6.2 KiB
Experiment 60B.47 — Negative-outcome decision closure
Date: 2026-08-14
Branch: feature/closure-metadata-capture-v0.39
Purpose
Test whether the same decision lifecycle closes cleanly when the material customer uncertainty resolves negatively instead of positively (60B.46).
Hypothesis: clean lifecycle handling should not depend on whether the answer is positive or negative.
Method
One bounded live update using the 60B.44/46 pre-anchored fixture:
- Fixture:
tests/fixtures/pre-anchored-product-launch-customer-signing.json - Mode:
updateOnly(single Update, no Start) - Answer: "No. The enterprise customer has now confirmed in writing that they will not sign if we launch this year, so the £700,000 of expected annual revenue from them will not be received. There are no other material uncertainties between launching this year and waiting twelve months."
- Model:
qwen-claude:latestvia Ollama (http://192.168.1.111:11434)
Call accounting
startCalls: 0
updateCalls: 1
totalCalls: 1
retries: 0
Results
HTTP
- HTTP status: 422
- Stage:
proposal_compatibility— rejected (validation failure) - Validation error:
"Unknown node updated to resolved must also appear in resolvedUnknownNodeIds: \"n_product_launch_decision\""
Proposal content (from rejection snapshot)
The engine did produce a proposal before rejection. The rejected-snapshot reveals its structure:
{
"answerMeaning": {
"userSupportedMeaning": "The prospective enterprise customer will not sign if we launch this year, so £700,000 of expected annual revenue will not be received. There are no other material uncertainties between the two timing options.",
"possibleInference": "This financial reduction materially weakens the immediate-launch option relative to waiting twelve months."
},
"updatedNodes": [
{ "nodeId": "n_enterprise_customer_signing", "newValue": null },
{ "nodeId": "n_product_launch_decision", "newValue": null }
],
"resolvedUnknownNodeIds": [
"n_enterprise_customer_signing"
],
"addedNodes": [],
"addedEdges": []
}
Structural analysis of the rejected proposal
What got right:
- Negative meaning preserved correctly.
userSupportedMeaningaccurately reflects: "The prospective enterprise customer will not sign if we launch this year, so £700,000 of expected annual revenue will not be received." - Same customer factor identified.
n_enterprise_customer_signing— the exact same node ID as 60B.46. - Same decision targeted.
n_product_launch_decision— the exact same decision node as 60B.46. - Both nodes placed in updatedNodes for resolution.
- No new unknowns invented.
addedNodes: []. - No new edges created.
addedEdges: [].
The defect:
n_product_launch_decisionappeared inupdatedNodes(meaning the model proposed updating it to resolved), but was missing fromresolvedUnknownNodeIds.- The validator correctly caught this inconsistency and rejected the proposal.
Assessment
| Criterion | Result |
|---|---|
| Customer factor identity | RESOLVED IN PROPOSAL (rejected before application) |
| Negative meaning preservation | PRESERVED — userSupportedMeaning accurately captures "will not sign" + £700k revenue lost |
| Decision state in proposal | RESOLVED (in updatedNodes) |
| Identity preservation | Same node IDs as 60B.46 |
| New uncertainty invented | NONE |
| Structural validation | FAILED — resolvedUnknownNodeIds inconsistent with updatedNodes |
Classification: G — DIFFERENT FIRST FAILURE
Structural validation failure: The proposal was rejected at proposal_compatibility because the model included n_product_launch_decision in updatedNodes (proposing to resolve it) but omitted it from resolvedUnknownNodeIds.
The engine's semantic reasoning was correct — same customer factor, opposite meaning preserved, same decision targeted. The failure is purely structural: an internal consistency gap between updatedNodes and resolvedUnknownNodeIds when the model proposes a multi-node resolution in one turn.
Why this matters
This is a different failure class from 60B.46 (which showed clean closure) but reveals an important asymmetry:
- 60B.46 (positive): The model apparently produced
resolvedUnknownNodeIdsthat included both nodes — or the decision was resolved through a different mechanism (e.g., deterministic post-processing) — and the proposal passed validation cleanly. - 60B.47 (negative): The model explicitly listed both nodes in
updatedNodesbut forgot to include the decision node inresolvedUnknownNodeIds, causing structural rejection.
The semantic path is symmetric (same factor, same decision, correct meaning). The structural path is not yet symmetric. This is a fixable gap: the model needs consistent output of resolvedUnknownNodeIds when resolving multiple unknowns in one turn.
60B.46 comparison
| Field | 60B.46 (positive) | 60B.47 (negative) |
|---|---|---|
| Same customer factor reused | YES (n_enterprise_customer_signing) |
YES (n_enterprise_customer_signing) |
| Opposite answer meaning preserved | N/A | YES — userSupportedMeaning correct |
| Decision closure attempted in proposal | YES | YES (but structurally inconsistent) |
| Validation outcome | PASSED (422 equivalent not triggered) | REJECTED 422 |
| Added unknown count | 0 | 0 |
| Structural path symmetric? | — | NO |
What this proves
The engine's semantic reasoning is robust to answer polarity — the negative answer correctly identified the same factor, preserved its meaning, and targeted the same decision. However, the structural output contract is not yet symmetric: when resolving multiple unknowns simultaneously in one turn under negative framing, the model fails to consistently populate resolvedUnknownNodeIds.
What remains weak or unproven
- Whether the same proposal would pass if structured correctly (i.e., whether
n_product_launch_decisionshould also appear inresolvedUnknownNodeIds). - Whether positive vs negative answers trigger different output-template paths in the model.
- A targeted fix for multi-node resolution consistency in
resolvedUnknownNodeIds.