feat(rectification): 区间常驻条补代表分钟与已答题数,盘面五段折叠收成两段
Independent Staging Quality Gate / validate (push) Canceled after 3m14s
Independent Staging Quality Gate / publish (push) Canceled after 0s

R7 / 决策 D10。任务书 docs/tasks/TASK-cend-surfaces-claude-alignment-20260916.md。

T7.1 常驻条。任务书 E9 说区间只在盘面标题行,实际读代码:对话区顶部
已有常驻条 RectificationTimeline 且已显示区间与宽度,窄屏 .is-compact 下
也可见。真正只存在于 .rectification-board__clock 的是代表分钟——窄屏盘面
是默认关闭的 overlay,代表分钟就此看不见。所以没有另造第二条(会撞固定条
高这条正确性约束),而是在既有条上补齐缺的两项:

  05:07–05:09 · 3 分钟 · 代表分钟 05:08 · 已答 6 题

代表分钟与盘面标题行是同一次 workingRectificationTime(result) 调用,一个
值两处用,不是两条推导路径。已答题数逐字读服务端的
inference_state.answered_probe_count,投影没给就整项不显示,不补「已答 0 题」。
条上不写确认,边界句仍只在交付/采用旁白里出现一次。读数只增宽不增高:条高
在滚动容器外,变高会让贴底读者的内容无声滑出视野。

收窄进度未做,触发让步顺序第 5 条。没有这个字段(服务端只把这句话拼进旁白
正文),且前端自己减会算错——candidate_range 是当前窗口且会放宽(BUG-572),
拿它当「最初」相减会把一次放宽报成一次收窄。缺口与解除条件写进 BLOCKED.md。

T7.2 盘面折叠。实际有 8 个 details(任务书记的五处漏了交界节奏、错标了两块),
按内容归成「候选分钟」(换升时刻 + 次级候选)与「参数与口径」(宫位表、确认门、
本轮技法、两段本命上升、经历与大运对照含双轨一致性、交界节奏)。每块保留原有
渲染条件,engineMeaningToDisplayCopy() 仍是 5 处,逐分钟行的 is-changed /
当前时间 一字未改。共享组件 technique-audit-disclosure.tsx 未动。

顺带修掉一个静默失效的断言:rectification-agentic-entry 用
board.slice(indexOf(A), indexOf(B)),B 改名后 indexOf 返回 -1,slice(i, -1)
会悄悄退化成几乎整份文件,底下四条 doesNotMatch 照样绿。已换成带越界断言的
sliceBetween()。两处改动的断言都在测试里写了原值/新值/原因。

tsc 0 错;lint 0 error / 118 warning(同基线);npm test 3350 → 3360,失败
仍是 31 条无 Docker 用例且与基线逐条一致;next build exit 0,/ 仍 ○ Static;
产物 CSS gzip 39,017 → 38,973 B(−0.11%)。

