fix(rectification): prevent silent collect focus stalls
Independent Staging Quality Gate / validate (push) Successful in 20m38s
Independent Staging Quality Gate / publish (push) Successful in 24m14s

This commit is contained in:
Jesse_Chen
2026-08-30 23:07:17 +08:00
parent 0ae3e2d796
commit 79bfa73da3
5 changed files with 468 additions and 20 deletions
@@ -5,6 +5,7 @@ import {
evidenceLedgerFingerprint,
loadV9CaseCompute,
loadV9CaseDossier,
loadV9TurnReceipt,
persistV9DeterministicTurn,
RectificationToolServiceError,
transitionV9CaseStatus,
@@ -13,6 +14,7 @@ import { decideFromDossier, rectificationFollowupCatalog } from "@/lib/rectifica
import {
applyRectificationChoice,
applyCollectFocusDenial,
ensureNonTerminalTurnExit,
persistNextInterviewIfIdle,
persistCollectSpokenAssistantIfNew,
} from "@/lib/rectification-agentic/v9/answer-choice";
@@ -683,6 +685,22 @@ export async function POST(request: Request) {
`[rectification-v9] persist next interview after turn failed case=${caseId} reason=${error instanceof Error ? error.name : "Unknown"}`,
);
}
try {
const receipt = await loadV9TurnReceipt(accounting as never, userId, caseId, result.turnId);
const exit = await ensureNonTerminalTurnExit({
accounting: accounting as never,
userId,
caseId,
adoptCarrierReady: Boolean(receipt?.toolActivities.some((activity) => (
activity.tool === "rectification-offer-candidates" && activity.status === "completed"
))),
});
idleHostNarration = exit.hostNarration ?? idleHostNarration;
} catch (error) {
console.warn(
`[rectification-v9] nonterminal turn exit repair failed case=${caseId} reason=${error instanceof Error ? error.name : "Unknown"}`,
);
}
try {
const fallback = await persistCollectSpokenAssistantIfNew({
accounting: accounting as never,