diff --git a/CHANGELOG.md b/CHANGELOG.md index 72d65cbc..cc75f171 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,12 @@ # 印度占星 Skill 更新日志 -## 2026-10-09 — 事业清单写明代表星不猜职业,预热不再占重计算名额(回测未达标,未推送,未合入,未上线) +## 2026-10-09 — 事业清单写明代表星不猜职业,预热不再占重计算名额(已合入 staging) - 事业清单加一条:判断表里的自然代表星、Jaimini 代表星、大运主星只看力量和受冲,不按星的本性推断职业类型、做事方式或台前 / 幕后。职业类型仍问用户。系统提示没有改。 - 保存后的预热仍走原来的咨询入口,但不再占用重计算名额,避免刚保存就提问时收到 429。预热失败不影响保存。 -- 生平回测严重冲突从 3 降到 1,对照组误报仍是 0。齐达内的事业题还有一次按星性写方向,不合入。Skill 版本不变。 +- 生平回测严重冲突从 3 降到 1,对照组误报仍是 0。齐达内的事业题还有一次按星性写方向,产品按严重冲突 ≤ 1 放行,另开单处理。Skill 版本不变。 -## 2026-10-09 — 对话卡按提问当天取数,模型只看见数值(未推送,未合入,未上线) +## 2026-10-09 — 对话卡按提问当天取数,模型只看见数值(已合入 staging) - 同一张盘隔天再问,当前大运、行运和年盘按提问当天重算,不再冻在第一次计算的那天。超过两天的缓存文件会清掉。 - 送给模型的判断表只留数值和缺口。内部路径留在服务端。三张公开盘、十二个领域都不超过 2 万字符,最大 18,193。受冲仍只计数。 diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 513977b9..1a8b6f4a 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -17330,7 +17330,7 @@ ## BUG-1293 | 对话数据卡自己拼了一套数,没有综合判断表 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-07 / 2026-10-09 - 来源:产品反馈对话「只看本命盘或 D10」;任务书 `TASK-consult-card-full-source-20261007`。 - 影响面:普通对话证据卡的领域段。旧的基础投影仍在,避免首轮回答的字段名变化。新的权威数字是领域段上的综合判断表。 @@ -17342,11 +17342,11 @@ - 防复发:上述测试;事实 JSON 若含 `tajika_named_yogas` 直接拒绝(对话年运仍读 `tajika_yogas`,BUG-1282)。 - 相关记录:BUG-1160、BUG-1161、BUG-1221、BUG-1282。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1294 | 对话卡外补取每轮只能 1 次 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-07 / 2026-10-09 - 来源:产品 2026-10-08 确认把卡外补取上限从 1 改为 3。 - 影响面:`read-consultation-evidence`。第 4 次仍拒绝。KP 补取仍带参考说明,不作结论。 @@ -17358,11 +17358,11 @@ - 防复发:该测试锁上限 3 与第四次拒绝。 - 相关记录:BUG-1293、BUG-1256。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1295 | 对话进一步阅读指向 oracle 与治理文件 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-07 / 2026-10-09 - 来源:任务书 T5。产品确认 `further_reading` 改为按领域的技法资料目录。 - 影响面:普通对话工具结果里的 `methodology.further_reading`。不接书籍语料,不做每轮联网。 @@ -17374,11 +17374,11 @@ - 防复发:该测试。 - 相关记录:BUG-1293。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1296 | 对话资料包缓存键没有参照日期 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-09 / 2026-10-09 - 来源:修复单 F1。Claude 验收:缓存键不含日期,后一次命中把当前大运、行运和年盘冻在第一次计算的那天。 - 影响面:普通对话使用的完整资料包缓存。同一张盘隔天再问,可能仍用第一天的当前大运。 @@ -17390,11 +17390,11 @@ - 防复发:上述测试。重复跑之前先删掉这两把自己的缓存文件,避免上次留下的文件被当成命中。 - 相关记录:BUG-1251。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1297 | 送给模型的判断表带上内部路径,整卡超过两万字符 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-09 / 2026-10-09 - 来源:修复单 F2。Claude 验收:乔布斯事业卡由真实事实端到端组出后为 37,507 字符,判断表 27,159,参与清单 5,447。每格带有 status、path、check、value,内部路径进了模型。 - 影响面:普通对话送给模型的证据卡。服务端副本仍保留路径,供核对。 @@ -17406,11 +17406,11 @@ - 防复发:该测试。手写事实的组装测试只锁组装规则,并在注释里写明它不代替金样。 - 相关记录:BUG-1160、BUG-1161、BUG-1221。临时上限仍是卡 20,000、卡加清单 26,000。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1298 | 十二个领域的行星相位整列记成 blocked -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-09 / 2026-10-09 - 来源:修复单 F3。Claude 验收:参与层因为路由器没有把行星相位列成一层,十二个领域都是 blocked。 - 影响面:普通对话判断表的「照」。不新造罗睺、计都向外的相位。 @@ -17422,11 +17422,11 @@ - 防复发:`tests/test_consult_card_full_source.py` 的公开盘测试。 - 相关记录:BUG-1155。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1299 | 对话卡合同测试用手工事实,不是引擎金样 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-09 / 2026-10-09 - 来源:修复单 F4。合同测试的形状必须来自真实引擎。 - 影响面:`frontend/tests/consult-card-full-source-20261007.test.ts`。手写组装测试保留,只锁组装规则。 @@ -17438,11 +17438,11 @@ - 防复发:测试直接读这份金样。重新生成用上面的命令,不手改数字。 - 相关记录:BUG-1297。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1300 | 新建或修改星盘后没有预热对话资料包 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-09 / 2026-10-09 - 来源:修复单 F5。前序任务书要求星盘建好或出生资料改过之后,后台预热当天的资料包。 - 影响面:星盘新建、星盘修改、本人出生资料保存。保存响应不等待计算。 @@ -17454,11 +17454,11 @@ - 防复发:上述两个测试。lint 对该测试 0 error。 - 相关记录:BUG-1251、BUG-1296。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1301 | 事业判断表的代表星被读成职业类型 -- 状态:investigating(分支 `codex/consult-card-full-source-20261007`,清单已加一条,回测仍有 1 次;未推送、未合入、未部署) +- 状态:mitigated(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;回测严重冲突回到 1,与合入前 staging 相同;剩余 1 次转 BUG-1303) - 首次发现 / 最近更新:2026-10-09 / 2026-10-09 - 来源:修复单 G1。前一轮生平回测严重冲突 1 → 3,新增的两次都是同一位公开球星的事业题。 - 影响面:普通咨询的事业回答。判断表仍保留代表星、旺弱和功能吉凶,没有删行,也没有改取值。 @@ -17467,14 +17467,14 @@ - 根因:既有「不猜行业、问用户」没有写明这些代表星只能看力量和受冲。模型用星的本性补上了职业类型。 - 修复:事业清单加一条,不进系统提示。本轮回测严重冲突 3 → 1,对照组误报仍是 0。齐达内事业两次里仍有一次按星性写方向,所以这条不标 resolved。 - 验证:`frontend/tests/consult-condensed-checklist-20260927.test.ts` 锁住这句,并锁住系统提示源码切片仍是 15,291 字符。生平回测 72 份、失败 0。阅读评分见 `docs/tasks/PROGRESS-consult-card-full-source-fix2-20261009.md`。 -- 防复发:上述测试。合入仍要求严重冲突 ≤ 1,且齐达内事业两次都不再按星性写职业类型。 +- 防复发:上述测试。产品 2026-10-09 按「严重冲突 ≤ 1」放行合入;齐达内事业第 2 次仍按星性写方向,与合入前 staging 的泰勒事业第 2 次同属行业类型冲突,另立 `TASK-consult-career-type-residual-20261009.md`(BUG-1303)。 - 相关记录:BUG-1176。 - 复发自:无。产品 2026-10-03「不猜行业、问用户」没有拦住判断表上的星性。 -- 修复版本:清单已写进本分支。回测未达标。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 ## BUG-1302 | 保存后的预热占用重计算名额 -- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,本地未推送、未合入、未部署;有针对性回归测试) +- 状态:resolved(分支 `codex/consult-card-full-source-20261007`,已快进合入 staging;有针对性回归测试) - 首次发现 / 最近更新:2026-10-09 / 2026-10-09 - 来源:修复单 G2。 - 影响面:星盘保存成功后的后台预热,以及紧接着的用户提问。保存响应本身仍然不等待预热。 @@ -17486,4 +17486,36 @@ - 防复发:上述并发测试。 - 相关记录:BUG-1300。 - 复发自:无。 -- 修复版本:本分支提交。未部署。 +- 修复版本:本分支提交,2026-10-09 快进合入 staging。 + +## BUG-1303 | 事业题仍偶发按星性写方向(BUG-1301 残余) + +- 状态:investigating(待 `TASK-consult-career-type-residual-20261009.md`) +- 首次发现 / 最近更新:2026-10-09 / 2026-10-09 +- 来源:BUG-1301 修复后的生平回测。 +- 影响面:普通咨询事业回答。 +- 现象:18 份事业回答中 1 份把方向写成「知识、表达、信息和资源」一类,与公开人物的实际职业类型不符。 +- 触发条件:判断表多处点名同一颗代表星;模型抽样波动。 +- 根因:待查。初判是清单只禁止推断、没有规定「方向」一节写什么。 +- 修复:待做。 +- 验证:待做。 +- 防复发:待做。 +- 相关记录:BUG-1301、BUG-1176。 +- 复发自:BUG-1301(残余,非新问题)。 +- 修复版本:无。 + +## BUG-1304 | 保存后马上提问,预热与用户请求重复计算同一份资料包 + +- 状态:investigating(待 `TASK-consult-career-type-residual-20261009.md`) +- 首次发现 / 最近更新:2026-10-09 / 2026-10-09 +- 来源:Claude 验收 BUG-1302 时读代码发现。 +- 影响面:保存星盘后立刻提问的第一轮等待时长与服务器 CPU。不会因此返回 429。 +- 现象:同一张盘同一天的资料包可能被并行算两次;多次保存时预热无上限并行。 +- 触发条件:预热未完成时同一张盘的提问到达,或短时间多次保存。 +- 根因:`get_or_build` 没有按缓存键单飞;预热跳过重计算名额后没有自己的上限。 +- 修复:待做。 +- 验证:待做。 +- 防复发:待做。 +- 相关记录:BUG-1300、BUG-1302。 +- 复发自:无。 +- 修复版本:无。 diff --git a/docs/tasks/PROGRESS-consult-card-full-source-fix2-20261009.md b/docs/tasks/PROGRESS-consult-card-full-source-fix2-20261009.md index efaa8353..a8339498 100644 --- a/docs/tasks/PROGRESS-consult-card-full-source-fix2-20261009.md +++ b/docs/tasks/PROGRESS-consult-card-full-source-fix2-20261009.md @@ -1,6 +1,6 @@ # PROGRESS · 对话卡同源第二轮修复(2026-10-09) -分支 `codex/consult-card-full-source-20261007`。已 rebase 到 `origin/staging` `8bb7ff93`。状态:执行中。G3 未通过。未推送,未合入,未上线。 +分支 `codex/consult-card-full-source-20261007`。已 rebase 到 `origin/staging` `8bb7ff93`。状态:已验收(Claude,2026-10-09)。产品按严重冲突 ≤ 1 放行,快进合入 staging;剩余 1 次见 `TASK-consult-career-type-residual-20261009.md`。 ## 结论 @@ -51,3 +51,17 @@ | 快速门、Python 全量、npm test 全量、next build、Linux | 本轮没跑。不把上一轮 Windows 快速门当成通过。 | G4 未完成。G3 未过,状态保持执行中。 + +## Claude 验收(2026-10-09,Linux,`fc3a2e68`) + +| 项 | 结果 | +| --- | --- | +| Python 全量 | 失败 62 条,与上一轮基线逐名相同 | +| 快速门(`--skip-yoga-logic --skip-frontend-runtime`) | 通过 | +| `npm test`(Node 22) | 4,998 条 / 失败 24,与基线逐名相同;新增 1 条,无消失 | +| tsc / lint | 0 / 0 error(125 warning 原有) | +| `next build --webpack` | `/` 仍 ○ Static | +| G1 / G2 | 通过。G2 的预热分支不经 Next 对外暴露(5200 只在内网) | +| G3 | 严重冲突 1 = 合入前 staging 的 1,达到产品合入线;任务书附加的「齐达内两次都不按星性」未达成,产品选择合入后另开单 | + +遗留(写入 `TASK-consult-career-type-residual-20261009.md`):保存后马上提问时,预热与用户请求会各自完整算一遍同一份资料包(缓存没有按键单飞);预热本身也没有自己的并发上限。 diff --git a/docs/tasks/README.md b/docs/tasks/README.md index cc075411..3a15b817 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -131,7 +131,8 @@ | --- | --- | --- | --- | --- | | `TASK-consult-card-full-source-20261007.md` | `PROGRESS-consult-card-full-source-20261007.md` | **对话数据卡与报告同源 + 领域综合判断表**:事业卡只有约 7,600 字符、无自然代表星、无大运主星关系、D10 联动只能补取、补取上限 1;全 12 领域;综合判断表、参与清单(不止 D1/D9,含精度闸)、补取 3 次、资料目录均已确认;KP 不上卡、不联网、不接书籍语料;排在 sync6 与报告单之后 | 验收未通过(`35dafd1e`,见 fix-20261009) | `codex/consult-card-full-source-20261007` | | `TASK-consult-card-full-source-fix-20261009.md` | `PROGRESS-consult-card-full-source-fix-20261009.md` | **对话卡同源修复**:缓存键无日期致当前大运冻结、整卡 37.5K(每格带内部路径)、星照整列 blocked(资料库其实有出处)、前端测试手写数据、无预热;合入前用临时 key 跑模型 A/B 与生平回测 | F1–F5 已验收,F6 未过(见 fix2) | `codex/consult-card-full-source-20261007` | -| `TASK-consult-card-full-source-fix2-20261009.md` | `PROGRESS-consult-card-full-source-fix2-20261009.md` | **对话卡同源第二轮**:齐达内事业被「水星=说写算」带偏致严重冲突 1→3;事业清单加「代表星只看力量受冲、不按星性猜职业」后重跑回测(≤1 才合入);预热改为不占重计算名额 | 执行中(G3:齐达内事业仍有 1 次按星性写方向,未让步) | `codex/consult-card-full-source-20261007` | +| `TASK-consult-card-full-source-fix2-20261009.md` | `PROGRESS-consult-card-full-source-fix2-20261009.md` | **对话卡同源第二轮**:齐达内事业被「水星=说写算」带偏致严重冲突 1→3;事业清单加「代表星只看力量受冲、不按星性猜职业」后重跑回测(≤1 才合入);预热改为不占重计算名额 | 已验收并快进合入 staging(2026-10-09,产品按严重冲突 ≤ 1 放行;剩余 1 次见 career-type-residual) | `codex/consult-card-full-source-20261007` | +| `TASK-consult-career-type-residual-20261009.md` | — | **事业题按星性写方向的残余 + 预热单飞**:回测仍有 1 次(齐达内事业第 2 次;合入前 staging 是泰勒事业第 2 次);保存后马上提问时预热与用户请求并行重复算同一份资料包 | 待领取 | — | | — (产品 09-27 拍板 D1–D4,直接执行) | [PROGRESS](PROGRESS-home-landing-blank-20260927.md) | **登录后 / 裸 `/` 落空白首页**:真机登录后在「首页」提问其实问进了上一次生时校正。删登录返回存根(401 / 次级页链接写、登录后写回 `?c=` 打开),裸 `/` 不再落最近会话,一律当前人物的空白首页(复用空草稿);`?c=` / `?new=1` / 对话内刷新不变;推翻 BUG-1038 存根与 BUG-599 默认落点 | 已验收(真机欠) | `codex/home-landing-blank-20260927`(BUG-1052,本地未推) | | — (产品 09-26 口头拍板 D1–D3,直接执行) | `PROGRESS-consult-answer-truncation-20260926.md` | **普通咨询回答写到一半被掐断仍扣点(BUG-1051,复发自 BUG-305)**:工具循环与写回答共用 110 秒 signal;Mastra 1.50 超时不抛错(`abort` 块 + `finish(tripwire)` 后正常关流),结算只认抛错与 `length`。D1 写回答自有 70 秒时钟(首用起算,续写 / 回答重试共用,最坏 180 秒,`maxDuration` 240);D2 写回答的最后一个流不是 `stop` 且有正文 → `answer_truncated`、不扣点、记 abort 步、不冲半句,`length` 续写不变;D3 观测加 `composeFinishReason` / `composeAborted` / `answerVisibleChars` | 已验收(真机欠) | `codex/consult-answer-truncation-20260926`(本地,未推送);新回归 15 条用真实 Mastra `Agent`(修复前 11 条红);全量失败名单 0 新增;Python 948/1;`/` ○、gzip 0%;真机清单 `docs/testing/consult-answer-truncation-20260926.md` | | `TASK-consult-evidence-card-research-20260927.md` | `PROGRESS-consult-evidence-card-research-20260927.md` | **普通对话数据卡调研**:引擎输出逐项分五类计量(现约 4 万 token、父母问题相关约 3.5%);四处领域→技法来源对账并起草各领域数据卡(家庭拆父母/子女);卡体量与逐字一致性;按卡算的提速空间;反馈迭代埋点方案。只调研不改线上 | 已验收(待产品拍板 7 项) | `codex/consult-evidence-card-research-20260927` 快进 staging;报告 `docs/research/consult_evidence_card_research_2026_09_27.md`;投影缺口记 BUG-1054 investigating | diff --git a/docs/tasks/TASK-consult-career-type-residual-20261009.md b/docs/tasks/TASK-consult-career-type-residual-20261009.md new file mode 100644 index 00000000..debbd052 --- /dev/null +++ b/docs/tasks/TASK-consult-career-type-residual-20261009.md @@ -0,0 +1,50 @@ +# TASK · 事业题按星性写方向的残余 + 预热单飞(2026-10-09) + +- 基线:`origin/staging`,含 `fc3a2e68`(对话卡同源已合入)。分支 `codex/consult-career-type-residual-20261009`。 +- 前序:`TASK-consult-card-full-source-fix2-20261009.md`(已验收合入)。 +- BUG 编号:本单已登记 BUG-1303、BUG-1304(investigating),新问题从 **1305** 起,开工时核对。 + +## 1. 实证 + +| # | 问题 | 证据 | +| --- | --- | --- | +| H1 | 事业题仍有 1 / 18 份按星的本性写方向 | `PROGRESS-consult-card-full-source-fix2-20261009.md`:齐达内事业第 2 次把方向写成「知识、表达、信息和资源」。合入前 staging 的唯一严重冲突是泰勒事业第 2 次(写成不靠曝光),同属行业类型冲突。2 次抽样、`deepseek-flash`,单次波动大 | +| H2 | 预热与用户请求重复计算同一份资料包 | `scripts/consult_full_data_cache.py` 的 `get_or_build` 没有按键加锁:保存后预热还在算时用户提问,用户请求缓存未命中,会在重计算名额里再完整算一遍。预热分支(`jyotish_api_server.py` 中 `consult_card_warm_only`)不占名额,也没有自己的并发上限,2 vCPU 上多次保存会并行多份 | + +## 2. 根因 + +- H1:清单规则只说「不按星性推断」,但判断表仍把同一颗星在自然代表星、大运主星、旺弱多处点名;模型在写「方向」一节时仍会给出星性词。规则没有说「方向」该写什么。 +- H2:F5 只做了「保存后调用」,没有做同键单飞与预热限流。 + +## 3. 决策记录(产品 2026-10-09) + +1. 对话卡同源分支按「严重冲突 ≤ 1」放行合入;剩余这 1 次另开本单。 +2. 本单不删判断表行、不改卡片取值、不改系统提示(≤ 26.6K)、不改首轮形状与口吻;继续遵守 `CAREER_FIELD_ASK_RULE`「不猜行业、问用户」。 +3. 回测临时 key 只放执行方会话的环境变量,不进任何文件。 + +## 4. 硬红线 + +1. 只改事业清单(`frontend/src/lib/consultation-condensed-checklist.ts`)或判断表的呈现文字,不改引擎取值。 +2. 不为回测改评分口径;判读口径沿用前两轮进度记录。 +3. 预热失败不影响保存;用户请求不得因预热收到 429;不新增 API 类方法;`jyotish_api_server.py` 不增长(`tests/test_api_server_growth_contract.py`)。 + +## 5. 任务分解 + +| # | 内容 | 验收标准 | +| --- | --- | --- | +| H1 | 事业清单写明「方向」一节只写力量、阻力、时间与三件事(机会出现 / 成形 / 公开落地),职业类型与工作方式一律问用户;必要时在判断表代表星行旁加一句同义提示(呈现文字,不改值) | 新测试锁住;生平回测 9 人 × 4 领域 × **3 次**:事业 27 份里行业类型冲突 0,全体严重冲突 ≤ 1,对照组误报 0;数字进进度记录 | +| H2 | `get_or_build` 按缓存键单飞(同键并发只算一次,后到者等结果);预热单独限流(例如同时最多 1 份),满了直接跳过 | 并发测试:预热进行中同键用户请求只触发 1 次构建;多次预热不超过上限;既有 `tests/test_api_heavy_compute_gate.py` 通过 | +| H3 | Linux:快速门、Python 全量 ⊆ 基线(62)、`npm test` 失败名单与基线相同、tsc 0、lint 0 error、`next build` `/` Static | 全部满足 | +| H4 | 记录 | BUG-1303 / 1304 更新状态;`CHANGELOG.md`、进度记录、状态板 | + +## 6. 让步顺序 + +H2 可先单独交付;H1 若 3 次回测仍有 1 次行业冲突,如实记录并停,交产品决定,不改口径。 + +## 7. 开工前置 + +```bash +git fetch origin --prune +git worktree add -b codex/consult-career-type-residual-20261009 .worktrees/consult-career-type-residual-20261009 origin/staging +grep -n "^## BUG-1[3-9][0-9][0-9]" docs/BUG_HISTORY.md | tail -3 +```