Compare commits

...
Author SHA1 Message Date
Jesse_ChenandClaude 30c4d39f34 docs(tasks): birth-time source intake brief, part 1 (agent loop, issue #144)
jesse chose A: keep asking for the source, stop mapping a source to a
fixed error, let the user give earliest/latest or "error unknown", and
add the columns needed (additive only). Part 2, per-item stability over
the range, is a separate queued issue.

Co-Authored-By: Claude (agent loop) <noreply@anthropic.com>
2026-11-02 17:45:40 +08:00
2 changed files with 118 additions and 0 deletions
+1
View File
@@ -548,3 +548,4 @@
| `TASK-upstream-sync9b-20261028.md` | `PROGRESS-upstream-sync9b-20261028.md` | **第 1 次打回(冻结契约排除清单删了第八轮两条,见 `TASK-upstream-sync9b-fix-20261028.md`)** · **#159 上游同步第九轮乙批(产品选 A)**:Sarpa Drekkana 补成五段、第 22 号 Drekkana 改为 D3 第 8 宫;改冻结文件 `varga.py`,校正 20 + 900 与上一份逐条相同后按 ERR-110 重新冻结。Narayana 小运强度口径(B2)不做,另问产品 | 待验收 | `codex/upstream-sync9b-20261028` |
| — | — | **#134 咨询答题默认低思考量(产品选 A)**:`CONSULT_ANSWER_REASONING_EFFORT` 不设时默认 `low`,设 `off` 恢复原请求体(Claude 直接执行) | 已推 staging | `codex/answer-effort-default-20261029` |
| — | — | **#162 咨询分类与扣点同时进行(产品同意)**:审核放行后分类与扣点、写入并行;计费与寒暄退点不变(BUG-1499,Claude 直接执行) | 已推 staging | `codex/consult-classify-parallel-20261029` |
| `TASK-birth-time-source-intake-20261102.md` | — | **#144 第一单(jesse 选 A)**:建档六个出生时间来源选项;不再把来源换成固定误差,改填最早 / 最晚或「不清楚误差」;加列 `id_document`、记录方式、误差是否已知、时辰(只加不删);第二单(分项算稳定性)另开排队 | 待领取 | `codex/birth-time-source-intake-20261102` |
@@ -0,0 +1,117 @@
# TASK · 建档:出生时间来源与时间范围(issue #144 第一单,2026-11-02)
- 来源:issue #144。jesse 11-02 贴了占星 / skill 作者对「来源 → 固定误差」表的意见,并在 17:12 回复 **A**:照意见做、允许加数据库列、拆两单。本单是**第一单:选项、填范围、存储**;第二单(按范围分项算稳定性、统一计算设置、何时先核实时间)另开 issue,排在本单之后。
- 执行方:**Grok(Windows + Docker)**,分支 `codex/birth-time-source-intake-20261102`(本任务书是第一个提交),只推这个分支
- 验收:Claude(Linux,无 Docker;`test:db` 以 Grok 为准)
- BUG:本单不是 Bug 修复,不新开 BUG 号;若开工中发现产品 Bug,按 `docs/BUG_HISTORY.md` 最大号 +1 登记。
## 1. 基线
`origin/staging` `c8c08a49`。
## 2. 现状(staging 上核对过)
| 位置 | 现在 | 问题 |
| --- | --- | --- |
| `frontend/src/lib/birth-time-intake-model.ts:104-108` | 只显示 3 个选项:医院记录 / 家人记得 / 只知道时段或完全不知道 | 产品要 6 个 |
| `frontend/src/lib/account-profile-patch.ts:133-170` | 医院记录必须前后 2 分钟;家人记得只能 15/30/60/120 分钟且前后相等 | 来源被直接换成固定误差——本单要去掉 |
| 同上 | 最早 / 最晚(`declared_window_start/end`)只允许 `period_only` 用 | 要对所有「有时间」的来源开放 |
| `frontend/src/lib/lagna-precheck.ts:108` `lagnaPrecheckWindow` | 没填误差时按来源取默认分钟 | 默认误差就是固定误差,要去掉 |
| 数据库 `profiles` / `chart_profiles` | 没有「误差不清楚」「明确记录还是大概记得」「户口本 / 证件」「时辰」的存法;`chart_profiles` 连 `birth_time_clue` 都没有 | 要加列(只加不删) |
| 数据库约束 `profiles_declared_window_clocks`(`20260822010000`) | 只校验 `HH:MM` 格式和成对出现,不绑来源 | 不用改 |
## 3. 决策记录
1. **jesse 11-02 选 A**:照占星意见做;允许改数据库(只加不删,老档案照常读);拆两单。
2. 「来源」「时间不确定范围」「计算结果稳定程度」三件事分开存、分开显示。**任何来源都不再自动对应固定误差。**
3. 用户可以选「不清楚误差」,不强迫填范围。
4. 「完全不知道」存成未知;计算若需要参考时刻,只能标成计算占位,不能冒充出生时间。
5. 页面文案**一字不改**用 #144 jesse 11-02 10:54 评论里的原文(下面 §5 已摘出)。
6. 老档案:`hospital_record` 的 2/2、`approximate` 的 15–120 分钟照常读出,显示成「最早 / 最晚」;不做数据迁移改写。
## 4. 硬红线
1. 只**新增**迁移文件;不改任何已有迁移。新列全部可空,老数据不回填也能读。
2. 不改 `.gitea/workflows/**`、DNS、生产任何东西。
3. 校正(rectification)打分和冻结文件不碰;本单不改上升预检的计算内容(那是第二单),只改它拿到的时间窗口。
4. 改到已有测试的期望值,写原值 / 新值 / 原因三栏;不得删断言或放宽。
5. 公开仓库:测试只用虚构出生资料。
## 5. 任务分解
### T1 数据库(新增迁移,`profiles` 与 `chart_profiles` 两张表都做)
| 字段 | 取值 | 含义 |
| --- | --- | --- |
| `birth_time_source` | 现有值 + **`id_document`** | 户口本或其他证件(CHECK 约束扩一个值;`chart_profiles` 的白名单同步) |
| 新列 `birth_time_record_kind` | `recorded` / `approximate` / `derived` / null | 明确记录 / 大概记得 / 后来由别人推算(时辰选项用到 `derived`) |
| 新列 `birth_time_uncertainty_known` | boolean / null | `false` = 用户选了「不清楚误差」;null = 老档案 |
| 新列 `birth_time_shichen` | `zi` `chou` `yin` `mao` `chen` `si` `wu` `wei` `shen` `you` `xu` `hai` / null | 只记得时辰时选的那个时辰;时间范围仍存在 `declared_window_start/end` |
| `chart_profiles` 新列 `birth_time_clue` | text / null | 与 `profiles` 对齐,存「这个时间最初来自哪里」等补充说明 |
另外:Supabase 两套迁移目录如有镜像要求,照仓库现有做法同步;`chart_profiles` 的同步触发器 / 回填函数里加上新列。
### T2 六个选项与追问(`birth-time-intake-model.ts`、`birth-time-intake.tsx`)
问题标题前的说明(原文):「请填写您知道的出生时间,并注明它来自哪里。只记得大概时段,或完全不知道,也可以如实选择,不需要猜一个准确时间。」
| 选项(显示文字由 Grok 按现有组件风格定短标签) | 存成 | 选项下一句(原文) | 追问 |
| --- | --- | --- | --- |
| 出生证明、医院记录 | `hospital_record` | 请按记录填写。不清楚实际误差也没关系。 | 时间 + 「这个时间是明确记录的,还是大概记得?如果是大概,您觉得最早和最晚可能是什么时间?」;可选「不清楚误差」 |
| 户口本、其他证件 | `id_document` | 如果知道这个时间最初来自哪里,可以一起告诉我们。 | 同上;另给一个可选的「最初来源」短文本 → `birth_time_clue` |
| 家人记得大概几点 | `approximate` | 大概时间也可以,请尽量告诉我们可能的范围。 | 时间 + 最早 / 最晚;可选「不清楚误差」 |
| 只记得时辰 | `period_only` + `birth_time_shichen` | 请选记得的时辰,无需自行换成某个准确分钟。 | 十二时辰选择器(每个 2 小时;子时 23:00–01:00 跨日,按填的出生日期算);「这个时辰是家人一直记得的,还是后来有人根据命盘推算的?」→ `record_kind` = `approximate` / `derived`;「还能确定更靠近时辰的开始、中间或结束吗?不记得也可以。」→ 写进 `birth_time_clue`,**不自动缩窄范围** |
| 只知道凌晨、上午等时段 | `period_only` | 请选择最接近的时段,之后还可以补充或修改。 | 现有时段 → 让用户确认 / 修改起止时间 |
| 完全不知道 | `unknown` | 可以先不填时间;依赖出生时刻的内容暂不确定。 | 无 |
「不清楚误差」时:存时间、`uncertainty_known=false`、最早 / 最晚为空。
### T3 校验(`account-profile-patch.ts` 及调用方)
- 删掉「医院记录必须 2/2」「家人记得只能 15/30/60/120」两条。
- 新规则:有时间的来源(`hospital_record` / `id_document` / `approximate` / `family_exact`)要么给最早 + 最晚(且包含所填时间),要么 `uncertainty_known=false`;`period_only` 必须有起止;`unknown` 什么都没有。
- `uncertainty_before/after_minutes` 由最早 / 最晚算出来写回(兼容现有读法),允许前后不相等。
- 老档案读取不报错。
### T4 上升预检拿到的窗口(`lagna-precheck.ts:108`)
- 有最早 / 最晚:用它。
- `uncertainty_known=false`:**不再按来源取默认分钟**;只按所填时间算一次,提示用原文:「出生时间会影响部分计算结果。我们会保留不确定性;需要进一步核实的内容,会单独说明。」
- 老档案:照旧用已存的前后分钟。
- 预检**算什么**本单不改(第二单再扩到分盘和月亮)。
### T5 文案替换
把「上升、宫位和大运都跟出生时间有关,差几分钟,有时整张盘就换了样子。」全仓替换为原文:「**出生时间会影响上升、宫位、分盘和部分周期计算。接近关键分界时,几分钟也可能改变某些结果;具体影响需要按您的时间范围计算。**」(先 `git grep` 找全)。
### T6 测试
- 改:`birth-time-intake.test.ts`(:360-416 选项与文案)、`birth-time-consultation-consent.test.ts:212-228`、`profile-gender-ui-20260927.test.tsx:108-129`、`lagna-precheck.test.ts`(「前后约 2 分钟」等)——三栏注释。
- 新增:六个选项都能保存并刷新回显;`id_document` 与 `approximate` 刷新后分得开;十二时辰都存成正确 2 小时范围,子时跨日单测;「不清楚误差」保存后最早 / 最晚为空且预检不取默认分钟;老档案(2/2、30/30、period_only、unknown)照常读出。
- 数据库:迁移在 `test:db` 里跑通;`chart_profiles` 新列同步有测试。
### T7 记录
CHANGELOG、`docs/tasks/README.md` 状态板、PROGRESS(含跑过的命令与数字);真机清单 `docs/testing/birth-time-source-intake-20261102.md`(建档六个选项各走一遍、手机宽度、老档案打开不报错)。
## 6. 让步顺序
T1–T4、T6、T7 必做;T5 若全仓出现处超过 5 处且有一处在报告正文生成里,先只改页面文案并在 PROGRESS 列出其余位置。
## 7. 验收命令
| 检查 | Grok 自跑 | Claude 验收 |
| --- | --- | --- |
| `tsc --noEmit`、`npm run lint` | 必跑 | 复验 |
| 改到的前端测试文件 | 必跑 | 复验 |
| `npm run test:db`(动了迁移) | **必跑,以 Grok 为准**(与 `tools/agent-loop/windows-known-failures.txt` 逐条比) | 无 Docker,不跑 |
| 前端全量、Python 快速门 | 不跑 | 以 Claude 为准 |
## 8. 开工前置命令
```
git fetch origin
git worktree add .worktrees/birth-time-source-intake-20261102 codex/birth-time-source-intake-20261102
python scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
git grep -n "差几分钟" -- frontend scripts docs
```