# PROGRESS · 对话卡同源修复(2026-10-09) 分支 `codex/consult-card-full-source-20261007`。已 rebase 到 `origin/staging` `19bae8a8`,本地提交 `b216b286` 之上还有未推送的修复。状态:执行中。F6 未通过。未推送,未合入,未上线。 ## 结论 F1 到 F5 已按修复单做完。F6 未通过,不让步:严重冲突从 1 增到 3,对照组误报仍是 0。卡体量最大 18,193 字符,没有内部路径。建议上限仍留在 20,000。未推送。 ## 修复 | 项 | 做法 | | --- | --- | | F1 缓存日期 | 键加入参照日期(请求的 today 或 transit_date,否则服务端当天)。当前大运、行运、年盘用这同一个日期。schema `consult-full-data-cache-v2`。超过两天的文件删除。BUG-1296。 | | F2 模型只看数值 | path、check 留在服务端。缺口留一个状态字。超过 800 字符、没有值的占位不送进模型。受冲仍只计数。BUG-1297。 | | F3 行星相位 | 资料包抄上引擎的 house_aspects。出处 `references/signs-and-houses.md` 第六节。七颗行星投射,罗睺计都只做目标。BUG-1298。 | | F4 金样 | `frontend/tests/fixtures/consult-card-facts-20261009.json`。命令:`python scripts/research/freeze_consult_card_facts_fixture.py`。参照日 2026-09-27,岁差 raman,交点 mean。BUG-1299。 | | F5 预热 | 星盘新建、修改、本人资料保存成功后,`after()` 后台预热。缺日期、时间、经纬度或时区则跳过。不挡住保存。不新增 API 类方法。BUG-1300。 | `scripts/jyotish_api_server.py` 10,963 行,粗护栏 11,224。类方法数没有增加。`page.tsx` 的 useState / useRef 没有增加。系统提示文件没有改。KP 仍不上卡。年运卡仍读 `tajika_yogas`。 ## 卡片体量 组卡方式与合同测试相同:生平 golden 工作流加上冻结的领域事实。父母、婚恋、健康、事业用本领域路由;其余领域借用事业路由的本命底,体量略偏大。 | 盘 | 最大领域 | 字符 | 十二个领域是否都 ≤ 20,000 | 内部路径 | | --- | --- | --- | --- | --- | | 乔布斯 | 财富 16,921 | 最大 16,921 | 是 | 无 | | 奥巴马 | 财富 16,313 | 最大 16,313 | 是 | 无 | | 泰勒 | 财富 18,193 | 最大 18,193 | 是 | 无 | 没有 `worksheets.`、`core_chart.`、`"check"`。 上限建议:临时上限维持 20,000。最大实测 18,193,留约 1,800 字符。不降到 18,000,因为只量了三张公开盘。卡加清单的临时上限 26,000 仍够用:改后事业工具结果约 18,290 到 19,600 字符。 ## 模型对比 模型 `deepseek-flash`。key 只在当次命令的环境变量里,没有写入仓库、日志正文或本文。 生平回测:9 位公开人物 × 父母 / 婚恋 / 健康 / 事业 × 2 次。改前不挂事实,用当时的 golden 卡。改后挂参照日 2026-09-27 的事实。引擎仍是 golden 桩。 | 项 | 改前 | 改后 | | --- | --- | --- | | 份数 | 72 | 72 | | 失败 | 0 | 0 | | 空答 | 0 | 0 | | 墙钟 | 862 秒 | 921 秒 | | 平均总耗时 | 46.2 秒 | 49.9 秒 | | 平均输入 token | 27,984.9 | 28,655.8 | | 其中缓存 token 平均 | 22,519.1 | 21,240.9 | | 平均回答 token | 9,311.8 | 9,328.0 | | 平均思考 token | 8,736.4 | 8,736.1 | | 平均卡字符 | 6,918.7 | 14,129.8 | | 最大卡字符 | 7,561 | 16,281 | | 禁句 | 0 | 0 | | 性别代词 | 0 | 0 | | must_not 原文处数 | 7 | 4 | must_not 是线索,不是阅读结论。改前 7 处、改后 4 处,都落在「可能不在身边,也可能人在」这种两头都写的句子上。按这个口径,两头都写不算对照组误报,也不算严重冲突。改前阅读:严重冲突 1,就是泰勒事业第 2 次把公开职业写成不靠频繁曝光;这一条同时记行业冲突。对照组误报 0。改后 18 份事业回答里没有「不靠曝光 / 幕后 / 不是台前 / 顾问 / 技术」。 改后有 1 份(乔布斯父母第 1 次)多调了一次家庭工具再回到父母。当时进程里的脚本还没放行家庭域。源码现已对家庭、子女返回空,不抛错。这一份留在 72 份的平均数里。 首字时间是另一次直连,不是上面的代理循环。同一套系统提示(本次读到 25,165 字符;本轮没有改提示词文件),用户问题相同,只换工具结果。流一开始就中止,记的是第一个思考 token。空答 0。 | 盘 | 改前首字 | 改后首字 | 改前工具结果 | 改后工具结果 | | --- | --- | --- | --- | --- | | 乔布斯 | 1,064 毫秒 | 769 毫秒 | 11,988 | 18,290 | | 奥巴马 | 707 毫秒 | 485 毫秒 | 11,839 | 18,836 | | 泰勒 | 465 毫秒 | 642 毫秒 | 11,776 | 19,600 | | 平均 | 745 毫秒 | 632 毫秒 | | | 样本只有 3 题,第一发最慢。卡变大约一倍,首字没有变慢,72 份的平均总耗时多 3.7 秒。 ## 阅读 同一口径:两头都写的「可能不在,也可能人在」不算误报,也不算严重冲突。直接把行业写成另一类,或把公开人物写成不靠曝光、往里走、不靠场面,记严重冲突,同时记行业冲突。 | 项 | 改前 | 改后 | | --- | --- | --- | | 通过 | 71 | 69 | | 错过 | 0 | 0 | | 读反 | 0 | 0 | | 严重冲突 | 1 | 3 | | 对照组误报 | 0 | 0 | | 行业冲突 | 1 | 3 | | 空话凑段 | 3 | 2 | 改前的 1 条是泰勒事业第 2 次。改后仍是泰勒事业第 2 次,另外齐达内事业两次都把公开的球星路子写成靠专业判断、把事情说清楚,或写成说得清、写得明、算得出,并压低外面认不认你这一头。红线不允许严重冲突升高。F6 停在这里,没有改评分,也没有改系统提示。 ## 本机已跑 | 检查 | 结果 | | --- | --- | | `tsc --noEmit` | 0 | | `npm run lint` | 0 error,125 条原有 warning | | 增长合同 + 对话卡 pytest | 18 通过 | | 隐私标记(已暂存当时的代码与金样) | 通过 | | 前端合同测试(金样组卡、预热) | 通过 | ## 快速门(本机,2026-10-09) 编译、JSON、审计和核心 pytest 通过。pytest 615 秒。门禁在 `npm test` 停下,退出码 1。lint 和 `next build` 没有跑到。 `npm test`:4997 项,通过 4877,失败 120,取消 0。本轮新增的两条都在通过里:金样组卡、保存后预热。 这 120 条不是 Linux 验收里的那 24 条。本机没有数据库,迁移和 Postgres 测试失败。首页预热和「新建对话」那一组是本机既有的页面生命周期失败。另外 6 条是这次门禁命令带了技能占位符预加载,路径被拼成双份盘符,文件找不到。那是命令环境,不是这批业务改动。 没有在 Linux 上重跑全量 pytest。不把这份 Windows 名单说成 Linux 基线。没有登录态。真机清单结果列为空。