Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
a2518d1
Reconcile the iLert operator alert stream
morgaesis Aug 27, 2026
581dbe1
Simplify iLert alert reconciliation
morgaesis Aug 27, 2026
0d1a69a
Normalize iLert action history identities
morgaesis Aug 27, 2026
210655c
Reconcile terminal review threads
morgaesis Aug 27, 2026
835bb8a
Merge main into iLert alert reconciliation
morgaesis Aug 28, 2026
3d11e5e
Keep canaries out of production alert recovery
morgaesis Aug 28, 2026
4a654c5
Clarify iLert canary alert ownership
morgaesis Aug 28, 2026
335c6ad
Clarify iLert canary failure ownership
morgaesis Sep 2, 2026
e962e04
Harden iLert alert stream canary
morgaesis Sep 2, 2026
d219d6d
Finalize iLert canary cleanup
morgaesis Sep 2, 2026
d9d07da
Bound iLert canary alert lookup
morgaesis Sep 2, 2026
a226379
Harden iLert canary delivery proof
morgaesis Sep 2, 2026
6c4c428
Harden iLert canary reconciliation
morgaesis Sep 2, 2026
1424718
Fail closed iLert alert relations
morgaesis Sep 2, 2026
dac6987
Require exact iLert canary history identities
morgaesis Sep 2, 2026
4f2a5da
Bind iLert action responses to requested identities
morgaesis Sep 2, 2026
f70cb66
Harden iLert webhook canary cleanup
morgaesis Sep 2, 2026
91081f8
Harden iLert canary remediation
morgaesis Sep 2, 2026
644a5e5
Harden iLert canary state machine
morgaesis Sep 2, 2026
13de991
Harden iLert canary cleanup recovery
morgaesis Sep 2, 2026
abb8f65
Make iLert canary cleanup attempt-specific
morgaesis Sep 2, 2026
6e17b67
Replace iLert canary source binding
morgaesis Sep 2, 2026
dca1760
Harden iLert canary finalization
morgaesis Sep 2, 2026
966bb44
Harden iLert canary reconciliation
morgaesis Sep 2, 2026
fc16bde
Harden iLert alert reconciliation
morgaesis Sep 2, 2026
54de0e1
Fail closed on invalid finalizer statuses
morgaesis Sep 2, 2026
1631b63
Fail closed after invalid canary cleanup status
morgaesis Sep 2, 2026
0186161
Close iLert canary cleanup gaps
morgaesis Sep 2, 2026
b12cf6c
Harden iLert canary finalization
morgaesis Sep 3, 2026
72de03b
Harden iLert canary cleanup
morgaesis Sep 3, 2026
135cf91
Harden iLert canary cleanup verification
morgaesis Sep 3, 2026
ee8eba0
Strengthen iLert event query coverage
morgaesis Sep 3, 2026
a1f7195
Remove unrelated iLert event query coverage
morgaesis Sep 3, 2026
0a10b5a
Verify exact iLert event predicates
morgaesis Sep 3, 2026
b657900
Sweep cleaned iLert canary handoffs
morgaesis Sep 3, 2026
140cc9b
Extend iLert canary rerun cleanup
morgaesis Sep 3, 2026
0eefa84
Protect iLert alert inventory pagination
morgaesis Sep 3, 2026
4a27e99
Harden iLert canary pagination
morgaesis Sep 3, 2026
be98724
Close iLert inventory continuity gaps
morgaesis Sep 3, 2026
fbbf8ad
Harden iLert reconciliation inventory
morgaesis Sep 3, 2026
065a6d8
Cover iLert inventory continuity
morgaesis Sep 3, 2026
4523663
Harden iLert reconciliation boundaries
morgaesis Sep 3, 2026
e3ae94b
Harden iLert mutation boundaries
morgaesis Sep 3, 2026
5c54d9b
Revalidate iLert mutation retries
morgaesis Sep 3, 2026
dd40e47
Guard iLert mutation retry deadlines
morgaesis Sep 3, 2026
3c4da88
Propagate iLert action guard failures
morgaesis Sep 3, 2026
badbfa0
Harden iLert action mutation guards
morgaesis Sep 3, 2026
5eebf6d
Remove unused canary timing handoff
morgaesis Sep 3, 2026
ae3c02a
Recover interrupted iLert canaries
morgaesis Sep 3, 2026
6211bee
Harden iLert canary workflow recovery
morgaesis Sep 3, 2026
40098cb
Validate complete iLert orphan inventories
morgaesis Sep 3, 2026
16c676f
Harden production monitor execution bounds
morgaesis Sep 3, 2026
074d84a
Bound iLert canary cleanup
morgaesis Sep 3, 2026
1193cdc
Partition iLert finalizer deadlines
morgaesis Sep 3, 2026
840e345
Harden deployment workflow trust
morgaesis Sep 3, 2026
e79f078
Harden deployment trust and monitor probes
morgaesis Sep 3, 2026
636113a
Bind iLert observations to canary keys
morgaesis Sep 3, 2026
67ea8db
Harden production monitor release contracts
morgaesis Sep 3, 2026
cb228b4
Harden release index and recovery targets
morgaesis Sep 3, 2026
4ae6baf
Harden monitoring cleanup metadata
morgaesis Sep 3, 2026
7b5f8a0
Release transient response bodies before retry
morgaesis Sep 3, 2026
07ff927
Release terminal HTTP response bodies
morgaesis Sep 3, 2026
490dd95
Release ambiguous creation response bodies
morgaesis Sep 3, 2026
a37c6ab
Fix iLert operational index test
morgaesis Sep 3, 2026
d73437f
Document iLert monitor integration key
morgaesis Sep 3, 2026
7367cf8
Release private monitor response bodies
morgaesis Sep 3, 2026
b453d61
Make webhook runtime secret staging explicit
morgaesis Sep 3, 2026
4972b4c
Fail closed for unknown iLert handoffs
morgaesis Sep 3, 2026
0455739
Clarify webhook redaction fixture
morgaesis Sep 3, 2026
6776ecd
Preserve management source error context
morgaesis Sep 3, 2026
8d17880
Merge main into alert-stream canary
morgaesis Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 39 additions & 6 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,41 @@ POSTIL_SESSION_SECRET=
# settings page. Generate: openssl rand -hex 32
GITHUB_WEBHOOK_SECRET=