窄屏 .is-compact 下常驻条的实际可见性无 Chrome 无法验证,已按任务书写成环境
缺口,未标通过;CSS 上已确认无任何规则在该状态下隐藏该条,并写成测试断言。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
This commit is contained in:
Jesse_Chen
2026-09-16 06:44:49 +00:00
co-authored by Claude Opus 5
parent a1a78c7ebc
commit ca0204984b
13 changed files with 751 additions and 72 deletions
+25 -3
View File
@@ -614,17 +614,30 @@ Admin 的 antd `<Spin>` 是独立设计系统,不在此表。
读数和轴的水平内边距对齐助手列:桌面 `space-8 + --assistant-content-inset`767px 以下 `space-4 + --assistant-content-inset`,与 `.message-list` 沟槽和头像让位相同。底边发丝线和背景仍拉满聊天列,不把条做成第二条滚动容器。
**三、条上只有两个元素**:轴本体(区间带 + 候选标记 + 刻度)与区间读数(`05:0705:09 · 3 分钟`)。以下一律不得加回来——每一条都是被明确砍掉的
**三、条上只有两个元素**:轴本体(区间带 + 候选标记 + 刻度)与一行读数。读数四项、一行排完
`05:0705:09 · 3 分钟 · 代表分钟 05:08 · 已答 6 题`
**读数只增宽,不增高。** 条高仍是硬规定二的 64 / 56px,`.rectification-timeline__readout` 因此是 `flex-wrap: nowrap` + `white-space: nowrap`;真放不下时由条本身的 `overflow: hidden` 裁掉尾部,四项里「已答 N 题」排最后、最先被裁——它是背景信息,区间和代表分钟不是。
**代表分钟上条是 D10(2026-09-16)的产品决定,推翻了「条上只有区间」的原设计。** 理由是窄屏:`.is-compact` 下右栏盘面整体变成默认关闭的 overlay,代表分钟此前只在 `.rectification-board__clock` 出现,于是用户最该一直看着的那个数字恰恰看不见。条上的取值必须与盘面标题行**同一次调用**——`workingRectificationTime(result)`,由 `rectification-agentic-chat.tsx` 算一次、两处共用,不允许第二条推导路径。已采用时写「已采用 HH:MM」,否则写「代表分钟 HH:MM」;**采用不是确认**,完整边界句仍只在交付 / 采用旁白里出现一次,条上不写、也不得暗示某一分钟已确认。
**条上不得出现收窄进度(「已从 30 分钟收到 7 分钟」)。** 开场窗口确实在线上,但没有任何投影把这个对比作为字段给出,而 VOICE.md 第 2 条要求进度数字来自服务端。前端自己减还会算错:轴是**当前**窗口且会放宽(BUG-572),相减会把一次放宽报成进度。这句话继续由服务端拼进旁白。缺的字段见 `BLOCKED.md`
以下一律不得加回来——每一条都是被明确砍掉的:
| 不得出现 | 理由 |
| --- | --- |
| 范围变化句 | 服务端已写进落库助手消息,BUG-588 防复发要求它在那里;条上再写=同句同屏两次 |
| 收窄进度(「已从 N 分钟收到 M 分钟」) | 无服务端字段;前端相减会把放宽报成收窄。见上 |
| 「仍在范围内 N / 已排除 N」计数与图例 | 实心=在内、空心=已排除,答完第一题即自明;图例是过度提示的典型形态 |
| 阶段标签(时段 / 分钟) | `block_scan` / `minute` 是后台词汇,贴近 BUG-043 红线 |
| 「已对照 N 件经历」 | 归交付卡;卡上是人话「N 件里 M 件对得上」,不是计数条 |
| 「已对照 N 件经历」 | 归交付卡;卡上是人话「N 件里 M 件对得上」。它和条上的「已答 N 题」不是同一个量:后者是服务端 `inference_state.answered_probe_count`,问了几道答了几道,不是经历吻合数 |
| 「时间轴只读」注脚 | 在解释一个不存在的东西;没有元素看起来可点,就不需要声明不可点 |
| 预计剩余时间、定时器插值动画 | 与报告进度条同一条原则:不得演出后端没做的动作 |
**条上每个数字都必须是服务端投影里已有的字段。** 区间来自 `credible_range`,代表分钟来自上面那一次调用,已答题数来自 `answered_probe_count`;投影没给计数就整项不显示,不得补一个 `已答 0 题`
### 轴与标记
- **轴 = 当前搜索窗口(`candidate_range`),不是开场窗口。** 开场窗口不是定值(±15 / ±30 / ±60 / ±120 / 整天),且放宽会顶穿它(BUG-572:±15 → ±30 → ±60 → ±120)。窗口变化时轴重新对到新窗口,区间带与标记用 CSS transition 过渡到新位置(`prefers-reduced-motion` 由全局 `*` 规则收成一帧)。窗口不变时轴稳定,收窄照样读得出来。
@@ -653,7 +666,16 @@ Admin 的 antd `<Spin>` 是独立设计系统,不在此表。
**本命宫位改北印星盘。**`VedicChartSvg` 渲染代表分钟的 `house_table`。宫位表退到星盘下方的 `<details>`(读屏与复制仍可用)。换分钟时只高亮变化的宫(`changedHouses` / `lagnaChanged`),不做动画。星盘组件在校正面 `dynamic()` 分包里,不进首页首屏。
**换升时刻默认折叠。** 时间轴已常驻显示范围与候选点,右栏「换升时刻」整段默认收进 `<details>`,summary 为「换升时刻 · N 个」;逐分钟 LayerChips 不变。「显示层」子折叠并入同一折叠。确认门折叠、两段本命上升折叠保留原样。
**折叠块只有两段(D102026-09-16)。** 此前盘面从上到下并排五个 `<details className="technique-audit">`,一屏扫下去全是折叠头,看不出哪个该点。现在收敛成两段,星盘本身不折叠:
| 段 | 装什么 |
| --- | --- |
| **候选分钟** · N 个时刻 | 「换升时刻」(段内组标题 + 逐分钟 LayerChips 列表)、「次级候选」子折叠(原「显示层」) |
| **参数与口径** | 「本命宫位表」、「唯一分钟确认门」、「本轮技法」、「两段本命上升」、「经历与大运对照」(含双轨一致性那句)、「交界节奏」 |
**这是换归属,不是删内容。** 六块一条不少,每块保留自己原来的渲染条件——确认门与技法表仍跟着 `table` 走,此前没有星盘时它们本来就不出现,现在也一样。所有引擎串仍逐一经过 `engineMeaningToDisplayCopy()`。逐分钟行的 `is-changed` / `is-working` / 「当前时间」 / 「已更新」标记一律不变。
两段都默认收起,且都是真 `<summary>`——嵌套多了一层,键盘可达性因此只能靠 `<summary>` 保证,不得把任何一块改成挂 `onClick``div`。盘面内 `.technique-audit` 的分隔线仍是全局关掉的,段内节奏由 `.rectification-board .technique-audit > *``margin-top` 给。
## 13. 回答的两层可见性