docs: record closure reconciliation consolidation
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user