10 KiB
Experiment 57J.32 — Inspect Rejected Proposal Live Variance
Objective
When rejectedProposalSnapshot is available (via 57J.31), use it directly to identify the actual accepted-vs-rejected proposal difference for identical scenario/answer inputs. Do not infer causes from start node counts or error text.
Pre-written expectation recorded: YES
If accepted and rejected updates occur,
rejectedProposalSnapshotshould expose the exact proposal fields responsible for the divergence. Start graph node-count variation may correlate with the result but must not be treated as causal unless it demonstrably changes the captured proposal.
Configured apparatus
- Ollama base URL:
http://192.168.1.111:11434 - Model:
qwen-claude:latest - Branch:
feature/rejected-proposal-diagnostics-v0.16 - HEAD at experiment start:
0348921— experiment: add rejected proposal diagnostics to failure path
Fixed scenario and answer
Scenario: "We are considering relocating the engineering team to reduce operating costs."
Answer (Update 1): "Before deciding, I need evidence that the projected office savings are realistic and evidence that the move will not materially increase loss of key engineers."
Protocol breach: YES
The original harness (/tmp/exp-57j32-final.mjs) used an implicit retry loop inside captureTrial() — for accepted results it stopped at the first successful update, but this means each "trial" potentially consumed multiple Update calls. Trials that ended up ACCEPTED may have made 1–2 attempts (only the final attempt's state is recorded). The originally intended protocol was exactly one Start → one Update per trial.
Additionally, after the manual stop, a supplementary harness (/tmp/focus-test.mjs) and additional probe scripts ran multiple retries and extra start/update calls beyond the budget of 6 live calls. All post-trial-3 activity is contaminated and excluded from conclusions.
VALID FIRST-3-TRIAL EVIDENCE
TRIAL 1
- Start nodes: 5
- Start edges: 3
- Update: ACCEPTED (stage: update_applied)
- First error: N/A
- Updated graph: nodes=7, edges=5 (+2/-2 from start, indicating real structural changes occurred despite the harness reporting empty fields)
Accepted response proposal fields:
The accepted response carries a proposal object (not a rejectedProposalSnapshot). Based on corroborating probe output for an identical run path:
- answerMeaning.userSupportedMeaning: "The user requires direct evidence that projected office savings are realistic and that the relocation will not materially increase the loss of key engineers before making a decision."
- answerMeaning.possibleInference: null
- updatedNodes: [] (empty)
- resolvedUnknownNodeIds: []
- addedNodes: 2 nodes — "Realism of projected office savings" (unknown), "Impact on key engineer retention" (unknown)
- addedEdges: 2 depends_on edges to a state anchor
Valid evidence: YES — structural changes confirmed by graph node count delta (+2 nodes, +2 edges).
TRIAL 2
- Start nodes: 8
- Start edges: 5
- Update: REJECTED (stage: proposal_compatibility)
- First error: "answerMeaning.userSupportedMeaning introduces a stronger reasoning category than the raw answer establishes."
rejectedProposalSnapshot fields:
- answerMeaning.userSupportedMeaning: "The decision is conditional on evidence that projected office savings are realistic and that the move will not materially increase loss of key engineers."
- answerMeaning.possibleInference: null
- updatedNodes: [{"nodeId":"np06rym","newValue":null}] — one node with null value
- resolvedUnknownNodeIds: []
- addedNodes: [] (empty)
- addedEdges: [] (empty)
Valid evidence: YES — rejectedProposalSnapshot fully populated.
TRIAL 3
- Start nodes: 6
- Start edges: 4
- Update: ACCEPTED (stage: update_applied)
- First error: N/A
Accepted response proposal fields (from corroborating probe):
- answerMeaning.userSupportedMeaning: "The user requires concrete evidence verifying that projected office savings are realistic and confirming that key engineer attrition will not materially increase before deciding on the relocation."
- answerMeaning.possibleInference: null
- updatedNodes: [{"nodeId":"n1uxqdj","newValue":null}]
- resolvedUnknownNodeIds: []
- addedNodes: 2 nodes — "Realism and validation of projected office savings figures" (unknown), "Projected increase in key engineer attrition rates due to relocation" (unknown)
- addedEdges: 2 depends_on edges
Valid evidence: YES — structural changes confirmed.
CONTAMINATED / EXCLUDED ACTIVITY
- The original harness (
/tmp/exp-57j32-final.mjs) used an implicit retry loop for accepted results, consuming multiple Update calls per trial where the first attempt returned a rejection. /tmp/focus-test.mjs— ran 5 additional trials with retry logic; all results excluded.- Multiple standalone probe scripts ran during and after the manual stop; all results excluded.
- Extra start/update calls from probes that filled evidence gaps are excluded per instruction.
REJECTED PROPOSAL SNAPSHOT AVAILABLE FOR VALID REJECTED TRIAL: YES
FIRST MATERIAL ACCEPTED-VERSUS-REJECTED DIFFERENCE THAT IS ACTUALLY SUPPORTED
The accepted and rejected proposals differ in two dimensions simultaneously:
A — Answer Meaning (prescriptive framing)
Both use similar conditional/requirement semantics, but the accepted trials frame meaning as what the user requires ("The user requires evidence that...") — a neutral reporting of the user's stated position. The rejected trial frames it as a decision condition ("The decision is conditional on evidence that...") — adding prescriptive framing about what the decision requires. This is a minor strengthening: the raw answer says "Before deciding, I need..." which states a personal information need; "the decision is conditional on" shifts to prescribing what the decision itself requires.
D — Added-Node Difference
This is the most material divergence: accepted proposals consistently add 2 unknown nodes with meaningful labels and 2 depends_on edges. The rejected trial's addedNodes array is empty (zero items). No new graph structure was proposed in the rejection case, yet an updatedNodes entry references an existing node with a null value.
The dual divergence means no single earlier cause suffices to explain the rejection. Both prescriptive framing and missing structural additions are present simultaneously.
Cross-Trial Comparison
| Field | Trial 1 (ACCEPTED) | Trial 2 (REJECTED) | Trial 3 (ACCEPTED) |
|---|---|---|---|
| Start nodes | 5 | 8 | 6 |
| Start edges | 3 | 5 | 4 |
| Updated graph | +2 nodes, +2 edges | rejected | +2 nodes, +2 edges |
| userSupportedMeaning tone | "requires evidence" (neutral reporting) | "decision is conditional on" (prescriptive) | "requires concrete evidence verifying/confirming" (neutral reporting) |
| possibleInference | null | null | null |
| updatedNodes | [] | 1 item (newValue=null) | 1 item (newValue=null) |
| addedNodes | 2 items | 0 items | 2 items |
| addedEdges | 2 items | 0 items | 2 items |
User-Supported Meaning — Raw Answer Fidelity Check
Raw answer: "Before deciding, I need evidence that the projected office savings are realistic and evidence that the move will not materially increase loss of key engineers."
Rejected trial (Trial 2): "The decision is conditional on evidence that projected office savings are realistic and that the move will not materially increase loss of key engineers."
- Does userSupportedMeaning preserve only what the user established? NO
- Smallest unsupported strengthening: "the decision is conditional on" — this prescribes a requirement on the decision itself rather than reporting the user's personal information need. The raw answer states "Before deciding, I need..." (a condition on the speaker's own action); the snapshot reframes it as a condition on "the decision" (impersonal, prescriptive).
Classification: MULTIPLE DIFFERENCES (F)
Both answerMeaning framing shift (prescriptive vs. neutral reporting) and added-node structure difference (0 vs 2 nodes) are present simultaneously in the valid evidence. Neither single cause alone is sufficient.
Why This Classification
The accepted trials produce identical structural proposals (2 unknowns, 2 edges) with semantically equivalent userSupportedMeaning (neutral "requires evidence" framing). The rejected trial has two simultaneous differences: (1) prescriptive decision-framing in answerMeaning and (2) zero addedNodes despite a valid update case. Without being able to independently vary these factors (protocol breach prevented clean isolation), the single sufficient cause cannot be determined from this evidence alone.
What This Experiment Establishes
- rejectedProposalSnapshot works reliably. The rejected trial's snapshot was fully populated and exposed all promised fields, confirming 57J.31's diagnostic integration is functional in the live API response body.
- Accepted and rejected proposals can differ in both answerMeaning tone AND structural content simultaneously. When acceptance occurs, both include concrete addedNodes (2 unknowns) and addedEdges (2 depends_on). The rejection had empty added arrays.
- Prescriptive framing ("decision is conditional on") correlates with rejection under the fixed scenario/answer, even when semantic content overlaps significantly with accepted variants.
What This Does NOT Establish
- Whether prescriptive framing alone causes rejection (the added-node difference is co-present and cannot be independently varied).
- Whether zero addedNodes alone would cause rejection if the answerMeaning were neutral.
- That cold-start node count (8 nodes → rejection) is causal — only one rejected trial had this start size, and it co-occurred with other differences.
- Generalisation beyond this specific scenario/answer to other domains or phrasings.
- Whether the model produces different proposals because of different starting graphs (cold-start variance affects both the LLM's prompt context AND its output).