Fixes#2467 partial (completion wave slice 3 of 5). close() now marks the persisted Programme stage COMPLETE and rides the continuation canary on the envelope (task done ≠ programme done). No programme → no block; ledger failure degrades. Bonus: same-second contract-id collision fixed (uuid suffix). 4 contracts (3 wire + 1 id-collision); 37 interface tests green.
Propagation: construction_interface close() gained the continuation hook (additive, no-programme callers unchanged — proven by the no-continuation contract); all existing ids keep their format with a uuid suffix added.
Fixes #2467 partial (completion wave slice 3 of 5). close() now marks the persisted Programme stage COMPLETE and rides the continuation canary on the envelope (task done ≠ programme done). No programme → no block; ledger failure degrades. Bonus: same-second contract-id collision fixed (uuid suffix). 4 contracts (3 wire + 1 id-collision); 37 interface tests green.
Propagation: construction_interface close() gained the continuation hook (additive, no-programme callers unchanged — proven by the no-continuation contract); all existing ids keep their format with a uuid suffix added.
Slice 3 of the completion wave: closing a contract that is a stage of a persisted Programme marks that stage COMPLETE, persists the ledger, and rides the continuation canary on the close envelope — the next eligible stage is SURFACED, never guessed (task done ≠ programme done). No programme bound → no continuation block; ledger failure degrades without failing the closure. Three contracts. Also fixed en route: contract ids were second-granularity timestamps that collided when two needs filed in the same second (red test proves distinct ids now, uuid suffix added).
🤖Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.
🤖 **Headless spec gate (non-blocking, #204 first slice)**
Spec-gate agent produced no text output — check runner logs.
<details><summary>Deterministic floors still govern the merge</summary>
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.</details>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Fixes #2467 partial (completion wave slice 3 of 5). close() now marks the persisted Programme stage COMPLETE and rides the continuation canary on the envelope (task done ≠ programme done). No programme → no block; ledger failure degrades. Bonus: same-second contract-id collision fixed (uuid suffix). 4 contracts (3 wire + 1 id-collision); 37 interface tests green.
Propagation: construction_interface close() gained the continuation hook (additive, no-programme callers unchanged — proven by the no-continuation contract); all existing ids keep their format with a uuid suffix added.
🤖 Headless spec gate (non-blocking, #204 first slice)
Spec-gate agent produced no text output — check runner logs.
Deterministic floors still govern the merge
This comment is advisory. Required checks (lint, tests, canaries, type-check, coverage, dependency lock, impact gate) remain the merge authority per docs/adversarial-review.md proportionality.