verdict: PASS

reason: This document is a system context/CLAUDE.md reference file, not a build spec proposing new code paths — it describes existing canonical architecture (dispatch, modality registry, prompt engine, sidecar) consistently with the manifest, and all new modalities (audio_t2a, lipsync_post, eval_image_v1, eval_video_v1, eval_audio_v1) are routed through the canonical registry via `register_runner`/`get_runner`, with no parallel assemblers, no new sidecar writers, and no duplicate payload assembly paths introduced.


verdict: FAIL

reason: Phase 1 matches accretion pattern 3 ("New file for a known capability") and pattern 2 ("Backward compatibility" excuse): `sidecar_writing` has a canonical path at `recoil/pipeline/_lib/sidecar.py::populate_sidecar`, and the spec must extend that function to handle audio fields rather than creating a parallel `write_audio_sidecar()` in a new file.


verdict: BYPASS

reason: Manual bypass: Phase 5 test bypass — verifying bypass logging


reason: No accretion-pattern violations. Spec is a path-layout refactor touching canonicals mechanically and registers one genuinely-new capability (project_path_construction). Two medium findings: (1) manifest amendment Phase 4 ordered after code Phases 1-3 — sub-agents in 1-3 may see no project_path_construction entry; (2) Phase 4 creates ref_resolution_v2: as new peer alongside retired ref_resolution: pointing at same canonical file — granularity-rule borderline; cleaner to reactivate existing entry in-place. Two low findings: Phase 2 rewrites retired canonical before Phase 4 reactivates it; Phase 7a leaves second ProjectPaths class at step_types.py.

auditor_route: sub-agent (opus 4.7 in-session) — API direct route blocked by OAuth-vs-SDK 429

confidence: HIGH


reason: Phase 5 subprocess-wraps the canonical recoil/pipeline/tools/dispatch_cli.py (sanctioned per CP-5); no phase creates parallel payload/dispatch/ref/prompt paths or adds an unretired fallback.


reason: Extends canonical projects_root() resolver in place (no fork/fallback/RECOIL_DATA_ROOT); HALT-flags dispatch/harness path contracts rather than duplicating them; no capability accretion.


reason: Migration consolidates (does not fragment) every state home; the only phase touching a canonical file (Phase 4, paths.py::ProjectPaths) extends it in place while preserving env>config>raise order, the RECOIL_PROJECTS_ROOT var name, and the no-RECOIL_DATA_ROOT invariant.


reason: Spec is a filesystem/infrastructure migration with no new capabilities, canonical paths, or SSOT violations.


reason: Architecturally sound: events.jsonl is a legitimately new single canonical home (no manifest capability owns maintenance/finding state) and the consult.py change extends run_codex_consultation() in place rather than forking; build-prerequisite defect (function absent on main) flagged for Step-1 spec review, not an SSOT violation.


reason: Build-dispatch supervision layer outside the manifest's generation namespace; each piece of run state has one canonical home (status.json; pending_async/Linear demoted to hint/projection); detached reviewer retired in the same change.


reason: Spec reuses (never forks) every manifest-adjacent capability (session_workspace.sh, nightwatch ledger/CLI, harness_orchestrator.sh, dispatch_status shlock pattern) and creates no competing home for any manifest-owned state; new lease/claim/event modules govern a distinct autonomy domain the manifest does not cover.


reason: Extends Take/Beat/EpisodeRunner/generate.py in place; reuses Beat.new_take + strategy-diff; no second home for take/dispatch/strategy state.


reason: Reuses canonical render_cinema_tokens (no reimpl); appends to bound.text (no prompt-assembly fork); double-append guarded.


reason: Build-orchestration/merge-gating tooling (shared codex_review_gate.sh + auto-land + /land); touches no manifest capability, forks no generation path, no second state home.


reason: Wiring the existing nightwatch.py engine to a launchd scheduler via a standalone script + plist; no new state home, no duplicate capability, no manifest amendment required.


reason: Phase 4 inlines a prompt builder in board_builder.py instead of registering it in prompt_engine BUILDERS (CP-3 prompt_building canonical) — accretion pattern 3


reason: CP-3 violation fixed: storyboard prompt builder registered in prompt_engine BUILDERS, consumed via get_builder(); REGISTER_CAPABILITY obligations met (manifest amendment Phase 1, no overlap)


reason: Phase 7 leaves migrate_sublocations.py as live second registry writer stamping source_sha256 with old plate-hash semantics while gen_sublocations redefines it as bible-desc hash — two writers, one file, two meanings; superseded writer not retired


reason: Phase 7 amended per auditor's stated conversion condition: migrate_sublocations.py retired to _archive with tombstone in same change; gen_sublocations sole registry writer; bible_desc_sha256 single stamp source


reason: Composition beside existing capabilities; verdict state single-homed in .verdict.json with Beat.board as documented projection; all generation stays on dispatch(); judge calls via existing anthropic_client factory.