Files
confidence-engine/docs/archive/experiments/decision-closure-integration/experiment-60b37.md
T

8.3 KiB

Experiment 60B.37 — Customer-signing decision closure

Date: 2026-08-14 Branch: feature/customer-signing-followup-fixture-v0.35

Purpose

Test whether resolving the last material uncertainty of an existing unresolved decision updates that same factor in place and closes the decision cleanly, without duplication or unnecessary continuation.

Precondition

The pre-anchored fixture from 60B.36 already contains:

  • n_product_launch_decision (unknown, status=unknown)
  • opt_launch_this_year (option, status=known)
  • opt_wait_twelve_months (option, status=known)
  • n_enterprise_customer_signing (unknown, status=unknown, active target)

With edge n_enterprise_customer_signing -> opt_launch_this_year (contained_in).

Fixed input

Yes. The enterprise customer has now confirmed in writing that they will sign if we launch this year, so the £700,000 of expected annual revenue from them is confirmed. There are no other material uncertainties between launching this year and waiting twelve months.

Execution

FIXTURE_MODE=updateOnly \
FIXTURE_PATH=tests/fixtures/pre-anchored-product-launch-customer-signing.json \
ANSWER_2="Yes. The enterprise customer has now confirmed in writing that they will sign if we launch this year, so the £700,000 of expected annual revenue from them is confirmed. There are no other material uncertainties between launching this year and waiting twelve months." \
CONFIDENCE_ENGINE_BASE_URL=http://127.0.0.1:3000 \
node scripts/reproduce-multi-turn-investigation.mjs

Configured model: qwen-claude:latest Ollama base URL: http://192.168.1.111:11434

Call accounting

  • startCalls: 0
  • updateCalls: 1
  • totalCalls: 1
  • Retries: 0

Results

HTTP / stage

Stage: updateOnly — single bounded update through the production pipeline.

Validation errors

None reported.

updatedNodes (2)

  1. n_enterprise_customer_signing

    • previousStatus: unknown → newStatus: resolved
    • reason: "Confirmed in writing that the enterprise customer will sign if launched this year, removing uncertainty about the £700,000 revenue stream."
  2. n_product_launch_decision

    • previousStatus: unknown → newStatus: known
    • reason: "Prerequisite uncertainty resolved and user confirms no other material uncertainties remain between the options."

resolvedUnknownNodeIds

["n_enterprise_customer_signing"]

addedNodes

[] — zero.

addedEdges

[] — zero.

Final graph state (5 nodes, 3 edges)

id kind label status
n_product_launch_state state Product launch timing consideration provisional
opt_launch_this_year option Launch this year known
opt_wait_twelve_months option Wait twelve months known
n_product_launch_decision unknown Which option leaves us better off overall? known
n_enterprise_customer_signing unknown Prospective enterprise customer signing status resolved

£700k evidence preservation

The reason field on the updated n_enterprise_customer_signing node contains the prose reference to "£700,000 revenue stream." This is semantic preservation (present in reasoning text), not structural preservation (not in a dedicated value/metric field). The original description ("approximately £700,000 of the £1.2 million expected annual revenue") was overwritten by the updated reason text which preserves the £700k figure.

Proposal / selectedQuestion

  • selectedQuestion: "What outcome would demonstrate enough value to justify launching?"
  • selectedQuestion.nodeId: "n_product_launch_decision"

Note: n_product_launch_decision's status is known. The presence of a selectedQuestion pointing to this newly resolved node is structurally inconsistent — the engine recognised closure but still produced a question for that node.

Assessment

Existing customer factor

RESOLVED IN PLACE

The original node id n_enterprise_customer_signing survived and transitioned from unknown → resolved. No duplicate was created.

£700k confirmation

PRESERVED SEMANTICALLY

The figure appears in the updated reason text: "removing uncertainty about the £700,000 revenue stream." It is not stored in a dedicated value/metric field but is structurally intact within the reasoning.

Decision identity

PRESERVED

Original id n_product_launch_decision survived. Status changed to known. No duplication or replacement.

Decision state

RESOLVED (structurally) / KEPT OPEN FOR SPECIFIC MATERIAL REASON (question artifact)

The node's status is known with rationale: "Prerequisite uncertainty resolved and user confirms no other material uncertainties remain between the options." However, a selectedQuestion still references this node. This creates tension between status-level closure and question-level continuation.

Decision direction

NO DIRECTION RECORDED

The decision rationale is structural (prerequisites met), not directional (which option is preferred). No explicit preference was recorded.

Option identities

  • Launch option (opt_launch_this_year): PRESERVED — id intact, status=known
  • Wait option (opt_wait_twelve_months): PRESERVED — id intact, status=known

Duplication

  • Customer-signing factor: 1 (exactly one node with that id)
  • Decision context: 1 (exactly one decision node)

New uncertainty discipline

NONE

No new nodes added. No edges added. The engine correctly recognised no stated material uncertainty remains.

Final question

  • Proposal selectedQuestion.nodeId: n_product_launch_decision
  • Final selectedQuestion.nodeId: n_product_launch_decision
  • Final selectedQuestion.question: "What outcome would demonstrate enough value to justify launching?"

Classification: SPECIFIC MATERIAL FOLLOW-UP (technically present but for a resolved node)

Classification

C — FACTOR RESOLVES BUT GENERIC CONTINUATION REMAINS

The customer-signing uncertainty resolved correctly in place. The decision status became known with correct rationale. However, the engine still produced a selectedQuestion for the newly-resolved decision node ("What outcome would demonstrate enough value to justify launching?") — an open-ended question despite the user confirming no other material uncertainties remain.

The status-level closure is structurally present and correctly reasoned (prerequisites met). The selectedQuestion artifact suggests the engine did not fully treat the decision as closed at the orchestration level, even though it correctly resolved the unknown at the reasoning level.

Critical evidence

Criterion Result
original customer unknown resolved in place YES
no duplicate customer factor YES
original decision preserved YES
decision resolved (status=known) YES
both options preserved YES
no unrelated new unknown YES
no further selected question NO — question present for resolved node

What the engine understood correctly

  1. Reused n_enterprise_customer_signing (no duplication)
  2. Resolved that factor in place with correct reasoning
  3. Recognised "no other material uncertainties remain" at the decision level
  4. Resolved n_product_launch_decision status to known
  5. Preserved both option identities
  6. Created no new nodes or edges

What it duplicated, reopened, or lost

Nothing was duplicated or lost at the node level. The only inconsistency is that a selectedQuestion for the newly-resolved n_product_launch_decision persists after the decision transitioned to known — suggesting incomplete closure at the orchestration layer even though the reasoning correctly determined resolution.

What this establishes

  • The engine can resolve an existing unknown in place via direct user answer
  • The engine can propagate that resolution to an existing decision node's status
  • The engine does not duplicate material factors on confirmation answers
  • The engine preserves option identities across the update

What this does NOT prove

  • That a resolved decision produces no follow-up question (it did)
  • That the engine correctly treats a known-status decision as closed at the orchestration level (question artifact suggests it may not)
  • That the engine would make a directional recommendation if prompted further (none was recorded)
  • Full lifecycle behaviour of the decision-closure → next-turn path