91 lines
2.7 KiB
Markdown
91 lines
2.7 KiB
Markdown
# 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. |