During the 0.3.0 release-day incident, the "HEAD moved after range seal" blocker suggested know-code range begin — which never cleared seal artifacts, so following the product's own advice could not resolve the block. Even range abort couldn't help under requireAttest (the signed binding is deliberately kept). That one message was fixed in 0.3.0 to point at taught → quiz → pass (which now consumes the stale seal).
Task: audit every blocker emitted in pipeline.ts (and the deny messages in check.ts / hooks) and verify, ideally with tests, that the command field actually leads to a state where the blocker clears. Candidates to scrutinize:
- stale-artifact blockers (taught/answers/grade/grade-proposal) — do the suggested next steps hold when scope flips between index and range?
- "Gate stale — diff may have changed" paths
requireTrailer denials between pass and the first know-code commit (stale COMMIT_EDITMSG, see the status display issue)
Acceptance idea: an e2e test per blocker that reaches the blocked state, runs the suggested command(s), and asserts the pipeline advances.
During the 0.3.0 release-day incident, the "HEAD moved after range seal" blocker suggested
know-code range begin— which never cleared seal artifacts, so following the product's own advice could not resolve the block. Evenrange abortcouldn't help underrequireAttest(the signed binding is deliberately kept). That one message was fixed in 0.3.0 to point attaught → quiz → pass(which now consumes the stale seal).Task: audit every blocker emitted in
pipeline.ts(and the deny messages incheck.ts/ hooks) and verify, ideally with tests, that thecommandfield actually leads to a state where the blocker clears. Candidates to scrutinize:requireTrailerdenials betweenpassand the firstknow-code commit(staleCOMMIT_EDITMSG, see the status display issue)Acceptance idea: an e2e test per blocker that reaches the blocked state, runs the suggested command(s), and asserts the pipeline advances.