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
@@ -13,7 +13,7 @@ import {
parseWindowScan,
} from "../src/lib/rectification-agentic/v9/varga-observations.ts";
import { WINDOW_SCAN_DISPLAY_LAYER_ORDER } from "../src/lib/rectification-agentic/v9/refinement-packet.ts";
import { GENERIC_COLLECT_QUESTION, USER_COLLECT_QUESTION, withFirstDatedCollectInvite } from "../src/lib/rectification-agentic/user-copy.ts";
import { GENERIC_COLLECT_QUESTION, collectQuestionForDomain, withFirstDatedCollectInvite } from "../src/lib/rectification-agentic/user-copy.ts";
import { RECTIFICATION_SKILL_VERSION } from "../src/lib/rectification-agentic/v9/case-status.ts";
import { buildInferenceState } from "../src/lib/rectification-agentic/core/build-state.ts";
import { decideRectification } from "../src/lib/rectification-agentic/core/rectification-decision.ts";
@@ -1454,9 +1454,9 @@ test("rescore failure does not fail the evidence write", async () => {
assert.ok(result.rescore.error_code);
});
test("public tool surface stays at 14 and new cases bind 10.0.21", () => {
test("public tool surface stays at 14 and new cases bind 10.0.22", () => {
assert.equal(PUBLIC_RECTIFICATION_TOOLS.length, 14);
assert.equal(RECTIFICATION_SKILL_VERSION, "10.0.21");
assert.equal(RECTIFICATION_SKILL_VERSION, "10.0.22");
const deprecated = resolveExactSkillPackage(
"jyotish-birth-time-rectification",
"10.0.2",
@@ -2386,15 +2386,15 @@ test("family collect attaches the collection-probe year instead of a yearless D2
assert.equal(plan.next_followup?.domain, "family");
assert.equal(plan.next_followup?.choice_frame, null);
assert.equal(plan.next_followup?.probe_year, 2021);
// 旧:year_label / spoken 带「2021 年前后,」前缀
// 新probe_year 仍是 2021,口语等于 USER_COLLECT_QUESTION.family,不填 year_label
// 原因:决策 7,年份只用于计分与去重,不进采集题干
// 原值: USER_COLLECT_QUESTION.family,不进题干
// 新值: 带 2021 年前后线索,不含「记得大概哪年就行」
// 原因: BUG-642
assert.equal(plan.next_followup?.year_label, undefined);
assert.doesNotMatch(plan.next_followup?.semantic_key ?? "", /varga\.d24/);
// 旧:口语等于 USER_COLLECT_QUESTION.family
// 新:第一道逐领域采集题干末尾加一次「想到别的也可以一起说」
// 原因:BUG-604 单事件开场不插追问轮
assert.equal(spokenFollowupForUser(plan.next_followup), withFirstDatedCollectInvite(USER_COLLECT_QUESTION.family));
const spoken = spokenFollowupForUser(plan.next_followup);
assert.equal(spoken, withFirstDatedCollectInvite(collectQuestionForDomain("family", 2021) ?? ""));
assert.match(spoken ?? "", /2021 年前后/);
assert.doesNotMatch(spoken ?? "", /记得大概哪年就行/);
});
test("already-open yearless family card is abandoned instead of kept as a scoring frame", () => {