Files
confidence-engine/docs/experiment-57j54.md
T

10 KiB

Experiment 57J.54 — Uncertainty Identity vs Relatedness Diagnosis

Branch: feature/structured-semantic-fidelity-v0.20 Starting HEAD: 19c00f3 (experiment: test structured-fidelity multi-turn progress) Experiment commit: pending

Objective

Answer exactly: Under the current v0.20 graph-update contract, why can an explicit unresolved uncertainty such as "whether projected office savings are realistic" be represented by modifying a broader existing cost unknown instead of creating/refining a node that actually represents that uncertainty?

Controlled Distinction

Broad projected-cost uncertainty (Concept A): "What will total costs at the new location be, including relocation, facilities and payroll?"

Savings-realism uncertainty (Concept B): "Are the projected office savings realistic?"

Verdict: OVERLAPPING BUT DISTINCT

These are not fully distinct because Concept B is a sub-question of Concept A's domain. Concept A asks "how much will it cost?" and Concept B asks "is one component of the cost projection valid?" They overlap in that both concern projected financial outcomes at the new location. But they are not the same uncertainty: Concept A is about magnitude/estimation accuracy across all cost categories; Concept B is about assumption validity for a specific cost category (office savings). One can be fully resolved (we know total will be £X) while the other remains open (savings may be overstated).

The graph cannot currently represent this without either:

  • A dedicated unknown for Concept B (direct), or
  • Absorbing it into Concept A's node (indirect, losing specificity).

Part 1 — Prompt Contract

Same-vs-related distinction explicit: PARTIAL

Relevant rules from lib/graph/prompt-builder.js:

  • Rule #6: structural mutation required for consequential information/uncertainty
  • Rule #7: new unknown only for "new decision, claim, object, measure, dependency, or unresolved term"
  • Rule #11: "Do not add duplicate unknowns."
  • Additional Guidance (line 137): "first check whether an existing unresolved node already represents the same uncertainty; if so, update/refine that existing structure rather than adding a duplicate; if no such node exists, add a new unknown"
  • Rule #12: "Do not expand unrelated branches."

Analysis: The prompt instructs the model to distinguish "same uncertainty" from "merely related uncertainty" but provides no structural mechanism to enforce this distinction. Rule #11 says "do not add duplicate unknowns" — but this only triggers when the model chooses to add a new unknown node (which then gets checked against existing ones). When the model chooses update/refine over add, this rule never applies. The additional guidance line 137 tells the model to check for "the same uncertainty" but gives no criteria for distinguishing "same" from "related." Rule #7's list ("new decision, claim, object, measure, dependency, or unresolved term") is exhaustive in structure but not semantic — it lists categories that justify new nodes but does not define when an existing node already covers the uncertainty.

Part 2 — Validator Contract

Same-vs-related distinction enforced: NO

Mechanism: validateSemanticDuplicateUnknowns() in lib/graph/apply-proposal.js (line 378) compares added nodes against unresolved existing unknowns for exact normalized string overlap on label/description text. It uses .includes(text) — i.e., the added node's label or description must appear as a substring of the existing unknown's label or description.

This mechanism cannot distinguish Concept A from Concept B because:

  1. The model chose updatedNodes (not addedNodes), so this function never runs for the savings-realism question.
  2. Even if it did run, exact string matching would not flag "savings realism" as a duplicate of "total costs at new location" since neither text contains the other.

The validator has no invariant that says: "If an existing unknown is a superset concept and the answer introduces a sub-question within that superset but outside its direct scope, a new unknown may be required." This distinction is purely semantic and falls entirely on model compliance.

Part 3 — Structural Consequences

57J.53 Update 1 representation: MATERIAL INFORMATION LOSS

Why: The engine replaced a focused uncertainty ("is this specific savings assumption valid?") with a broad status flag ("this cost projection is provisional"). The node's semantic content did not change — only its status field changed from unknown to provisional. This means:

  1. Query capability lost: The graph cannot answer "What evidence bears on whether savings are realistic?" because the node's label/description still says "Projected total costs at the new location including relocation, facility, and payroll adjustments." The specific savings-realism question is not retrievable from any node field.
  2. Dependency tracking lost: If someone later adds evidence about savings realism (as Update 2 did), there is no structural target for that evidence beyond a "supports" edge to the central statement — not to the cost unknown node where the concern actually resides.
  3. Scope drift possible: Future reasoning steps might treat provisional status as meaning "this cost estimate needs verification" rather than "I specifically doubt whether these savings assumptions hold." The distinction is subtle but material for downstream investigation.

