experiment: define decision closure integration boundary

This commit is contained in:
2026-08-14 13:43:43 +01:00
parent 100dfa2be5
commit 7ee9b197ab
2 changed files with 383 additions and 0 deletions
+91
View File
@@ -3095,3 +3095,94 @@ Vitest run: NO
- Docs: `docs: record decision factor detection`
**Next step:** Decision-sufficiency closure integration remains a separate next experiment.
## Experiment 60B.62 — Decision Closure Integration Boundary (read-only design analysis)
**Status: PASSED (design-only, no production code changes)**
### Objective
Identify the exact deterministic integration point in `applyValidatedProposal` and the exact existing representation of "no other material uncertainties remain" that can safely trigger parent-decision closure.
**Answer: Model C (graph sufficiency + bounded confirmation signal) integrates at Candidate D (post-propagation).**
### Traced Lifecycle
Full `applyValidatedProposal` traced line-by-line:
1. **Line 3537**`reconcileResolutionSemantics(graph, proposal)`
2. **Line 3635** — proposal compatibility errors (blocking)
3. **Line 3694** — second `applyGraphUpdate` (final mutation)
4. **Line 3703+**`updatedSituationGraph` exists with post-mutation status
5. **Line 3765**`propagateResolvedChildEvidence` (decomposition-child propagation only)
6. **Line 39964019** — model-selection honour for proposed target
7. **Line 4049+** — question formulation and reseat logic
8. **Line 4285** — return
The `answer` parameter is available at every point as a direct argument. `validatedProposal.answerMeaning.userSupportedMeaning` is available after validation (line 3537+).
### Checkpoint 1 — User-Confirmation Signal
| Field | Available Before Mutation | Model Generated | Safe as Confirmation | Why |
|-------|--------------------------|-----------------|---------------------|-----|
| `answer` (raw string) | YES | PARTIAL | CONDITIONAL | No bounded helper exists for "no other material differences" pattern. |
| `updatedNodes[].reason` | YES | MODEL GENERATED | CONDITIONAL | The exact 60B.56 proposal includes `reason: "With customer signing confirmed and no other material uncertainties remaining, the decision is closed."` — a naturally bounded pattern already produced by the prompt. |
**Winning signal: `updatedNodes[].reason` on the parent decision update.** Requires no schema change; leverages existing model output.
### Checkpoint 2 — Raw User Statement vs Model Interpretation
- Raw answer available at integration point: **YES**
- userSupportedMeaning available: **YES**
- Safest existing signal: **BOTH** — raw answer provides ground truth; userSupportedMeaning provides classified meaning. Neither alone gives deterministic confirmation without bounded text matching.
### Checkpoint 3 — Lifecycle Candidates
**Candidate A (reconciliation):** Graph not post-mutation. NO closure. HIGH validation risk.
**Candidate B (pre-mutation):** Graph not post-mutation. NO closure. HIGH validation risk.
**Candidate C (post-mutation, pre-decomposition):** Complete graph visible BUT decomposition may add new unresolved factors that should block closure. CONDITIONAL safety.
**Candidate D (post-propagation):** Complete post-mutation + post-decomposition graph visible before any question-selection locks targets. LOWest interference risk. **WINNER.**
**Candidate E (active-target selection):** Too late — model-selection honour logic already set, question formulation started. Complex override needed.
### Checkpoint 4 — Closure Mutation Semantics
- Preferred terminal status: **`resolved`** — canonical for evidence-sufficient decisions (60B.43/60B.56 tests use it)
- Decision ID to resolvedUnknownNodeIds: **YES** — prevents `selectActiveUnknownCandidate` from re-selecting it
- Existing mutation path: upsert into `proposalSnapshot.updatedNodes` + push to `resolvedUnknownNodeIds` (mirrors propagateResolvedChildEvidence pattern at line 978-985)
### Checkpoint 5 — Closure Without Direction
- Can close without direction: **YES** structurally — no validator requires preferred option
- Implies recommendation: **NO** — status="resolved" carries no option preference
- Validator rejects closure without direction: **UNPROVEN** — never tested; propagateResolvedChildEvidence resolves parents unconditionally
### Checkpoint 6 — Counterexample
`makeProductLaunchClosureFixture({ includeFallbackUnknown: true })` — customer factor resolved but `n_other_market_evidence` (may_cause → option) remains unresolved. `hasRemainingMaterialFactors = true`. Decision stays open under any winning model.
### Checkpoint 7 — No-Confirmation Case
**Choice: B — KEEP OPEN.** Without confirmation, cannot distinguish genuine sufficiency from accidental factor elimination. Cost of delayed closure << cost of premature wrong decision.
### Model Assessment Summary
| Model | Fixes 60B.56 | Premature-Closure Risk | Schema Change |
|-------|-------------|----------------------|---------------|
| A (graph only) | YES | HIGH — closes on any resolution event | NO |
| B (confirmation only) | CONDITIONAL | MEDIUM — needs text matching | NO |
| C (graph + confirmation) | YES | LOW — both conditions required | NO |
| D (model owns closure) | NO (baseline failure) | NONE | NO |
### Critical Distinction: C — GRAPH + USER CONFIRMATION SHOULD CLOSE
Both must agree: structural guarantee + model's stated recognition of sufficiency.
### Minimum Corrective Boundary: E — new helper for explicit confirmation + one integration point
```
1 new bounded pattern-match helper (updatedNodes[].reason)
1 integration at candidate D (post-propagation)
0 schema/prompt/test changes
```
**Verification against decision criteria:** 8/8 pass. Positive closure valid, genuine remaining factors keep decision open, no-confirmation keeps decision open, direction remains separate.
### Implementation Readiness: A — READY FOR BOUNDED IMPLEMENTATION