fix: make graph-backed questions authoritative

This commit is contained in:
2026-08-03 09:13:52 +01:00
parent ef04b9e494
commit db994d7764
4 changed files with 285 additions and 31 deletions
+66 -25
View File
@@ -13,10 +13,14 @@ import {
updateCaseRequestSchema,
} from "./schema.js";
import { buildInitialGraph, describeGraph } from "./builder.js";
import { applyValidatedProposal } from "./apply-proposal.js";
import {
applyValidatedProposal,
determineGraphBackedQuestion,
} from "./apply-proposal.js";
import { buildGraphUpdatePrompt } from "./prompt-builder.js";
import {
buildReasoningState,
formulateQuestion,
formulateTieResolutionQuestion,
} from "./question-formulator.js";
import { parseGraphUpdateProposal } from "./update-proposal.js";
@@ -41,6 +45,13 @@ function buildDiagnostics({
graph,
graphReferenceValidation,
unknownSelectionExplanation,
reconstructionQuestion,
reconstructionQuestionAccepted,
reconstructionQuestionRejectionReasons,
finalGraphBackedQuestion,
selectedUnknownNodeId,
decompositionApplied,
questionComplexityAssessment,
}) {
return {
promptVersion: analysis?.promptVersion ?? null,
@@ -54,6 +65,14 @@ function buildDiagnostics({
compatibilityChanges: analysis?.compatibilityChanges ?? [],
compatibilityWarnings: analysis?.compatibilityWarnings ?? [],
unknownSelectionExplanation: unknownSelectionExplanation ?? null,
reconstructionQuestion: reconstructionQuestion ?? null,
reconstructionQuestionAccepted: reconstructionQuestionAccepted ?? null,
reconstructionQuestionRejectionReasons:
reconstructionQuestionRejectionReasons ?? [],
finalGraphBackedQuestion: finalGraphBackedQuestion ?? null,
selectedUnknownNodeId: selectedUnknownNodeId ?? null,
decompositionApplied: decompositionApplied ?? false,
questionComplexityAssessment: questionComplexityAssessment ?? null,
};
}
@@ -263,23 +282,11 @@ export async function startCase(body) {
});
const currentSummary = describeGraph(initialGraph);
const deterministicSelection = selectActiveUnknownCandidate(
{
...initialGraph,
resolvedNodeIds: [],
},
[],
);
const activeUnknownNodeId =
deterministicSelection?.status === "selected"
? deterministicSelection.nodeId
: null;
const situationGraph = makeGraph({
const initialSituationGraph = makeGraph({
centralStatement: scenario,
nodes: initialGraph.nodes,
edges: initialGraph.edges,
activeUnknownNodeId,
activeUnknownNodeId: null,
resolvedNodeIds: [],
currentSummary,
reasoningState: buildReasoningState({
@@ -290,17 +297,20 @@ export async function startCase(body) {
}),
});
situationGraphSchema.parse(situationGraph);
situationGraphSchema.parse(initialSituationGraph);
const graphReferenceValidation = validateGraphReferences(situationGraph);
const selectedQuestion =
deterministicSelection?.status === "ambiguous"
? {
id: "q_tie_resolution",
...formulateTieResolutionQuestion({ graph: situationGraph }),
tiedCandidateIds: deterministicSelection.tiedCandidateIds,
}
: (analysis.nextQuestion ?? null);
const graphReferenceValidation = validateGraphReferences(
initialSituationGraph,
);
const initialQuestionResult = determineGraphBackedQuestion({
situationGraph: initialSituationGraph,
});
const situationGraph = initialQuestionResult.success
? initialQuestionResult.updatedSituationGraph
: initialSituationGraph;
const selectedQuestion = initialQuestionResult.success
? initialQuestionResult.selectedQuestion
: null;
const unknownSelectionExplanation = buildUnknownSelectionDiagnostics(
situationGraph,
[],
@@ -315,6 +325,22 @@ export async function startCase(body) {
graph: situationGraph,
graphReferenceValidation,
unknownSelectionExplanation,
reconstructionQuestion: analysis.nextQuestion?.question ?? null,
reconstructionQuestionAccepted: false,
reconstructionQuestionRejectionReasons:
analysis.nextQuestion?.question != null
? [
"reconstruction_question_not_authoritative",
"graph_backed_pipeline_required",
]
: [],
finalGraphBackedQuestion: selectedQuestion?.question ?? null,
selectedUnknownNodeId:
initialQuestionResult.selectedUnknownAfter ?? null,
decompositionApplied:
initialQuestionResult.decompositionPerformed ?? false,
questionComplexityAssessment:
initialQuestionResult.questionComplexityAssessment ?? null,
}),
validationErrors: graphReferenceValidation.errors,
statusCode: 500,
@@ -330,6 +356,21 @@ export async function startCase(body) {
graph: situationGraph,
graphReferenceValidation,
unknownSelectionExplanation,
reconstructionQuestion: analysis.nextQuestion?.question ?? null,
reconstructionQuestionAccepted: false,
reconstructionQuestionRejectionReasons:
analysis.nextQuestion?.question != null
? [
"reconstruction_question_not_authoritative",
"graph_backed_pipeline_required",
]
: [],
finalGraphBackedQuestion: selectedQuestion?.question ?? null,
selectedUnknownNodeId: initialQuestionResult.selectedUnknownAfter ?? null,
decompositionApplied:
initialQuestionResult.decompositionPerformed ?? false,
questionComplexityAssessment:
initialQuestionResult.questionComplexityAssessment ?? null,
}),
};
}