✨ Added
- Introduced canonical
mission_runtimeumbrella package (src/mission_runtime/) as the sole
sanctioned execution-state resolver;resolve_action_contextis now the single entry point
for all mission/WP context resolution (epic #1666 slice 2, ADR2026-06-07-1-execution-state-canonical-surface.md). - Added
_branch_trees_equalpredicate in merge command for content-based squash-resume
idempotency (FR-037); replaces ancestry-basedrev-listcheck that failed after squash merges. - Added
path_is_under_worktreesguard to_stage_finalize_artifacts_in_coord_worktree
(FR-035); finalize/implement can no longer stage sources already under.worktrees/, preventing
nested-worktree path pollution on coord-topology missions (#1772 Bug 0). - Added
rebuild_mission_event_logcanonical rebuild entry point for migration paths (#1754). - New ADR
2026-06-07-1-execution-state-canonical-surface.mddocumenting the sole-resolver
boundary and migration contract.
🔧 Changed
status/facade now enforced repo-wide: ~219 deepspecify_cli.status.<sub>imports
collapsed to 21 acrosssrc/specify_cliandsrc/runtime(724 files covered by boundary test).mission_read_path.pyconverted to a thin compatibility shim over the canonical
specify_cli.missions._read_path_resolver; duplicate resolver implementation eliminated.mission_runtime.__all__trimmed to the 4-symbol public contract; historical first-party
names (ActionContext,ActionName,ACTION_NAMES,_resolve_mission_slug) served via
__getattr__without appearing in the public surface.resolve_action_contexttop-level imports moved to deferred (inside function bodies),
breaking themission_runtime → dependency_graph → status → uninitialized_hint → dependency_graph
circular import; coldimport mission_runtimenow works without prior status initialization.FrontmatterSourceandresolve_wp_manifestsrouted through single ownership ports (#1757).- Mission-identity snapshot carry-through added to
runtime_bridge.py(#1663). - Full-sequence parity ratchet (
test_execution_context_parity.py) extended to cover
next → implement → move-task → review → statusacross three execution modes plus a
negative control (#1672).
🐛 Fixed
- Coord-topology merge hardening (#1772):
path_is_under_worktreespredicate applied at
staging;_lane_already_integratedtree-diff gate (fail-loud on zero-diff squash); in-branch
status validation;doctorcheck for tracked.worktrees/content. - Cold import of
mission_runtimeno longer raisesImportError: cannot import name 'detect_cycles' from partially initialized module(circular import via status facade). mission_runtime_api.mdcontract corrected to match actualresolve_action_contextsignature
(action/featurekeyword args, not positionalmission).status_boundary.mdupdated to documentworkspace/context.pyas a permanent third
exemption (import-time cycle breaker); contract and test allow-list now in sync.- Raw
kitty-specs/path construction eliminated from call sites; all paths go through the
single resolver (FR-009). - Closed: #1673, #1664, #1672, #1663, #1757, #1754, #1772.