Explicit approval contract change

Historical implementation record. The later publication-boundary change removes routine plan approval while retaining explicit selection and final-publication approval. The probes below describe the earlier contract, not current operation.

Implement the phase-5 correction without treating a retry as an operator choice. No paid model calls, ingest implementation or data migration are part of this change.

Consumer packet

Contract field Disposition
Authoritative declaration ADR 127 and headless/operator.py: only an explicitly captured answer authorizes continuation past an operator stop.
Scope and enforcement Revision plans and strike lists use answer(); the function reads a stored answer, never the editable draft. Full-pass --direction is unchanged.
Consumer classes Runtime reader/writer, revision workflow, review CLI, fake-harness fixtures, revision instruction, review guide, architecture, command reference and ADR updated. No result-file schema or validator change.
Byte-pinned consumers The edited revision instruction is a captured assessment input. Its new bytes invalidate plan approval and call reuse. Existing review result hashes naturally become stale; no baselines are rewritten. Historical run captures stay unchanged.
Old spellings Searched operator\.answer|operator\.waiting, edited or not|unedited.*answer, repeats the command|repeat the command|repeating the same command, and artifact/plan\.yaml|--plan FILE in src, tests, kb/reference and kb/instructions. Post-change line counts: 5, 1, 2 and 12 respectively; remaining hits describe the new interface or unrelated full-pass retry.
Generated and projected forms No scaffold, template or skill-name change. Installed projects read the revised instruction in the library. The existing editable uv tool pointed to this checkout but had stale launchers; reinstallation exposed commonplace-review and removed retired launchers.
Fresh install Scratch commonplace-init plus a named empty plan exercised the real CLI without model calls. An unapproved repeat remained stopped.
Existing installs and clones Init preserves existing run files. An old draft with no proposal record cannot be approved. No compatibility or migration: existing drafts are not authority; the next workflow materializes a keyed proposal. Source clones use the same code.
Diagnostic promises Old keys fail with proposal changed; unregistered files fail with no operator proposal; out-of-run paths are refused; concurrent approval raises the run-lock error. Covered by CLI or runtime tests.
Acceptance probe /tmp/commonplace-approval-probe-bbass0r8: init fresh, seed Git, propose an empty named plan, repeat, init again with a legacy draft present, reject approval of that draft, approve the registered plan, edit its draft without reapproval, repeat successfully using the captured answer. Note unchanged; validation and init pointer checks pass. Initial attempt before the seed commit failed because the runtime requires Git HEAD; no worker launched.
Drift guard Parameterized consumer tests change assessment instruction/profile and strike criterion/profile; they require new approval even when the generated proposal text is identical. Existing plan-edit tests require explicit reapproval and retain replay assertions.
Historical witnesses The plan's phase-5 build history retains the original repeat-as-answer mechanism, explicitly distinguished from the correction. Old run captures and retained evidence are not rewritten.
Identity by convention A stop names an artifact-relative file. Its operator record is keyed by that path; the proposal identity covers stop name, producing inputs and original proposal text. The approval command requires that identity.
Shared exclusions Not applicable: no new artifact-membership predicate. Both runtime paths use the same proposal-path validation.
Relocation side effects Not applicable: no artifacts moved.

The revision instruction is consumed both by operators following its workflow section and by the assessment worker as a captured criterion. Its composition landing routes to that section without restating the approval mechanism. No changes are needed to other pass instructions or the root control plane.

Verification

  • Focused runtime and revision tests: 29 passed, including unapproved repeats, captured answers, stale keys, lock refusal, path escape, changed proposal inputs, named plans, reapproval, publication conflicts and replacement proposals from retried calls under the same request key.
  • Broader run: 915 passed in 788.52 seconds across general, headless, review, agentic analysis, relocation and docs, including slow tests (-m ''). The first attempt timed out at 200 seconds; the completed run replaced it.
  • Core rerun after the additional regression cases: 319 passed in 51.20 seconds across general, headless, review, relocation and docs (-m ''). The final focused rerun passed all 29 tests after the last local edits.
  • Ruff passed. Five changed library documents passed deterministic validation.
  • No live-worker evidence is claimed. Phase-5 paid trials and the first collection sweep remain for the operator.