diff --git a/docs/current-handoff.md b/docs/current-handoff.md index a2b6351..3cd33fa 100644 --- a/docs/current-handoff.md +++ b/docs/current-handoff.md @@ -250,6 +250,14 @@ Experiment 54N tested whether an interpretation disagreement can be judged for m - Focused validation passed via `npx vitest run tests/reproduce-multi-turn-investigation.harness.test.js` (`67/67`). - The exact 60B.44 live closure case can now be rerun once with direct evidence for active-target clearing and final-question clearing. +### 60B.55 closure-normalization consolidation + +- Consolidated the proven closure-normalization fix: reverse resolution reconciliation, same-turn stale `selectedQuestion` clearing before strict validation, prompt clarification that `selectedQuestion` must remain unresolved after applying the proposal, and repaired deterministic 60B.47 regression structure. +- Focused verification passed via `npx vitest run tests/graph/apply-proposal.test.js tests/graph/prompt-builder.test.js -t "60B.49|60B.52|60B.54|60B.43|60B.11|replaces downstream pricing|selectedQuestion|resolution"` (`38 passed | 151 skipped`). +- Verified exact negative closure state deterministically: customer resolved, decision resolved, both resolved IDs present, `activeUnknownNodeId = null`, `selectedQuestion = null`. +- Existing forward reconciliation, fallback-to-real-unresolved target, 60B.43, 60B.11, pricing prerequisite-first, and prompt-builder selectedQuestion rule all remained green. +- Repository is now ready for one bounded live rerun of the exact 60B.47 negative-outcome closure. + ### When This Knowledge-Management Phase Is Complete Provisional criteria for review (all confirmed met by Experiment 38 cold-start test): diff --git a/docs/experiment-60b55.md b/docs/experiment-60b55.md new file mode 100644 index 0000000..e940130 --- /dev/null +++ b/docs/experiment-60b55.md @@ -0,0 +1,91 @@ +# Experiment 60B.55 — Closure-normalization consolidation + +**Date:** 2026-08-14 +**Branch:** `feature/closure-selection-reconciliation-v0.41` + +## Purpose + +Consolidate and commit the already-proven closure-normalization fix after focused regression verification. + +## Implementation state consolidated + +The committed fix consists of four bounded changes only: + +1. reverse resolution reconciliation + - `updatedNodes.newStatus = "resolved"` + - `-> resolvedUnknownNodeIds` automatically includes that existing unknown node + +2. stale same-turn selectedQuestion clearing + - if `selectedQuestion.nodeId` is resolved by the same proposal + - `-> selectedQuestion = null` before strict validation + +3. prompt clarification + - `selectedQuestion` must remain unresolved after applying the proposal + - if all consequential unknowns resolve, `selectedQuestion` must be null + +4. repaired deterministic 60B.47 negative-closure regression structure + +## Focused verification result + +Command run: + +```bash +npx vitest run \ + tests/graph/apply-proposal.test.js \ + tests/graph/prompt-builder.test.js \ + -t "60B.49|60B.52|60B.54|60B.43|60B.11|replaces downstream pricing|selectedQuestion|resolution" +``` + +Result: + +- PASS — `38 passed | 151 skipped` + +## Verified behaviours + +### Exact negative closure regression + +The exact 60B.47-shaped deterministic regression now passes through `applyValidatedProposal(...)` with: + +- customer factor resolved +- decision resolved +- `resolvedUnknownNodeIds` / resulting `resolvedNodeIds` containing both IDs +- `activeUnknownNodeId = null` +- `selectedQuestion = null` + +### Reconciliation invariants + +Verified preserved: + +- forward reconciliation +- already-consistent proposal unchanged +- no duplicate resolved IDs +- non-unknown nodes are not auto-added +- non-resolved statuses are not auto-added + +### Fallback preservation + +Verified preserved: + +- stale same-turn resolved selectedQuestion clears cleanly +- another genuine unresolved candidate still becomes the fallback target + +### Existing behavioural regressions preserved + +Verified preserved: + +- 60B.43 terminal post-mutation closure regression +- 60B.11 preferred-target behaviour +- pricing prerequisite-first regression +- prompt-builder selectedQuestion rule regression + +## What is now guaranteed + +The deterministic engine now normalizes same-turn closure structure coherently before strict validation: + +- resolved existing unknowns are represented in both status and `resolvedUnknownNodeIds` +- a same-turn resolved `selectedQuestion` cannot survive as stale structure +- strict validator semantics remain intact + +## What remains unproven + +The exact live negative-outcome closure still needs one bounded rerun after this deterministic fix to confirm the same end state through the live model-driven path. \ No newline at end of file