fix(rectification): invite-first collect, holdout at 4 events, Skill 10.0.23 (BUG-646–648)

Stop domain-wheel collecting and age-band years in prompts. Ask until the training gate, then discriminate until convergence, then deliver a range plus a concrete follow-up. Reserve holdout only with four dated events.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-11 01:43:02 +08:00
co-authored by Cursor
parent cb04529728
commit dd8f35f7ba
70 changed files with 2576 additions and 1183 deletions
@@ -14,6 +14,9 @@ import {
rectificationInitialLiveLabel,
rectificationQuestionGapState,
rectificationQuestionRetryActive,
interviewCollectWaiting,
interviewStopReasonFromSnapshot,
RECTIFICATION_COLLECT_WAITING_PLACEHOLDER,
rectificationReadonlyRangeCopy,
type RectificationQuestionGapInput,
} from "../src/lib/rectification-surface-state.ts";
@@ -60,6 +63,34 @@ test("question gap: preparing while retries remain, then unavailable with a relo
assert.equal(rectificationQuestionRetryActive("verified_idle"), false);
});
test("question gap: collect waiting is not the unavailable repair path", () => {
assert.equal(
interviewCollectWaiting({
stopReason: "insufficient_dated_events",
sessionOutcome: "collect_evidence",
questionMissing: true,
}),
true,
);
assert.equal(
rectificationQuestionGapState({
...gapBase,
collectWaiting: true,
questionLoadFailed: true,
retryAttempts: RECTIFICATION_QUESTION_RETRY_LIMIT,
}),
"collect_waiting",
);
assert.equal(rectificationQuestionRetryActive("collect_waiting"), false);
assert.equal(RECTIFICATION_COLLECT_WAITING_PLACEHOLDER, "再说一件带年月的事");
assert.equal(
interviewStopReasonFromSnapshot({
interview: { stop_reason: "insufficient_domains" },
}),
"insufficient_domains",
);
});
test("question gap: a snapshot that never arrived is a gap the same retries fill", () => {
assert.equal(rectificationQuestionGapState({ ...gapBase, snapshotLoaded: false }), "preparing");
assert.equal(rectificationQuestionGapState({ ...gapBase, snapshotLoaded: false, retryAttempts: RECTIFICATION_QUESTION_RETRY_LIMIT }), "unavailable");