From 379f0e6f5f039bed499ab881baaedfb4414a1c67 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Thu, 20 Aug 2026 22:25:14 +0800 Subject: [PATCH] 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 --- docs/BUG_HISTORY.md | 16 ++++++++++++++++ .../v9/refinement-packet.ts | 10 +++++++--- .../tests/rectification-agentic-entry.test.ts | 4 +++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 2fcd7423..be94226f 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -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 diff --git a/frontend/src/lib/rectification-agentic/v9/refinement-packet.ts b/frontend/src/lib/rectification-agentic/v9/refinement-packet.ts index c9218e0a..42bdf469 100644 --- a/frontend/src/lib/rectification-agentic/v9/refinement-packet.ts +++ b/frontend/src/lib/rectification-agentic/v9/refinement-packet.ts @@ -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 = { 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, }); } diff --git a/frontend/tests/rectification-agentic-entry.test.ts b/frontend/tests/rectification-agentic-entry.test.ts index caa4ff5e..617e4fda 100644 --- a/frontend/tests/rectification-agentic-entry.test.ts +++ b/frontend/tests/rectification-agentic-entry.test.ts @@ -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/);