RISK-WP-0005 finished: the seven gaps closed

T01 fix tracking now reads the owner's workplan file and found two
findings the register should have known about. T02 incident and external
report intake, the latter routed since the address is not ours to create.
T03 the production transition defined by what is held rather than what
was announced. T04 the README stops claiming a surface. T05 escalation
carries a delivery state and is raised once when unacknowledged. T06
checked_by and a heartbeat, so a 1q rung cannot silently mean nobody
looked. T07 coverage: 7 of 117 repos have ever appeared in a finding.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-21 08:34:30 +02:00
parent 449307bea2
commit a05ca6822b
14 changed files with 195 additions and 26 deletions

View file

@ -43,6 +43,7 @@ Then, per due finding:
Then record it, in the same sitting:
```
RISK_CHECKED_BY=<who-or-what-you-are> \
make checked ARGS="RISK-F-0002 clean"
make checked ARGS="RISK-F-0002 moved 'ops-warden enabled the gate'"
make checked ARGS="RISK-F-0002 defer 2026-09-01 'operator: after the migration'"

View file

@ -184,6 +184,26 @@ The test therefore applies to intake, not to sweeps:
If that trips, the first suspects are triggers 3 and 4 — spend thresholds set
too low, and "unowned" being read where "not yet routed" is meant.
## Delivery is a state, not an act
`RISK-WP-0005-T05`. An escalation that nobody acknowledged is indistinguishable
from one never sent — which is precisely the failure this register committed
on 2026-08-19 and then fixed for its **own** inbox with an hourly watch, while
leaving the path that matters more unguarded.
So an escalation carries a state:
```yaml
escalation_status: pending-operator # sent | seen | answered | withdrawn
escalation_sent: "2026-08-19"
```
`make check` reports how long each has been unacknowledged. At seven days it
says so and the escalation is **raised once more** — once, per the rule above.
After that the default applies and is recorded. Repetition until someone
answers is how the operator becomes the queue, and silence that is recorded is
not the same as silence that is ignored.
## Escalations are batched
Four escalations are one conversation, not four interruptions. Open items go

View file

@ -49,6 +49,17 @@ Two rules and one escape:
the only way out of the bottom rung other than a clean check, and it is a
decision with a name on it rather than a check quietly not happening.
### Who checked, and when anyone last did
`RISK-WP-0005-T06`. Two defences against the rung telling a lie:
- **`checked_by` on every check.** `record_check.py` writes it. A rung earned
by nobody in particular is visible as such.
- **A heartbeat.** If nothing anywhere in the register has been checked for two
days, `make check` says so **before anything else**. A `1q` rung means
"stable for a quarter" and "nobody looked for a quarter", and those read
identically from the outside — the heartbeat is what separates them.
### The rung is the signal
This is the point of the design, not a side effect. **The cadence a finding