Patch release continuing the post-3.2.0 stabilization, focused on the
coordination/primary surface-resolution ("split-brain" / file-location)
remediation. Remediation of these recent file-location issues is ongoing, but
progress is significant enough to warrant a new release — we will continue stabilizing
the functionality. This release also adopts a coherent test-flakiness policy, hardens
CI test coverage, and decomposes the agent/tasks.py god-module.
✨ Added
- Single, kind- and topology-aware artifact-surface authority (split-brain remediation).
Mission planning artifacts and reads/writes now resolve through one canonical surface
authority instead of drifting between the coordination worktree and the primary checkout:MissionTopologySSOT +routes_through_coordinationroute every decision site through
one classifier; a single read-surface resolver and a single write-surface authority
replace the parallel derivations (#2070, single-authority topology cleanup).- Planning + identity artifacts are placed by a kind-aware
MissionArtifactKindpartition —
planning/identity kinds land on the primarytarget_branchfor all topologies; status/
bookkeeping stays on coordination (#2090 write-surface coherence; ADR for kind- and
topology-aware placement, #2101). - The planning-lifecycle gate/verify commands (
setup-plan,accept,map-requirements,
record-analysis,research, and thefinalize-taskscommit) now read/commit planning
artifacts via that seam — closing the case where a coord-topology mission authored on
primary but verified from coordination (#2113; closes #2107, #2085, #2102). A default-deny
architectural literal-ban ratchet prevents the class from regrowing.
- CI test-coverage hardening. A static gate-coverage checker + orphan ratchet flags tests
selected by zero CI gates and ratchets the backlog down (#2067, folds #1933); hot
churn-magnet orphans andtests/runtime/are now gated and run on every PR (#2108, #2109, #2111). - Maintainability: the 4633-LOC
agent/tasks.pygod-module is decomposed into five cohesive,
one-way-import seam modules with a byte-identical CLI surface; the three planning-commit tails
are centralized throughcommit_for_mission(#2058 / #2114; follow-up body-thinning + FR-007
consolidation tracked in #2116). - Test-flakiness handling policy (#2038): a suite-wide policy (
docs/development/testing-flakiness.md)
— never retry-to-green; three tiers (budget / correctness / environmental), each with one sanctioned
response — plus an env-gated, non-blockingquarantinepytest marker (held out of every normal/
blocking run unlessSPEC_KITTY_RUN_QUARANTINE=1), distinct from the mutmut-deselectionflakymarker.
🐛 Fixed
- Surface-resolution "split-brain" / file-location fixes (coordination vs primary).
- Mission-identity reads (mid8 /
mission_id) are anchored on the primary surface, so a
coord-topology mission no longer builds a malformed coordination branch from an empty mid8 (#2091). finalize-tasksaligns on the primary planning surface and the ownership-overlap validator is
lane/dependency-aware — dependency-ordered WPs that legitimately shareowned_filesare no
longer falsely rejected (#2087, #2088).- The read path no longer returns a stale coordination "husk" for a flattened/single-branch mission:
the stored topology gates the husk short-circuit (#2062);map-requirementsandfinalize-tasks
share one WP-frontmatter read surface (#2064). - Write-branch resolvers (
get_feature_target_branch,resolve_target_branch, thefinalize-tasks
commit) readmeta.jsonon the primary surface, so commits no longer silently fall back to the
repo defaultmainunder coordination topology.
- Mission-identity reads (mid8 /
- Coord-topology orchestration: WPs reached
donewith nothing committed or integrated. Three fixes,
all on the externalorchestrator-apipath for coordination-topology missions:start-implementationno longer crashed withTypeError: transactional status batch only supports one feature/mission/wp— the transactional batch guard now anchors the per-request consistency check on the
first request's canonicalized dir (matching the non-transactional sibling) instead of the resolved primary
anchor, which legitimately differs from the coord-worktree request surface.append-historynow commits the WP prompt file from the coordination worktree (via the canonical
resolve_placement_onlytarget) instead of the primary checkout, fixing aSAFE_COMMIT_PATH_POLICY
refusal that stalled the orchestrate loop.start-implementationnow allocates the real lane worktree (lane branch on the coordination branch,
with dependency-lane tips merged) instead of returning a bare legacy path, somerge-missionhas a lane
branch to integrate and dependent WPs see their dependencies' code. Its response now carrieslane_id,
lane_branch, andlane_base_ref, andworkspace_pathnow means that lane worktree. Thefor_review
transition is gated on a real commit existing beyond the lane base (shared with the nativemove-task
gate), so "done without a commit" is impossible via the API too.- Both
spec-kitty mergeandorchestrator-api merge-missionnow resolve the target branch from the
primary-checkout meta.json (merge_target_branchthentarget_branch) via one shared resolver
(core.paths.resolve_merge_target_branch), instead of the coord-aware read surface — which under
coordination topology has no meta.json and made the resolver silently fall back to the repo default
(main), merging the mission into the wrong branch (and tripping a downstreamSafeCommitHeadMismatch).
Explicit--targetstill wins; the repo default is only used when no mission target is set.
- Non-deterministic xdist collection in
tests/specify_cli/shims/test_registry.py(#2038): the
frozenset-derived parametrize sets are nowsorted(), so workers collect an identical order
(root-cause fix — no retry).
⚠️ Contract
orchestrator-apiCONTRACT_VERSIONbumped to 1.1.0: additivestart-implementationresponse fields
(lane_id,lane_branch,lane_base_ref) and a changed meaning forworkspace_path(now the lane
worktree). New error codeLANE_ALLOCATION_FAILED.