Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
067fe3ef14 | ||
|
|
2d8e3d03a3 |
@@ -0,0 +1,29 @@
|
||||
# #238 任务书修订:按合并方案调整(2026-11-13,Claude)
|
||||
|
||||
本文件补充 `TASK-chart-choice-rounds-engine-20261113.md`。两份冲突时,以本文件为准。
|
||||
|
||||
## 补充:产品负责人 2026-11-13 已同意合并方案(以本节为准)
|
||||
|
||||
画布:https://claude.ai/artifact/XcxXXAfHEyAmhWbxGGbEW7 ,父单 #229 的规划评论里也有文字版。选盘和占星师方法合成一条流程:
|
||||
|
||||
1. 时间范围
|
||||
2. 找关键换盘线
|
||||
3. 逐处确认,最多 3 处
|
||||
4. 结果是候选时间段
|
||||
5. 「用这个时间段继续」
|
||||
|
||||
三处拍板:
|
||||
|
||||
- 每处的主问题是「某个年龄段有没有发生某件事」,即她的 A–D 四档;性格对比降为可跳过的补充。
|
||||
- 外表、胎记只在主盘 D1 上升换座时问。
|
||||
- 有日期的事少于 3 件时,结果只写「倾向」,不给把握等级。
|
||||
|
||||
问哪条线的顺序按她的决策树:D1 → D9 → D10 → D2/D6/D8。不再按「离填写时刻最近」。
|
||||
|
||||
本任务书里与上面冲突的地方,一律按本节执行。
|
||||
|
||||
## 对本单的改动
|
||||
|
||||
1. **选线顺序。**当前段内找出所有关键线后,按她的决策树依次问:先问翻转 D1 的线,再问 D9,再问 D10,最后问 D2、D6、D8。同一优先级里有几条线时,先问离填写时刻最近的。原任务书里「取离填报时刻最近的一条」作废。每一轮返回的包里加上 `ordered_lines`:剩下的关键线按这个顺序排好,前端用它在第 2 步画出「按这个顺序问」。
|
||||
2. **出题内容移到 #241。**本单只负责多轮的机制:`resolved`、`stop`、当前段、最多 3 轮、`undetermined_charts`,以及修正保存时刻落到线外、v2 记录。每轮的题目先沿用现有的「更像哪一种」,#241 会把它换成事件题。D6、D8 的性格对比文案照原任务书写,用途变为补充题。
|
||||
3. **v2 记录**里多留一个 `events` 字段,由 #241 填,本单先放空数组。
|
||||
@@ -0,0 +1,79 @@
|
||||
# TASK:选盘引擎改为多轮:逐条问区间内的关键换盘线(最多 3 轮),跟踪 D6、D8,修正保存时刻落到线另一侧(2026-11-13)
|
||||
|
||||
- Gitea:#238(父单 #229)
|
||||
- 分支:`codex/chart-choice-rounds-engine-20261113`,基于 staging `3e6077f752b606fee69a9eb15853fe328801901b`
|
||||
- Bug 编号:BUG-1872
|
||||
- 验收:Claude(jyotisha-e6)
|
||||
|
||||
不得自行写「产品决定/裁定」;任务书没写的取舍一律选需拍板。不得修改或删除既有断言来让测试通过;确需修改的,写明原值、新值和原因。
|
||||
|
||||
## 背景与产品决定(2026-11-13)
|
||||
|
||||
现在的选盘页(`scripts/chart_choice/`,contract `chart-choice-v1`)只问离填报时刻最近的**一条**换盘线(`nearest_line`),选完就保存。产品负责人自己的账号就是这样:线在 04:59:42,选了线后一侧,但这一侧里九分盘 05:07:55、事业盘 05:14:30 还会再换座,没人问过。报告因此只能把这两张盘判为 D。
|
||||
|
||||
另外有两个已知问题:
|
||||
|
||||
- `TRACKED_DIVISIONS = (1, 2, 4, 9, 10, 12, 24)`,不含 D6、D8;报告健康节要用这两张盘。
|
||||
- `representative_minute` 在所选一侧不到一个整分钟时会退到线的另一侧(#227 中复现:一侧为 04:59:43–05:00:00,结果返回 04:59)。
|
||||
|
||||
**产品负责人 2026-11-13 的决定:**
|
||||
|
||||
1. 关键分盘为报告要用的六张:**D1、D9、D10、D2、D6、D8**。最终区间内这六张都不换座,才算「定下来」。
|
||||
2. 最多连续问 **3 轮**(每轮仍最多 5 个问题)。3 轮之后仍会换座的关键分盘,记为「未定」。用户在任何一轮都可以选「不确定」停下。
|
||||
3. 已采纳过的老用户:在生时纠正页提示「还有 N 处没确认」,从上次结果接着问。这部分在页面单(#239)里做,本单只提供引擎接口。
|
||||
|
||||
## 要做的(只改 `scripts/chart_choice/` 及其 API 路由和测试)
|
||||
|
||||
1. **跟踪 D6、D8。** `TRACKED_DIVISIONS` 加入 6、8,`DOMAIN`、`DOMAIN_ORDER`、`readings.py` 补上 D6、D8 的条目。
|
||||
- 问题文案要求:日常生活的说法,不涉及疾病、诊断和身体部位,不出现「健康风险」类字眼。D6 可以从日常节奏、抗压、和人起冲突后怎么处理这类角度问;D8 可以从突发变化、重大转折时的反应这类角度问。
|
||||
- 文案全部集中在 `readings.py` 的常量里,并在 PROGRESS 里列一张表,标「待产品负责人与占星师审核」。
|
||||
- D4、D12、D24 保持跟踪,但不算关键分盘。
|
||||
2. **多轮接口。** `build_packet` / `decide_packet` 接受 `resolved: [{"line_at": "YYYY-MM-DDTHH:MM:SS", "side": "before"|"after"}]`,即前几轮的选择。
|
||||
- 处理方式:先按已选的线把窗口依次裁成「当前段」(秒级),再在当前段内找「至少有一张关键分盘换座」的线,取离填报时刻最近的一条作为本轮要问的线。
|
||||
- 当前段内只剩非关键分盘的线时,不再问,直接 `certain`。
|
||||
- `resolved` 里的线必须真实存在于重算结果中(按秒比对,容差 1 秒),否则返回 400。
|
||||
- 包里新增:`round`(第几轮,从 1 起)、`max_rounds: 3`、`remaining_key_lines`(当前段内还剩几条关键线)、`segment`(当前段的起止,精确到秒)。
|
||||
- 第 3 轮选完后仍有关键线的,`decide_packet` 的结果里带 `undetermined_charts`(列出仍会换座的关键分盘,例如 `["D9"]`),并且不再给出下一轮。
|
||||
3. **最终保存的时刻(修 BUG)。** 保存时刻必须落在最终段内,并且离两端都至少 `EDGE_GUARD_SECONDS`。做法:
|
||||
- 段内有整分钟的,取离填报时刻最近的整分钟;
|
||||
- 段内没有任何整分钟(段长不足 1 分钟,或整分钟都在保护距离之内)的,保存到秒,`saved_at` 用 `YYYY-MM-DDTHH:MM:SS`。确认 `chart_choice_adopt_v3` 和档案的 `active_birth_time`(`time` 类型)能存秒;报告计算请求本来就有 `second` 字段,要确认它被用上了。
|
||||
- 不得返回段外的时刻。
|
||||
4. **采纳记录。** 新 contract `chart-choice-v2`,在 `decision` 和采纳 provenance 里新增:
|
||||
- `segment`:最终段,精确到秒;
|
||||
- `rounds`:每轮的 `line_at`、`charts`、`chosen_side`、`rule`、`votes`;
|
||||
- `undetermined_charts`。
|
||||
|
||||
v1 的字段照旧保留。
|
||||
5. **老用户续问。** 提供一个只读入口:给定 v1 采纳记录(window、line_at、chosen_side、reported_at),返回 `resolved` 的初始值,以及当前段内还剩几条关键线。页面单用它显示「还有 N 处没确认」。
|
||||
|
||||
## 不要碰
|
||||
|
||||
- 页面组件(页面单负责)。
|
||||
- 报告代码。
|
||||
- 冻结文件。
|
||||
- `decision.py` 的投票规则:每一轮都用同一套规则。
|
||||
|
||||
## 验收(新测试)
|
||||
|
||||
1. 产品负责人这张盘的结构,用合成或真实可公开的同构数据:
|
||||
- 第 1 轮选线后一侧之后,第 2 轮问的是 D9 在 05:07:55 那条线;
|
||||
- 第 3 轮问的是 D10 在 05:14:30 那条线;
|
||||
- 3 轮全部选完,最终段内六张关键分盘都不换座,`undetermined_charts` 为空。
|
||||
2. 关键线超过 3 条时,第 3 轮之后不再出题,`undetermined_charts` 正确列出仍会换座的分盘。
|
||||
3. 选择「不确定」时:当轮停止,剩下仍会换座的关键分盘记入 `undetermined_charts`。是否有「不确定」按钮、按钮怎么放,由页面单决定;引擎这边接受 `stop: true` 即可。
|
||||
4. 段长 17 秒(例如 04:59:43–05:00:00)时,`saved_at` 带秒并落在段内。旧代码在这里返回 04:59,必须失败,并记进 PROGRESS。
|
||||
5. D6、D8 换座的线也会被找到;只换 D4/D12/D24 的线不会被当作关键线。
|
||||
6. 现有选盘测试全部通过;v1 请求(不带 `resolved`)的行为与现在一致。
|
||||
|
||||
## 自测命令
|
||||
|
||||
```
|
||||
python3 -m pytest -q tests/ -k chart_choice
|
||||
python3 scripts/run_quality_gate.py --profile quick --skip-frontend-runtime
|
||||
```
|
||||
|
||||
## 何时停下来选「需拍板」
|
||||
|
||||
- 3 轮内无法覆盖、但又不应该记为未定的情况。
|
||||
- 档案或采纳函数存不了秒,必须改数据库结构。
|
||||
- D6、D8 的问题无法避开医疗含义。
|
||||
Reference in New Issue
Block a user