NightShift

Method

How the incidents were staged, who answered them, how each answer was graded, and what these numbers do not show.

A pass

The store is four small services on AWS Lambda: cart, orders, fulfillment and a mock payment provider, with Aurora DSQL, DynamoDB and an SQS queue. A chaos runner breaks it through real mechanisms only: a bad deploy through the real deploy path, a changed setting, a removed IAM permission, a poison message on the queue, real load. No flag in the application code says "fault here".

For each incident the runner warms the store up, injects the fault and waits for an alarm. On the first alarm, which is when a real on-call engineer would be paged, all five configurations start investigating the same incident at the same moment. Each runs as its own process holding only a read-only role. Afterwards the runner recovers the store and checks its health; an incident that fails a health check is not counted.

Incidents are kept apart. Every tool can look back at most 30 minutes, and the runner waits for 45 quiet minutes (no invocations, no configuration changes) before the next injection, so an answer cannot come from the previous incident's leftovers. Every result was scanned for evidence older than that; none was.

Pass m7: 36 incidents, 12 scenarios three times each, in an order shuffled once from seed 20260928, all at commit 5085754.

Who answered

ConfigurationModelWhat it sees
Agent, Geminigemini-3.5-flash-liteThe page, plus ten read-only tools: alarms, metrics, logs, traces, deployments, recent changes, queue stats, function config, topology, flags. At most 15 steps and 100K tokens.
Agent, Mistralministral-14b-latestThe page, plus ten read-only tools: alarms, metrics, logs, traces, deployments, recent changes, queue stats, function config, topology, flags. At most 15 steps and 100K tokens.
Alarm text only, Geminigemini-3.5-flash-liteThe same model with only the alarm text and no tools. It measures how much of the agent's score comes from investigating rather than guessing from an alarm's name.
Alarm text only, Mistralministral-14b-latestThe same model with only the alarm text and no tools. It measures how much of the agent's score comes from investigating rather than guessing from an alarm's name.
Scripted runbookscriptedNo model. The rules a written runbook would have: blame a deploy of the alarmed service in the last 30 minutes, otherwise one rule per alarm, otherwise insufficient evidence. Written knowing the scenarios, which makes it a strong baseline, not a straw man.

Grading

Deterministic, with no model as judge: two words compared with two words.

What these numbers do not show

The full reasoning, including what went wrong while building and running it, is in LEARNING.md, section 14.

Notes recorded during the pass

Pass m7: decisions made during the pass

Recorded here because nothing is committed to main while the pass runs (freeze rule). Copied into the decisions log (docs/decisions/log.md) once the pass ended.

  • 2026-10-01, owner: phase 1 entry 13 (scenario 11, run 1) is counted on its second attempt. The first attempt (results/chaos/11-legit-spike-20261001T030042Z) never paged: 1 serialization retry in the whole spike, and the alarm needs 10 a minute for 2 minutes. It was re-queued at 10:11 UTC and re-run (results/chaos/11-legit-spike-20261001T144735Z). The spike again did not reach the retry alarm (1, 1, 3, 1 a minute); the page came from nightshift-throttles, one orders throttle during warm-up at 15:38 UTC, which changed state 0.2 s after injection. Counted because it is a real page with no fault, which is what scenario 11 tests, and M4 already treats a stray throttle as noise. Reported as such in the results. Scenario 11's own alarm has now failed to page in 2 of 4 runs, the same unexplained variance as scenario 7 (ADR 0003).
  • 2026-10-01, owner: run phase 2 (entries 19 to 36) at the same commit, 5085754.