test(confidence-engine): forward deep provider schemas

This commit is contained in:
2026-10-07 07:25:52 +01:00
parent 0b84f8ad28
commit 44db12d9c0
2 changed files with 57 additions and 7 deletions
@@ -410,6 +410,58 @@ assert(helperSrc.includes("updatedSituationGraph: updatedGraph"), "next graph re
// D12. Next Contributions/Findings returned for Episode N+1
assert(helperSrc.includes("postEpisodeContributions") && helperSrc.includes("postEpisodeFindings"), "next Contributions and Findings returned for longitudinal tracking");
// ---- WRAPPER FORWARDING VERIFICATION (Iteration 3 — NEW) ──────────────
// These assertions verify that the timedProvider wrapper correctly forwards
// all provider arguments (prompt, modelName, outputSchema) to the underlying provider.
// W1. Both runLiveExperiment and composeDeepInvestigationCheckpoint timedProviders forward a third argument
const timingWrapperMatches = helperSrc.match(/async generateReconstruction\(prompt,\s*modelName,\s*outputSchema\)/g);
assert(timingWrapperMatches !== null && timingWrapperMatches.length === 2, "exactly two timedProvider wrappers forward outputSchema (3-param signature)");
// W2. Both wrappers invoke the underlying provider with the forwarded third argument
const forwardCallMatches = helperSrc.match(/await provider\.generateReconstruction\(prompt,\s*modelName,\s*outputSchema\)/g);
assert(forwardCallMatches !== null && forwardCallMatches.length === 2, "exactly two timedProvider invocations forward all three arguments");
// W3. focusedDeconstruct receives timedProvider (not raw provider)
assert(helperSrc.includes("provider: timedProvider") || helperSrc.includes("provider : timedProvider"), "focusedDeconstruct receives timedProvider (wrapped) not raw provider");
// W4. No manual compensation increment for focusedDeconstruction exists
assert(!helperSrc.includes("focusedDeconstruct now uses the same provider") && !helperSrc.includes("focused_deconstruct now uses the same provider"), "no manual compensation increment present in helper source");
// W5. synthesizeCurrentUnderstanding receives timedProvider (not raw provider)
const synthSection = helperSrc.substring(helperSrc.indexOf("synthesizeCurrentUnderstanding"));
assert(synthSection.includes("provider: timedProvider") || synthSection.includes("provider : timedProvider"), "CU synthesis receives timedProvider in composeDeepInvestigationCheckpoint");
// W6. focused deconstruction schema assertion — focusedDeconstructJsonSchema is passed as 3rd arg
const focusedDeconstructImport = helperSrc.indexOf('import("../../lib/graph/focused-investigation.js")');
const focusedCallStart = helperSrc.indexOf("focusedDeconstruct(", focusedDeconstructImport);
// W6. focused deconstruction uses focusedDeconstructJsonSchema (verified in production module)
const fiModuleSrc = readFileSync("./lib/graph/focused-investigation.js", "utf8");
assert(fiModuleSrc.includes("export const focusedDeconstructJsonSchema") && fiModuleSrc.includes("generateReconstruction"), "focused deconstruction schema exported and used in production module");
// W7. CU synthesis schema — synthesizeCurrentUnderstanding passes synthesisOutputSchema as 3rd arg
const synthModuleSrc = readFileSync("./lib/graph/current-understanding-synthesis.js", "utf8");
assert(synthModuleSrc.includes("generateReconstruction") && synthModuleSrc.includes("synthesisOutputSchema"), "CU synthesis source uses synthesisOutputSchema in provider call");
// ---- APPARATUS CORRECTION VERIFICATION ──────────────────────────────
// These assertions verify the apparatus is correct after the fix:
// - All three calls (focusedDeconstruct, CU synthesis) use timedProvider
// - No manual counter compensation exists
// - Schema forwarding is complete in both wrappers
// AC1. Verify focusedDeconstruct receives timedProvider in the non-episode path too
const updateCasePath = helperSrc.substring(
helperSrc.indexOf("else {"),
helperSrc.indexOf("const endToEndElapsedMs")
);
assert(updateCasePath.includes("provider: timedProvider") || updateCasePath.includes("provider : timedProvider"), "non-episode updateCase path uses timedProvider");
// AC2. Compose function still callable (state continuity preserved)
assert(typeof composeDeepInvestigationCheckpoint === "function", "composeDeepInvestigationCheckpoint remains callable (state continuity)");
// 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)");
// ---- CU SYNTHESIS OBSERVABILITY (Batch 3 Iteration 1) ─────────────────────
console.log("\n=== CU SYNTHESIS OBSERVABILITY ===\n");
@@ -194,10 +194,10 @@ async function runLiveExperiment({ graph, previousQuestion, answer, findings = [
let providerGenerateCalls = 0;
const timedProvider = {
async generateReconstruction(prompt, modelName) {
async generateReconstruction(prompt, modelName, outputSchema) {
providerGenerateCalls++;
const startedAt = Date.now();
const response = await provider.generateReconstruction(prompt, modelName);
const response = await provider.generateReconstruction(prompt, modelName, outputSchema);
modelElapsedMs = Date.now() - startedAt;
return response;
},
@@ -299,10 +299,10 @@ async function composeDeepInvestigationCheckpoint({ situationGraph, previousQues
let providerGenerateCalls = 0;
const timedProvider = {
async generateReconstruction(prompt, modelName) {
async generateReconstruction(prompt, modelName, outputSchema) {
providerGenerateCalls++;
const startedAt = Date.now();
const response = await provider.generateReconstruction(prompt, modelName);
const response = await provider.generateReconstruction(prompt, modelName, outputSchema);
modelElapsedMs = Date.now() - startedAt;
return response;
},
@@ -332,7 +332,7 @@ async function composeDeepInvestigationCheckpoint({ situationGraph, previousQues
// Call production-focused deconstruct — exactly one provider generation
const focused = await focusedDeconstruct({
provider,
provider: timedProvider,
modelName: model,
targetNodeId,
targetLabel,
@@ -342,8 +342,6 @@ async function composeDeepInvestigationCheckpoint({ situationGraph, previousQues
answer,
});
providerGenerateCalls++; // focusedDeconstruct now uses the same provider (1 call)
if (!focused.success) {
throw new Error(`focusedDeconstruct failed for episode ${contribSeq}: ${JSON.stringify(focused.errors)}`);
}