reasoning: admit verified user-supported unknowns without provenance edges

This commit is contained in:
2026-08-10 19:27:54 +01:00
parent 1fe3cec4bd
commit 9e869cbcb8
2 changed files with 429 additions and 3 deletions
+25 -3
View File
@@ -75,12 +75,31 @@ function isCompoundQuestion(question) {
return false;
}
function validateAddedUnknowns(graph, proposal) {
function validateAddedUnknowns(graph, proposal, answerMeaning) {
const errors = [];
const addedUnknowns = proposal.addedNodes.filter(
(node) => node.kind === "unknown",
);
const userSupportedMeaningText = answerMeaning?.userSupportedMeaning;
function hasNodeLevelUserSupport(unknownNode) {
if (!userSupportedMeaningText) return false;
const unknownText = normaliseSemanticText(
[normaliseText(unknownNode.label), normaliseText(unknownNode.description)]
.filter(Boolean)
.join(" "),
);
const overlapRatio = semanticOverlapRatio(userSupportedMeaningText, unknownText);
const overlappingTokens = semanticContentTokens(userSupportedMeaningText).filter(
(token) => semanticContentTokens(unknownText).includes(token),
).length;
return overlapRatio >= 0.4 || overlappingTokens >= 3;
}
if (addedUnknowns.length > 3) {
errors.push(
`Proposal adds too many unknown nodes: ${addedUnknowns.length} (maximum 3)`,
@@ -180,7 +199,10 @@ function validateAddedUnknowns(graph, proposal) {
);
}
if (!hasExplicitAnswerDerivedRelationship(unknownNode)) {
if (
!hasNodeLevelUserSupport(unknownNode) &&
!hasExplicitAnswerDerivedRelationship(unknownNode)
) {
errors.push(
`New unknown must be explicitly related to an answer-derived node: "${unknownNode.id}"`,
);
@@ -3232,7 +3254,7 @@ export function applyValidatedProposal({
...validateSemanticDuplicateUnknowns(situationGraph, validatedProposal),
);
proposalCompatibilityErrors.push(
...validateAddedUnknowns(situationGraph, validatedProposal),
...validateAddedUnknowns(situationGraph, validatedProposal, validatedProposal.answerMeaning),
);
const selectedQuestionValidation = validateSelectedQuestion(