Research: Write-Surface Coherence
Phase 0 consolidation. Most of this was resolved by the post-spec adversarial squad (alphonso / debbie / paula / priti, 2026-06-23), which live-traced the actual seams. Findings are recorded as Decision / Rationale / Alternatives.
D-1 — The seam is a single shared placement authority, not N resolvers
(consumed via commit_for_mission) by artifact class, made in the use_coord arm at commit_router.py:124.
resolve_placement_only returns CommitTarget(ref=coordination_branch)` for a coord mission, for both planning and status commits. There is already one entry point and one authority — the split is that it doesn't distinguish artifact class. Fixing the one router arm closes all ≥7 callers.
spec framing) — wrong: they already delegate to one authority; a per-command patch would leave analyze/tasks/accept routing planning to coord (the "fixed 3 of N" trap).
- Decision: Treat the change as a bifurcation of
resolve_placement_only - Rationale: Live trace (debbie): `spec-commit → commit_for_mission →
- Alternatives rejected: "Converge 6 commands onto one resolver" (the original
D-2 — Bifurcate by explicit artifact class, not by inference
explicit input to the placement authority, threaded from the caller.
and status (status_transition.py:332) callers; inferring class from paths is fragile. Status routing must remain unchanged (C-001).
a second parallel resolver (violates C-006 "no parallel read resolver" — and the bifurcation is a destination split, not a new resolver).
- Decision: The artifact class (planning vs status/bookkeeping) is an
- Rationale:
resolve_placement_onlyis shared by planning (commit_router) - Alternatives rejected: Inferring class from filename patterns (brittle);
D-3 — Protected-primary: require a feature branch (no coord transit)
a coord-topology mission on a protected target_branch is refused with guidance to start a feature branch (operator decision 2026-06-23).
topology-driven, not protection-driven; the deadlock guard is safe_commit step 6 (ProtectedBranchRefused/GuardCapability). Requiring a feature branch removes the deadlock by invariant, with no coord-transit special case (cleaner than transiting coord for the commit landing).
commit landing only (more plumbing, keeps a coord special case).
- Decision: Planning commits require a non-protected feature
target_branch; - Rationale: debbie corrected the spec's causal framing — coord routing is
- Alternatives rejected: Transit the coord-worktree materialization for the
D-4 — Shared coord-worktree helpers are entangled; govern them explicitly
_materialise_coord_worktree staging, _try_advance_ref (#1878), and the is_coordination_artifact_residue_path dirty-filter once planning no longer transits coord.
staging copy, and ff-advance; removing planning-on-coord changes their meaning. The ff-advance fast-forwarded primary to a coord HEAD mixing planning+status.
ff-advance on the planning path + an orphaned target_branch param).
- Decision: Add explicit handling (FR-005/IC-03) for
_planning_commit_worktree, - Rationale: alphonso — planning and status currently share the coord worktree,
- Alternatives rejected: Leaving the helpers untouched (would leave dead
D-5 — Read path must stop consulting the coord husk for planning artifacts
not fall back to the coord husk for planning artifacts (FR-006/IC-04).
(the #2062 stale-coord class). The read side converged in 01KVRJ6P but still has consults_coord_husk arms (_read_path_resolver.py, _coord_mid8).
transients #1718/#1848 — KEEP those — but not for planning-artifact husk reads).
- Decision: After writes are primary-always, the planning read path must
- Rationale: paula — a stale pre-mission coord copy could shadow primary truth
- Alternatives rejected: Assuming the read side is fully done (it is for status
D-6 — #2100 fold sized to in-mission sites; name the duplicate load_meta
(agent/mission.py) through canonical load_meta; name/reconcile the duplicate load_meta at task_utils/support.py:363. Defer the remaining ~53-site backlog.
56); the in-mission subset is ~3. Folding the whole backlog would balloon the diff with unrelated modules.
relationship to write-surface coherence).
- Decision: Route only the ~3 inline meta reads in the touched modules
- Rationale: All four reviewers — "~62" is a repo-wide #2100 figure (real count
- Alternatives rejected: Folding the full #2100 backlog here (scope creep, no
D-7 — Verification is behavioral, not structural
(planning→primary target_branch, status→coordination), plus red-first repro of the split and a flattened-regression proof.
passes vacuously today (one authority already exists) and proves nothing.
- Decision: NFR-002 guard asserts two refs from a coord-topology fixture
- Rationale: paula/DIRECTIVE_041 — a "resolved in exactly one function" count
- Alternatives rejected: Structural single-locus count (tautological).
Anchors verified (alphonso)
All named anchors exist and are correctly characterized: primary_feature_dir_for_mission / resolve_handle_to_read_path / candidate_feature_dir_for_mission (_read_path_resolver.py); setup_plan / check_prerequisites (_primary_anchored_feature_dir, PR #2089) / finalize_tasks (agent/mission.py); spec-commit + map-requirements; resolve_placement_only / resolve_topology / routes_through_coordination / CommitTarget (mission_runtime); load_meta family (mission_metadata.py).