4.5 KiB
Experiment 60B.69 — Post-Refactor Deterministic Closure Path Replay
Date: 2026-08-14
Branch: feature/decision-sufficiency-module-v0.44
Experiment commit: 1ca5026 experiment: confirm post-refactor live equivalence
Objective
When the post-refactor production code receives the exact proposal shape where only the customer factor resolves and the parent decision remains unknown, does the extracted decision-sufficiency.js path close that existing decision exactly as the pre-refactor 60B.66 path did?
Hypothesis
Customer factor: updated → resolved (in place)
Parent decision: NOT updated by proposal (remains unknown entering applyValidatedProposal)
Raw answer contains confirmation phrase: "There are no other material uncertainties between launching this year and waiting twelve months."
Expected post-mutation:
customer status = resolved
decision status = resolved (via deterministic closure, not via proposal mutation)
decision value = null (no directional recommendation invented by closure)
activeUnknownNodeId = null
selectedQuestion = null
resolvedUnknownNodeIds contains both customer and decision
addedNodes = []
addedEdges = []
Critical distinction
This experiment is NOT asking whether the LLM produces a good closure proposal.
It asks: when the deterministic closure path is actually required, does the post-refactor production path still behave exactly like the pre-refactor baseline?
Apparatus
The existing regression 60B.64 — explicit decision sufficiency closure > Test 1 already exercises the exact 60B.56-shaped proposal:
- Proposal: only
n_enterprise_customer_signingupdated to resolved;n_product_launch_decisionNOT inupdatedNodes - Raw answer: "There are no other material uncertainties between launching this year and waiting twelve months." (confirmation phrase)
- Parent decision enters as unknown → must be resolved by deterministic closure
No new harness created. The existing regression is reused directly.
Baseline comparison
| Field | 60B.66 (pre-refactor live) | 60B.64 Test 1 (post-refactor deterministic replay) |
|---|---|---|
| Proposal accepted | YES | YES |
| Customer status | resolved | resolved |
| Decision status | resolved (unknown→resolved via closure) | resolved (unknown→resolved via closure) |
| Decision value | null | null |
| activeUnknownNodeId | null | null |
| selectedQuestion | null | null |
| addedNodes | [] | [] |
| addedEdges | [] | [] |
| resolvedUnknownNodeIds | ["n_enterprise_customer_signing", "n_product_launch_decision"] | includes both customer and decision |
Test run
Command
npx vitest run tests/graph/apply-proposal.test.js tests/graph/decision-sufficiency.test.js -t "60B.69|60B.64|60B.67"
Result: 8 passed (all from 60B.64 — explicit decision sufficiency closure)
All 32 pure decision-sufficiency module tests also pass independently.
Classification: A — EXACT DETERMINISTIC EQUIVALENCE CONFIRMED
The post-refactor production path receives an unresolved parent decision and deterministically produces the same clean closure baseline:
decision -> resolved
activeUnknownNodeId -> null
selectedQuestion -> null
no direction invented
Evidence conclusion
PRE-REFACTOR LIVE BASELINE:
60B.66 PASS
POST-REFACTOR DETERMINISTIC EXACT-PATH REPLAY:
60B.69 PASS (via existing 60B.64 Test 1 regression)
POST-REFACTOR LIVE OPERATIONAL CHECK:
60B.68 PASS, DIFFERENT MODEL PROPOSAL SHAPE
CONCLUSION:
The structural extraction is sufficiently evidenced as zero-semantic-change for the customer-signing decision-sufficiency path.
What this proves
- The extracted
decision-sufficiency.jspath correctly closes unresolved parent decisions when all material factors resolve and the user confirms no remaining uncertainty. - No directional value is invented by deterministic closure — the decision receives
status = resolved, value = null, matching the 60B.66 baseline. - Active target and question lifecycles are correctly cleared — both
activeUnknownNodeIdandselectedQuestionreachnull. - No spurious graph mutations — zero added nodes, zero added edges.
- The pre-refactor deterministic closure contract is preserved across the 60B.67 structural extraction refactor.