Can later reasoning directly ask what evidence bears on savings realism: PARTIAL

PARTIAL because the selected question from Update 1 ("What would clarify realism of projected office savings from the relocation in this situation?") preserved the specific language, so at least one textual anchor survives — but this is in the selectedQuestion.label, not in the graph structure itself. If the selectedQuestion field is transient, no persistent graph-level anchor for the savings-realism concern remains.

Part 4 — Evidence Linkage Consequence

Is Update 2's parallel £2M metric consequence of the same representation issue: YES — SAME ROOT CAUSE

Why structurally: Because Update 1 represented the savings-realism uncertainty via status degradation rather than a dedicated node, there was no structural anchor for the evidence to attach to. When Update 2 arrives with concrete savings data ("£2M/year based on lease/business rates/etc."), the model sees:

  • Central statement node (target of "supports" edge — but that's generic)
  • noymlfr node with only a provisional status flag (not a clear "savings realism unknown")
  • No dedicated savings-realism unknown

The £2M metric was correctly added as evidence, but without a dedicated savings-realism unknown from Update 1, the model had no structurally obvious target for the linkage. It connected to the central statement instead — which is valid but incomplete. The lack of cross-linkage between the new evidence and the existing uncertainty is a direct downstream consequence of Update 1's weak representation.

Part 5 — Architecture Ownership

Classification: B — PROMPT SEMANTIC-IDENTITY GAP

Why: The prompt correctly instructs the model to distinguish "same uncertainty" from "merely related uncertainty" (Additional Guidance, line 137), but this instruction is fundamentally underspecified. It tells the model to do the right thing (check whether an existing node represents the same uncertainty) without giving it a criterion for when a broad cost node covers a specific savings-valuation concern. The gap is in the prompt's semantic identity definition — it conflates "overlapping topic domain" with "same uncertainty" without distinguishing them structurally or semantically.

The prompt does NOT need keyword logic (anti-keyword rule confirmed: the distinction is inherently semantic). It needs clearer boundary conditions between:

  • "This broad node already covers my concern" (update/refine)
  • "This broad node overlaps my domain but asks a different question about it" (add new unknown)

Part 6 — Smallest Next Boundary

Smallest next boundary: B — prompt-only clarification

The single semantic distinction the prompt must make:

When the answer expresses uncertainty about a specific assumption or sub-component within an existing uncertain topic, treat this as a new unresolved term under rule #7 (the assumption itself is the unresolved term), even if the broader domain appears covered. "Same uncertainty" means the question being asked is structurally equivalent — both are asking for the same factual resolution. "Overlapping but distinct" means one asks about scope/magnitude while the other asks about a specific variable's validity or realism within that scope, and resolving the magnitude does not resolve the variable's validity.

This can be stated as an addition to Additional Guidance under rule #6 for explicitly unresolved uncertainty — no schema change, validator change, or graph-model change required. It simply tightens the criterion the model uses to judge "same uncertainty" vs "related but distinct."


Convergence

Does this require keyword/synonym logic: NO

Does this require new semantic taxonomy: NO

Does this require graph schema change: NO

Does this require validator change: NO (the current validator works correctly for what it checks — exact string duplicates. The gap is upstream in model instruction, not validation.)

Does this require prompt change: YES

Should the candidate-tie stall be handled in this same change: NO (explicitly excluded)

What this establishes:

  • The root cause of 57J.53's Update 1 behavior is a prompt-level semantic-identity gap, not a validator or graph-model defect.
  • "Same uncertainty" and "overlapping but distinct" are both real distinctions the system needs to make, and the current contract does not distinguish them clearly enough to enforce consistently.

What this does NOT establish:

  • Whether the model can actually comply with tighter prompt guidance (requires testing).
  • Whether similar gaps exist in other structured categories beyond uncertainty identity.
  • Any resolution of the question-selection tie stall from Update 2.
  • The full scope of information loss across all existing unknown nodes that might absorb sub-concerns.

Production code changed: NO

Prompt changed: NO

Validator changed: NO

Schema changed: NO

Tests changed: NO

Ollama calls: 0

Dev server disturbed: NO