Skip to content

Incident record

Purpose. Write every incident down in the same structure, so it becomes something the next operator (and the next version of this repository) can learn from, and a regression test for the runbooks. Level. 1. Where. The agent profile keeps records in its workspace, <install-dir>/agent/workspace/incidents/YYYY-MM-DD-<slug>.md. Otherwise wherever the team keeps them; one file per incident.

Template

---
id: YYYY-MM-DD-<short-slug>
severity: 1 | 2 | 3            # 1 down for everyone or data at risk; 2 one app or one team; 3 degraded, no one blocked
status: open | mitigated | resolved
services: [<compose service or app slug>, ...]
runbooks: [<runbook used>, ...]
---

## Timeline (UTC)
- HH:MM  first signal: who saw what, where
- HH:MM  each observation, hypothesis, action, with who decided

## Symptom
What users or checks saw. Exact status codes and messages, not "it was down".

## Cause
Confirmed, with the evidence that confirmed it. If not confirmed: "suspected", and what would confirm it.

## Impact
Who and what, for how long. Data lost or at risk: yes or no, and how you know.

## Decision
What was decided, by whom, when (every level-3 action has an ok here).

## Fix
What changed, exactly (command, object id, commit). How it can be undone.

## Prevention
The rule, check, test or runbook change this leaves. "Be more careful" is not one.

## Evidence
Commands and their relevant output (no secrets), log excerpts, run links.

## Not checked
What could still be wrong.

Example (anonymized, from the first box)

---
id: day-12-backup-blocked-by-os-prompt
severity: 2
status: resolved
services: [backup]
runbooks: [backup-stuck]
---

## Timeline (UTC)
- day 10 02:00  nightly backup starts on the host scheduler
- day 12 09:30  the portal's backup card shows the newest success 54 h old; the operator reads the status: "running"
- day 12 09:35  process alive, CPU ~0, log silent, repository size unchanged across two readings, lock held
- day 12 09:40  the OS privacy log shows an access request for the backup binary pending a user decision
- day 12 09:49  the admin clicks "allow" (decision: admin)
- day 12 10:15  the run finishes: 15.0 GiB read, 749 MiB new, partial check without errors

## Symptom
Backup "running" for ~54 h; the next two nightly runs refused by the lock.

## Cause
An operating-system privacy prompt (macOS TCC) blocked the binary's open() on a protected folder until someone answered. Confirmed by the OS privacy log naming the binary and the path.

## Impact
No new backup for two nights. No data lost; the previous snapshots verified.

## Decision
Let the run resume after the click rather than kill it (admin).

## Fix
Permission granted to the binaries that open the path; binaries pinned; lock, 4 h timeout, JSON progress and a failed status added to the job.

## Prevention
Unattended jobs never depend on a prompt; after any upgrade of the pinned binaries, run once interactively. Check the reports mount at each release of the portal.

## Evidence
status file before and after; two size readings; process tree; privacy log line (path redacted).

## Not checked
Whether other scheduled jobs on the host read protected folders.