docs(tasks): rectification explicit entry, nearest-boundary opening, D12 parent probe research (BUG-1306~1308)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HwMNZEzdzmrbPhuRNmZe3C
This commit is contained in:
Jesse_Chen
2026-10-12 11:31:33 +08:00
co-authored by Claude Opus 5.5
parent fddddaabb3
commit e6baff952c
5 changed files with 310 additions and 2 deletions
+26 -2
View File
@@ -17538,7 +17538,7 @@
## BUG-1306 | 对话里明说「帮我做生时纠正」进不了校正:模型不出提议卡,反而在普通对话里自己「收窄出生时间」
- 状态:investigating
- 状态:open(根因已定,修复单 `docs/tasks/TASK-rectification-explicit-entry-20261012.md` 待领取;T0 取证未完成)
- 首次发现 / 最近更新:2026-10-11 / 2026-10-11
- 来源:产品在 staging(`de4cfeb8`)新对话第一句输入「请你帮我进行生时纠正」,回复截图转述。
- 现象:回复显示「已完成 3 步」,正文说「收窄出生时间这件事能做」,要用户报有年月的经历,「对得上,区间就能往里收」;全文没有提到提议卡,界面上也没有卡片。正文还按「代表分钟」写出大运 / 子运起止年月。
@@ -17549,7 +17549,31 @@
3. BUG-1248 上线前的模型实测只覆盖「不认同解释 / 过去的事对不上 + 时间是估的 / 家人 / 已提议又被拒」四种说法,没有「首轮直接点名要校正」。
4. 服务端拒绝原因中 `product_disabled`、`pricing_unavailable` 要求正文「不要提校正」,用户看到的是没有回应。
- 推断(未证实):正文主动承诺能收窄,不像收到「不要提校正」的拒绝,更像模型没有调用提议工具;无模型凭据、无 staging 运行日志,暂未取证。另:用户若照做在普通对话里报经历,这些经历不会进入校正引擎计分,正文「区间就能往里收」是做不到的承诺;按代表分钟写大运起止,与申报时段指令「精确应期一律不可用」不符。
- 待做:取该轮观测记录确认是否调用了工具及服务端结果;产品决定明确要求时是否直接进入校正。
- 待做:取该轮观测记录确认是否调用了工具及服务端结果(任务书 T0;观测只打到 web 容器控制台,需 staging 主机日志)。
- 相关记录:BUG-1247、BUG-1248(入口改为提议卡)、BUG-976/977(禁正则判意图)。
- 复发自:无。
- 修复版本:未修复。
- 决策日志(2026-10-12,产品):选 A——用户明确要求做生时校正时直接进入校正,不先写解读、不用点卡;意图由模型判断,禁正则 / 关键词。**推翻 BUG-1248 两处**:①明确要求的这一轮不再「只出卡、点卡才进」;②`product_disabled`、`pricing_unavailable`「正文不要提校正」改为必须一句话说明做不了,不得静默。普通对话模型不得承诺收窄出生时间、不得在对话里收集经历假装校正;申报时段下不得写大运 / 子运精确起止。服务端本人 / 开关 / 进行中 case / 价格判定不变。同日另立 BUG-1307(最近分界开场)、BUG-1308(父母静态题研究)。
## BUG-1307 | 生时校正开场不说记录时间离最近分界多近,首轮选题面向整个窗口,用户觉得步骤多、目的不明
- 状态:open(任务书 `docs/tasks/TASK-rectification-nearest-boundary-opening-20261012.md` 待领取)
- 首次发现 / 最近更新:2026-10-12 / 2026-10-12
- 来源:产品拿上游 Skill 的一次私人样例校正比较,认为上游步骤短。上游先找记录时间最近的分盘换段点,只问两侧不同的层。
- 现象:我方开场不讲记录时间与分界的关系;`window_scan` 有逐分钟 11 层换段数据,但不以记录时间为锚;记录时间只在交付时与区间比较(`reportedTimeOffsetCopy`)。
- 根因:扫描数据从未以记录时间为锚组织,呈现与选题都面向整个窗口。
- 决策:只改呈现与首轮选题顺序,不改打分、闸门、4 件 3 域;对外不说秒级、不说「记录时间是错的」。
- 相关记录:BUG-1306、BUG-1115~1117(盘型口径)、BUG-1143/1144(按段选题)、BUG-691(记录优先)、BUG-1240(不说秒级)。
- 复发自:无。
- 修复版本:未修复。
## BUG-1308 | 父母静态是非题(D12)对出生时间分界两侧有没有区分力未经评测
- 状态:open(研究单 `docs/tasks/TASK-rectification-d12-parent-probes-research-20261012.md` 待领取)
- 首次发现 / 最近更新:2026-10-12 / 2026-10-12
- 来源:同 BUG-1307 的上游样例:上游用五道父母是非题区分 D12 换段两侧。同一输入上游两次结论相反,下结论的那次靠单条父母事实的事后解读。
- 现象:我方无静态父母题;上游 10-02 的 D12 绑定(`bbb16115` 等)针对带日期的父母事件,静态题两边都没有评测。
- 决策:先研究,公开案例、预登记、乱序与正对照,过门才立实现单;过门前不进题库、不计分。
- 相关记录:BUG-1306、BUG-1307、BUG-1141 / BUG-1240(同类研究均未过门)。
- 复发自:无。
- 修复版本:不适用(研究)。
+3
View File
@@ -124,6 +124,9 @@
| `TASK-rectification-mobile-timeline-readout-20260917.md` | `PROGRESS-rectification-mobile-timeline-readout-20260917.md` | 手机截图:时间轴读数第四项被裁成「已…」(nowrap + inset 内边距,BUG-918);「跳到最新」浮层压住选项 C(BUG-919)。灰卡与「再说一件」矛盾归修复单 BUG-915/917 | 已验收 | `e8e98bbd`(合入时重放为本分支提交,BUG-918/919)。时间轴相关 71 条 + 全量同上;手机上隐藏「已对照 N 件」符合 DESIGN §10;桌面是否也移除待产品拍板。真机清单 `docs/testing/rectification-mobile-timeline-readout-20260917.md` |
| `TASK-mobile-viewport-scroll-lock-20260917.md` | `PROGRESS-mobile-viewport-scroll-lock-20260917.md` | iPhone 上键盘收起 / 刷新后整页上移、顶栏点不到(BUG-920):iOS 不支持 `interactive-widget`,键盘弹出时 Safari 滚动 window,`html/body overflow: hidden` 让用户拉不回来,reload 又还原 `scrollY`;代码里无任何 window 级复位。补 `ViewportScrollLock`(`scrollRestoration=manual` + `visualViewport` 复位)。与今天两单无关,既有缺陷。**T3 顶栏积分块「有点扁」(BUG-921)**:两枚芯片 44px 塞在 46px 顶栏里、字号/内边距/圆角各一套、积分块强制 64px 最小宽度;统一尺寸并把手机顶栏放到 52px | 已合入(无独立验收记录) | `1b508d5e`(BUG-920/921 resolved;已部署 staging,run 2715);真机待核 |
| `TASK-rectification-session-composer-guard-20260917.md` | `PROGRESS-rectification-session-composer-guard-20260917.md` | 校正会话激活但校正面未开(刷新揭幕超时 / 打开失败不重试 / 删除与 popstate 回退落到列表第一条)时露出可用的普通输入框,问题发到 `/api/consult` 回 404「咨询会话不存在」;`send()` 无会话类型守卫;服务端无独立错误码。关联 BUG-505。BUG 段 924 起 | 已验收 | `6d81062b`(Claude 验收:T1–T5 全通过;409 `session_not_consultation` 在扣点前、不扣点;回退路径多修了归档一条;page.tsx 1830→1830。残留 P3:列表只剩校正会话时 `activeSession` 为空,输入框可用但发送静默无效 → BUG-935 在 fix 单);真机三条欠 |
| `TASK-rectification-explicit-entry-20261012.md` | — | **明说要校正就直接进入(BUG-1306)**:模型判断意图(禁正则),服务端判定后直接开案并绑定来源对话;首轮排盘合同对此轮豁免;拒绝必须一句话说明(推翻 BUG-1248 静默两条);普通对话不得假装校正、申报时段不写子运起止。**先做** | 待领取 | — |
| `TASK-rectification-nearest-boundary-opening-20261012.md` | — | **最近分界开场(BUG-1307)**:开场说记录时间离最近分盘换段点多近、两侧哪些层不同,近分界时首轮只问该分界;不改打分 / 闸门 / 4 件 3 域,77 例回放不降;改 page.tsx / 校正开场组件的部分须在 BUG-1306 合入后 | 待领取 | — |
| `TASK-rectification-d12-parent-probes-research-20261012.md` | — | **父母静态是非题(D12)研究(BUG-1308)**:公开案例 ≥60、预登记、乱序与正对照,过门才立实现单;纯研究可并行 | 待领取 | — |
### 聊天主链路与首页
@@ -0,0 +1,72 @@
# TASK · 研究:父母静态是非题(D12)能不能区分分界两侧(BUG-1308,2026-10-12)
- 基线:`origin/staging` @ `fddddaab`。
- 分支 / worktree:`codex/rectification-d12-parent-probes-research-20261012` / `.worktrees/rectification-d12-parent-probes-research-20261012`
- 性质:**纯研究**,只新增 `scripts/research/`、`tests/`、`docs/research/`、`references/real_case_calibration/` 下的文件,不改生产代码。与 `TASK-rectification-explicit-entry-20261012`、`TASK-rectification-nearest-boundary-opening-20261012` 并行。
- BUG 编号:本单为 BUG-1308(已建记录,状态 open)。
## 1. 背景与事故实证
- 产品 10-12 拿上游 Skill 的一次私人样例校正来比较。上游在记录时间前后最近的分界(D12 上升换座)两侧,问了五道父母是非题,例如「母亲是否比父亲更多负责日常照料」「父亲是否长期两地奔波」。题不需要年份,答得快。
- 同一样例上游两次会话结论相反。下结论的那一次,核心论据是一条父母职业事实的**事后**解读(先知道答案再读盘),且它的另一候选窗对母亲一侧的匹配评价更高。单例、事后、无对照,不能当证据。
- 我方此前同类结论:不带年份的性格题信号弱,已降级为平局裁决(±1、不淘汰)。四类方法(人拍权重 / 数据权重 / 缺席证据 / 角度技法)都不能在分钟级提出信号(`docs/research/rectification_angle_timing_2026_10_01.md`、`rectification_nadi_seconds_2026_10_05.md`)。
- 上游参照(`/workspace/yinduzhanxing` `origin/main`,只作口径参照,不搬代码):
- `bbb16115`「bind parent rectification to D12」:`father_death` / `mother_death` 加 `vargas: [D1, D12]` 与 profile `parent_father_d12` / `parent_mother_d12`;
- `fe56dd84`:父亲事件主宫默认 9 宫(Parashari),另存北印 10 宫备选 profile;
- `e3bac915`:各领域事件绑分盘(婚恋 D9+UL、事业 D10+A10、财富 D2/D11 等)。
- 注意:上游绑的是**带日期的父母事件**(如过世),不是静态是非题。静态父母题在上游也没有评测;父母盲测与现实校准合同仍待占星师确认(`docs/research/astrologer_questions_v2_2026_10_02.md` 甲2)。
- sync5(`TASK-upstream-sync5-20261002` §2 第 3 条)当时不搬上游的显式权重 / 行运锚点 / 双轨门,理由是我方 v9 架构不同、待占星师甲8 / 甲9。也不搬父母 / 事业盲测与现实校准合同,理由是甲2、甲3 未定。本单不改这一决定,只测静态父母题本身有没有区分力。
- 我方 D12 现状:家人领域已用 D12(`scripts/active_rectification_event_engine.py` family 行、`scripts/rectification/event_probes.py` `SCORING_LAYERS`),用于带日期事件的计分,没有静态父母题。
## 2. 决策记录(产品 2026-10-12)
1. 同意把「父母静态是非题」作为候选题型研究;**过门才立实现单**,过门前不进生产题库、不计分。
2. 只用公开、可查来源的案例(AA / A 级出生时间),**不用任何真实用户资料**(包括本次私人样例)。
3. 判读规则必须**在看答案之前**预登记(参照 `docs/research/nadi_seconds_preregistration_2026_10_05.json` 的做法)。
## 3. 硬红线
1. 不改生产代码、打分、题库、`decision_policy`;不升算法身份。
2. 预登记文件先提交、后跑评测;预登记后改判据算作新一轮,旧结果照记。
3. 必须有乱序对照(把父母事实在案例间随机打乱 ≥200 次)和正对照(人为埋入「与 D12 读法一致」的事实,流程须能测出),否则结论无效。
4. 父母事实必须有可引用的出处(传记、访谈、权威百科条目),每条记来源链接与可信等级;拿不到出处的不入集。
5. 文档与数据集不得含真实用户资料;推送前跑 `tests/test_repo_privacy_markers.py`。
## 4. 任务分解
### R0 案例集
- 从 `references/real_case_calibration/holdout_v5_roster.json` 的 77 例与 AA 公开名人中,挑父母信息可查的案例,目标 ≥60 例。每例记录 4–6 条可核父母事实,对应上游五题的维度:主要照料者、家庭财务主导、父亲是否指导学业、父亲职业类型(体制 / 技能奔波 / 经商等)、父母是否长期分隔两地。答案取「是 / 否 / 不清楚」。
- 验收:`references/real_case_calibration/parent_facts_v1.json` + 来源表;不清楚率逐题报告。
### R1 预登记
- 每题写清:读哪张盘(D12;D1 9/4 宫与日、月作对照)、哪几宫 / 宫主 / 征象星、什么配置算「是」。给 9 宫父 / 10 宫父两种 profile(对照上游 `fe56dd84`),各自预登记。
- 验收:`docs/research/d12_parent_probes_preregistration_2026_10_12.json` 先于评测提交。
### R2 区分力评测
- 对每例,在真实出生时间 ±10 / ±30 窗口内,取 D12 上升最近的换段点两侧各一个代表分钟,看预登记判读对「真实一侧」的选中率。另报:同窗内全部 D12 段的头段命中、真值段保留。
- 对照:乱序对照的分布与真实值的分位;正对照能被测出;Bonferroni 校正后显著才算过。
- 稳健性:换岁差(Lahiri / Raman)、换交点(mean / true)后判读改变的比例。
- 验收:`docs/research/rectification_d12_parent_probes_2026_10_12.md` + 结果 JSON;脚本两次运行逐字节一致;Python 定向测试 + 快速门全量。
### R3 结论
- 过门(真实一侧选中率显著高于乱序对照,且岁差 / 交点稳健性改变比例 <20%):写实现建议(题干、计分方式,只作平局裁决还是计分,接到 `TASK-rectification-nearest-boundary-opening-20261012` 的首轮选题)。
- 不过门:写明「不上线」,给产品一句对外口径。
## 5. 让步顺序
案例不足 60 例 → 先用能凑到的跑并标「欠力」,不下「无效」结论;稳健性只做岁差一项。正 / 乱序对照不可让。
## 6. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-d12-parent-probes-research-20261012 .worktrees/rectification-d12-parent-probes-research-20261012 origin/staging
grep -oE "^## BUG-[0-9]+" docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1
export PYTHONHASHSEED=0
```
完成后 BUG-1308 改 closed(附结论)或转为实现单的引用。
@@ -0,0 +1,114 @@
# TASK · 对话里明说要校正就直接进入生时校正(BUG-1306,2026-10-12)
- 基线:`origin/staging` @ `fddddaab`(已部署代码 `de4cfeb8`,含 BUG-1247~1251「校正并入对话」第一步)。
- 分支 / worktree:`codex/rectification-explicit-entry-20261012` / `.worktrees/rectification-explicit-entry-20261012`
- 串行顺序:**本单最先做**。`TASK-rectification-nearest-boundary-opening-20261012` 若改到 `frontend/src/app/(app)/page.tsx`、`use-rectification-surface.ts` 或校正开场组件,必须等本单合入 staging 后再开工;`TASK-rectification-d12-parent-probes-research-20261012` 是纯研究,可并行。
- BUG 编号:本单修 BUG-1306(已存在,状态 investigating)。实现中另发现的问题从开工时 `docs/BUG_HISTORY.md` 最大号顺延(写作时最大为 BUG-1308)。
## 1. 事故实证
产品 10-11 在 staging 新对话第一句输入「请你帮我进行生时纠正」(本人档案,申报出生时段)。回复显示「已完成 3 步」,正文:
- 「收窄出生时间这件事能做……对得上,区间就能往里收」,要用户报有年月的经历;
- 全文没有提卡片,界面上也没有提议卡;
- 按「代表分钟」写出大运、子运的起止年月。
代码事实(行号按符号定位):
| 位置 | 事实 |
| --- | --- |
| `frontend/src/lib/consultation-thinking-plan.ts` `RECTIFICATION_OFFER_RULE` | 规则以「用户说你推得不准时」开头;「明确想核对出生时间」只是其中一支 |
| `frontend/src/mastra/consultation-tools.ts` `createRectificationOfferTool` | 工具只记录提议,进入校正要用户再点卡 |
| 同文件 `RECTIFICATION_OFFER_REFUSAL_NOTES` | `product_disabled`、`pricing_unavailable` 要求「正文不要提校正」 → 用户看到的是没回应 |
| `frontend/src/app/api/consult/route.ts` `declaredWindowInstruction` | 已写「精确应期一律不可用」,模型仍写了子运起止 |
| 同文件 natal / window 两处「运行合同不完整」重试 | 首轮没调计算工具就强制重跑 → 「要校正」这一轮也会被逼着先排盘写解读 |
| BUG-1247 | 删除首页入口与文字口令后,新用户进校正只剩「模型调工具 → 服务端放行 → 出卡 → 点卡」一条路 |
| BUG-1248 上线前模型实测 | 只测了四种说法,没有「首轮直接点名要校正」 |
## 2. 根因
1. 入口完全依赖模型判断,规则写成「推得不准」场景,没覆盖「用户直接要做校正」。
2. 服务端拒绝时有两种原因被设计成静默。
3. 普通对话模型没有「不能在对话里做校正」的边界,于是自己收经历、承诺收窄。用户照做也不会进入校正引擎计分。
4. 首轮强制排盘合同没有给「要校正」这轮留出口。
## 3. 决策记录(产品 2026-10-12)
1. **用户明确要求做生时校正时,直接进入校正**:不先写解读,不用点卡。是否「明确要求」由模型判断,**禁止正则 / 关键词**(BUG-976/977 口径不变)。
2. **推翻 BUG-1248 的两条**:
- 「工具只记录提议、进入要点卡」:对用户明确要求的这一轮,改为直接打开。「推得不准、可能是时间问题」时主动提议仍走卡片,不变。
- `product_disabled`、`pricing_unavailable`「正文不要提校正」:改为**必须用一句话说明现在做不了**,不得静默。措辞对照 `frontend/docs/VOICE.md`,不写价格、不写内部原因名。
3. 普通对话模型**不得**承诺「能收窄出生时间」,不得在对话里收集经历假装校正;用户要做校正,就走第 1 条。
4. 申报时段下不得写大运、子运的精确起止(守 `declaredWindowInstruction` 原有规定)。只补指令与回归测试,不改证据卡。
5. 服务端判定不变:本人、`isProductEnabled("rectification")`、无进行中 case、`feature_pricing` 有价,缺一不开。家人档案、已有进行中 case 照原口径一句话说明(进行中的 case 可给「接着做」入口,见 T3)。
## 4. 硬红线
1. 不用正则 / 关键词判断意图,不新增前端意图判断。
2. 不改数据库结构、不动迁移;不改校正引擎、打分、`decision_policy`、闸门。
3. 守 AGENTS §6:`scripts/jyotish_api_server.py` 类方法数不增长;`frontend/src/app/(app)/page.tsx` 的 `Home()` 中 `useState` / `useRef` 数不增长(新逻辑进 hook / lib)。
4. 不在任何文件、测试、日志里写真实用户资料;实测只用公开名人 golden 盘或虚构资料。
5. 计费:直接进入校正与原来点卡开案一样,走原有开案扣费路径,不新增扣费点;这一轮咨询如果没有写解读,不得按解读扣咨询点数(与 smalltalk 路径一样核对结算)。
6. 测试总数不得低于基线;改既有断言写「原值 / 新值 / 原因」三栏。
## 5. 任务分解
### T0 取证(先做,做不到写成环境缺口)
- 目标:确认 10-11 那一轮模型是否调用了 `offer-birth-time-rectification`,服务端返回了什么。
- 途径:`[agent-observability]` 只打到 web 容器控制台(`frontend/src/lib/agent-observability.ts` `consoleSink`)。需要 staging 主机 `docker logs`(按 `deploy/README.md`)里该时段 `toolCalls`。另一佐证:该会话的 `chat_sessions.messages` 里有没有 `rectificationOffer`。
- 没有主机 / 数据库访问:写进 `BLOCKED.md`,在进度记录给产品一条可照做的查法(只查工具名与结果,不复制正文与出生资料)。**不阻塞 T1–T5**。
- 验收:进度记录写明取证结果或环境缺口。
### T1 直达工具语义
- `offer-birth-time-rectification` 增加「用户这一轮明确要求做校正」这一参数,或拆出一个开案工具(执行方选一种,写理由)。由模型判断,不用正则。
- 服务端判定通过时,`run.completed` 事件(或新事件)带「直接打开」的指令和来源会话号;浏览器收到后调用现有打开流程:`useRectificationSurface` 的打开函数,`intent=homepage` 加 `sourceSessionId`,复用 BUG-1249/1250 的来源绑定与「回到刚才的对话」。
- 本轮助手消息只留一句过渡(例如「好,我们开始核对出生时间。」),消息上记一条与提议卡同结构的记录(状态直接为 `opened`),保证刷新后来源仍能找回(`findRectificationSource` 只认带 caseId 的提议卡)。
- 验收:单测覆盖「通过 → 直接打开且绑定来源」「同一轮不重复开案」「刷新后来源可找回」;`bindRectificationSource` 对 `opened` 记录幂等。
### T2 首轮合同豁免
- natal 与 window 两条路径的「运行合同不完整」重试:本轮已经走直达(T1 通过)时不重试、不要求计算工具,也不写解读。
- 服务端拒绝时同样不重试,只写一句说明。
- 验收:单测断言两条路径在直达 / 拒绝时都不触发重试;正常咨询轮重试行为不变(原测试不改或三栏说明)。
### T3 拒绝不静默
- 改 `RECTIFICATION_OFFER_REFUSAL_NOTES`:`product_disabled`、`pricing_unavailable` 改为一句话说明现在做不了。`case_in_progress` 除说明外,直达场景下直接打开那个进行中的 case(与历史里打开相同),不新开。
- 验收:四种拒绝各一条单测,断言 note 不含「不要提校正」;文案对照 VOICE.md。
### T4 普通对话的边界
- 在 `RECTIFICATION_OFFER_RULE`(只此一处定义)里加:不承诺收窄出生时间,不在对话里收集经历做校正;用户要做就调工具。
- `declaredWindowInstruction` 补一句:大运、子运只说「在哪一段附近」,不写起止年月日。
- 验收:指令内容测试;规则仍只定义一处。
### T5 模型实测(公开名人 golden 盘或虚构资料,至少 deepseek-flash 与产品默认模型各一遍,每场景 ≥2 次)
| 场景 | 期望 |
| --- | --- |
| 首轮直接点名:「请你帮我进行生时纠正」 | 直接打开,不写解读 |
| 不同说法:「帮我校正出生时间」「想核对一下出生时间准不准」「我出生时间是估的,帮我对一下」 | 直接打开 |
| 追问轮里才提出要校正 | 直接打开 |
| 只是不认同解读:「你说我事业不顺,我觉得挺顺的」 | **不得进入**,按纠正规则改读 |
| 过去的事对不上 + 时间是估的(未明确要校正) | 出提议卡(原行为) |
| 家人档案明确要校正 | 一句话说明暂不支持,不开案 |
| 服务端 `pricing_unavailable` | 一句话说明,不静默 |
| 申报时段普通咨询 | 不出现子运起止年月日、不承诺收窄 |
- 验收:进度记录逐场景给次数与结果;任一「不得进入」场景进入了即不通过。无模型凭据时写成环境缺口,并补 `docs/testing/` 真机清单。
## 6. 让步顺序
时间不够时依次放弃:T5 中第二个模型 → T0 取证(写缺口)。T1–T4 不可让。
## 7. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-explicit-entry-20261012 .worktrees/rectification-explicit-entry-20261012 origin/staging
grep -oE "^## BUG-[0-9]+" docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1
```
前端门禁:`tsc --noEmit` 0 错、`npm run lint` 0 error、`npm test` 失败名单与基线逐条相同、`next build` 后 `/` Static、首屏 gzip ±2%。改 UI 同提交更新 `frontend/DESIGN.md`;`docs/BUG_HISTORY.md` 的 BUG-1306 更新为 fixed-pending-verify 并写修复与验证。真机清单写到 `docs/testing/rectification-explicit-entry-20261012.md`。
@@ -0,0 +1,95 @@
# TASK · 生时校正开场:先说记录时间离最近分界多近,首轮只问这条分界两侧的不同(BUG-1307,2026-10-12)
- 基线:`origin/staging` @ `fddddaab`(已部署代码 `de4cfeb8`)。
- 分支 / worktree:`codex/rectification-nearest-boundary-opening-20261012` / `.worktrees/rectification-nearest-boundary-opening-20261012`
- 串行顺序:若本单改到 `frontend/src/app/(app)/page.tsx`、`frontend/src/hooks/use-rectification-surface.ts` 或校正开场组件,**必须等 `TASK-rectification-explicit-entry-20261012`(BUG-1306)合入 staging 后**再以新 staging 为基线开工;只改 `scripts/rectification/**` 与 `frontend/src/lib/rectification-agentic/**` 的部分可先做。与 `TASK-rectification-d12-parent-probes-research-20261012` 无文件交叉,可并行。
- BUG 编号:本单为 BUG-1307(已建记录,状态 open)。另发现的问题从开工时 `docs/BUG_HISTORY.md` 最大号顺延。
## 1. 事故实证
产品 10-12 拿上游 Skill(占星师本机运行)的一次校正和我们比较,认为上游「步骤短很多,还能出结果」。样例是一例私人资料,本单只记相对时刻。
上游的做法:以记录时间为锚扫描前后 30 分钟,找到最近的分盘换段点,在记录时间前约 17 秒。然后列出两侧不同的层(父母盘、事业盘、居住盘,本命上升星座不变),只问这几层的区别,五道是非题。
同一样例的 PM 复算(Swiss Ephemeris,Raman,与上游两份文件的日期在一天内一致),看用户一件「某年某月」的经历落在哪个子运小段:
| 出生时刻(相对记录时间) | 该月所处小段 |
| --- | --- |
| 前 8 分钟 | 月初 4 天为金星,之后为太阳 |
| 前 4 分钟(上游自己的点估计) | 太阳 → 月亮 |
| 前 30 秒 | 太阳 → 月亮 |
| 记录时间 | 太阳 → 月亮 |
同一输入,上游两次会话结论相反:一次「保留记录时间,没有足够依据改」;一次「记录时间是错的,真实时间在记录前 13 分钟到前 17 秒之间」。后一份的事件论据与它自己的点估计矛盾(见上表),实际只靠一条父母事实的事后解读。
**结论**:上游值得借的是呈现与选题顺序:用户一听就懂「为什么要答这几道题」,题也少。不借的是秒级口径和「记录时间是错的」。
我方现状(`fddddaab`,行号按符号定位,执行方开工先复核):
| 位置 | 现状 |
| --- | --- |
| `scripts/rectification/refinement_packet.py` `window_scan` | 逐分钟扫描 11 层(D1/D9/D10/D4/D5/D7/D12/D24/D2/D11/D30)及展示层,输出 `transitions`(层、时刻、前后星座)。**不以记录时间为锚,不算记录时间离最近换段点多远** |
| 同文件 `nakshatra_boundary` | 只看代表分钟的上升离星宿交界多近,出性格类二选一,不是分盘换段 |
| 同文件 `precision_stage` | 按 D1→D9→D10→D4→D5/D24 顺序给「还差什么」,与记录时间无关 |
| `frontend/src/lib/rectification-agentic/core/segment-summary.ts` | 段汇总只对 D1/D9/D10(`TARGET_CHARTS`),按领域取盘(`targetChartsForDomain`) |
| `frontend/src/lib/rectification-agentic/core/segment-probe-order.ts` | 按段信息增益排题,窗口 ≤61 分钟默认开(BUG-1143/1144);只排序,不限定题目范围 |
| `frontend/src/lib/rectification-agentic/birth-time-provenance.ts` `reportedTimeOffsetCopy` | 用户能看到的「记录时间」只出现在交付时,说的是记录时间与**交付区间**差几分钟,不是与分界的距离 |
用户在开场看不到「记录时间离分界多近、两侧哪里不同」。
## 2. 根因
扫描数据已经有了,但从没以记录时间为锚组织过:开场不讲,选题面向整个窗口,所以用户感觉步骤多、目的不明。
## 3. 决策记录(产品 2026-10-12)
1. 采纳「最近分界开场」:开场告诉用户,记录时间离最近的分盘换段点有多近(以分钟计)、两侧哪几层不同(用人话:父母、工作、住处、婚恋……)。
2. 记录时间离分界近时,首轮只出能区分这条分界两侧的题,问完再按原流程。「近」的阈值由执行方用 77 例回放定,写进进度记录。
3. **只改呈现与选题顺序,不改打分。** `decision_policy`、闸门、4 件 3 域(BUG-1193)、采用门、交付卡档位全部不动。
4. 对外不说秒级(守 `docs/research/rectification_nadi_seconds_2026_10_05.md` §8 口径);不出现「记录时间是错的 / 不准」(守 BUG-691「记录优先、分歧并列」)。
## 4. 硬红线
1. 不改打分、`scripts/rectification/decision_policy.py`、闸门常量、4 件 3 域、算法身份;同输入同分。
2. v5 77 例持久回放(`docs/research/varga_resolution_persisted_onoff_after_fix_2026_10_01.json` 同法):±10 / ±30 真值段保留不低于 76 / 76;D9、D10 头段命中不低于修后基线;任一格下降即停,报产品。
3. 用户可见文案不得出现秒、「记录时间错了 / 不准」、「已确认」;距离以整分钟说,不足 1 分钟说「不到 1 分钟」。
4. 申报方式为 `period_only` 时没有可比的记录分钟,不出「离分界多近」这一句,走原流程。
5. 守 AGENTS §6(Home() 状态数、API server 方法数不增长);新文案对照 VOICE.md;改 UI 同提交更新 `frontend/DESIGN.md`。
6. 测试总数不低于基线;改既有断言写三栏。
## 5. 任务分解
### T1 以记录时间为锚的分界计算(Python,薄注册)
- 在 `scripts/rectification/` 新模块里,基于 `window_scan` 的 `transitions`,给出:记录时间前后最近的换段点(分钟)、该点两侧不同的层清单、各层前后星座。只读已有扫描,不改 `window_scan` 的输出语义。
- 验收:Python 定向测试用公开名人 golden 盘(AA 级);记录时间正好在段内、紧贴换段、窗口内无换段三种情况各一条;快速门全量。
### T2 开场一句话
- 校正开场(BUG-1257 开场切片所在处,执行方先定位)加一句:记录时间离最近换段点多近、两侧哪几件事不同,并说明接下来先问这几件。窗口内无换段时说「你填的时间附近这些盘都不换,先从经历开始」。
- 验收:单测覆盖三种情况与 `period_only`;文案逐条对照 VOICE.md,不含红线 3 的词。
### T3 首轮选题限定在该分界
- 记录时间离分界在阈值内时,首轮候选题只取能区分两侧的层对应的题(复用现有题库与 `segmentInformationGain`,不新增题型);问完回到原排序。
- 阈值用 77 例回放选,候选值至少 3 档(例如 2 / 5 / 10 分钟),逐档报问题数、真值段保留、头段命中。
- 验收:回放表进进度记录;红线 2 全过才默认开启,否则留开关默认关并报产品。
### T4 真机清单
- `docs/testing/rectification-nearest-boundary-opening-20261012.md`:用公开名人资料或虚构资料,记录时间紧贴分界与远离分界各走一遍。
## 6. 让步顺序
T3 回放不过门 → 只上 T1 + T2(呈现),T3 留开关默认关。T2 不可让。
## 7. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-nearest-boundary-opening-20261012 .worktrees/rectification-nearest-boundary-opening-20261012 origin/staging
grep -oE "^## BUG-[0-9]+" docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1
export PYTHONHASHSEED=0 # 回放命令见 docs/research/rectification_varga_resolution_2026_09_30.md 附录
```
门禁:Python 快速门全量、前端 tsc / lint / npm test(失败名单与基线逐条相同)/ build `/` Static / gzip ±2%。完成后 BUG-1307 改 fixed-pending-verify,写修复、验证与回放数字。