feat(rectification): open on the nearest chart boundary (BUG-1307)
This commit is contained in:
+6
-3
@@ -17561,15 +17561,18 @@
|
||||
|
||||
## BUG-1307 | 生时校正开场不说记录时间离最近分界多近,首轮选题面向整个窗口,用户觉得步骤多、目的不明
|
||||
|
||||
- 状态:open(任务书 `docs/tasks/TASK-rectification-nearest-boundary-opening-20261012.md` 待领取)
|
||||
- 状态:fixed-pending-verify(只上了开场呈现。选题开关默认关:v5 77 例持久回放没有跑,±10 / ±30 真值段保留和 D9、D10 头段命中都没有新数字,红线未核。部署和真机清单完成前不标 resolved)
|
||||
- 首次发现 / 最近更新: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(不说秒级)。
|
||||
- 修复:新模块只读 `window_scan` 的换段行,给出记录分钟前后最近的换段、两侧不同的层和前后星座。开场由服务端把这一句放在原来两句中间。申报时段、扫描失败不加这一句。窗口里没有换段,用固定的一句「附近这些盘都不换」。选题开关 `RECTIFICATION_NEAREST_BOUNDARY_PROBES=on` 才把对应领域的题排到增益序前面;默认关,开场因此不说「接下来先问这几件」。2 / 5 / 10 分钟都没有选定。Skill 仍是 10.0.33,没有改 OpeningPolicy 正文。
|
||||
- 验证:公开 AA 盘定向测试覆盖段内、紧贴换段、窗口内无换段;分盘接口默认响应不增加这个字段。前端开场单测覆盖这三句和开关默认关。77 例回放未跑。真机清单 `docs/testing/rectification-nearest-boundary-opening-20261012.md` 未走。
|
||||
- 防复发:默认开场两句保持原文字;有换段句时服务端整段替换,不靠模型现编。开关关闭时排序函数返回原数组。打分、闸门、4 件 3 域未改。
|
||||
- 相关记录:BUG-1306、BUG-1115~1117(盘型口径)、BUG-1143/1144(按段选题)、BUG-691(记录优先)、BUG-1240(不说秒级)、BUG-621(历史 case 仍打开旧 Skill)。
|
||||
- 复发自:无。
|
||||
- 修复版本:未修复。
|
||||
- 修复版本:分支 `codex/rectification-nearest-boundary-opening-20261012`,未推送,未部署。进度 `docs/tasks/PROGRESS-rectification-nearest-boundary-opening-20261012.md`。
|
||||
|
||||
## BUG-1308 | 父母静态是非题(D12)对出生时间分界两侧有没有区分力未经评测
|
||||
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
# PROGRESS · 生时校正开场说最近一次换段(2026-10-12,BUG-1307)
|
||||
|
||||
任务书:`TASK-rectification-nearest-boundary-opening-20261012.md`。分支 `codex/rectification-nearest-boundary-opening-20261012`,基线 `e6baff95`。只 commit,不 push。未部署。
|
||||
|
||||
## 一句话
|
||||
|
||||
开场会说填的时间离最近一次换段差几分钟、两边哪几件事不同。2 / 5 / 10 分钟都没有跑 77 例,阈值没有选定,选题开关默认关。打分没改。Skill 仍是 10.0.33。
|
||||
|
||||
## 阈值
|
||||
|
||||
没有采用。候选 2 / 5 / 10 分钟都没跑持久回放,不能说哪一档过了红线。
|
||||
|
||||
代码里的 `NEAREST_BOUNDARY_PROBE_THRESHOLD_MINUTES = 5` 只在开关打开之后才用,注释写明未采纳。它不是选定结果。
|
||||
|
||||
开关:环境变量 `RECTIFICATION_NEAREST_BOUNDARY_PROBES` 必须等于 `on` 才改变出题顺序,默认关。关着的时候,开场不说「接下来先问这几件」,避免承诺一件没有做的事。
|
||||
|
||||
## 77 例回放
|
||||
|
||||
没跑。持久回放要本地 Postgres 和逐例星历,这一轮不启动。因此红线未核,按任务书让步:只上呈现,选题留开关默认关。没有为了过门改打分。
|
||||
|
||||
修后基线(`docs/research/varga_resolution_persisted_onoff_after_fix_2026_10_01.json`,段序开,生产默认窗口不超过 61 分钟;`dataset_sha256` `ab365a3e3f4953d4b538f2c0889dc98ab89444a28340c3a7b29e2a864cdd687a`)这一轮没有重测:
|
||||
|
||||
| 窗口 | 提问数 | D9 头段命中 | D10 头段命中 | 真值段保留 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| ±10 开 | 355 | 71 | 67 | 76 |
|
||||
| ±30 开 | 418 | 51 | 55 | 76 |
|
||||
|
||||
红线是 ±10 / ±30 真值段保留都不低于 76 / 76,D9、D10 头段命中不低于上表。任一格下降就要停。
|
||||
|
||||
| 阈值 | 问题数 | ±10 真值段保留 | ±30 真值段保留 | ±10 D9 头段 | ±10 D10 头段 | ±30 D9 头段 | ±30 D10 头段 |
|
||||
| --- | --- | --- | --- | --- | --- | --- | --- |
|
||||
| 2 分钟 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 |
|
||||
| 5 分钟 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 |
|
||||
| 10 分钟 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 | 未跑 |
|
||||
|
||||
公开 AA 盘上傍晚 40 分钟里,离换段最远是 3 分钟。那是一张盘的测量,不是 77 例的门,也不拿来选阈值。
|
||||
|
||||
## 句数上限
|
||||
|
||||
| 项 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| `isAcceptableOpeningBody` 句数上限 | 3 | 3 | 新句放在原来两句中间,没有放宽上限 |
|
||||
|
||||
没有新句时,默认开场两句与改前逐字相同。
|
||||
|
||||
## 为什么没有 10.0.34
|
||||
|
||||
OpeningPolicy 仍要求正文两句大白话,旧版本目录没有改。开场正文由服务端在模型写完后整段换成 `openingSpokenBody`,不靠模型现编,也不靠 Skill 正文。历史 case 仍读 10.0.33(BUG-621)。`RECTIFICATION_SKILL_VERSION` 仍是 `10.0.33`。
|
||||
|
||||
## 呈现
|
||||
|
||||
- 新模块 `scripts/rectification/nearest_boundary.py` 只读 `window_scan` 的 `transitions`。真正换段是前后星座不同。展示层和星座没变的行忽略。距离按钟面环形分钟算,一样近时留更早的钟点。不改 `window_scan` 的返回形状。
|
||||
- 开场扫描走现有 `POST /api/rectification/v5/varga-segments`。`target_charts` 仍是调用方要的盘;只有带了 `boundary_charts` 和 `recorded_time` 才多一个 `nearest_boundary`。默认缓存键不变。`minutes.signs` 仍只含请求的目标盘。D12 仍不能当目标盘。
|
||||
- 人话对照:婚恋、工作、住处、学业、子女、父母、钱、身体。本命上升不说成一件事。客户端只用层名白名单重写主题,不采用接口里的主题字符串。
|
||||
- 申报方式 `period_only`、没有记录钟点、或扫描失败:原来两句,不挡开场。
|
||||
- 窗口内没有换段:`你填的时间附近这些盘都不换,先从经历开始。`
|
||||
- 有换段:`你填的时间离最近会换的地方不到 1 分钟,两边不一样的是父母、工作。` 或 `差 N 分钟`。不足 1 分钟说「不到 1 分钟」。
|
||||
|
||||
## 选题开关
|
||||
|
||||
打开之后,现有增益排序不变,再把领域落在这条分界上的题排到前面,其余保持刚才的顺序。不新增题型,不改分数。问完这些再接原来的顺序。`period_only`、没有记录钟点、找不到换段、距离大于未采纳的 5 分钟、或没有领域时,不改顺序。
|
||||
|
||||
开关关闭时,排序函数返回原来的数组,同输入同分、同顺序。
|
||||
|
||||
## 没改的
|
||||
|
||||
`decision_policy.py`、闸门常量、4 件 3 域、采用门、交付卡档位、`window_scan` 输出、`page.tsx`、`use-rectification-surface.ts`、咨询入口三个文件、`scripts/jyotish_api_server.py`、数据库、`.gitea`、BUG-1306、BUG-1308、Skill 10.0.33 正文。Home() 状态数没增加。
|
||||
|
||||
## 测试
|
||||
|
||||
Python 用 Anaconda `C:\Users\74082\anaconda3\python.exe`,`PYTHONHASHSEED=0`。本仓没有 `.venv`,没有往仓库里 pip install。
|
||||
|
||||
| 项 | 结果 |
|
||||
| --- | --- |
|
||||
| `tests/test_rectification_nearest_boundary.py` | 4 项通过。公开 AA 盘覆盖段内、紧贴换段、窗口内无换段。默认分盘响应没有 `nearest_boundary`;带上新字段后与 `window_scan` 的最近换段一致 |
|
||||
| `tsc --noEmit` | 通过,退出码 0 |
|
||||
| `npm run lint` | 0 error,125 条 warning,都在原有文件上 |
|
||||
| 开场 / 文案合同 | `rectification-nearest-boundary-opening-20261012.test.ts`、`rectification-opening-plain-20260926.test.ts`、`agent-voice-copy-contract.test.ts` 共 31 项通过 |
|
||||
| 快速门 `--profile quick` | 编译、JSON、能力清单、片段审计、解释源清单、BPHS 不变量通过。pytest 1067 passed、1 skipped、1 failed。失败的是 `tests/test_rectification_v5_services.py` 里全天 block_scan 必须在 15 秒内完成,整门里用了 38.0 秒。这个文件没改。单独再跑通过。算这台机器在长套件里的负载,不算本单回归。门禁因此停在 pytest,没有接着跑它自己的 npm test / lint / build |
|
||||
| `CI=1` `npm test` | 4915 项,通过 4774,失败 100,cancelled 0。失败都落在没改过的文件上,见下 |
|
||||
|
||||
这 100 条是 Windows 基线,不是本单回归:没有 Docker 起不来 Postgres;没有创建符号链接的权限(Skill 运行时别名 `EPERM`);没有 WSL 的 bash;部分路径被拼成 `G:\G:\...` 因而找不到目录;迁移文件在这台机器上读出来的是路径而不是正文;一条打字拒绝测试的子进程退出码是 null(超时或被杀掉),没有进到本单改过的出题参数。本单新增的开场测试在这 4774 条里面。
|
||||
|
||||
`next build`:失败。Turbopack 报 `frontend/node_modules` 这个 junction 指到文件系统根外面。这是已知环境缺口,没有改 Next 配置,也没有删 junction。首屏 gzip 和 `/` 是否仍为 Static 因此没有在这台机器上量。
|
||||
|
||||
## 真机
|
||||
|
||||
`docs/testing/rectification-nearest-boundary-opening-20261012.md`。公开盘两档:19:01 是「不到 1 分钟」,19:04 是「差 3 分钟」。公开记录 19:15 在默认前后 15 分钟窗口里是「差 2 分钟」。窗口内不换那一句,界面选不出那么窄的窗,由自动化测试覆盖。
|
||||
@@ -125,7 +125,7 @@
|
||||
| `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` | `PROGRESS-rectification-explicit-entry-20261012.md` | **明说要校正就直接进入(BUG-1306)**:模型判断意图(禁正则),服务端判定后直接开案并绑定来源对话;首轮排盘合同对此轮豁免;拒绝必须一句话说明(推翻 BUG-1248 静默两条);普通对话不得假装校正、申报时段不写子运起止。**先做** | 已部署 staging `b8bdc003`,真机欠 | — |
|
||||
| `TASK-rectification-nearest-boundary-opening-20261012.md` | — | **最近分界开场(BUG-1307)**:开场说记录时间离最近分盘换段点多近、两侧哪些层不同,近分界时首轮只问该分界;不改打分 / 闸门 / 4 件 3 域,77 例回放不降;改 page.tsx / 校正开场组件的部分须在 BUG-1306 合入后 | 待领取 | — |
|
||||
| `TASK-rectification-nearest-boundary-opening-20261012.md` | `PROGRESS-rectification-nearest-boundary-opening-20261012.md` | **最近分界开场(BUG-1307)**:开场说记录时间离最近换段多近、两侧哪些事不同。选题开关默认关(77 例未跑)。不改打分 / 闸门 / 4 件 3 域。未改 page.tsx | 待验收 | 分支 `codex/rectification-nearest-boundary-opening-20261012`,未推送 |
|
||||
| `TASK-rectification-d12-parent-probes-research-20261012.md` | — | **父母静态是非题(D12)研究(BUG-1308)**:公开案例 ≥60、预登记、乱序与正对照,过门才立实现单;纯研究可并行 | 待领取 | — |
|
||||
| `TASK-rectification-1012-batch-fix-20261012.md` | `PROGRESS-rectification-offer-opened-state-20261012.md` | **10-12 三单验收修复**:entry `6a799582` 通过(合入待产品);boundary `b285011a` 未通过——F1 开场与段汇总岁差写死 Raman(BUG-1307 / 新 BUG-1309)、F2 本命上升换段不说;F3 提议在开案成功后才标 opened(BUG-1306 跟进,本分支待验收);F4 研究报告补编码问题与暂停结论(BUG-1308) | F3 待验收(`codex/rectification-offer-opened-state-20261012`);F1/F2/F4 仍待领取 | — |
|
||||
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
# 生时校正:开场说最近一次换段 · 真机清单(2026-10-12,BUG-1307)
|
||||
|
||||
用公开盘,不要用真实用户的出生资料。盘是 Steve Jobs,1955-02-24,旧金山(纬度 37.77、经度 -122.42、西八区)。下面的钟点是为了走两种开场故意填的,不是在改这份公开记录。
|
||||
|
||||
校正开场按这张盘的候选窗口扫描,岁差固定 Raman、交点固定平均。星盘页如果选了别的岁差,这一句仍按 Raman 算。出生证界面写「前后 2 分钟」,校正实际开窗是前后 15 分钟。开场里「现在先在哪一段之间找」就是这个窗口。
|
||||
|
||||
选题开关默认关。中间那句说到句号为止,不出现「接下来先问这几件」。第一题仍按原来的顺序,不会因为提到学业或父母就提前。
|
||||
|
||||
扫描接口没连上时,开场仍是原来的两句。那是退路。先确认校正服务可用,再照下面走。
|
||||
|
||||
## 1. 紧贴换段
|
||||
|
||||
1. 新建这个人,申报方式选「有出生证或医院记录,精确到分钟」,钟点填 19:01。
|
||||
2. 明确说要做生时校正,进入校正。
|
||||
3. 开场正文三句。第一句里的窗口是 18:46–19:16。中间这一句逐字是:
|
||||
|
||||
你填的时间离最近会换的地方不到 1 分钟,两边不一样的是学业、父母。
|
||||
|
||||
4. 不应出现:秒、分盘、盘面、大运、区间、精确到秒、记录时间错了、记录时间不准、已确认、接下来先问这几件。
|
||||
5. 接着答一两件带年月的经历。下一题按原来的收集顺序来,不因为这句提到学业、父母就被换掉。
|
||||
|
||||
## 2. 这张盘上离得最远的一档
|
||||
|
||||
同一人,钟点改成 19:04,申报仍用出生证(窗口同样是前后 15 分钟,18:49–19:19)。「家人记得大概时间」再选「差不多准」也是这 15 分钟。
|
||||
|
||||
中间这一句逐字是:
|
||||
|
||||
你填的时间离最近会换的地方差 3 分钟,两边不一样的是学业、父母。
|
||||
|
||||
这张盘在这段傍晚里,离换段最远就是 3 分钟。这里的「远离」是量到的最大间隔,不是一个很宽的空档。
|
||||
|
||||
## 3. 顺手核对公开记录钟点
|
||||
|
||||
钟点用公开记录 19:15,出生证或「差不多准」都是 19:00–19:30。中间这一句逐字是:
|
||||
|
||||
你填的时间离最近会换的地方差 2 分钟,两边不一样的是婚恋、住处、学业、子女、父母、钱、身体。
|
||||
|
||||
没有「工作」。本命上升也换,这句话不提。
|
||||
|
||||
## 4. 只知道大概时段
|
||||
|
||||
申报方式选「只知道大概时段,或完全不知道」。开场不加中间那句,仍是原来两句:先说在哪一段里找,再说你讲几件大事和大概年月。
|
||||
|
||||
## 5. 窗口里看不到换段
|
||||
|
||||
这句话是:
|
||||
|
||||
你填的时间附近这些盘都不换,先从经历开始。
|
||||
|
||||
校正开窗至少前后 15 分钟,而这张盘几分钟就换一次,界面上选不出这么窄的窗口。这一句由自动化测试覆盖:只扫描 19:01–19:06、记录钟点 19:04,结果是窗口内没有换段,文案就是上面这一句。
|
||||
|
||||
有任何一步和上面不一样,记下是第几步,以及开场实际写了什么。不要把真实用户的出生时间写进记录。
|
||||
Reference in New Issue
Block a user