Skip to content

fix: keep task writer transitions committable#367

Closed
SUaDtL wants to merge 4 commits into
chore/docs-command-mirror-reconciliationfrom
fix/taskwriter-queued-done
Closed

fix: keep task writer transitions committable#367
SUaDtL wants to merge 4 commits into
chore/docs-command-mirror-reconciliationfrom
fix/taskwriter-queued-done

Conversation

@SUaDtL

@SUaDtL SUaDtL commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Require queued tasks to enter in-progress before done, with actionable no-write errors for invalid transitions.
  • Keep every successful public task mutation acceptable to the commit classifier, including ID minting and missing-section adds.
  • Reject malformed namespaces and add fields before they can inject invalid board lines.
  • Reject internal queued-state rewinds that could erase started or completed evidence.
  • Retry only the exact transient Windows proof-admission refusal once, without changing production containment.
  • Regenerate the Claude, Codex, and Pi task surfaces from the shared core.

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)
  • Full configured Python gate, including 1,023 hook tests
  • Pi tools typecheck and Vitest suite (545 passed, 1 intentional skip)
  • python .github/scripts/test_pi_platform_contract.py --fixtures-only
  • Core sync, surface generation, host package, reference graph, compilation, secret, and diff checks
  • Independent contract review and required coverage audit, both PASS with no CRITICAL or HIGH findings

Closes #364
Closes #366
Closes #339

SUaDtL added 2 commits July 20, 2026 11:03
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
@SUaDtL
SUaDtL changed the base branch from chore/docs-command-mirror-reconciliation to main July 20, 2026 15:24
@SUaDtL SUaDtL closed this Jul 20, 2026
@SUaDtL SUaDtL reopened this Jul 20, 2026
@SUaDtL
SUaDtL changed the base branch from main to chore/docs-command-mirror-reconciliation July 20, 2026 15:52
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
@SUaDtL
SUaDtL changed the base branch from chore/docs-command-mirror-reconciliation to main July 20, 2026 16:23
@SUaDtL SUaDtL closed this Jul 20, 2026
@SUaDtL SUaDtL reopened this Jul 20, 2026
@SUaDtL
SUaDtL changed the base branch from main to chore/docs-command-mirror-reconciliation July 20, 2026 16:32
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
@SUaDtL
SUaDtL changed the base branch from chore/docs-command-mirror-reconciliation to main July 20, 2026 16:49
@SUaDtL SUaDtL closed this Jul 20, 2026
@SUaDtL SUaDtL reopened this Jul 20, 2026
@SUaDtL
SUaDtL changed the base branch from main to chore/docs-command-mirror-reconciliation July 20, 2026 16:59
@SUaDtL

SUaDtL commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator Author

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.

@SUaDtL

SUaDtL commented Jul 20, 2026

Copy link
Copy Markdown
Collaborator Author

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.

@SUaDtL SUaDtL closed this Jul 20, 2026
@SUaDtL
SUaDtL deleted the fix/taskwriter-queued-done branch July 24, 2026 21:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant