fix(rectification): simplify delivery card and guard double turns (BUG-595, BUG-596)
Independent Staging Quality Gate / validate (push) Successful in 25m9s
Independent Staging Quality Gate / publish (push) Successful in 37m19s

Make the range card row-select, drop the composer 先这样 control and adopt status bar, keep delivery copy to three sentences with a folded verification report, and skip a second no-message agent run after a terminal delivery turn.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-08 19:56:48 +08:00
co-authored by Cursor
parent 6368ebba0f
commit 7e3b6cdc7a
60 changed files with 1561 additions and 1105 deletions
@@ -319,8 +319,10 @@ test("Agentic rectification follows the conversation tail only while the reader
assert.match(styles, /--rectification-jump-clearance/);
assert.match(styles, /\.message-stage-and-answer \{[\s\S]*gap: var\(--space-2\)/);
assert.doesNotMatch(chat, /conversationEnd/);
// 旧 禁止任何 scrollIntoView → 新 改选滚到出卡消息 → 保留 不得再做 conversationEnd 第二套滚动
assert.match(chat, /offerSectionRef\.current\?\.scrollIntoView\(\{ block: "center", behavior: "smooth" \}\)/);
// 原值: 改选滚到出卡消息
// 新值: 无 offerSectionRef;点其他行即改选
// 原因: BUG-595 决策 3
assert.doesNotMatch(chat, /offerSectionRef/);
assert.doesNotMatch(styles, /scrollIntoView/);
});
@@ -427,12 +429,15 @@ test("candidate state renders from the snapshot API and never from sentinels", (
assert.doesNotMatch(chat, /disabled=\{Boolean\(candidateResult\.selectedTime\)/);
assert.match(styles, /\.rectification-candidate-list \{[\s\S]*grid-template-columns: repeat\(3, minmax\(0, 1fr\)\)/);
assert.match(styles, /\.rectification-candidate-list \{[\s\S]*min-width: 0/);
assert.match(styles, /\.rectification-divergence-list \{[\s\S]*grid-template-columns: repeat\(3, minmax\(0, 1fr\)\)/);
// 原值: 分歧面板三列
// 新值: 按分钟行选,无 divergence-list
// 原因: BUG-595 决策 1
assert.doesNotMatch(styles, /\.rectification-divergence-list \{/);
assert.doesNotMatch(chat, /relativeSupport}\%/);
assert.doesNotMatch(chat, /相对支持度 \{candidate\.relativeSupport\}/);
assert.doesNotMatch(chat, /isRecommendedRectificationCandidate/);
assert.match(deliveryCard, /已采用/);
assert.match(deliveryCard, /正在采用…/);
assert.match(deliveryCard, /rangeDeliveryAdopted/);
assert.match(deliveryCard, /rangeDeliveryAdopting/);
assert.match(chat, /RectificationBoard/);
assert.match(board, /className="rectification-snapshot"/);
assert.match(styles, /\.rectification-snapshot \{/);
@@ -599,7 +604,10 @@ test("time-selection cards use server adoption state and stay mutually exclusive
/offeredSelectionOnce/,
);
assert.match(chat, /!candidateResult\?\.selectedTime \? latestSettledAssistant\?\.renderKey/);
assert.match(messageLoop, /showSelectionCards && message\.renderKey === selectionCardMessageKey/);
// 原值: showSelectionCards && message.renderKey === selectionCardMessageKey
// 新值: 还要有 candidateResult 才渲染行选卡
// 原因: BUG-595 决策 1
assert.match(messageLoop, /showSelectionCards && candidateResult && message\.renderKey === selectionCardMessageKey/);
assert.match(messageLoop, /<RectificationChoiceCard/);
assert.match(messageLoop, /variant="embedded"/);
assert.match(messageLoop, /choiceNonce/);