fix(rectification): equal-weight collect, year-cue questions, classifier no/unsure (BUG-641–643)

Ask finance and health like other domains, put year-cued collect questions first, and let the classifier distinguish decline vs skip. Skill 10.0.22.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-10 21:53:10 +08:00
co-authored by Cursor
parent 71eaeb2e8b
commit 52db714ba9
46 changed files with 1033 additions and 160 deletions
@@ -36,10 +36,8 @@ import { previousInferenceFromReceipt } from "@/lib/rectification-agentic/v9/inf
import { CHOICE_STOP_LABEL, parseAgentChoiceCopy } from "@/lib/rectification-agentic/v9/choice-card";
import {
classifyRectificationTurnIntent,
isCollectDeclineUtterance,
isCollectSkipUtterance,
optionIdForAnswerClass,
shouldDeclineCollectFocus,
collectFocusCloseStatus,
shouldContinueAgentForDatedEvent,
classifyTurnIntentWithRetry,
} from "@/lib/rectification-agentic/v9/turn-intent-classifier";
@@ -309,6 +307,7 @@ export async function POST(request: Request) {
),
});
let expectedWrite: "evidence" | "none" | "unknown" = "none";
let collectIntent: "classified" | "unclassified" | null = null;
let writeClassified = false;
const immediateResponse = await (async (): Promise<Response | null> => {
if (isStructuredChoice) {
@@ -522,24 +521,6 @@ export async function POST(request: Request) {
}
} else if (focus && isCollectFocusSchema(focus.expectedAnswerSchema)) {
const userMessage = parsed.data.message ?? "";
if (isCollectDeclineUtterance(userMessage) || isCollectSkipUtterance(userMessage)) {
const applied = await applyCollectFocusDenial(accounting, {
userId,
caseId,
focusId: focus.id,
status: isCollectSkipUtterance(userMessage) ? "skipped" : "declined",
narrateAdopt,
});
const finished = await persistCollectDenialTurn({
accounting,
userId,
caseId,
requestId,
userMessage,
applied,
});
return completedMessageResponse(finished.streamText, requestId, caseId, finished.turnId);
}
let classified = null;
const intent = await classifyTurnIntentWithRetry(resolvedModel, {
focus,
@@ -550,6 +531,7 @@ export async function POST(request: Request) {
classified = intent.classified;
expectedWrite = intent.expectedWrite;
writeClassified = true;
collectIntent = classified ? "classified" : "unclassified";
if (classified?.intent === "stop_rectification" || classified?.intent === "ask_about_result") {
const previous = previousInferenceFromReceipt(dossier.latestResult?.decisionReceipt ?? null);
const applied = await applyRectificationChoice(accounting, {
@@ -570,12 +552,14 @@ export async function POST(request: Request) {
await transitionV9CaseStatus(accounting, userId, caseId, "paused");
return completedMessageResponse(applied.narration, requestId, caseId, applied.turnId);
}
if (shouldDeclineCollectFocus(classified)) {
const closeStatus = collectFocusCloseStatus(classified);
if (closeStatus) {
const continueToAgent = shouldContinueAgentForDatedEvent(classified);
const applied = await applyCollectFocusDenial(accounting, {
userId,
caseId,
focusId: focus.id,
status: closeStatus,
deferFollowup: continueToAgent,
narrateAdopt,
});
@@ -882,6 +866,7 @@ export async function POST(request: Request) {
timeContext,
generationModel: selectedModel.model,
expectedWrite,
collectIntent,
buildAgent: async (turnId, skillPackage, attemptId) => {
let decision;
try {