fix: keep task writer transitions committable#367
Conversation
Keep the sanctioned writer and commit classifier on one forward-only public lifecycle so successful task mutations can ride their work commits. CHANGELOG: Require queued tasks to start before completion and reject invalid task namespaces before writing. Closes #364 Ref: ADR-0008
Prevent the sanctioned writer from reporting success for board mutations that the commit classifier must reject, including physical-line injection through add metadata. CHANGELOG: Reject malformed task descriptions, sections, origins, and boundaries before writing. Refs #364
Hosted Windows runners can transiently refuse the inert Job holder before any Pi child starts. Retry the exact proof-only refusal once so the fail-closed production boundary remains unchanged while recurrent runner cold-load does not fail an otherwise green candidate. Closes #339
The shared helper advertised queued as a transition target even though the sanctioned lifecycle is forward-only. Internal callers could erase start or completion evidence without entering the public writer path. CHANGELOG: Prevent internal task-state calls from erasing lifecycle evidence by rewinding tasks to queued. Closes #366
|
Backlog reconciliation follow-up (2026-07-20):\n\n�2.rev.0026 and �2.rev.0027 are already complete in authoritative history but remain queued on the board:\n- 66eca56 / PR #201 records the scoped LGPL-3.0-or-later + 0BSD decision and CONFIRM-09 strategy.\n- 23fa77a / PR #216 implements and releases the audit staleness warning in ca 2.8.11.\n\nA fresh ADR-0008 backstop attempt reproduced the contract mismatch this PR fixes: the currently installed writer reports queued-to-done success, while main's classify_board_diff rejects that transition. A combined two-task flip is also rejected because the classifier intentionally accepts exactly one transition per work commit.\n\nPost-merge recovery: reconcile each task separately through the landed lifecycle (start, then done), one task-writer transition per evidence-bearing work commit. Do not bypass or broaden the classifier. No source, dependency, runtime, or security-posture change is required. |
|
Superseded by #313, the single hackathon review surface. This PR's recorded head and changes are represented in #313's exact 16-PR / 29-commit / 126-path source manifest. PR #313 passed final exact-head CI at commit 6173b1d and remains open and unmerged. Closing this source PR to avoid parallel review; please continue review and discussion on #313. |
Summary
in-progressbeforedone, with actionable no-write errors for invalid transitions.Why
Issue #364 exposed a contract split: the sanctioned writer could report success for output that the commit gate refused. This change restores one ordered lifecycle and makes success mean the resulting board can ride its work commit.
The implementation follows ADR-0008: preserve strict lifecycle atomicity, classify only exact sanctioned writer shapes, and reject malformed input before mutation.
This PR is stacked on #365. It now closes the inherited internal queued-rewind finding in #366 and carries the proof-only hosted hardening from #339.
Test plan
python .github/scripts/test_taskwriter.py(46 passed)python .github/scripts/test_taskboardlib.py(104 passed)python .github/scripts/test_board_sync.py(6 passed)python .github/scripts/test_pi_platform_contract.py --fixtures-onlyCloses #364
Closes #366
Closes #339