From 3fd74daf34605bea7b7c77a807166755ff3eb316 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Wed, 16 Sep 2026 04:18:37 +0000 Subject: [PATCH] =?UTF-8?q?docs(tasks):=20C=20=E7=AB=AF=E6=AC=A1=E7=BA=A7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=AF=B9=E9=BD=90=E4=BB=BB=E5=8A=A1=E4=B9=A6?= =?UTF-8?q?=EF=BC=88R4=E2=80=93R8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 星盘/星历/报告三个页面各是脱离 app 外壳的独立全屏页,侧栏整个消失, 且三家各写了一套一样的 shell/topbar/hero 骨架——与上一单空状态同根因。 R4 抽只读导航外壳(前置)→ R5 星盘+星历、R6 报告 R7 生时校正、R8 设置+充值 可并行 设置单已于 111b4a84 合入,R8 阻塞解除。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P --- docs/tasks/README.md | 1 + ...cend-surfaces-claude-alignment-20260916.md | 323 ++++++++++++++++++ 2 files changed, 324 insertions(+) create mode 100644 docs/tasks/TASK-cend-surfaces-claude-alignment-20260916.md diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 5a4c49e8..c1b06c5f 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -157,6 +157,7 @@ | `TASK-engine-runtime-hygiene-20260901.md` | `PROGRESS-engine-runtime-hygiene-20260901.md` | Python 引擎运行时治理 | 已验收 | `124d3990`(staging 实机三条待部署窗口) | | `TASK-billing-pricing-20260830.md` | `PROGRESS-billing-pricing-20260830.md` | 计费闭环与功能级定价 | 已合入 | `aaaa5fb7`~`a499c344` | | `TASK-cend-ui-claude-alignment-20260916.md` | — | **C 端界面向 claude.ai 产品界面对齐(三轮串行 R1→R2→R3,都动 `globals.css`,不得并行)**:根因是 `frontend/CLAUDE_DESIGN.md` 扒的是 **claude.com 营销官网**,它自己在 Known Gaps 里写明 claude.ai 产品界面不在范围内,而 `DESIGN.md:3` 把它当成了产品界面的实现契约。**R1**:`--font-display` 里 Tiempos Headline / StyreneB **从未加载**(无 `@font-face`、`public/` 无字体、`layout.tsx` 只 vendor 了 Inter),中文标题全站落到 **宋体 / SimSun**,波及 20 处含助手回答的 h2/h3(BUG-737);亮色强调色 `#85432f` 与暗色 `#d78064` 不同源,产品拍板亮色换 **Claude coral `#cc785c`**,**易漏点**是 `globals.css:16` 的 `--color-ring` 硬编码在 `@theme inline` 里不跟随 `:root`,另有第四个 `:root` 亮色块(`:4358`)必须同步(BUG-738);`.composer-footer` 常驻 44px + 顶栏 68px + `--composer-reserve` 148px,每屏固定吃掉 216px,模型选择器移进输入框内部、删掉底栏、顶栏收到 46px 并删「分析对象」副标题。**R2**:空状态是营销落地页(hero 卡 + 两张 132px 入口大卡 + 3 列 156px 主题卡),输入框被压在 **800px 以上**内容之下,重排成「问候 + 居中输入框 + 两枚入口 pill + 一排 chip」。**R3**:侧栏两个 `
` 拍平成一条「最近」、星盘的两个入口(侧栏分组 + 账户菜单)收敛到一处、删掉逐条助手头像。**决策记录 D3 推翻 DESIGN.md「报告强调色与应用同源」一句**(报告刻意保留深棕)。原型图 https://claude.ai/code/artifact/da275da6-2954-4f50-99aa-32bb8694d38b(三套画面 + 明暗,页面标题就是建议字体栈的实际渲染)。环境缺口:无登录态无 Chrome,四项真机观感留 `docs/testing/`。BUG 段 737–738 | 待领取 | — | +| `TASK-cend-surfaces-claude-alignment-20260916.md` | — | **次级页面对齐(上一单的续篇,R4→R5/R6,R7、R8 可并行)**:星盘 `/chart`、星历 `/ephemeris`、报告 `/reports` **各是脱离 app 外壳的独立全屏页**,顶部只有一个「返回对话」链接、侧栏整个消失,且三家各写了一套一模一样的 `*-shell`/`*-topbar`/`*-hero` 骨架——与上一单 E5 同根因(营销站 band 结构被套到产品界面)。**R4** 抽只读导航外壳 `AppNavRail`(只用现成的 `GET /api/sessions` + `GET /api/account`,会话行走 `sessionHref` 跳 `/?c=`;**刻意不带**重命名/删除/收藏/归档——那套连着 `Home()` 的乐观更新与回滚,搬过来会撞 useState 增长门禁)。**R5** 星盘五 tab 下划线化 + 参数合表 + 行星表横向滚动;星历日期导航改 `‹ 日期 ›`。**R6** 报告中心卡片网格改行式列表;阅读页加常驻目录。**R7** 生时校正把可信区间从盘面板标题行提成常驻条(窄屏 `.is-compact` 下盘面板是 overlay,现在默认看不到区间),五个 `technique-audit` 折叠块收成两段。**R8** 设置内容区收窄(880px 弹窗里表单铺了 690px)、套餐卡三修饰符收敛成两态。**已解锁**:原挡路的设置单已于 `111b4a84`(BUG-698)合入。**两条不得回退**:BUG-698 的 `@supports (height: 1dvh)` 写法(重复声明回退会被 Lightning CSS 折叠)、BUG-616/617 的报告盘面 grid 实现。默认不占 BUG 号 | 执行中(Claude 直接执行) | — | ### 待开的任务书(2026-09-03 审查决定) diff --git a/docs/tasks/TASK-cend-surfaces-claude-alignment-20260916.md b/docs/tasks/TASK-cend-surfaces-claude-alignment-20260916.md new file mode 100644 index 00000000..dda239a6 --- /dev/null +++ b/docs/tasks/TASK-cend-surfaces-claude-alignment-20260916.md @@ -0,0 +1,323 @@ +# TASK · C 端次级页面向 claude.ai 产品界面对齐(2026-09-16) + +## 基线 + +- 基线 commit:`origin/staging` = `111b4a8455b5e3d6ae7b4ea759ba35492fc806cc`(2026-09-16,BUG-698 设置弹窗 vh 基线之后) +- 原型图(十套画面,本单覆盖后七套): + https://claude.ai/code/artifact/da275da6-2954-4f50-99aa-32bb8694d38b +- **本单是 `TASK-cend-ui-claude-alignment-20260916.md` 的续篇。** 那一份改对话主链路(R1 字体与强调色、R2 空状态、R3 侧栏),本份改五个次级面。 +- BUG 编号起点:**BUG-739**(当前最大 BUG-738;本单四轮均为产品改造,**默认不占 BUG 号**,只有实现中发现真实缺陷才从 739 起顺延) + +### 轮次依赖 + +``` +brief#1 R1(字体 + coral token) ← 软前置,先落地可避免两次视觉返工 + │ + ├─ R4 次级页外壳 ──┬─ R5 星盘 + 星历 + │ └─ R6 报告中心 + 报告阅读 + ├─ R7 生时校正 (文件不重叠,可与 R4/R5/R6 并行) + └─ R8 设置 + 充值 (文件不重叠,可并行;基线已解锁,见下) +``` + +R8 原本被 `codex/settings-dialog-size-and-nav-20260916` 挡着,该单已于 `111b4a84` 合入,**阻塞解除**。 + +`globals.css` 四轮都要动,但落在互不重叠的区段:R4/R5 在 `.chart-page-*` / `.ephemeris-*`;R6 在 `.report-center-*` / `.personal-report-*`;R7 在 2614–2800 的 `.rectification-workspace*`;R8 在 1757–1960 的 `.settings-*` / `.membership-*`。**同一轮内不得越界改别轮的区段**,越界即产生冲突。 + +--- + +## 事故实证 + +行号按 `origin/staging` 的 `111b4a84`。符号名在括号里,行号漂移时按符号定位。 + +### E8 · 三个次级页各自是脱离 app 外壳的独立全屏页 + +| 路由 | 入口文件 | 外壳写法 | +|---|---|---| +| `/chart` | `frontend/src/app/chart/page.tsx` | ``,仅 `import "../site-styles"` | +| `/ephemeris` | `frontend/src/app/ephemeris/page.tsx` | ``,同上 | +| `/reports` | `frontend/src/app/reports/page.tsx` | ``,另加 `export const dynamic = "force-dynamic"` | + +三个页面的根节点分别是 `chart-page-view.tsx:70`(`
`)、`ephemeris-page.tsx:116`(`.ephemeris-shell`)、`personal-report-center.tsx:179`(`.report-center-shell`),彼此**各写了一套一模一样的骨架**: + +``` +*-shell + └ *-topbar → 只有一个「返回对话」链接 + └ *-hero → h1 大标题 + 一行副文案 + └ *-section → h2 + 内容 +``` + +侧栏(`AppSidebar`)只在 `page.tsx:1560` 的 `Home()` 里渲染,挂在 `SidebarProvider`(`:1557`)下。所以用户从对话点进星盘页,**侧栏整个消失**,唯一的回路是那个「返回对话」链接。 + +这与 brief#1 的 E5(空状态是营销落地页)是同一个根因的三次复制:`*-hero` 加 `*-section` 就是 claude.com 营销页的 band 结构。 + +### E9 · 生时校正的盘面板有五个折叠块,最该看的数字埋在里面 + +`frontend/src/components/rectification-board.tsx` 内 `
` 出现在 `:117`、`:132`、`:160`、`:182`、`:198` 共五处,分别装:盘面技法审计、换升时刻、次级候选分钟、口径披露、双轨一致性。 + +当前可信区间与代表分钟是整个流程里用户唯一持续关心的数字,现在它只以 `.rectification-board__clock`(`:81`)的形式出现在**右侧面板的标题行**,在窄屏(`.rectification-workspace.is-compact`,`globals.css:2630`)下该面板整体变成 overlay,默认不可见。 + +### E10 · 报告阅读页是一整篇 Markdown,没有任何导航 + +`frontend/src/components/personal-report/personal-report-page.tsx:421` 起: + +``` +
+ +
+ +
+
+``` + +一份完整个人报告是 9 节、20 余张盘。整篇直下,**没有目录、没有章节定位**,只能靠滚动。 + +**已修、不要重做**:BUG-616(22 张盘叠在同一位置)与 BUG-617(滚动整篇重建卡顿)在 `docs/BUG_HISTORY.md` 里都是 `resolved`,修法是 `frontend/src/lib/report-chart-grid-rehype.ts` 把 `D\d+` / `Moon Chart` 标题收进 grid 容器。本轮**不得回退该实现**,只在其上加导航。 + +### E11 · 报告中心是卡片网格,状态信息靠底色区分 + +`personal-report-center.tsx:218` 起 `.report-center-list` → `.report-center-card`(`globals.css:3608`)。状态 `.report-center-status` 三个变体(`:3632-3635`)分别用 `--color-success-muted` / `--color-action-soft` / `--color-danger-muted` 三块底色区分。卡片网格在报告数量超过五六份后扫读成本高于行式列表。 + +### E12 · 套餐卡三个修饰符叠加三层描边与底色 + +`frontend/src/components/billing-panel.tsx:135`: + +```js +className={`membership-plan-card${recommended ? " membership-plan-card--recommended" : ""}${isCurrent ? " membership-plan-card--current" : ""}${highlighted ? " membership-plan-card--highlighted" : ""}`} +``` + +三个修饰符可同时命中(推荐 + 当前 + 从 URL 高亮),叠出的边框与底色组合没有设计定义。 + +### E13 · 设置弹窗内容区铺满,与导航宽度失衡 + +`globals.css:1759`(`.account-settings-shell`):`grid-template-columns: 176px minmax(0, 1fr)`,弹窗总宽 880px,内容区因此有约 690px。其中「个人资料」是一列表单,铺到 690px 后每行左右大量留白,字段与标签的关联被拉断。 + +(`.settings-dialog-nav-item[aria-current="page"]` 的左侧强调条已在 BUG-698 里改成填充块,**本单不重复改**。) + +--- + +## 根因 + +1. **E8/E11 的共同根因**:与 brief#1 的根因同源——`frontend/CLAUDE_DESIGN.md` 是 claude.com **营销官网**的设计系统,它自己在 `## Known Gaps` 写明 claude.ai 产品界面不在范围内。营销站的页面是「独立着陆页 + hero + 特性卡网格」,产品界面是「常驻外壳 + 主区域换内容」。三个次级页照抄了前者。 + +2. **E8 的直接根因**:`AppSidebar` 的数据与回调(`sessions` / `charts` / `account` / `sessionControls` 共约 15 个)全部生长在 `Home()` 的 hook 里,没有一个可独立复用的导航外壳。于是新页面只能选择「不要侧栏」。 + +3. **E9/E10 的根因**:把"可核查的依据"与"用户要一直看着的结论"放进了同一种容器(折叠块 / 长正文流)。依据可以折叠,结论不能。 + +--- + +## 决策记录 + +产品负责人 2026-09-16 在会话中审阅原型图后确认「现在已经很完美了,请你开始吧」,即授权按原型图实施。逐条: + +- **D8|三个次级页收进同一个外壳,侧栏常驻。** 删掉各页的「返回对话」链接与 hero 大标题;页名进顶栏。 +- **D9|次级页的侧栏是只读导航,不带会话操作。** 重命名 / 删除 / 收藏 / 归档 / 分享只在 `/` 上提供。理由见 T4.1 的工作量论证;这是刻意的功能差,不是遗漏。 +- **D10|生时校正的可信区间提成常驻条**(含收窄进度),盘面板五个折叠块收敛成「候选分钟」与「参数」两段。窄屏下常驻条必须仍然可见。 +- **D11|报告阅读页加常驻目录。** 纸面调色板(`--report-paper` / `--report-rule` / `--report-accent`)**保持不动**,延续 brief#1 决策 D3:报告是文档表面,不跟应用强调色走。 +- **D12|报告中心卡片网格改行式列表**,状态用带色点的 chip。 +- **D13|套餐卡的三个修饰符收敛成两种状态**:「当前套餐」与「推荐」。URL 高亮(`highlighted`)不再改变卡片外观,改为滚动定位。 +- **D14|会员充值不恢复独立路由。** 线上已无 `/membership` 页面(`frontend/src/app/membership/` 不存在,`membershipHref` 只用于设置弹窗内的 pane 定位),维持现状。 + +--- + +## 硬红线 + +1. `./node_modules/.bin/tsc --noEmit` 0 错;`npm run lint` **0 error**。 +2. 测试总数不得低于开工时在 `origin/staging` 的实测值。改任何既有断言必须在进度记录里写「原值 / 新值 / 原因」三栏。 +3. `next build` 后 **`/` 保持 `○ Static`**。R4 给次级页加外壳**不得**把 `/` 变成动态渲染;`/chart` 与 `/ephemeris` 当前的渲染标记也必须保持不变(`/reports` 本来就是 `force-dynamic`,维持)。四个路由的渲染标记改前改后逐个列进进度记录。 +4. 首屏 gzip:`/` 的变化在 ±2% 内。次级页各自的首屏体积改前改后都要列出;R4 因为新增了侧栏,次级页体积**预期上升**,上升幅度要给出数字并说明。 +5. `frontend/src/app/page.tsx` 按 `AGENTS.md` §6 现行门禁:`Home()` 的 `useState` / `useRef` 数**不得增长**(`frontend/tests/home-shell-growth-contract.test.ts` 执行),行数是粗护栏(开工实测基线 + 150)。 +6. 一律复用 `ChatComposer`;一律复用 `useConversationScrollAnchor` + `JumpToLatestButton`。不得手写第二套。 +7. 揭幕后不得出现 spinner / 骨架 /「正在加载」(流式生成中除外)。次级页外壳在会话列表到达前显示**静态空态**,不是骨架屏。 +8. **不得回退 BUG-698 的 `@supports (height: 1dvh)` 写法**(`globals.css:5110` 起)。经典的 `height: 100vh; height: 100dvh;` 重复声明回退会被 Lightning CSS 折叠掉,`frontend/tests/viewport-unit-fallback-contract.test.ts` 会拦。新写的全高容器照同一模式办。 +9. **不得回退 BUG-616/617 的报告盘面 grid 实现**(`report-chart-grid-rehype.ts`)。 +10. 改 UI 的**同一提交**内更新 `frontend/DESIGN.md`;新文案先对照 `frontend/docs/VOICE.md`。 +11. 不改数据库结构,不得顺带动迁移。不得顺手升级依赖、不得顺手修不在本单里的 warning。 +12. 次级页的只读侧栏**不得**发起任何写操作接口。会话重命名 / 删除 / 归档的 RPC 在这些页面上必须不可达(D9)。 + +--- + +## 任务分解 + +### R4 · 次级页外壳(前置轮) + +分支 `codex/cend-shell-20260916`。R5 与 R6 依赖本轮。 + +#### T4.1 · 抽出只读导航外壳 + +新建 `frontend/src/components/app-nav-rail.tsx`(名字可改,不要叫 `AppShell` 以免与 `Home()` 的 `SidebarProvider` 混淆)。它渲染:品牌字、三个导航项(新建对话 → `/`、我的报告 → `/reports`、星盘资料 → `/?settings=chart-library` 或等价入口)、一条「最近」列表、账户页脚。 + +数据只需两个现成的只读接口: + +| 需要 | 来源 | 现状 | +|---|---|---| +| 会话列表 | `GET /api/sessions`(`frontend/src/app/api/sessions/route.ts`) | 已存在 | +| 账户与余额 | `GET /api/account`(`frontend/src/app/api/account/route.ts`) | 已存在 | + +会话行用 `sessionHref(search, sessionId)`(`frontend/src/lib/chat-session-url.ts:32`)生成 `/?c=` 链接,直接跳回 `/` 并选中该会话——**不要另造一套跳转**。 + +**为什么是只读(D9 的工作量论证)**:`AppSidebar` 当前需要 `sessionControls` 这一整组回调(重命名、删除、收藏、归档、分享、菜单开合),它们连着 `Home()` 里的乐观更新、确认弹窗与错误回滚。把这套搬到四个路由共享,等于把 `Home()` 的会话管理层整体上提,**远超本单范围**且会撞红线 5。只读版本用一次 `GET` 就够,且次级页上并不需要这些操作。 + +**验收标准** +- `AppNavRail` 不 import `page.tsx` 的任何 hook,不持有会话写状态。 +- 四个路由(`/chart`、`/ephemeris`、`/reports`、`/reports/[reportId]`)都挂上外壳,侧栏在桌面常驻、在移动端是抽屉。 +- 点任一「最近」行跳到 `/?c=` 并正确选中该会话(`parseSessionUrlQuery` 已有测试,补一条链接生成的断言即可)。 +- 会话列表未到达时显示静态空态文案,**无骨架屏、无 spinner**(红线 7)。 +- 未登录时外壳降级为只有品牌字与登录入口,不报错、不空白。 +- 四个路由的渲染标记与 `/` 的 `○ Static` 逐个列进进度记录(红线 3)。 + +#### T4.2 · 删掉三套重复骨架 + +- `chart-page-view.tsx`:删 `.chart-page-topbar` 与其中的「返回对话」``;`.chart-page-hero` 的 `

