fix(ci): align rectification frontend contracts after skill-style present

The quality gate still expected the old board-only varga sentence ban, and public dasha ledger copy leaked raw scores.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-20 22:25:14 +08:00
parent 1b3e43d0ec
commit 379f0e6f5f
3 changed files with 26 additions and 4 deletions
+16
View File
@@ -4987,6 +4987,22 @@
- 复发自:无
- 修复版本:4b02f63a
## BUG-332 | 校时 skill 呈现改完后,前端质量门仍锁旧分盘句禁令和透传分数账本
- 状态:resolved
- 首次发现:2026-08-20
- 最近更新:2026-08-20
- 影响面:Gitea `backend-quality-gate``npm test --prefix frontend``frontend/tests/rectification-agentic-entry.test.ts``frontend/tests/rectification-candidate-result.test.ts`、公开 `event_dasha_ledger`
- 用户现象:质量门 `tests 1840``pass 1838` / `fail 2`。日志末尾是已通过的 health truth-source 合同;真正失败是校时 Agent 提示合同和候选账本解析。
- 触发条件:把出牌/采用轮改成粘贴 `skill_verification_report`,并把账本 `user_meaning` 透传引擎原文后,再跑完整前端套件。
- 根因:`rectification-agentic-entry` 仍要求提示词写「分盘句和宫位表由界面展示」,与现行「验证报告进正文、宫位表仍由盘面展示」冲突。`parseEventDashaLedger` 改为原样采用 `user_meaning` 后,公开账本会带上 `12.5 points` 一类评分泄漏。
- 修复:入口合同改为锁定 `skill_verification_report` / D9-D10 类型对照,并明确不得再写旧分盘句禁令。公开账本只从 `summary`、匹配档和结构化 `gochara` 重建文案,拒绝 `points` 泄漏。
- 验证:`frontend/tests/rectification-agentic-entry.test.ts``frontend/tests/rectification-v9-agent.test.ts``frontend/tests/rectification-candidate-result.test.ts`;完整 `npm test --prefix frontend`
- 防复发:校时提示词合同必须与 `rectification-v9-agent` 同向;公开 ledger/window copy 不得透传可能含分数或星座类型标签的引擎 `user_meaning`
- 相关记录:BUG-307、BUG-308、BUG-331
- 复发自:BUG-307(当时把分盘句和宫位表从正文挪到界面后,入口合同锁死了那句提示词)
- 修复版本:待提交
## BUG-329 | 生时纠正 Agent 回答在结算后一次性出现,推理中无法停止
- 状态:resolved
@@ -8,7 +8,7 @@
const TIME = /^(?:[01]\d|2[0-3]):[0-5]\d$/;
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const DENIED = /lon|latitude|longitude|degree|score|weight|fingerprint/i;
const DENIED = /lon|latitude|longitude|degree|score|weight|fingerprint|\bpoints\b/i;
const LAYER_LABEL: Record<WindowScanLayer, string> = {
d1: "本命上升",
d9: "D9",
@@ -241,12 +241,16 @@ export function parseEventDashaLedger(value: unknown): readonly EventDashaLedger
const gochara = row.gochara === "activated" || row.gochara === "not_seen"
? row.gochara
: null;
const meaning = asText(row.user_meaning, 220) ?? `${summary}${matchLabel}`;
const gocharaNote = gochara === "activated"
? "Gochara 激活相关宫"
: gochara === "not_seen"
? "Gochara 未见对应"
: "";
rows.push({
summary,
match,
match_label: matchLabel,
user_meaning: meaning,
user_meaning: `${summary}${matchLabel}${gocharaNote}`,
gochara,
});
}
@@ -466,7 +466,9 @@ test("rectification Agent output stays natural and keeps tool execution silent",
assert.match(agent, /禁止只说记下了、会话会保留、以后再继续/);
assert.match(agent, /暂时想不到了 \/ 没有更多 \/ 先这样/);
assert.match(agent, /on_user_stop/);
assert.match(agent, /分盘句和宫位表由界面展示/);
assert.match(agent, /skill_verification_report/);
assert.match(agent, /D9\/D10 类型对照/);
assert.doesNotMatch(agent, /分盘句和宫位表由界面展示/);
assert.match(skill, /不得叙述读取 Skill/);
assert.match(skill, /完整回复可以(?:是)?零(?:个)?问题/);
assert.match(skill, /同一用户可以保留多个可恢复 Case/);