docs(tasks): repo-hygiene brief — product ruling: default ayanamsa stays Raman, user-selectable in settings; reference sets pin lahiri explicitly
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
This commit is contained in:
@@ -91,7 +91,7 @@
|
||||
|
||||
| 任务书 | 进度 | 主题 | 状态 | 落点 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `TASK-repo-hygiene-20260903.md` | — | 默认岁差回 Lahiri(P0,单独先推)、发布门本地可复现、注册表白名单、仓库地址、早期日志搬家、远端分支清理 | 待领取 | 分支 `codex/repo-hygiene-20260903` |
|
||||
| `TASK-repo-hygiene-20260903.md` | — | 岁差默认 Raman + 用户设置可选、参考集锁口径(P0,单独先推)、发布门本地可复现、注册表白名单、仓库地址、早期日志搬家、远端分支清理 | 待领取 | 分支 `codex/repo-hygiene-20260903` |
|
||||
|
||||
## 命名与归档
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 任务书 · 仓库整备与 main 提升前置:默认岁差回 Lahiri、发布门可跑、地址/日志/分支清理(2026-09-03)
|
||||
# 任务书 · 仓库整备与 main 提升前置:岁差默认 Raman 且用户可选、发布门可跑、地址/日志/分支清理(2026-09-03)
|
||||
|
||||
基线:`origin/staging` @ `d159f08e`(校正会话面重做 `codex/rectification-ux-20260903` 已合入)。分支 `codex/repo-hygiene-20260903`。BUG 编号从 **510** 起(staging 当前最大 BUG-509;开工再 `grep -oE '^## BUG-[0-9]+' docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1` 核对)。
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
| 同盘 Vimshottari 首段 | Rahu 余运 → Jupiter 2000-09-20~2016-09-20 | Jupiter 余运 1998-11-27~2014-11-27 |
|
||||
| `tests/test_user_invocation_acceptance_contract.py::test_fixture_dasha_timeline_rejects_workbuddy_regression_claims` | 通过 | **失败** |
|
||||
|
||||
两套岁差相差约 1°26′,Moon 落在 nakshatra 边界附近的盘会整段大运换主;公开案例复验的参考值来自 Lahiri 口径的公开来源,所以门槛从满分掉到 0.94。`run_quality_gate.py --profile release` 包含真实案例复验(`skip_real_cases: False`),也就是说**现在的 staging 过不了发布门**,`main` 无法提升。
|
||||
两套岁差相差约 1°26′,Moon 落在 nakshatra 边界附近的盘会整段大运换主;公开案例复验的参考值来自 Lahiri 口径的公开来源,而 `tests/run_real_case_revalidation.py:64` 调用 `jyotish_engine.py` 时**没有显式传 `--ayanamsa`**,跟着默认走,所以门槛从满分掉到 0.94。`run_quality_gate.py --profile release` 包含真实案例复验(`skip_real_cases: False`),也就是说**现在的 staging 过不了发布门**,`main` 无法提升。根因不是 Raman 本身,而是:参考集对照没有锁定自己的口径;产品没有把岁差作为用户可见、可选的设置;三处标签与实际计算不一致。
|
||||
|
||||
- 一致性问题(无论默认取哪个都要修):`scripts/jyotish_api_server.py:2853` 与 `:4017` 把 `ayanamsa_policy` 兜底成字面量 `'lahiri'` 交给 VedAstro 适配器,`:7030` 把返回体里的 `'ayanamsa'` 写死 `'lahiri'`,而本地引擎按 `DEFAULT_AYANAMSA_NAME` 算——本地与 VedAstro 对照用的不是同一套岁差,且证据包标签可能与真实计算不一致。`:7086` 的 `ayanamsa_display` 又兜底 `'Raman'`。
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
## 决策记录(产品授权,2026-09-03)
|
||||
|
||||
1. 产品已同意:每周提升一次 `main`;仓库小活交 coding agent;删除已合入的远端分支。
|
||||
2. **默认岁差回到 Lahiri**(本任务书 PM 决定,理由:Lahiri 是 JHora / VedAstro / 公开来源的默认口径,全部公开案例复验与既有 benchmark 都按它校准;生产用户至今看到的是 Lahiri 盘,提升 `main` 后不能让同一个人的 Moon nakshatra 无声换掉;`80102459` 未记录改口理由,也未重校任何参考集)。Raman 与 `true_pushya` **保留为显式可选**,`AYANAMSA_MODES` 不删。若产品负责人推翻本条,改为"全部标签、VedAstro 对照、前端常量统一 Raman + 重新采集 real-case 参考值 + CHANGELOG 声明",同样不允许两头默认。
|
||||
2. **产品负责人 2026-09-03 拍板:默认岁差保持 Raman,并在用户设置里可选。** 可选值 `raman`(默认)/ `lahiri` / `kp` / `true_pushya`,与 Python `AYANAMSA_MODES` 一致。PM 曾建议回 Lahiri(理由:公开来源与既有 benchmark 都按 Lahiri 校准;生产用户此前看到的是 Lahiri 盘),产品明确否决;因此本轮的原则改为:**产品计算用用户设置(默认 Raman),参考集与外部对照各自显式锁定口径,任何地方不再依赖"默认值恰好是什么"**。提升 `main` 后生产用户的 Moon nakshatra / 大运可能相对旧版变化,这是产品已知并接受的后果,CHANGELOG 必须写明并告诉用户可在设置里切回 Lahiri。
|
||||
3. 本任务书**不改**任何被哈希锁定的 `skills/*/versions/**`,也不改指向上游研究仓的 `references/cross_project_contract/**`、`references/upstream/**`、`tests/test_import_yinduzhanxing.py`、`tests/test_upstream_import_plan.py`——那些地址是导入来源的真实记录。
|
||||
4. `progress.md` / `findings.md` / `task_plan.md` 的"发布关键文件必须已跟踪"检查保留,只改路径。
|
||||
|
||||
@@ -59,8 +59,8 @@
|
||||
|
||||
## 硬红线
|
||||
|
||||
1. 任务 0 不得通过改期望值让测试变绿:`test_fixture_dasha_timeline_rejects_workbuddy_regression_claims` 的日期、`tests/run_real_case_revalidation.py` 的参考值、`references/**` 的 oracle 目标值一律不动。
|
||||
2. 不得在同一提交里既改默认岁差又改校正引擎的打分/阈值;`80102459` 里 08-20 新增的 Raman packet JSON(`*_2026_08_20.json`)若因默认回 Lahiri 而对不上,按"原值 / 新值 / 原因"三栏说明处理,不得静默删。
|
||||
1. 任务 0 不得通过改期望值让测试变绿:`test_fixture_dasha_timeline_rejects_workbuddy_regression_claims` 的日期、`tests/run_real_case_revalidation.py` 的参考值、`references/**` 的 oracle 目标值一律不动;让它们变绿的唯一合法手段是**显式传参口径**(`--ayanamsa lahiri`),并在三栏说明里写清"原来依赖默认值"。
|
||||
2. 不得在同一轮里改校正引擎的打分/阈值;`DEFAULT_AYANAMSA_NAME` 本轮**不改**(保持 `raman`)。
|
||||
3. `scripts/jyotish_api_server.py` 行数不得增长(`tests/test_api_server_growth_contract.py`);一致性修复是改字面量为常量,不是加逻辑。
|
||||
4. 分支删除只删任务 5 列出的已合入名单;4 条未合入分支不删;本地 worktree 正在使用的分支(`codex/unified-loading-20260902`、`codex/frontend-optimization-20260828`、`codex/streaming-ux-20260901`)远端可删、本地不动。
|
||||
5. 不改 `.gitea/workflows/**` 的触发条件;给发布门补依赖只允许改 `requirements-dev.txt` / `requirements.txt` 与 workflow 的 `pip install` 行。
|
||||
@@ -87,19 +87,35 @@ git worktree add -b codex/repo-hygiene-20260903 ../.worktrees/repo-hygiene-20260
|
||||
|
||||
## 任务分解
|
||||
|
||||
### 任务 0(P0,单独先推)· 默认岁差回 Lahiri,并让"算的"和"写的"一致
|
||||
### 任务 0(P0,单独先推)· 岁差成为用户设置(默认 Raman),参考集显式锁口径,"算的"和"写的"一致
|
||||
|
||||
1. `scripts/ayanamsa_utils.py`:`DEFAULT_AYANAMSA_NAME = 'lahiri'`;模块 docstring 里"never silently collapse to Lahiri"的语义保留(未知名字仍抛 `UnsupportedAyanamsaError`)。
|
||||
2. `scripts/jyotish_api_server.py:2853`、`:4017`、`:7030`:字面量 `'lahiri'` 改为**该请求实际使用的岁差名**(有则用请求里的,无则 `DEFAULT_AYANAMSA_NAME`);`:7086` 的 `ayanamsa_display` 从实际名派生(`AYANAMSA_LABELS` 或等价映射),不再兜底 `'Raman'`。
|
||||
3. 前端:`frontend/src/lib/birth-time-journey-assessment.ts:28,40`、`global-birth-payloads.ts:49` 及 `80102459` 触及的其余前端文件(`consult/route.ts`、`birth-time-journey-service.ts`、`personal-report-generation.ts`、`consultation-technique-audit.ts`)——把默认值收敛到**一个**导出常量(建议 `frontend/src/lib/ayanamsa.ts` 的 `DEFAULT_AYANAMSA = "lahiri"`),类型 `"lahiri" | "raman" | "kp" | "true_pushya"` 与 Python `AYANAMSA_MODES` 一致;技法审计表、报告证据包、校正回执里显示的岁差必须来自服务端回执,不得前端猜。
|
||||
4. 校正引擎:核对 `frontend/src/lib/rectification-agentic/v9/**` 与 `scripts/active_rectification_*.py` 中是否有按 Raman 校准的阈值或 golden(重点:08-20 新增的 `*_2026_08_20.json` packet、`tests/rectification-v9-contracts.test.ts`、`tests/rectification-eight-method.test.ts`)。对得上就不动;对不上按三栏说明改 fixture,**不改阈值**。
|
||||
5. 记录:`CHANGELOG.md` 新条目(写明 08-20 曾默认 Raman、本轮回 Lahiri、Raman/true_pushya 仍可显式选);`docs/BUG_HISTORY.md` 新增 BUG(现象=公开案例复验 valid=false、根因=`80102459`、关联记录=无、复发自=无)。
|
||||
6. 验收:
|
||||
- `.venv/bin/python tests/run_real_case_revalidation.py` → `valid: true`、`gated 66/66`、`pass_rate ≥ 0.98`。
|
||||
- `tests/test_user_invocation_acceptance_contract.py::test_fixture_dasha_timeline_rejects_workbuddy_regression_claims` 通过(不改期望值)。
|
||||
- 表 A 那张虚构盘 `jyotish_engine.py dasha` 输出与生产 `7b620c7a` 一致(Swati / Rahu 余运)。
|
||||
- `grep -rn "'lahiri'\|\"lahiri\"\|'raman'\|\"raman\"" scripts/jyotish_api_server.py frontend/src --include=*.py --include=*.ts --include=*.tsx | grep -v test` 只剩常量定义与标签映射,没有散落的兜底字面量。
|
||||
- 产品负责人在 staging 部署后用同一份虚构出生资料对照生产:Moon nakshatra、当前大运主一致。
|
||||
**0.a 参考集与外部对照显式锁定口径(先做,这一步单独就能让发布门变绿)**
|
||||
|
||||
1. `tests/run_real_case_revalidation.py:64` 的 `jyotish_engine.py` 调用显式加 `--ayanamsa lahiri`(参考值来自 Lahiri 口径的公开来源),报告 JSON 增加 `reference_ayanamsa: "lahiri"` 字段;`scripts/local_accuracy_report.py` 同理。
|
||||
2. `tests/test_user_invocation_acceptance_contract.py::test_fixture_dasha_timeline_rejects_workbuddy_regression_claims` 的 `base` 命令显式加 `--ayanamsa lahiri`(三栏说明:原值=依赖默认、新值=显式 lahiri、原因=夹具日期是 Lahiri 口径);期望日期一字不改。
|
||||
3. VedAstro / oracle 对照:`scripts/jyotish_api_server.py:2853`、`:4017` 的 `ayanamsa_policy` 不再兜底字面量 `'lahiri'`,改为**该次请求实际使用的岁差名**,让本地与 VedAstro 对照同口径;`references/oracle/**` 的目标值不动(它们各自的 `ayanamsa` 元数据字段就是口径)。
|
||||
4. 验收:`tests/run_real_case_revalidation.py` → `valid: true`、`gated 66/66`、`pass_rate ≥ 0.98`;上述夹具测试通过;`scripts/user_invocation_acceptance_check.py` 的 `checks.user_invocation_tests: true`。
|
||||
|
||||
**0.b 标签与实际计算一致**
|
||||
|
||||
5. `scripts/jyotish_api_server.py:7030` 的 `'ayanamsa': 'lahiri'` 改为实际值;`:7086` 的 `ayanamsa_display` 从实际名派生(`AYANAMSA_LABELS` 或等价映射),不再兜底 `'Raman'`。所有回执(`/api/consultation_workflow`、`/api/chart`、校正、报告证据包)必须带 `ayanamsa` 实际名,前端只显示回执,不得自己猜。
|
||||
6. 验收:`grep -rn "'lahiri'\|\"lahiri\"\|'raman'\|\"raman\"" scripts/jyotish_api_server.py frontend/src --include=*.py --include=*.ts --include=*.tsx | grep -v test` 只剩常量定义、标签映射与设置选项,没有散落的兜底字面量。
|
||||
|
||||
**0.c 用户设置:账户与出生资料面板里可选岁差**
|
||||
|
||||
7. 数据:`profiles` 加 `ayanamsa` 列(Drizzle 迁移,`frontend/db/migrations/`;`text not null default 'raman'`,check 约束四个值)。这是本轮唯一的动表,`npm run test:db` 必须真跑(AGENTS §7.6)。
|
||||
8. 接口:`/api/account` 读写该字段;服务端校验只接受四个值;未登录/旧客户端不带字段时按 `raman`。
|
||||
9. 界面:「账户与出生资料」面板加一个单选(Raman【默认】/ Lahiri / KP / True Pushya),每项一句话说明(文案先对 `frontend/docs/VOICE.md`),下方一行提示"切换只影响之后的新计算;已生成的报告和校正结果保持当时的口径"。`frontend/DESIGN.md` 同提交更新。
|
||||
10. 贯通:`frontend/src/lib/global-birth-payloads.ts:49`、`birth-time-journey-assessment.ts:28,40` 及 `80102459` 触及的其余前端文件(`consult/route.ts`、`birth-time-journey-service.ts`、`personal-report-generation.ts`、`consultation-technique-audit.ts`)不再硬编码,统一从一个导出 `resolveAyanamsa(profile)`(新建 `frontend/src/lib/ayanamsa.ts`,类型 `"raman" | "lahiri" | "kp" | "true_pushya"`,默认常量 `DEFAULT_AYANAMSA = "raman"`)取值;咨询、校正、报告、星盘库、每日星语全部把它传给 Python。
|
||||
11. 已有数据:校正案例与已生成报告记录创建时的岁差(若表里没有字段,本轮只在新写入的 JSON 载荷里带 `ayanamsa`,不追加第二个迁移);切换设置不重算历史。校正引擎(`frontend/src/lib/rectification-agentic/v9/**`、`scripts/active_rectification_*.py`)里若有按 Raman 校准的阈值或 golden,本轮**不动**,只确认它们在 `lahiri` 下不会崩(跑一遍 `tests/rectification-*.test.ts`),异常写 BLOCKED。
|
||||
12. 验收:
|
||||
- 设置切到 Lahiri 后,用附录那张虚构盘(2000-01-01 12:00 UTC,0/0)发一次咨询:回执 `ayanamsa = lahiri`、Moon nakshatra = Swati;切回 Raman:`ayanamsa = raman`、Vishakha。技法审计表与星盘头显示的岁差与回执一致。
|
||||
- `tsc` 0 错、`npm run lint` 0 error、`npm run test:db` 通过、相关前端套件 fail=0;`page.tsx` 行数不增长。
|
||||
- 产品负责人在 staging 部署后按上面两步实测一次。
|
||||
|
||||
**0.d 记录**
|
||||
|
||||
13. `CHANGELOG.md` 新条目:默认岁差自 `80102459`(2026-08-20)起为 Raman,本轮补齐用户设置与四个可选值,说明升级后老用户可能看到 Moon nakshatra / 大运变化并可在设置切回 Lahiri。`docs/BUG_HISTORY.md` 新增 BUG(现象=公开案例复验 `valid=false` 与三处标签不一致、根因=参考集未锁口径 + 字面量兜底、修复=0.a/0.b、关联记录=无、复发自=无)。
|
||||
|
||||
### 任务 1(P0)· 发布门一条命令本地可复现
|
||||
|
||||
@@ -197,7 +213,7 @@ git push origin --delete <上表>
|
||||
|
||||
| 测试 | 本地现象 | 初判 |
|
||||
| --- | --- | --- |
|
||||
| `test_user_invocation_acceptance_contract.py::test_fixture_dasha_timeline_rejects_workbuddy_regression_claims` | Jupiter 段 2014-11-27 ≠ 期望 2016-09-20 | 岁差默认改 Raman(任务 0) |
|
||||
| `test_user_invocation_acceptance_contract.py::test_fixture_dasha_timeline_rejects_workbuddy_regression_claims` | Jupiter 段 2014-11-27 ≠ 期望 2016-09-20 | 夹具是 Lahiri 口径却跟着默认 Raman 跑(任务 0.a) |
|
||||
| `test_user_invocation_acceptance_contract.py::test_one_command_user_invocation_acceptance_check` | `checks.user_invocation_tests: false` → `status: fail`(`external_adapter_status` 已是 `partial`) | 同上,上一条的连带 |
|
||||
| `test_skill_release_clean_trial.py::test_premium_skill_zip_runs_from_clean_directory` | 打包后的 acceptance check 同样 `fail` | 同上,连带 |
|
||||
| `test_local_accuracy_report.py`(2 条) | `scripts/local_accuracy_report.py` 抛 SystemExit | 大概率是公开案例复验 `valid=false` 传导,任务 0 完成后复跑;若仍红再单独查 |
|
||||
|
||||
Reference in New Issue
Block a user