Hide engine branding, gate supported divisional columns, align house cells, and add accessible symbol help. Reduce desktop chart width and stabilize the waiting slot. Validated with 78 browser checks and 87 focused frontend tests. Full suite retains 29 identical baseline loader failures; no new failures. Co-Authored-By: Claude Code <noreply@anthropic.com>
18 KiB
TASK · 星盘去引擎展示、能力列按支持显示、宫位对齐、图标解释与盘面收紧(2026-09-29)
初稿为任务书模式。产品于 2026-09-29 明确要求“请你执行任务书”,已进入独立工作树实施;执行后独立验收,本轮不推送、不发布。
执行补充:尺寸只在既有 ≥1024px 桌面两栏断点收紧,印度 440px 指绘图区而非含 padding 的外框。T3 同时修复本命、月亮、Bhava、行运的同类宫位对齐;本命/月亮保留原八列 markup,按八列表头精确限定 CSS 第四列,不全局改
mid。
1. 基线与串行依赖
- 调查基线:
origin/staging = 78b9c5b65cda44650e8c7ca019931ce33a85a95d。执行开工重新 fetch,记录实际 SHA。 - 实现分支:
codex/chart-surface-polish-20260929;工作树:.worktrees/chart-surface-polish-20260929。 - 进度:
docs/tasks/PROGRESS-chart-surface-polish-20260929.md;真人清单:docs/testing/chart-surface-polish-20260929.md。 - 必须接在
codex/mobile-chart-confirmed-edit-20260929(BUG-1083)合入之后;本基线已包含其修复。不得重新引入手机宽表撑开外层网格的问题。 - 同日报告两单既有顺序不变:
codex/report-reader-polish-20260929→codex/report-english-edition-20260929。本单优先限定/chart;若要同时编辑共享vedic-chart-svg.tsx、报告图盘导出或同一 CSS/文档段落,必须串行交接,不能各自在旧基线上覆盖。默认本单共享 SVG 改动先合入,英文版再接续;若对方已开工,先协调,不重置别人分支。
2. 事故实证与根因
本轮输入为产品截图和展示要求,不记录截图中的真实星盘数据。本轮没有登录态浏览器复现或全量业务验收。代码定位按符号为准,以下行号对应上述基线:
| 现象 | 证据与根因 |
|---|---|
| 所有印度盘显示引擎来源 | frontend/src/lib/chart-view-mapper.ts:822 投影 engineName,chart-view-contract.ts:261 要求该字段;components/chart-page/chart-param-table.tsx:28 把它作为参数行无条件渲染。chart-vedic-tab.tsx:312 的共享 VedicLayout 让该行出现在全部 23 种印度盘型。西洋盘不走此表,不能声称其已有同一行。 |
| 分盘宫位标题左、内容居中(BUG-1098) | chart-vedic-tab.tsx:148,163 的 VargaRow / VargaAscendantRow 给宫位套了 chart-page-planet-mid。globals.css:5210–5215 本来统一左对齐,却被 :5249 的该类覆盖成居中。是单元格类使用不当,不是引擎数据错误。 |
| 盘内符号无悬停解释 | components/personal-report/vedic-chart-svg.tsx:168–220 的 OccupantGlyph 渲染行星、逆行短线、As,没有逐符号 <title>;整盘读屏描述不能替代鼠标提示。西洋盘 components/chart-page/western-wheel-svg.tsx 的行星交互组已有键盘/选择语义,须在其上补解释而非换一套事件。 |
| 印度盘可能铺得过大 | globals.css:5136–5142 的 .chart-page-vedic-stage 未设最大宽度;桌面 :5508–5519 第一列为 minmax(0,1.1fr),盘随列宽铺开。西洋盘 .chart-page-western-wheel(:5417–5421)已有 520px 上限。尺寸取舍不是计算缺陷。 |
历史约束核对
已确认的产品契约冲突:
frontend/DESIGN.md§15「排盘参数表」原来明确规定八行,最后一行为「引擎」。因此移除是新的产品决定,不是丢字段。- 09-28
TASK-chart-types-and-report-buttons-20260928.mdT3 规定分盘庙旺只取入旺 / 自宫 / 落陷,且同位是分盘与本命同星座;不能以空白多直接认定计算不支持,也不能把它包装成全面尊贵状态或外部精度认证。 - 09-18 符号化改造让宫内只画行星符号;读屏信息、图例和鼠标悬停提示不是一回事,不能以已有
aria-label代替可见解释。
数据能力核查(代码证据,不是外部占星准确率验证)
| 范围 | 实际来源 | 本单处理 |
|---|---|---|
| D1 状态 | /api/chart 的原生 _get_dignity_level;旧八列表 |
保留,不改其计算 |
| D2–D60 行星庙旺 | chart-view-mapper.ts:216–253 服务端 vargaRows 调用 chart-view-varga.ts:19–23;规则表由 tests/test_chart_page_vedic_tables_contract.py 与 Python 原生常量及九体×十二星座逐格对照 |
保留三档能力:入旺 / 自宫 / 落陷。不是 /api/varga_full 原生返回字段,但为有合同保护的同源派生,不能说引擎不支持。没有三档命中为 null;不代表未知或不支持 |
| D9 行星同位 | mapper 比较 D1/D9 星座;scripts/jyotish_engine.py:300–313 _calc_vargottama 原生判定也是 D1↔D9 |
保留;必须加星盘投影与原生结果的直接对照测试 |
| D9 上升同位 | mapper 比较 D1/D9 上升;原生 consultation_native_layers.build_d9_summary 与 satabdika_dasha.satabdika_applicability 有同座判定路径 |
保留已有事实比较,补同源合同;不要声称 _calc_vargottama 本身处理上升 |
| 其他 Dn 同位 | mapper 对任意分盘都用 sign === natalSign,并统一命名 vargottama;原生 _calc_vargottama 并无各 Dn 的这套泛化 |
按产品“不支持不显示”的原则,本单收口:只在 D9 显示「同位」,其他 Dn 隐藏。不是断言通用同座比较算错,而是限制产品术语的能力范围 |
| 上升庙旺 | 无此字段,组件固定「—」 | 不对上升假造尊严计算;行星能力列仍在,上升此格标「不适用」并对照 VOICE |
| 月亮 / Bhava / 行运 / 西洋 | 独立表,无上述两列 | 不新增 |
/api/varga_full 本身没有这两字段;既有契约的 dignity 为三枚举或 null、vargottama 为必填 boolean,没有独立的 unsupported 状态。缺分盘/本命星座时 mapper 会跳过该行。支持性应由服务端的盘型能力和有效数据来源表示,不能由真值多少推断,也不能让未知被 false 吞掉。本轮只读查到上述测试存在,尚未运行其回归,不以旧记录代替本轮结果。
3. 决策记录
| 项 | 产品授权 / 本单执行口径 |
|---|---|
| D1 去引擎 | 产品要求所有盘型不再显示「引擎」「Swiss Ephemeris(本站)」这类实现品牌。删除展示节点,不改为「自研引擎」「本站引擎」,不只用 CSS 藏起来。印度各盘型与西洋盘都查。 |
| D2 能力列 | 有实际计算依据才显示「庙旺 / 同位」;没有该能力时隐藏整列,不留一列横杠。支持但未命中不能当成不支持。此次不扩建算法、不虚构结果。 |
| D3 宫位对齐 | 宫位标题与每行内容统一左对齐,同列左右 padding 一致。不是把表头改成居中来迁就错误的单元格样式。 |
| D4 图标说明 | 鼠标停在图标上显示中文名称和已有事实;键盘能获得等价信息。手机没有 hover,提供可用的轻点说明且不与现有点选动作冲突。不加运势解释,不调用模型。 |
| D5 盘面收紧 | 适度缩小星盘页的盘面,优先收紧桌面最大宽度;手机不机械按比例缩小文字与点击区域。不改数据坐标,不重做绘图。 |
对旧约定的有限修订:D1 推翻 DESIGN §15 参数表必须含引擎的旧约定;D2 将 09-28 T3 与 BUG-1076 中「所有分盘同位 = 与本命同星座」的泛化展示收口为 D9 才显示同位(基于此次“不支持则不显示”的授权,架构建议;不新造另名列),庙旺的同源三档派生保留;D3 只修宫位列,宿主 / pada 的居中不顺带改;D5 允许修改星盘页尺寸上限,保留 BUG-1083 的无溢出和西洋盘点击 / 避让规则。版权、许可证、第三方声明与内部诊断元数据不删除;隐藏展示不是让技术栈保密的安全措施。
4. 硬红线
- 不改本命 / 分盘 / Bhava / 行运 / 西洋盘的计算结果、岁差、交点、宫制或时间精度提示;不拿 D1 数据补分盘(BUG-1076)。
- 不在浏览器补算庙旺或同位。数据不支持就不显示,未知不伪装为 false / 正常。
- 服务端计算元数据和审计来源保留;不得全仓字符串替换或删除许可证署名。此次只收口面向用户的盘面展示,不清洗既有存储报告或原始引擎 JSON。
- 星盘页的盘型条、按需取数、缓存身份、等待 / 失败 / 重试规则不变;不新增请求、模型调用或 loading 动画。
- 盘面文字与触控可用性优先于尺寸;西洋盘现有行星点选过滤相位、再次点选取消必须保留。多星同宫和拥挤盘不许通过缩字掩盖重叠。
- 共用 SVG 同时供校正右栏、报告与静态导出使用。不得直接把静态绘图组件整体改为依赖浏览器的客户端组件;交互只在需要的页面接入,导出仍是安全的静态 SVG。图表缩小样式只作用于
/chart。 - 不动数据库、依赖版本、workflow、DNS、
main,不碰首页装配。遵守 AGENTS 增长合同,不另加净增零行约束。 - 改代码之前在
frontend/tests/与tests/检索相关路径、符号、类名和文案;既有断言改动逐条写「原值 / 新值 / 原因」,不删测试消红。fixture 使用现有真实引擎 golden 或虚构输入生成的真实引擎响应。
5. 任务分解与验收
T1 · 去除盘面引擎展示
- 删除参数表引擎行;
engineName在 chart-page view schema / mapper 中只为该行服务,删除这项无用展示投影并同步 fixture / 缓存兼容,不影响原始后端计算元数据。检查所有印度盘型和西洋盘的可见说明是否仍出现实现来源。 - 不误删岁差 / 交点 / 宫制等影响结果的参数,不误删准确性边界。
- 验收:遍历全部盘型,渲染结果无引擎标签和供应商名称;西洋说明同样通过。后台/内部数据来源仍可追踪。若报告中共享盘块原有相同标签,同步去掉盘块标签,但不扩成报告正文清洗任务。
T2 · 能力列按支持显示
- 开工先复核本文数据能力结论,分别记录庙旺与同位的有效来源、覆盖范围和缺值含义。使用最小的服务端列能力契约(如每盘
supportsDignity/supportsVargottama,或等价的可用性字段),无需新建全站能力注册系统。D9 保留两列,其他 Dn 保留庙旺、隐藏同位;上升庙旺标不适用。 - 兼容旧浏览器模块缓存:契约新增字段不得导致旧缓存无声显示错误,按现有 schema/缓存换键方式处理;缺能力声明时保守隐藏对应列,不能假定支持。由 service mapper 输出列能力,组件只消费,不用分散的 JSX 魔法判断。
- 支持性独立于结果值:
false是有效同位结果;未命中入旺 / 自宫 / 落陷也可能是正常有效结果。不能以rows.some(row => row.vargottama)或某列有非空字符串作为能力判断。 - 不支持的列整列不渲染(含表头和上升行);单颗星不适用时可留「—」。两列分别控制,不能同开同关。
- 验收:真实 golden 的支持盘保留结果;缺失能力、只支持其中一列、两列都不支持、支持但全不命中分别覆盖。缺字段/无效字段的防御测试须从真实 golden 复制后做定向删除或破坏,不手造引擎响应形状。
T3 · 宫位同列左对齐
- 精确收窄表格样式到宫位单元格和表头,审计本命、分盘、月亮、Bhava 和行运的同类宫位列。
- 验收:桌面与手机截图中宫位标题和内容同一左边线;自动化断言 computed style 和边距,而不只看 JSX;宿主/pada 等刻意居中列不变,横向滚动仍在表格内部。
T4 · 图标解释
- 覆盖盘内行星、上升标记、逆行标记及存在的星座/角点缩写,明确每种图标含义。文案只报名称、已知位置与顺逆等事实,禁止编个人运势。
- 复用已有 tooltip / 提示样式和现有数据,图例与读屏信息保留。可在 SVG 中补安全的
<title>作为基础描述,但原生 title 不等于已完成 focus/触屏可见提示;页面级增强不要污染静态绘图层。没有度数等精细数据时只显示有依据的名称,不从粗略显示串造精度。 frontend/src/lib/report-chart-export.tsx:10–25的 SVG serializer 当前不允许title。本单导出的静态 SVG 不要求悬停交互,允许该描述节点按现有规则剥离;不得为图标提示顺带放开脚本、事件属性或任意 SVG 标签白名单。已有图例与事实文本保留,测试明确静态导出不带交互。- hover 与 focus 可见;离开/失焦/Esc 可关闭;不挡相邻图标。触屏不得依赖原生 title 长按;西洋盘轻点仍完成原有选择,解释随选中显示或采用不冲突的等价方式。
- 验收:鼠标、键盘、触屏各一条交互测试;至少覆盖多星同宫、逆行、上升、切盘后无旧提示;报告/校正共用渲染和静态 SVG 安全合同仍过。
T5 · 缩小盘面
- 推荐初值:
/chart印度盘绘图区宽度上限 440px,西洋盘 480px(不把 stage padding 算成盘宽),同时width:100%自适应并居中。印度盘相对 BUG-1083 在桌面记录的 480px 约收紧一成,西洋盘从 520px 小幅收紧;实际基线宽度小于该值时不能反而放大。此数值是设计目标,不是本轮已实测结论,按下方可读性验收可减小缩幅。 - 参数区和下方表格不随盘面一起变窄。骨架盘与结果盘使用相同宽度容器,揭幕后不跳尺寸。
- 手机保留自适应宽度和原可读性。缩小只改容器布局,不用
transform: scale()留下大空白或压小命中区。 - 验收:至少 375、390、1024、1280 视口对照;无整页横滚,表格仍可横滚;在实际盘宽下验证文字和触控尺寸、西洋拥挤标签/命中归属。报告与校正盘尺寸不变。
T6 · 文档、回归与交付
- UI 同提交更新
frontend/DESIGN.md,新文案核对并更新frontend/docs/VOICE.md,用户变化入CHANGELOG.md(Skill 不 bump)。 - 更新 BUG 历史与 PROGRESS;不能自动化的项目进入
docs/testing/chart-surface-polish-20260929.md,实际环境缺口入BLOCKED.md。 tsc --noEmit零错、lint 零 error、相关套件 fail/cancelled 均为零;全量npm test与同环境基线比测试名称、失败名单和退出码。npm run build后/仍 Static,首屏 gzip 同口径变化 ±2%。- 若修改 Python 或 Python 合同测试,定向与
run_quality_gate.py --profile quick全量必跑;即使仅前端,本单也运行 quick 以防漏掉前端源码的 Python 合同。 - 文档推送前运行
tests/test_repo_privacy_markers.py。代码完成先交 Claude 独立验收,不自行 push;用户授权推 staging 后才核对门禁、部署 SHA,不把文档已推送当作实现已上线。
已定位的回归文件与旧断言
| 文件 | 本轮重点 |
|---|---|
frontend/tests/chart-page-view.test.tsx |
参数行无引擎、全盘型遍历;原西洋 max-width:520px 断言改为本单目标,写三栏理由 |
frontend/tests/chart-varga-table.test.tsx |
真实分盘行/D1冻结仍保留;旧六列断言改为 D9 六列、其他 Dn 五列及能力缺失分支;宫位类回归 |
frontend/tests/chart-view-varga-dignity.test.ts |
入旺/自宫/落陷规则子集与未命中含义不变 |
tests/test_chart_page_vedic_tables_contract.py |
同源规则表合同保留;如增加 D9 同位对照,使用真实 golden 和原生函数,输入岁差明确 |
frontend/tests/chart-planet-glyphs.test.tsx |
原 markup.match(/逆/g) 只允许一处“逆”,新增 title 后不可继续全 markup 数字数;改为验证可见文字与说明节点各自语义,三栏列明,不能直接删除测试 |
frontend/tests/chart-page-mobile-width-20260929.test.ts |
保留 BUG-1083 的 minmax/overflow 合同;新增页面限定的盘宽约束 |
frontend/src/lib/report-chart-export.tsx 的相关测试 |
共享 drawing 仍 hook-free、静态导出安全、数字 height,不能出现 SVG height="auto"(BUG-906) |
西洋 hover 必须实测可见文字层而不只是透明命中层;现有 western-wheel-svg.tsx 先画 hit group、后画 caption group,上层文字可能截走指针。不得为了 tooltip 破坏字符命中归属和原键盘按钮语义。
6. 让步顺序
- 可先不扩展到本单没有展示缺陷的报告正文;不得扩大为全站技术词清理。
- 若触屏复杂浮层增加冲突,改用现有选中详情承载等价说明,不新造复杂手势。
- 若缩小后破坏可读性,减小缩幅,不能牺牲图标文字或命中区域。
- 去引擎、真实能力边界、宫位左对齐、鼠标图标解释与手机不溢出不可让步。
7. 开工前置命令
每次 Git 操作前都先 git status -sb,确认在自己的工作树;禁止 stash。以下路径按实际环境调整,不在主检出写代码。
git status -sb
git fetch origin --prune
git status -sb
git worktree add -b codex/chart-surface-polish-20260929 .worktrees/chart-surface-polish-20260929 origin/staging
cd .worktrees/chart-surface-polish-20260929
git status -sb
python3 scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
# 必读 AGENTS、frontend/AGENTS、DESIGN、VOICE;检索 BUG_HISTORY 和全部相关源码合同。
# 核对实际 Node/Python 环境,在同基线独立树保存全量测试名称/失败清单、构建与 gzip。
8. BUG 编号起点
写作时 docs/BUG_HISTORY.md 最大号 BUG-1097。本单从 BUG-1098 起登记已确认的展示缺陷;实现前再次核对,若被占用按当前最大号连续顺延并同步任务书/进度引用。新增功能/产品取舍不为了凑编号全部记 Bug。