fix(rectification): keep choice stems visible and align overlay adopt with the engine
Independent Staging Quality Gate / validate (push) Successful in 7m44s
Independent Staging Quality Gate / publish (push) Successful in 1m48s

Walkthrough polish: fail-closed empty D9 prompts, stop asserting the next question is on screen, vary same-domain collect copy, switch to reverse-verify after adopt, and let coverage route interview without blocking can_adopt.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-02 13:11:22 +08:00
co-authored by Cursor
parent bd79689f66
commit aab3ad4b84
22 changed files with 1019 additions and 82 deletions
@@ -548,7 +548,10 @@ test("nonterminal invariant 3: answer_choice response waits until incident fallb
const parsedIncident = parseV9CaseDossier(raw);
assert.ok(parsedIncident);
const decision = decideFromDossier(parsedIncident);
assert.equal(decision.canAdopt, false);
// 原断言 canAdopt=falsecoverage 未齐不得采用)→ 新断言 canAdopt=true。
// 问题 E 方案 1:coverage 只做问询路由,不挡 overlay 采用。确认门与引擎 ceiling 仍关。
// 本例仍继续采集家人层,nextAction 不得变成 offer_provisional_range。
assert.equal(decision.canAdopt, true);
assert.notEqual(decision.nextAction, "offer_provisional_range");
let activeFocus: Record<string, unknown> | null = null;
@@ -613,7 +616,9 @@ test("nonterminal invariant 3: answer_choice response waits until incident fallb
assert.ok(refreshed);
const currentQuestion = projectCurrentQuestion(refreshed.conversationSummary.activeFocus);
assert.equal(response.status, 200);
assert.equal(decision.canAdopt, false);
// 原断言 canAdopt=false → 新断言 canAdopt=truecoverage 不再挡采用)。
// 保留语义:answer_choice 出口仍必须先把家人采集题干写入 focus/turn,再返回 HTTP。
assert.equal(decision.canAdopt, true);
assert.ok(currentQuestion?.prompt);
assert.equal(currentQuestion.prompt, "家里如果有结婚、添丁或住院这类事,记得大概哪年就行。");
const historyTurn = accounting.calls.find((call) => call.fn === "append_agentic_rectification_turn");