Files
confidence-engine/docs/experiment-59a3.md
T

216 lines
8.9 KiB
Markdown

# Experiment 59A.3 — Known vs Uncertain Consequence Structure
**Branch:** `feature/question-formulation-v0.24`
**Date:** 2026-08-12
**Status:** Complete
**Following:** 59A.2 which showed partial decomposition (delivery impact structured but engineer loss left only in text, no epistemic separation).
## Objective
When the user states one consequence as known ("two senior engineers will leave") and a downstream consequence as uncertain ("whether losing them would delay delivery"), does the proposal represent them as separate structural objects with different epistemic states?
This isolates that distinction without the extra £2m-resolution step from 59A.1/59A.2.
## Context route
Read only:
- `docs/current-handoff.md` (sections 59A.1, 59A.2)
- Fixture: `tests/fixtures/pre-anchored-update-savings-realism.json`
- Harness: `scripts/reproduce-multi-turn-investigation.mjs`
Do not load older experiment history.
## Fixed starting graph
Fixture: `tests/fixtures/pre-anchored-update-savings-realism.json`
Existing unresolved question:
```
n_savings_realism — Are the projected office savings from relocation realistic? — status = unknown
```
## Fixed answer
```text
We know that relocating would cause two senior engineers to leave. What I don't know is whether losing them would delay delivery, or by how many months.
```
The answer contains two semantically different assertions:
1. **Known consequence:** two senior engineers will leave (epistemic state = known)
2. **Uncertain consequence:** whether/when that loss delays delivery (epistemic state = unknown)
Note: this version omits the £2m savings confirmation present in 59A.2, isolating only the known-vs-unknown distinction.
## Execution
**Host/model:** qwen-claude:latest at http://192.168.1.111:11434
**Calls:** startCalls=0, updateCalls=1, totalCalls=1
**Retries:** 0
---
## Results
### UPDATE output
```
HTTP status: 422
Stage: proposal_compatibility
Error: "selectedQuestion must be a single non-compound question"
```
### Rejected proposal snapshot (from diagnostics.rejectedProposalSnapshot)
#### answerMeaning
- `userSupportedMeaning`: "Relocating will cause two senior engineers to depart; it is currently unknown whether this loss will delay project delivery or determine the magnitude of such delays."
- `possibleInference`: "The financial savings from relocation may be negated by productivity losses and delivery delays caused by losing key technical staff."
#### Proposal mutations
```json
{
"updatedNodes": [],
"resolvedUnknownNodeIds": [],
"addedNodes": [
{
"id": "n_talent_departure",
"kind": "observation",
"label": "Senior engineer turnover from relocation",
"description": "Relocating would cause two senior engineers to leave.",
"parentId": null,
"dependsOn": ["n_relocation_state"],
"affects": ["n_delivery_delay_impact"],
"childIds": []
},
{
"id": "n_delivery_delay_impact",
"kind": "unknown",
"label": "Delivery delay impact from lost engineers",
"description": "Whether losing the two senior engineers will delay project delivery and by how many months; matters because it determines if productivity loss outweighs office savings.",
"parentId": null,
"dependsOn": ["n_talent_departure"],
"affects": ["n_relocation_state"],
"childIds": []
}
],
"addedEdges": [
{
"fromNodeId": "n_delivery_delay_impact",
"toNodeId": "n_talent_departure",
"relationship": "depends_on"
}
]
}
```
#### selectedQuestion
`null` (no selected question produced — caused the rejection at proposal_compatibility)
---
## Reasoning Assessment
### Known engineer loss
- Created dedicated node `n_talent_departure`:
- kind = **observation** (not unknown, not provisional)
- label: "Senior engineer turnover from relocation"
- description: "Relocating would cause two senior engineers to leave."
- depends_on: n_relocation_state
- affects: [n_delivery_delay_impact]
- `affects` field carries a **typed structural link** to the downstream uncertainty node.
**Classification: SEPARATE KNOWN STRUCTURE**
The engineer departure is not embedded in text or left uncertain — it is its own observation node with status derived from kind=observation (a factual assertion, not an unresolved question). This is a correct epistemic state for a known consequence.
### Delivery impact
- Created dedicated node `n_delivery_delay_impact`:
- kind = **unknown**
- status = unknown
- label: "Delivery delay impact from lost engineers"
- description: "Whether losing the two senior engineers will delay project delivery and by how many months..."
- depends_on: [n_talent_departure]
- The `dependsOn` field is populated with the known-consequence node — a **typed structural link**.
**Classification: SEPARATE UNRESOLVED STRUCTURE**
Delivery uncertainty is its own unknown node with proper kind=status=unknown and structural linkage back to the known consequence via depends_on.
### Epistemic separation
- `n_talent_departure` (kind=observation) = known factual consequence
- `n_delivery_delay_impact` (kind=unknown, status=unknown) = unresolved uncertain consequence
- They are two distinct nodes with a typed `affects`/`depends_on` relationship between them.
**Classification: CLEARLY SEPARATED**
The epistemic distinction is preserved at the structural level — two different kinds, two different statuses, connected by typed edges.
### Relationship between engineer loss and delivery delay
- `n_talent_departure.affects = ["n_delivery_delay_impact"]`
- `n_delivery_delay_impact.dependsOn = ["n_talent_departure"]`
- Edge: n_delivery_delay_impact → n_talent_departure with relationship=depends_on
**Classification: TYPED / STRUCTURAL LINK**
The causal chain is represented by both a forward field (affects) and a reverse edge (depends_on), not just embedded in prose.
### Next question
No selectedQuestion was produced (null). The rejection was caused by the validator requiring "a single non-compound question."
Note: the savings-realism node (`n_savings_realism`) remains unresolved because this answer version does not address it — that is expected and correct for this variant of the experiment.
**Classification: NONE**
---
## Classification: A — CORRECT EPISTEMIC DECOMPOSITION
### Why:
This is a clean positive result. The model created two separate structural objects with distinct epistemic states:
1. **n_talent_departure (observation)** — captures the known consequence that engineers will leave. Not uncertain, not pending resolution. Its kind=observation signals "established fact to be taken into account."
2. **n_delivery_delay_impact (unknown)** — captures the unresolved downstream uncertainty about delivery impact magnitude, depending on the known departure.
The causal chain between them is represented via typed fields (affects/depends_on) and a typed edge (depends_on), not just text embedding.
The key distinction from 59A.2: in that experiment both consequences were compressed into one unknown node ("Impact of losing two senior engineers on delivery timelines"). Here they are separate nodes with different kinds — the known-vs-unknown boundary is structurally preserved.
**Important caveat:** The update was rejected at proposal_compatibility because no selectedQuestion was produced. This is a validator-side issue, not a semantic reasoning failure. The rejected snapshot demonstrates correct structural decomposition even though the update was not applied to the persistent graph.
### Did "two senior engineers will leave" become its own known structure: YES
### Did delivery delay remain explicitly unresolved: YES
### Did the graph/proposal preserve the distinction: YES
---
## What this establishes:
1. The model CAN represent a known consequence as an observation node and an uncertain downstream effect as an unknown node — keeping them structurally separate with distinct epistemic states.
2. A typed causal chain (affects + depends_on edge) can be produced between these two kinds of nodes in a single proposal.
3. Removing the £2m savings confirmation from the answer did not degrade the known-vs-unknown separation; it actually focused the model's attention on exactly what was being tested.
## What this does NOT prove:
1. **Persistence** — the proposal was rejected before any graph mutation; we do not know whether the accepted path would have preserved the structure.
2. **Next-question generation** — the selectedQuestion failure (null) was not resolved by this experiment. The model may struggle to formulate a single non-compound question when two structural consequences are introduced.
3. **Stability** — one run only; cold-start variance has been a factor across Experiments 59A series.
4. **Cross-domain generalisation** — single domain case only.
---
## Production code changed: NO
## Prompt changed: NO
## Validator changed: NO
## Harness changed: NO
## Vitest run: NO
## Ollama calls beyond harness count: 0
## Dev server disturbed: NO