Found during 0.3.0 release-day dogfooding (2026-08-11), cost real human time mid-flow.
What happened: right after a successful human pass, know-code status printed:
commit/push allowed: no with no blockers list
receipt: standard @ … sealed=no for a gate that was correctly Ed25519-signed
Root causes:
status.ts prints sealed=${allowed ? "yes" : "no"} for the receipt line — it renders the overall runCheck result, not the receipt's signature validity. A perfectly sealed gate shows sealed=no whenever the trailer check denies.
- The deny came from
requireTrailer evaluating a stale .git/COMMIT_EDITMSG (left over from a soft-reset commit, carrying a superseded trailer). That state is expected between pass and the first know-code commit (which pre-writes a grounded EDITMSG), so status should either explain it or not count it as a blocker.
allowed: no with an empty blockers section is contradictory output; if check denies, status must show why.
Fix directions:
receipt … sealed= should reflect assertSigned on gate.json only.
- Surface the trailer-deny reason in the blockers list, with a hint when the pending EDITMSG trailer is stale but the gate is open ("next: know-code commit stamps a fresh trailer").
Found during 0.3.0 release-day dogfooding (2026-08-11), cost real human time mid-flow.
What happened: right after a successful human
pass,know-code statusprinted:commit/push allowed: nowith no blockers listreceipt: standard @ … sealed=nofor a gate that was correctly Ed25519-signedRoot causes:
status.tsprintssealed=${allowed ? "yes" : "no"}for the receipt line — it renders the overallrunCheckresult, not the receipt's signature validity. A perfectly sealed gate showssealed=nowhenever the trailer check denies.requireTrailerevaluating a stale.git/COMMIT_EDITMSG(left over from a soft-reset commit, carrying a superseded trailer). That state is expected betweenpassand the firstknow-code commit(which pre-writes a grounded EDITMSG), sostatusshould either explain it or not count it as a blocker.allowed: nowith an empty blockers section is contradictory output; if check denies, status must show why.Fix directions:
receipt … sealed=should reflectassertSignedon gate.json only.