Tasks: Verdict-Seam Boundary Hardening

Mission: verdict-seam-boundary-hardening-01KZG179 Branch: hardening/verdict-seam-facade-followup | Spec: spec.md | Plan: plan.md

Subtask completion is event-sourced — record with spec-kitty agent tasks mark-status Txxx --status done. The rows below are reference rows, not checkboxes.

Subtask Index

IDDescriptionWPParallel
T001Import + export full verdict_vocab surface (8 fns + EventVerdict alias + APPROVED/REJECTED/CHANGES_REQUESTED) on status.__all__WP01
T002Export review_result_from_state on status.__all__ (beside event_sourced_review_result)WP01
T003(FR-006 campsite) Rename two drifted reducer tests — name/docstring only, assertions unchangedWP01[P]
T004Extend façade-adoption test to assert the new exports presentWP01
T005Migrate the 8 verdict_vocab submodule-object consumers to façade symbolsWP02
T006Migrate the 4 collateral submodule-object imports (emit / store×2 / lane_reader)WP02
T007Campsite: extract _build_claim_review_override (cc=13 guard) + done_bookkeeping:119APPROVEDWP02
T008Retire the duplicated decode in _event_sourced_gate_verdict; delete the false docstring; reconcile reducer docstringWP02
T009Widen _is_bypass_import (submodule-name-targeted) + non-vacuity teeth testWP02
T010Behavior-preservation tests for the dedup (5 decode cases)WP02
T011Add a function-level exclusion mechanism to the verdict-seam censusWP03
T012Narrow verdict_provenance_backfill.py exclusion to write-side helpers; _legacy_frontmatter_verdict surfaces (#3236)WP03
T013Extend the classifier to recognize helper-constructed readers; _review_from_frontmatter surfaces (#3217)WP03
T014Flip the 3 wholesale-exclusion tests + update census fixture; retain non-vacuity teethWP03
T015RED-FIRST: conflict-marked latest review-cycle .md + arbiter override → no crash (#3244)WP04
T016Add ReviewCycleArtifact.latest_cycle_number() (filename-only) + hoist review-cycle glob/filename constants (S1192)WP04
T017Swap arbiter.py:466-467 to latest_cycle_number; leave .latest/from_file intact (C-004)WP04
T018Direct micro-test for latest_cycle_number (mixed valid + conflict-marked siblings)WP04[P]
T020Lift provenance_note out of the JSON gate; shared helper injects advisories[] at 4 emit sites (#3255)WP05
T021Campsite: _safe_emit_error_logged S110 fix (debug-log + rationale)WP05[P]
T022Test: stranded fixture → advisory in JSON; converged → empty advisoriesWP05
T023Add -m stress -n0 serial CI job to ci-quality.yml (POSIX-only, mirror timing-nfr-serial) (#3256)WP06
T024Right-size test_emit_durability.py durability test out of the fast poolWP06
T025Correct pytest.ini:47 stress-marker wording; leave #3235 coordination pointerWP06[P]

Work Packages

WP01 — Façade exports (IC-01a) · foundational

Goal: Promote the full verdict bridge onto status.__all__ so every symbol consumers need is a façade export, and land the export before WP02's dedup (C-002). Priority: P1. Independent test: import each promoted symbol from specify_cli.status; façade-adoption test green. Subtasks: T001, T002, T003, T004. Dependencies: none. Prompt: tasks/WP01-facade-exports.md (~250 lines). Risk: PR #3209 already merged into base — re-verify the two FR-006 test names before renaming.

WP02 — Consumer migration + dedup + guard widening (IC-01b)

Goal: Migrate all 12 submodule-object imports to façade symbols, retire the duplicated merge-blocking decode, and widen the boundary guard so the bypass is actually caught. Priority: P1. Independent test: grep shows zero status.<submodule> object imports; boundary teeth test flags a synthetic violation; full status suite green. Subtasks: T005, T006, T007, T008, T009, T010. Dependencies: WP01 (export-before-dedup). Prompt: tasks/WP02-consumer-migration-guard.md (~480 lines). Risk: three cc=15 do-not-touch functions in edited modules — keep diffs surgical.

WP03 — Census completeness (IC-02) · parallel

Goal: Narrow the wholesale module exclusion to function level and teach the classifier to see helper-constructed readers, so #3236+#3217 leave the census fully hardened. Priority: P1. Independent test: _legacy_frontmatter_verdict and _review_from_frontmatter appear as reader rows; write-side helpers excluded by name; non-vacuity teeth green. Subtasks: T011, T012, T013, T014. Dependencies: none. Prompt: tasks/WP03-census-completeness.md (~300 lines).

WP04 — Arbiter resilience (IC-03) · parallel · RED-FIRST

Goal: Red-first fix for the conflict-marked-artifact arbiter crash via a filename-only cycle-number resolver. Priority: P1. Independent test: the red-first regression is RED pre-fix, GREEN post-fix; .latest/from_file behavior unchanged. Subtasks: T015, T016, T017, T018. Dependencies: none. Prompt: tasks/WP04-arbiter-resilience-reader-dedup.md (~320 lines). Note: #3216 (originally folded here as T019) was descoped — the post-tasks squad found its target reader already retired by the prior mission's WP05 (#3245); #3216 closed as already-resolved.

WP05 — accept --json advisories (IC-04) · parallel

Goal: Surface the SC-008 advisory in a uniform top-level advisories array at the CLI emit layer. Priority: P2. Independent test: stranded fixture → advisory present in JSON; converged → empty array. Subtasks: T020, T021, T022. Dependencies: none. Prompt: tasks/WP05-accept-json-advisories.md (~230 lines).

WP06 — Stress CI lane (IC-05) · parallel · CI-infra

Goal: A dedicated -m stress -n0 serial lane so the heavyweight durability test stops riding the fast pool. Priority: P2. Independent test: -m stress selects the durability test in its own serial job; the fast-pool selector no longer collects it. Subtasks: T023, T024, T025. Dependencies: none. Prompt: tasks/WP06-stress-ci-lane.md (~230 lines).

Dependency Graph

WP01 ──▶ WP02
WP03  ── parallel
WP04  ── parallel (red-first)
WP05  ── parallel
WP06  ── parallel

MVP

WP01+WP02 (the single-authority boundary — the mission's core theme). WP03–WP06 are independent hardening lanes that can proceed concurrently.