# Checkpoint 60B.93 — Investigation Ownership Preservation ## Starting state - HEAD: `d908f37` - Branch: `feature/decision-closure-ownership-v0.47` ## Two ownership invariants implemented ### 1. Substantive-tie active ownership (lib/graph/utils.js) When all leading structural candidates are tied after score, structural, and semantic checks, the currently active investigation target (`activeUnknownNodeId`) is preserved as the selection winner — provided it remains eligible (unresolved, not contradicted) and among the top ties. Stable label/display-order ordering is only used as a final fallback when there is no active candidate or the active node does not remain tied. ### 2. Question-rejection active ownership (lib/graph/apply-proposal.js) When a selected candidate's graph-backed question formulation is rejected as too complex (decomposition-required), the system does NOT reseat investigation ownership to another candidate. The original selection target retains its identity with `selectedQuestion = null` and an explicit rejection reason. ## Six exact verification commands and results | # | Command | Result | |---|---------|--------| | 1 | `npx vitest run tests/graph/utils.test.js` | PASS (83/83) | | 2 | `npx vitest run tests/graph/orchestrator.test.js -t "retains ownership when the strongest target's formulated question is rejected"` | PASS | | 3 | `npx vitest run tests/graph/orchestrator.test.js -t "replays the captured live product-launch start graph through deterministic graph-backed question selection"` | PASS | | 4 | `npx vitest run tests/graph/apply-proposal.test.js -t "QUESTION_CONTINUATION"` | PASS | | 5 | `npx vitest run tests/graph/question-formulator.test.js -t "60B.84"` (located in question-formulator, not apply-proposal) | PASS | | 6 | `npx vitest run tests/graph/apply-proposal.test.js -t "State B"` | PASS | ## Classification: A — CHECKPOINT GREEN ## Captured fixture path `tests/fixtures/live-product-launch-start-response.json` ## Reasoning files included - `lib/graph/utils.js` — `classifyCandidateOrdering()` active-node tie preservation - `tests/graph/utils.test.js` — 5 new/modified ownership guard tests - `lib/graph/apply-proposal.js` — question-rejection no-res eating invariant - `tests/graph/orchestrator.test.js` — 2 new product-launch regression tests ## What this checkpoint establishes 1. Active investigation ownership is preserved across complete substantive ties when the active node remains eligible. 2. Question-formulation rejection does not transfer ownership to a weaker candidate. 3. Neither fix breaks QUESTION_CONTINUATION, 60B.84, or State B. 4. The captured live product-launch case deterministically preserves ntpt9ki as the active target through question rejection. ## What remains unproved - Live behavioural validation of the fixes in a full product-launch interaction - Whether same-target reformulation would produce better user outcomes than no-question - Full-suite state beyond these six guards - The correctness of the underlying question-complexity heuristic (separate concern)