# Optional iLert outbound alert receiver. Generate a random password with
# `openssl rand -hex 32`, set it here, and configure the iLert webhook URL as
# https://postil-ilert:<URL-encoded-password>@<your-host>/api/webhooks/ilert.
# Select alert-created, alert-assigned, alert-auto-escalated,
# alert-auto-resolved, alert-acknowledged, alert-rejected, alert-raised, and
# alert-resolved as trigger events. Leave unset to make the endpoint return 404.
# iLert webhook receiver password. Generate with `openssl rand -hex 32`. The
# reconciliation workflow loads this value from the secret record that also
# supplies the deployed receiver's runtime secret. The reconciler embeds
# URL-encoded HTTP Basic credentials for `postil-ilert` and this value in the
# webhook URL.
# Do not configure a custom `Authorization` header. Select alert-created,
# alert-acknowledged, alert-comment-added, and alert-resolved trigger events.
# Deployment preserves existing runtime secrets and stages no credential.
# Disable iLert delivery through the managed alert-action configuration, and
# revoke receiver access by rotating this credential under the applicable
# change controls.
POSTIL_ILERT_WEBHOOK_SECRET=

# Canonical HTTPS origin of the deployed receiver. The reconciler accepts only
# an origin without credentials, path, query, or fragment, and appends the
# fixed `/api/webhooks/ilert` path.
POSTIL_ILERT_RECEIVER_ORIGIN=https://your-host

# Numeric iLert alert source identity. Configure this as the
# `POSTIL_ILERT_ALERT_SOURCE_ID` GitHub Actions variable for the production
# monitor, not as a secret. It selects the source whose Webhook alert action is
# reconciled and verified.
POSTIL_ILERT_ALERT_SOURCE_ID=

# Workflow-only identity for live reconciliation and cancellation cleanup.
# `--canary` and every `--finalize-canary` invocation require this identity and
# scoped iLert management credentials. Finalization always performs a mandatory
# terminal management sweep, including after the primary canary proves cleanup,
# so it can resolve a delayed Event API duplicate. Each rerun uses a distinct
# main alert key. The workflow carries the producer attempt to the finalizer
# after an accepted ALERT; its running attempt is the sweep ceiling.
# POSTIL_ILERT_CANARY_RUN_ID=
# POSTIL_ILERT_CANARY_RUN_ATTEMPT=
# POSTIL_ILERT_CANARY_SWEEP_ATTEMPT=

# Numeric GitHub ids allowed to use operator-only surfaces. The alert stream
# also requires a renewable `postil login` access token for an allowlisted id.
POSTIL_OPERATOR_GITHUB_IDS=
Expand Down Expand Up @@ -163,6 +190,12 @@ POSTIL_CACHE_DIR=.cache
# opens one private incident without stopping other monitor checks.
POSTIL_MONITOR_INTERVAL_MS=300000
POSTIL_MONITOR_ALERT_STATE_PATH=/var/lib/postil-monitor/alert-state.json
# Optional iLert Event API integration credential for the monitor alert source.
# The monitor and canary use it to send ALERT and RESOLVE events; it is not a
# management API bearer credential. The monitor starts without it; each alert
# delivery attempt then fails with a configuration error and stays queued for
# retry until the key is set.
# ILERT_INTEGRATION_KEY=
# OPENROUTER_MANAGEMENT_API_KEY=
# POSTIL_OPENROUTER_DEVELOPMENT_KEY_NAME=
# POSTIL_OPENROUTER_PRODUCTION_KEY_NAME=
Expand Down
5 changes: 4 additions & 1 deletion .github/actions/ilert-event/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ inputs:
require-delivery:
description: >-
Fail when no integration key is configured instead of recording the
undelivered event. Use for alerts whose delivery must be observable.
undelivered event. Production failure alerts, recovery resolves, and
delivery tests set this to true. False is reserved for explicitly
optional events that do not describe a production failure.
required: false
default: "false"

Expand Down Expand Up @@ -99,6 +101,7 @@ runs:
--max-time 15 \
--retry 3 \
--retry-delay 5 \
--retry-max-time 45 \
--retry-all-errors \
--header 'Content-Type: application/json' \
--data @"${RUNNER_TEMP}/ilert-event.json" \
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ jobs:
POSTIL_TEST_DATABASE_URL: postgresql://postgres@localhost:5432/postgres
POSTIL_SEALING_KEY: 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
- name: Verify event-driven iLert operator alerts on fresh Postgres
run: bun test --isolate tests/ilert-alert-stream.test.ts
run: >-
bun test --isolate
tests/ilert-alert-stream.test.ts
tests/ilert-canary-alert-key-migration.test.ts
env:
POSTIL_TEST_DATABASE_URL: postgresql://postgres@localhost:5432/postgres
- run: bun test tests/model-override-migration.test.ts
Expand Down
Loading
Loading