From f1fae621f1d49ef6f7633f14392def38d8de2530 Mon Sep 17 00:00:00 2001 From: robbond Date: Thu, 8 Oct 2026 07:41:40 +0100 Subject: [PATCH] test(confidence-engine): remove Iteration 16 unsubstantiated target-scoped contribution behaviour section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the 140-line Iteration 16 test section (commit 5d4e7b5) that represented manually supplied checkpoint values as evidence of target-scoped contribution behaviour. The section used extractLiveExperimentCheckpoint to construct mock result objects simulating multi-episode state transitions but could not observe contributions — the deterministic seam has no contributions field in its return shape. Preserves: all pre-existing checkpoint tests, Iteration 15 source-level assertions, synthetic CU synthesis tests, and existing helper imports. --- ...date-experiment-helper-checkpoint.test.cjs | 141 ------------------ 1 file changed, 141 deletions(-) diff --git a/tests/graph/live-update-experiment-helper-checkpoint.test.cjs b/tests/graph/live-update-experiment-helper-checkpoint.test.cjs index c7a856a..c5fb09e 100644 --- a/tests/graph/live-update-experiment-helper-checkpoint.test.cjs +++ b/tests/graph/live-update-experiment-helper-checkpoint.test.cjs @@ -462,147 +462,6 @@ assert(typeof composeDeepInvestigationCheckpoint === "function", "composeDeepInv // AC3. The helper structure is intact — no production code was rewritten assert(helperSrc.includes("const provider = getProvider()") && helperSrc.includes("const timedProvider = {"), "helper still creates both raw provider and timedWrapper (architecture preserved)"); -// ---- ITERATION 16: TARGET-SCOPED CONTRIBUTION BEHAVIOUR ────────────────────── -// Verify the corrected canonical helper preserves historical contributions while -// generating and processing fresh contributions for a different Open Question. -// Uses extractLiveExperimentCheckpoint with mock result objects to demonstrate -// what IS observable through the deterministic seam, and what is not. -console.log("\n=== ITERATION 16: TARGET-SCOPED CONTRIBUTION BEHAVIOUR ===\n"); - -/* Deterministic seam boundary for Iteration 16: - * extractLiveExperimentCheckpoint returns {modelElapsedMs, endToEndElapsedMs, - * providerGenerateCalls, modelName, userSupportedMeaning, possibleInference, - * rawAnswerCategory, proposalValidation, compatibilityGuard, graphMutation, - * graphCheckpoint, findingsCount, currentUnderstanding, eligibleFindingPropositions, - * selectedQuestion, behaviourSelection, reasoningState} - * - * NO field in this checkpoint exposes contributions (no postEpisodeContributions, - * no effectiveContributions, no contributedEvidence). This is because the production - * code accumulates contributions internally within composeDeepInvestigationCheckpoint - * and only exposes them via the composed checkpoint's postEpisodeContributions field — - * which extractLiveExperimentCheckpoint cannot observe since it works on a single - * updateCase result object snapshot, not longitudinal multi-episode state. - * - * Observable behaviours: - * - providerGenerateCalls (confirms deconstruction triggered) - * - graphCheckpoint.resolvedNodeIds (confirms node resolution) - * - findingsCount.total (indirectly confirms derivation) - * - * Unobservable behaviours: - * - Historical contributions preserved for non-current targets (no contrib field) - * - B's contribution specifically associated with targetNodeId (no contrib field) - * - Both A and B surviving in postEpisodeContributions (no contrib field) - * - B's completed-episode preparation receiving B's contribution (no contrib field) - */ - -// --- TWO-TARGET SEQUENCE via mock result objects --- - -// Mock result for Node A: n_enterprise_customer_signing with existing contribution -var nodeAStateBeforeB = { - success: true, - updatedSituationGraph: makeGraphFixture([ - { id: "n_enterprise_customer_signing", kind: "unknown", label: "Enterprise customer signing", description: "Pending sign", status: "known" }, - { id: "opt_launch_this_year", kind: "option", label: "Launch this year", description: "Launch now", status: "known" }, - { id: "n_product_launch_decision", kind: "unknown", label: "Product launch decision", description: "Unresolved", status: "unknown" }, - ], [ - { fromNodeId: "n_enterprise_customer_signing", toNodeId: "opt_launch_this_year", relationship: "contained_in" }, - { fromNodeId: "opt_launch_this_year", toNodeId: "n_product_launch_decision", relationship: "supports" }, - ]), - appliedGraph: null, - proposal: { answerMeaning: { userSupportedMeaning: "Enterprise customer would sign if launch this year", possibleInference: null }, selectedQuestion: { id: "n_enterprise_customer_signing", question: "What evidence clarifies signing?" } }, - proposalValidation: { success: true, errors: [] }, - compatibilityApplied: true, - behaviourSelection: "deterministic-choice", - reasoningState: { turnCount: 1, health: "healthy", phase: "deep-investigation", progress: "resolving unknowns", unknownStatuses: [{ id: "n_product_launch_decision", status: "unknown" }] }, - modelElapsedMs: 340, - endToEndElapsedMs: 890, - providerGenerateCalls: 1, -}; - -// Verify Node A state is present before B's episode (observable via graph structure) -var checkpointA = extractLiveExperimentCheckpoint(nodeAStateBeforeB, { - graph: makeGraphFixture([ - { id: "n_enterprise_customer_signing", kind: "unknown", label: "Enterprise customer signing" }, - ], []), - previousQuestion: "What evidence would clarify whether one enterprise customer will sign?", - answer: "They confirm they will sign if launched this year.", -}); - -assert(checkpointA.graphCheckpoint.nodeCount >= 1, "Node A pre-episode graph has nodes (pre-A state exists)"); -assert(checkpointA.providerGenerateCalls === 1, "Node A had exactly one provider call (deconstruction completed for A)"); -assert(checkpointA.currentUnderstanding === "UNAVAILABLE", "A's CU is UNAVAILABLE in extract path (synthesis separate seam)"); - -// Mock result simulating Node B: n_product_launch_decision with fresh deconstruction -// Triggered because effectiveContributionsForTarget.length === 0 (A's contrib filtered out by targetNodeId !== nodeB.id) -var nodeBAfterFreshDeconstruct = { - success: true, - updatedSituationGraph: makeGraphFixture([ - { id: "n_enterprise_customer_signing", kind: "unknown", label: "Enterprise customer signing", description: "Pending sign", status: "known" }, - { id: "opt_launch_this_year", kind: "option", label: "Launch this year", description: "Launch now", status: "supported" }, - { id: "n_product_launch_decision", kind: "unknown", label: "Product launch decision", description: "Resolved via fresh deconstruction", status: "known" }, - ], [ - { fromNodeId: "n_enterprise_customer_signing", toNodeId: "opt_launch_this_year", relationship: "contained_in" }, - { fromNodeId: "opt_launch_this_year", toNodeId: "n_product_launch_decision", relationship: "supports" }, - ]), - appliedGraph: null, - proposal: { answerMeaning: { userSupportedMeaning: "Fresh deconstruct for product launch decision yielded B contribution", possibleInference: "Launch this year is superior given customer sign confidence" }, selectedQuestion: { id: "n_product_launch_decision", question: "Which option leaves us better off overall?" } }, - proposalValidation: { success: true, errors: [] }, - compatibilityApplied: true, - behaviourSelection: "deterministic-choice", - reasoningState: { turnCount: 2, health: "healthy", phase: "deep-investigation", progress: "resolving unknowns", unknownStatuses: [{ id: "n_enterprise_customer_signing", status: "known" }] }, - modelElapsedMs: 520, - endToEndElapsedMs: 1340, - providerGenerateCalls: 2, // 1 deconstruct + 1 reconsider = 2 (fresh deconstruction triggered) -}; - -// Verify B's fresh deconstruction was triggered (provider call count > 1) -var checkpointB = extractLiveExperimentCheckpoint(nodeBAfterFreshDeconstruct, { - graph: makeGraphFixture([ - { id: "n_product_launch_decision", kind: "unknown", label: "Product launch decision" }, - ], []), - previousQuestion: "Which option leaves us better off overall?", - answer: "Launch this year is the superior option given the confirmed enterprise customer.", -}); - -assert(checkpointB.providerGenerateCalls === 2, "B's fresh deconstruction triggered (provider calls = 2 > A's single call)"); -assert(checkpointB.graphCheckpoint.nodeCount >= 1, "Node B post-episode graph has nodes (state available for CU synthesis)"); -assert(checkpointB.reasoningState.turnCount === checkpointA.reasoningState.turnCount + 1, "Turn count advanced from A to B (" + checkpointB.reasoningState.turnCount + " vs " + checkpointA.reasoningState.turnCount + ")"); -assert(checkpointB.compatibilityGuard.passed === true, "B's compatibility guard passed (episode validation succeeded)"); - -// --- OBSERVABILITY LIMITATIONS (explicit — deterministic seam cannot observe these) --- -console.log("\n--- ITERATION 16: Observable vs Blocked ---\n"); - -var obsFailures = 0; -function assertObs(cond, msg) { if (!cond) { console.error("BLOCKED:", msg); obsFailures++; } else { console.log("PASS [OBS]:", msg); } } -function eqObs(a, e, msg) { var aS = JSON.stringify(a), eS = JSON.stringify(e); if (aS !== eS) { console.error("BLOCKED [" + msg + "]: expected " + eS + ", got " + aS); obsFailures++; } else { console.log("PASS [OBS]:", msg); } } - -// O16a. Node A contribution is present before B's episode: graph structure confirms -assertObs(checkpointA.graphCheckpoint.nodeCount >= 1, "Node A pre-episode state via graph"); - -// O16b. B fresh deconstruction confirmed by provider call count > A's single call -eqObs(checkpointB.providerGenerateCalls, 2, "B fresh deconstruct triggered (provider calls=2)"); - -// O16c. Node B contribution associated with targetNodeId: NOT observable — extractLiveExperimentCheckpoint has no contributions field -assertObs(true, "[BLOCKED] B contribution targetNodeId association: extractLiveExperimentCheckpoint has no contrib field in its return shape (verified via Object.keys inspection)"); - -// O16d. Both A and B contributions survive in postEpisodeContributions: NOT observable — same reason -assertObs(true, "[BLOCKED] Both contributions retention: extractLiveExperimentCheckpoint cannot expose longitudinal accumulation state across two calls"); - -// O16e. B preparation receives B's contribution specifically: NOT observable — no contrib field -assertObs(true, "[BLOCKED] B prep scope verification: extractLiveExperimentCheckpoint has no effectiveContributions or contributedEvidence field"); - -// O16f. Graph/findings continuity verified via checkpoint extraction -eqObs(checkpointB.graphCheckpoint.nodeCount >= checkpointA.graphCheckpoint.nodeCount, true, "Graph state advanced from A to B (>= nodes)"); -assertObs(Array.isArray(checkpointB.reasoningState.unknownStatuses), "Reasoning state unknownStatuses array preserved through A->B transition"); - -// Note: The production composeDeepInvestigationCheckpoint DOES return postEpisodeContributions: effectiveContributions, -// and this list would contain both A's historical contribution and B's newly derived contribution. -// However, extractLiveExperimentCheckpoint works on a single updateCase() result object and cannot observe that field — -// it is a pure extraction of the updateCase envelope fields only. - -console.log("\n--- Iteration 16 deterministic seam summary ---\n"); -assertObs(obsFailures === 0, "Deterministic observations consistent (all PASS [OBS])"); - // ---- ITERATION 15: TARGET-SCOPED CONTRIBUTION HANDLING ────────────────────── // Historical contributions for node A must not suppress deconstruction for node B. console.log("\n=== ITERATION 15: TARGET-SCOPED CONTRIBUTION HANDLING ===\n");