Judging freeze is on. Everything below is evaluated live; nothing is written to GitLab.
Is it safe to let the agents ship?
Not on their own yet. 3 agent changes wait for a human, because no agent has reached the 0.80 hands-off line in the areas it touches; the best score is 0.55. 1 incident is still in the loop. 1 of 1 promise kept in production.
The immune loop
Outer ring: an incident's way from alert to antibody. Inner rings: what the system remembers: past incidents, promises and each agent's trust. The gate on the right decides whether a change ships alone or waits for you.
631 order requests on staging, 40 users, database slowed to 400 ms. p99 latency 15,617 ms.
The Incident Responder checked the immune memory, named the cause in 74 s, and opened MR !1 with a regression test.
40 of 40 concurrent requests on a 400 ms database in the regression test. Production now runs a pool of 20.
Incident #2, step by step
Times are from the issue, the merge requests and the ledger. Choose a step to see it in the loop.
Every decision, with its reason
Live from GitLab and production, checked 01:19 UTC. Open a row to inspect the payload behind it.
gate label autonomy::supervisedno agent at 0.80 for its areachange
waits for you
gate label autonomy::supervisedno agent at 0.80 for its areachange
waits for you
gate label autonomy::supervisedno agent at 0.80 for its areachange
waits for you
next stage: Closedfix !1 mergedseverity 2
5/6 stages
[x] Opened [x] Diagnosed [x] Fix MR [x] Fix merged [x] Antibody [ ] Closed ← next
acceptance criteria of a closed issue4 checksevery 5 min in prod
kept
above_threshold_requires_verification
POST /orders {"item": "contract-check-high", "quantity": 1, "total": 650}
expect {"equals": "pending_verification", "json_path": "$.status", "max_ms": 2000, "status": 202}just_above_threshold_requires_verification
POST /orders {"item": "contract-check-boundary-above", "quantity": 1, "total": 500.01}
expect {"equals": "pending_verification", "json_path": "$.status", "max_ms": 2000, "status": 202}at_threshold_is_confirmed
POST /orders {"item": "contract-check-boundary", "quantity": 1, "total": 500}
expect {"equals": "confirmed", "json_path": "$.status", "max_ms": 2000, "status": 201}below_threshold_is_confirmed
POST /orders {"item": "contract-check-low", "quantity": 1, "total": 20}
expect {"equals": "confirmed", "json_path": "$.status", "max_ms": 2000, "status": 201}
INC-2 Orders API 503 database_busy under order spikes (DB pool 5 / 1.0s timeout too small)
replayed when app/orders_api/db.py changesreplayed when app/orders_api/settings.py changesreplayed when app/orders_api/main.py changesreplayed when infra/cloudrun.tf changesreplayed when infra/variables.tf changes
antibody
error_rate < 0.01
p95_ms < 2500
p99_ms < 3500
fault {"slow_query_ms": 400}
Read the postmortemEarned trust, per agent and code area
A change that survives the canary adds 0.05; a rollback takes 0.20. The gate merges on its own only at hands-off, 0.80.
| Agent | authcap supervised | data | api | infracap supervised | docs | memory |
|---|---|---|---|---|---|---|
| Incident responder0 shipped |
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
| Close the loop0 shipped |
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
| Contract keeper1 shipped |
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.55
supervised
|
| Contract breach0 shipped |
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
0.50
supervised
|
One step is yours.
The gate held 3 changes because trust isn't earned yet. Approving starts the canary; the result moves the agent's score.
- Nothing merges on its own unless tests, immune replay, every promise and the security audit are green.
- auth, infra and anything unmapped are capped at supervised, whatever an agent's score.
- A rollback costs 0.20 trust and drops the agent back toward supervision.
- Judging freeze is on: the system evaluates and reports, and writes nothing to GitLab.
curl -s -X POST https://orders-api-rjpdzrsxra-uc.a.run.app/orders \
-H 'content-type: application/json' \
-d '{"item":"judge-check","quantity":1,"total":650}'
# expect 202 and "status": "pending_verification"curl -s -X POST /mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"why","arguments":{"path":"app/orders_api/db.py"}}}'curl -s /api/memory