fix: close rectification convergence gaps

This commit is contained in:
Jesse_Chen
2026-07-25 12:59:13 +08:00
parent 0e6ed6ba79
commit e41fae1e05
6 changed files with 118 additions and 7 deletions
@@ -65,6 +65,7 @@ const labeledYearChoicesPattern = /A\s*[.、:)]?[\s\S]{0,80}(?:19|20)\d{2}\s*
const affirmativeAnswerPattern = /^\s*(?:(?:)?|(?:)?|||||+|)\s*[.!,]?\s*$/u;
const negativeAnswerPattern = /^\s*(?:||||)\s*[.!,]?\s*$/u;
const proposedDateQuestionPattern = /(?:19|20)\d{2}\s*(?:\s*(?:1[0-2]|0?[1-9])\s*)?(?:\s*(?:3[01]|[12]\d|0?[1-9])\s*(?:|))?[\s\S]{0,30}(?:|||||)/u;
const nonScoringDetailPattern = /||||||||(?:||)||||/u;
const domainLabels = {
career: "事业",
education: "学业",
@@ -261,9 +262,11 @@ export function validateNarrativeAgainstPacket(
phase: RectificationNarrativePhase = "first",
context: RectificationNarrativeContext = {},
): NarrativeValidation {
void phase;
const issues: string[] = [];
const candidate = packet.candidate;
if (phase === "final" && output.evidenceRequest !== null) {
issues.push("final narrative must not request more evidence");
}
if (output.candidateStatus !== candidate.status) {
issues.push(`candidateStatus ${output.candidateStatus} is not packet-grounded`);
}
@@ -302,6 +305,13 @@ export function validateNarrativeAgainstPacket(
&& packet.scoredHistoricalEvidence.some((item) => item.evidenceId === followUp.evidenceId)) {
issues.push("event detail follow-up targets already scored evidence");
}
const latestActiveEvidenceId = context.eventLedger?.filter((item) => item.active).at(-1)?.id;
if (followUp?.kind === "new_event"
&& latestActiveEvidenceId
&& nonScoringDetailPattern.test(output.evidenceRequest.prompt)
&& packet.scoredHistoricalEvidence.some((item) => item.evidenceId === latestActiveEvidenceId)) {
issues.push("new-event follow-up disguises detail about already scored evidence");
}
if (proposedDateQuestionPattern.test(output.evidenceRequest.prompt)
&& (followUp?.kind !== "event_date"
|| followUp.answerMode !== "yes_no"