星盘

` 删除,出生行改为顶栏里的一枚 chip。 +- `ephemeris-page.tsx`:同样删 `.ephemeris-topbar` / `.ephemeris-back`,`

` 删除;底部 `.ephemeris-footer` 里的「去问」按钮提到顶栏右侧。 +- `personal-report-center.tsx`:删 `.report-center-topbar` / `.report-center-back`,`

个人报告

` 删除;生成按钮提到顶栏右侧。 +- `globals.css` 里对应的 `.chart-page-topbar` / `.chart-page-back` / `.ephemeris-topbar` / `.ephemeris-back` / `.report-center-topbar` / `.report-center-back` / 三个 `*-hero` 规则一并清理。 + +**验收标准** +- `git grep -n "返回对话" frontend/src` 无命中。 +- 三个页面的错误态与空态(未登录、读取失败、无数据)仍然各自可达且文案不变——这些分支现在挂在 `*-shell *-message` 上(例如 `ephemeris-page.tsx:61`、`personal-report-center.tsx:169`),改外壳时**不要连它们一起删**。 +- 页名在顶栏可见且窄屏下省略号截断。 + +--- + +### R5 · 星盘 + 星历 + +分支 `codex/cend-chart-eph-20260916`,基线是 R4 合入后的 staging。 + +#### T5.1 · 星盘页 + +- 五个体系 tab(`CHART_VIEW_TABS`)改成顶栏下方一条下划线式 tab 行。 +- 分盘 chips(`.chart-page-varga-chips`)保留,视觉降一级。 +- 参数从 `.chart-page-center-card` 与 `.chart-page-params-below` 收进一张统一的键值表;`view.vedic.boundary` 的边界句放在表下方,**文案不得改动**(它是准确性边界句)。 +- 行星表加横向滚动容器。 + +**验收标准** +- 五个 tab 的按需 layer 拉取(`onNeedLayer("chara"/"western"/"qizheng"/"varga")`)行为不变,等待文案仍用 `CHART_VIEW_COPY.waitingLayer`,不得换成 spinner。 +- 行星表在 375px 宽下横向滚动,页面本身不横向滚动。 +- `chart-view-contract` 相关测试全绿。 + +#### T5.2 · 星历页 + +- 日期导航从三个并排按钮(前一天 / 今天 / 后一天)改成居中的 `‹ 日期 ›` 形式,「今天」在非今日时以文字按钮出现在日期下方。 +- 三个 section 统一成同一套卡片;`.ephemeris-panchanga` 的 `dl` 网格保留。 +- 「就今天问一句」提到顶栏(T4.2 已做),底部 `.ephemeris-footer` 删除。 + +**验收标准** +- `isToday` 的禁用逻辑仍然正确:在今日时不出现「今天」按钮,而不是出现一个禁用按钮。 +- `natalMissing` / `panchangaUnavailable` / `transitsUnavailable` / `eventsUnavailable` 四个降级分支文案与可达性不变。 + +--- + +### R6 · 报告中心 + 报告阅读 + +分支 `codex/cend-report-20260916`,基线是 R4 合入后的 staging。 + +#### T6.1 · 报告中心改行式列表(D12) + +`.report-center-list` 从卡片网格改成单列行式列表,每行:状态 chip(带色点)+ 标题 + 元信息(日期 / 节数 / 盘数)+ 右侧操作。 + +**验收标准** +- 四种状态(`ready` / `generating` / `failed` 以及生成中的分节进度)都有对应行样式;`role="status"` 在 `generating` 行上保留。 +- 失败行仍显示 `failureSummary ?? failureCode`,导出错误 `report-center-export-error` 的 `role="alert"` 保留。 +- 空态与读取失败态(`personal-report-center.tsx:204-216`)不变。 + +#### T6.2 · 报告阅读页加目录(D11) + +在 `.personal-report-reader` 右侧加一条常驻目录,从 Markdown 的 `##` 标题生成,滚动时高亮当前节。窄屏(< 860px)隐藏目录。 + +**验收标准** +- 目录项点击滚动到对应节;当前节高亮。 +- **打印样式不受影响**:`@page` 规则(`personal-report-page.tsx:422`)与 `@media print` 下目录必须隐藏。 +- 纸面 token 一个不改(D11)。 +- 不触碰 `report-chart-grid-rehype.ts`(红线 9);改后仍要实测一份 20 张盘以上的报告不重叠、滚动不卡——**这一条无真机就写成环境缺口,不得写「通过」**。 + +--- + +### R7 · 生时校正(可与 R4/R5/R6 并行) + +分支 `codex/cend-rectification-20260916`。只动 `rectification-*` 文件与 `globals.css` 的 2614–2800 区段。 + +#### T7.1 · 可信区间提成常驻条(D10) + +在对话区顶部加一条常驻条:当前区间、宽度、收窄进度、已答题数。数字**只能来自服务端投影**,不得前端口算(`frontend/docs/VOICE.md` 第 2 条)。 + +**验收标准** +- 窄屏(`.is-compact`)下常驻条仍然可见——这是本轮的核心收益,盘面板 overlay 关闭时也必须看得到区间。 +- 边界语义不弱化:「代表分钟只是代表性候选,不是已确认的唯一出生分钟」这句在交付/采用轮仍完整出现一次(`AGENTS.md` Part B、VOICE.md 第 4 条)。 +- 区间数字与盘面板标题行 `.rectification-board__clock` 的取值同源,不得出现两处不一致。 + +#### T7.2 · 盘面板折叠块收敛 + +五个 `
`(`rectification-board.tsx:117/132/160/182/198`)收敛成两段:「候选分钟」(含次级候选与换升时刻)与「参数与口径」(含技法审计、披露、双轨一致性)。 + +**验收标准** +- 五块内容一条不丢,只是换了归属;`engineMeaningToDisplayCopy()` 的调用点全部保留。 +- 候选分钟列表的 `is-changed` / `当前时间` 标记行为不变。 +- 键盘可达性不弱于改前。 + +--- + +### R8 · 设置弹窗 + 会员充值(可并行;阻塞已解除) + +分支 `codex/cend-settings-billing-20260916`。只动 `account-dialog-overlay.tsx`、`billing-panel.tsx` 与 `globals.css` 的 1757–1960 区段。 + +#### T8.1 · 设置内容区收窄(E13) + +`.settings-dialog-content` 内的表单类面板加一个最大宽度(建议 420–460px),左对齐。列表类面板(星盘资料、订单)保持铺满。 + +**验收标准** +- 「个人资料」与「通用设置」的表单收窄;「星盘资料」列表与「订单」表格不受影响。 +- 四个分区切换时弹窗尺寸不跳变——这是 BUG-554/BUG-698 的现象,**改完必须复验**,并在进度记录里说明复验方式。 +- 不碰 `.settings-dialog-nav-item[aria-current="page"]`(BUG-698 刚改过)。 + +#### T8.2 · 套餐卡状态收敛(D13) + +`billing-panel.tsx:135` 的三修饰符拼接改成两种互斥状态:`is-current`(当前套餐)与 `is-recommended`(推荐)。`highlighted` 不再改变外观,改为挂载后滚动定位到该卡。 + +**验收标准** +- 三种历史组合(推荐 / 当前 / 推荐且当前)各有明确且不叠加的外观。 +- 从 `membershipHref("credits")` 一类带参数的入口进入时,对应 tab 与卡片仍被定位到(改成滚动定位后要真跑一次)。 +- 支付关闭态(`paymentEnabled === false`)、套餐为空态、`packagesError` 三个分支文案与可达性不变。 + +--- + +## 让步顺序 + +1. **T4.1 的只读侧栏**:若 `GET /api/sessions` 在未登录或超时的情况下让次级页首屏变慢 —— 退到「侧栏先渲染品牌字与三个导航项,最近列表到达后再插入」,**但不得用骨架屏**(红线 7)。再退一步:次级页只给品牌字 + 三个导航项,不要最近列表。 +2. **T4.2 的页名进顶栏**:若某页顶栏放不下页名加动作 —— 优先保页名,动作收进一个「更多」菜单。 +3. **T5.1 的参数统一表**:若合并后信息密度过高 —— 退到保留 `.chart-page-center-card`,只做视觉对齐,不做结构合并。 +4. **T6.2 的目录**:若从 Markdown 生成标题锚点与现有 rehype 链冲突 —— 退到只做"回到顶部",目录另立单。**不得为了做目录去改 `report-chart-grid-rehype.ts`。** +5. **T7.1 的收窄进度**:若服务端投影里没有现成的"已从 N 分钟收到 M 分钟"字段 —— 只显示当前区间与宽度,**不要前端口算进度**。缺的字段写进 `BLOCKED.md` 并另立单。 +6. **T7.2 的两段收敛**:若某块内容在两段里都不自然 —— 保留三段,但不得回到五段。 +7. 任何一轮若被门禁或环境卡住,**先把已完成的子任务单独提交并推 staging**,未完成项写进 `BLOCKED.md`,不要整轮压着不交。 + +--- + +## 开工前置命令 + +```bash +git fetch origin --prune +git worktree add -b codex/cend-shell-20260916 .worktrees/cend-shell-20260916 origin/staging +cd .worktrees/cend-shell-20260916/frontend +npm ci +./node_modules/.bin/tsc --noEmit +npm run lint +npm test 2>&1 | tail -30 # 记下测试总数,红线 2 的基线 +npm run build 2>&1 | tail -40 # 记下 / /chart /ephemeris /reports 四个渲染标记与各自首屏体积,红线 3、4 的基线 +``` + +R5–R8 各自重复上述流程:R5、R6 的基线是 R4 合入后的 `origin/staging`;R7、R8 可直接以 `111b4a84` 之后的 `origin/staging` 为基线。 + +开工时核对 `docs/BUG_HISTORY.md` 的当前最大编号(现为 BUG-738)。 + +--- + +## 环境缺口 + +本单诊断来自读代码与设计文档,**没有真机截图**:本会话无登录态、无 Chrome。以下必须落到 `docs/testing/` 的人工清单,不得在进度记录里写成「通过」: + +- 次级页侧栏在移动端抽屉的手势与焦点行为(R4)。 +- 星盘行星表在 375px 宽下的横向滚动(R5)。 +- 20 张盘以上的报告在加目录后仍不重叠、滚动不卡(R6,红线 9 关联)。 +- 生时校正常驻条在窄屏 `.is-compact` 下的实际可见性(R7,本轮核心收益)。 +- 设置弹窗四个分区切换不跳尺寸(R8,BUG-554/698 的复验)。 +- 支付流程(`membershipHref` 入口定位、下单)——无受控账号,整条留给产品负责人实测。