feat(settings,reports): six ayanamsa options; report-scope solid button colours (T6/T7, BUG-1078)

T6: offer True Citra and Fagan-Bradley beside Raman/Lahiri/KP/True Pushya,
engine-supported values only; widen profiles_ayanamsa_check by an additive
migration; ephemeris note names; path tests so no new value falls back to
Raman.

T7: the unlayered `button { color: inherit; }` beats Tailwind's
text-primary-foreground, so solid report buttons showed page ink (light
(light 4.85:1, dark 5.77:1), grey disabled without fade, neutral selected
preset. button.tsx and theme tokens unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
This commit is contained in:
Jesse_Chen
2026-09-28 15:54:53 +08:00
co-authored by Claude Opus 5.5
parent 856dab6c55
commit 873fac8a5b
15 changed files with 483 additions and 8 deletions
@@ -0,0 +1,75 @@
# 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 工具类。需要产品决定是否另立单。