Files
Jyotisha/docs/tasks/PROGRESS-ayanamsa-report-buttons-20260928.md
T
Jesse_ChenandClaude Opus 5.5 36fae8fabf fix(reports): header 「生成报告」 joins the report disabled-button rule (BUG-1078)
The generate button renders in SecondaryPageShell's actions slot, outside the
report roots, so while submitting it still got the global 45% fade. A
report-owned `report-center-generate` class brings it into the disabled rule;
SecondaryPageShell and button.tsx unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-09-28 15:54:53 +08:00

81 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PROGRESS · 岁差 6 种(T6)与「我的报告」按钮配色(T7,BUG-1078)(2026-09-28)
任务书:`docs/tasks/TASK-chart-types-and-report-buttons-20260928.md`(T6、T7 及其 T8 文档部分)。T1–T5(星盘页)由另一执行方并行,本单未碰 `chart-page/*`、`chart-view-*`、`use-chart-page.ts`、`secondary-page-data.ts` 与任何 Python。产品 2026-09-28 授权直接执行(Claude fork 子代理)。
- 基线:`origin/staging` = `5dc977ef`
- 分支 / 工作树:`codex/ayanamsa-report-buttons-20260928` / `.worktrees/ayanamsa-report-buttons-20260928`(本地提交,未推送)
- 环境:Node v22.14.0(`/exec-daemon/node`),Linux;无 Docker;有 `/usr/bin/google-chrome`(无头)。
## T6 岁差扩到 6 项 — 完成
- `frontend/src/lib/ayanamsa.ts`:`AYANAMSA_VALUES` = `raman, lahiri, kp, true_citra, true_pushya, fagan_bradley`;设置项新增 True Citra「以角宿一的实际位置定起点,和 Lahiri 只差约 1 角分。」、Fagan-Bradley「西方恒星占星常用,比 Lahiri 多约 0.9°。」。`resolveAyanamsa` 接受 `true_chitra` → `true_citra`(与 `scripts/ayanamsa_utils.py` 一致)。默认仍 Raman,`AYANAMSA_SWITCH_HINT` 原句保留。
- 数字核对(pyswisseph,1950 / 2000 / 2026 年 1 月 1 日):Fagan-Bradley − Lahiri = 0.8832°(恒定);True Citra − Lahiri = −0.0164° / −0.0171° / −0.0174°(约 1 角分)。
- **偏离任务书:标签写 True Citra,不是 True Chitra。** 星盘页参数表显示的是引擎的 `ayanamsa_display`(`AYANAMSA_DISPLAY_NAMES['true_citra'] = 'True Citra'`),报告的 `SAFE_AYANAMSA` 也是 True Citra;设置里写 Chitra 会让同一个值在两处拼法不同。本单不动 chart-view 与 Python,所以统一用引擎拼法。`true_chitra` 仍作为别名接受。
- **任务书遗漏:数据库 CHECK。** `profiles.ayanamsa` 有 `profiles_ayanamsa_check`(`20260903010000_profile_ayanamsa.sql`)只许旧 4 个值;只改前端会让保存新岁差 500。新增迁移 `frontend/supabase/migrations/20260928010000_profile_ayanamsa_six.sql`:只 drop / add 该 CHECK(放宽,AGENTS §7.6 允许同轮),不动列、默认值、授权、数据。`chart_profiles.ayanamsa` 无 CHECK;人物接口直写类型化列,`chart_profiles_fill_typed_from_json` 的 JSON 兜底(只认旧 4 值)不在写路径上,未改。**部署顺序:迁移先于代码**(staging 迁移本来就在部署前自动应用)。回滚代码后已存的新值会被旧代码 `resolveAyanamsa` 读成 Raman。
- 显示名:`ephemeris-view.ts` `AYANAMSA_SHORT_NAME` 补两项(星历页岁差说明句);`personal-report-generation.ts` 已有,未改;星盘页用引擎显示名,**无需改 chart-view 文件**。人物档案详情取 `AYANAMSA_OPTIONS` 的 label,自动跟随。
- 全链路:12 处 `resolveAyanamsa` / `AYANAMSA_VALUES`(咨询 route service、报告 worker、星盘 load、人物写入、账户 PATCH zod、mastra workflow zod、校正 payload 等)都从同一枚举取值,无第二份白名单;Python 侧 `normalize_ayanamsa_name` 与 CLI `choices=AYANAMSA_MODES` 已含两值。
- 测试:
- `frontend/tests/ayanamsa.test.ts` 改既有断言(三栏):
| 位置 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| 测试名 | `…accepts the four product values` | `…accepts the six product values` | 值从 4 个变 6 个 |
| `AYANAMSA_VALUES` 断言 | `["raman","lahiri","kp","true_pushya"]` | `["raman","lahiri","kp","true_citra","true_pushya","fagan_bradley"]` | 产品 D4 |
| 新增一行 | — | `djwhal_khul` → `raman` | 证明不放出的值仍走回退 |
另加 2 条:6 值逐一原样返回(含大写 / 连字符写法与 `true_chitra` 别名);设置列表顺序与标签、每个值都在 `ayanamsa_utils.py` 里。
- 新增 `frontend/tests/ayanamsa-six-paths-20260928.test.ts`(7 条):账户 PATCH 接受 6 个、拒绝 `djwhal_khul / sassanian / fagan / yukteshwar`;迁移源文本(只改 CHECK、恰好 6 值);账户行、人物写入与读回、星盘发给引擎的 `ayanamsa` 均为 `true_citra` / `fagan_bradley`;星历说明句;报告显示名。
- 新增 `frontend/tests/database-profile-ayanamsa-six.test.ts`(1 条,需 Docker,本机跳过):真实库上 6 值可写、3 个非法值被 `profiles_ayanamsa_check` 拒绝。
## T7 我的报告按钮配色(BUG-1078)— 完成(真机欠)
- **根因更正**:任务书与 Claude 首轮判断是「深色主题下近黑字」。实测(本地 `next build` CSS + 无头 Chrome `getComputedStyle`)不是:`globals.css` 顶部未分层的 `button { color: inherit; }` 压过 Tailwind 分层的 `text-primary-foreground`,实心 `<button>` 的字一直是正文色——**浅色** #1d1d1f on #a9583e(3.33:1,正是反馈的「黑字配深红底」),深色 #f2f0ea on #d78064(2.57:1)。未分层的 `button:disabled { opacity: .45 }` 再把禁用按钮整体淡掉。`render={<Link/>}` 的按钮是 `<a>`,不受影响。这个问题**全站**所有实心 `<button>` 都有,本单按产品决定只修报告范围。
- 修复:`globals.css` 在分块导出规则之后新增报告作用域段(`.report-center-message / .report-center-body / .personal-report-state / .personal-report-reader`):实心 `[data-slot="button"][class~="bg-primary"]` 自己声明底色与字色(浅色 #fbfaf7 on #a9583e 4.85:1、hover 同原 `bg-primary/80`;深色 #f2f0ea on #8f4a33 5.77:1、hover 混 6% ink 5.1:1);禁用(任何变体)`--color-canvas-strong` 底 + `--color-ink-tertiary` 字、`opacity: 1`(浅色 4.10:1、深色 3.95:1,禁用态不受 AA 约束);套餐选中态 `--color-canvas-muted` + `--color-ink` + `--color-ink-secondary` 边(浅色 13.86:1、深色 11.62:1)。深色两条路径(系统偏好 / 固定深色)各一份,写法同 token 块。
- 用 `[class~="bg-primary"]` 而不是 `.bg-primary`:`class-name-definition-contract` 把样式表里每个 `.name` 的首段当作项目类族,写 `.bg-primary` 会让 `bg-background` / `bg-transparent` 等 Tailwind 工具类被判为「未定义的项目类」——首轮就这样红了 1 条,改成属性选择器后绿。
- 未改:`components/ui/button.tsx`、全局 `button` 规则、`:root` 与两块深色 token(合同测试锁定)。
- 测试:新增 `frontend/tests/report-buttons-scope-20260928.test.ts`(5 条,见 BUG-1078 验证段)。
- 样张(本地 build CSS + 与 `button.tsx` 同 class 串的静态页,390px,Chrome 无头),存于执行会话 scratchpad `shots/`(`base-light.png` / `new-light.png` / `base-dark.png` / `new-dark.png`,未入库)。计算样式:
| 按钮 | 基线浅色 | 新版浅色 | 基线深色 | 新版深色 |
| --- | --- | --- | --- | --- |
| 导出选中 (3) | 字 29,29,31 / 底 169,88,62 | 字 251,250,247 / 底 169,88,62 | 字 242,240,234 / 底 215,128,100 | 字 242,240,234 / 底 143,74,51 |
| 导出选中 (0)(禁用) | 同上,opacity 0.45 | 字 106,105,99 / 底 225,222,214,opacity 1 | 同上,opacity 0.45 | 字 156,152,142 / 底 59,58,55,opacity 1 |
| 套餐「常用」选中 | 字 169,88,62 / 底 247,236,229 | 字 29,29,31 / 底 235,233,227 | 字 215,128,100 / 底 58,38,32 | 字 242,240,234 / 底 48,48,45 |
| 范围外对照按钮 | 与基线一致 | 与基线一致 | 与基线一致 | 与基线一致 |
## T8 文档(本单部分)
`CHANGELOG.md` 一条(Skill 不 bump)、`docs/BUG_HISTORY.md` BUG-1078(investigating,待推送部署)、`frontend/DESIGN.md`(岁差一节 6 值;星历说明句名单;报告阅读页按钮一条)、`frontend/docs/VOICE.md`(星历岁差名单)、`docs/testing/ayanamsa-report-buttons-20260928.md`(13 条真机清单)、`BLOCKED.md`(无 Docker / 无登录态)。`CONTEXT.md` 无新术语,未改。
## 验证
| 项 | 基线 `5dc977ef` | 本分支 |
| --- | --- | --- |
| `tsc --noEmit` | 0 | 0 |
| `npm run lint` | 0 error / 127 warning | 0 error / 127 warning |
| `npm test`(Node 22) | 4212 tests / 4158 pass / 24 fail / 30 skip | 见下 |
| `next build` `/` | ○ Static | ○ Static |
| 首屏脚本 gzip-9(index.html 引用 26 个脚本) | 640,535 | 640,678(+143,+0.02%) |
| 首屏 CSS gzip-9 | 42,850 | 43,173(+323) |
24 条基线失败全部是需要 Docker / 部署环境的 DB 与部署套件,名单见 `BLOCKED.md` 同类条目;本分支失败名单与基线逐条比对见下。
**本分支 `npm test`(Node 22)**:4227 tests / 4172 pass / **24 fail** / 31 skip / 0 cancelled(退出码 1 同基线)。失败名单与基线 24 条**逐条相同**(`diff` 为空)。测试名对比:新增 16 条(含 1 条 docker 跳过的 DB 用例),消失 1 条 = `resolveAyanamsa defaults to Raman and accepts the four product values`,已改名为 `…six product values`(见上表三栏)。
隐私标记:`python3 -m pytest tests/test_repo_privacy_markers.py -q` 通过(本机无 `.venv`,用系统 Python)。
## 环境缺口
- 无 Docker:`npm run test:db` 未跑;新迁移与 `database-profile-ayanamsa-six.test.ts` 以门禁 DB job 为准。
- 无受控登录账号:保存新岁差、星盘参数表、报告页按钮只在单元测试与静态样张上验证;真机清单 `docs/testing/ayanamsa-report-buttons-20260928.md`。
- 未推送、未部署(按指令)。
## 交给 Claude 的范围外发现
- 全站所有渲染为 `<button>` 的实心 `Button`(报告范围外)都有同一问题:浅色近黑字 on #a9583e(3.33:1)、深色浅字 on #d78064(2.57:1),禁用时再淡到 45%。根因是 `globals.css` 未分层的 `button { color: inherit; }` / `button:disabled { opacity: .45 }` 压过 Tailwind 工具类。需要产品决定是否另立单。
## 追加(Claude 复核后补漏)
- 页头「生成报告」渲染在 `SecondaryPageShell` 的 `actions` 槽(`personal-report-center.tsx`),在报告根类之外,提交中(禁用、「正在创建…」)仍被全局 `button:disabled { opacity: .45 }` 淡掉。给该按钮加报告自有类 `report-center-generate`,并入同一条禁用规则;`SecondaryPageShell`、`button.tsx` 未改。无头 Chrome 计算样式:opacity 1、底 225,222,214、字 106,105,99(浅色)。
- `report-buttons-scope-20260928.test.ts` +1 条(按钮带挂钩类、`disabled={submitting}` 仍在、`SecondaryPageShell` 不含 report 类),禁用规则断言改为含该选择器。复跑:tsc 0;lint 0 error / 127 warning;相关 6 个测试文件 45 / 45 通过、0 cancelled。