fix(consult): 申报时段计算改为服务端预跑并走同请求缓存(BUG-957)
窗口计算挂在 agent context 缓存上,模型开口前预跑并注入 packet;工具再调用命中同请求缓存,成功次数仍为 1。
This commit is contained in:
+13
-13
@@ -12586,19 +12586,19 @@
|
||||
|
||||
## BUG-957 | 窗口计算由模型决定调不调,对结果无信息增益
|
||||
|
||||
- 状态:investigating
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-18
|
||||
- 最近更新:2026-09-18
|
||||
- 影响面:`consultation-tools.ts` `run-jyotish-window-consultation`、咨询运行时
|
||||
- 用户现象:无(窗口线被 BUG-954 挡住,本项尚未在真实环境验证)。
|
||||
- 触发条件:窗口工具 `inputSchema` 只有 `question`,出生数据完全服务端绑定。
|
||||
- 影响面:`consultation-tools.ts` `run-jyotish-window-consultation`、`stream-agent-response.ts` warmup、`consult/route.ts` 申报时段分支
|
||||
- 用户现象:只知道一段出生范围时,回答仍取决于模型是否调用计算工具;漏调就整轮失败或降级。
|
||||
- 触发条件:`consultationMode=declared_birth_window`。窗口工具 `inputSchema` 只有 `question`,出生数据完全服务端绑定。
|
||||
- 根因:由模型决定调不调对计算结果没有信息增益,只多一条失败路径(BUG-205/214/922/923/937)。
|
||||
- 修复:本单不做。任务书要求等 BUG-954 在真实环境验证通过后再单独做服务端预跑 + 同请求缓存。
|
||||
- 验证:未做。
|
||||
- 防复发:不得与救急同轮改运行时结构。
|
||||
- 关联记录:BUG-954、BUG-205、BUG-214、BUG-922、BUG-923、BUG-937
|
||||
- 复发自:无
|
||||
- 修复版本:—
|
||||
- 修复:缓存改挂在 agent context 上。服务端在模型循环前 `precomputeWindowConsultation`,进度经 warmup 写入同一 NDJSON 流;成功则把 packet 以服务端确定性消息注入本轮。工具仍留在窗口 Agent 上,再调用命中同请求缓存且 `consultationToolSuccessCount` 不得加第二次。预跑失败合同保持红,模型仍可调工具,既有 retry + 降级仍在。本命不预跑。没有 `toolChoice: "required"`。`contractReady()` 仍是「本请求恰好一次成功的真实计算」,预跑算那一次。
|
||||
- 验证:预跑成功且模型不调工具 → 合同绿、回执有 `run-jyotish-window-consultation` completed、正文送达;预跑后模型再调 → 缓存命中、成功次数为 1;预跑失败且模型只写字 → 仍降级。源码合同锁窗口工具仍 attach、本命工厂不变。
|
||||
- 防复发:窗口计算不得再依赖模型选不选工具;缓存不得回到工厂局部 `let`;咨询侧不得再写 `toolChoice: "required"`。
|
||||
- 关联记录:BUG-954、BUG-205、BUG-214、BUG-922、BUG-923、BUG-937、BUG-956、BUG-959
|
||||
- 复发自:无(954 验证通过后按任务书单独做)
|
||||
- 修复版本:`59788ac6`
|
||||
|
||||
## BUG-959 | 降级正文绕过 Pass 4,保证性结论原样送达
|
||||
|
||||
@@ -12614,7 +12614,7 @@
|
||||
- 防复发:降级路径必须复用 `releasePass4Sentences`,不得另写分句或句内替换。Pass 4 是门不是刀。
|
||||
- 关联记录:BUG-956、BUG-948、BUG-950、BUG-951
|
||||
- 复发自:BUG-956(降级路径漏接 Pass 4)
|
||||
- 修复版本:`ae2e46a6`
|
||||
- 修复版本:`e07d5190`
|
||||
|
||||
## BUG-960 | 两次 attempt 的正文被拼起来一起送出
|
||||
|
||||
@@ -12630,7 +12630,7 @@
|
||||
- 防复发:未绿缓冲按 attempt 隔离,不得跨 attempt 累加。
|
||||
- 关联记录:BUG-956、BUG-959
|
||||
- 复发自:BUG-956
|
||||
- 修复版本:`ae2e46a6`
|
||||
- 修复版本:`e07d5190`
|
||||
|
||||
## BUG-961 | 降级之后还会空跑一轮 compose
|
||||
|
||||
@@ -12646,7 +12646,7 @@
|
||||
- 防复发:降级是终态交付,不得再进 compose。
|
||||
- 关联记录:BUG-956、BUG-959
|
||||
- 复发自:BUG-956
|
||||
- 修复版本:`ae2e46a6`
|
||||
- 修复版本:`e07d5190`
|
||||
|
||||
## BUG-958 | 窗口指令「必须调工具」与「不得给应期」未写清,模型可能跳过计算或拒答
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
# PROGRESS · 申报时段计算改为服务端预跑(2026-09-18)
|
||||
|
||||
工作树:`.worktrees/contract-degraded-pass4-20260918`
|
||||
分支:`codex/contract-degraded-pass4-20260918`
|
||||
基线:`origin/staging` @ `1061514f`
|
||||
前序:`TASK-window-consult-contract-20260918.md` §5、BUG-954 已在 staging 验证通过
|
||||
任务:BUG-957
|
||||
|
||||
## 结论
|
||||
|
||||
申报时段的窗口计算不再等模型决定调不调。服务端在模型开口前先跑同一套工具体,进度写进同一条 NDJSON 流;算出的 packet 以服务端确定性消息注入本轮上下文。工具仍挂在窗口 Agent 上,再调用会命中同请求缓存,成功次数仍是 1。本命线没动。没有 `toolChoice: "required"`。
|
||||
|
||||
## 做法
|
||||
|
||||
| 点 | 落地 |
|
||||
| --- | --- |
|
||||
| 缓存位置 | `WindowConsultationAgentContext.calculationCache`,不是工厂局部 `let`。重建 tools 仍共享 |
|
||||
| 预跑 | `precomputeWindowConsultation(ctx, { question, writer })` 走同一 `execute` 体,记账 `consultationToolCompleted` / `successCount === 1` / 回执 `run-jyotish-window-consultation` |
|
||||
| 时机 | `streamAgentResponse` 的 `warmup`:`run.started` 与 skill 事件之后、`consumeAttempt` 之前 |
|
||||
| 注入 | 预跑成功后往 `baseMessages` 追加 `windowPrecomputedPacketMessage` |
|
||||
| 失败 | warmup 吞掉错误,合同保持红;模型仍可调工具;既有 retry + 降级仍在 |
|
||||
| 本命 | 不预跑 |
|
||||
|
||||
## 测试
|
||||
|
||||
| 项 | 结果 |
|
||||
| --- | --- |
|
||||
| 预跑成功 + 模型不调工具 | 合同绿,回执有窗口工具 completed 步,正文送达,无降级说明 |
|
||||
| 预跑成功 + 模型再调工具 | 缓存命中,`consultationToolSuccessCount === 1` |
|
||||
| 预跑失败 + 模型只写字 | 仍降级,不是静默成功 |
|
||||
| 源码合同 | 窗口 Agent 仍 attach 工具;本命工厂仍是局部 `let calculation`;窗口分支有 warmup;本命分支没有 |
|
||||
|
||||
| `tsc --noEmit` | 0 错 |
|
||||
| `npm run lint` | 0 error(120 warning,与基线同量级,未顺手修) |
|
||||
| 定向 6 个测试文件 | 132 tests / 130 pass / 2 fail。两条失败都是本机 Windows `EPERM` 无法为 live skill 建 symlink,与基线缺口同类 |
|
||||
|
||||
未跑全量 `npm test`(基线 3501 / 31 fail)。Linux 门禁才是验收数字。本机无登录态、无 Chrome。
|
||||
@@ -139,7 +139,8 @@
|
||||
| `TASK-consult-three-channels-fix-20260918.md` | `PROGRESS-consult-three-channels-fix-20260918.md` | 验收修复单:领域上限解耦(945)、31s 预算断言(946)、校正思考分片门(947)、Pass 4 按模式分流(948)、容量算术(949) | 已验收通过(Claude:tsc 0 / lint 0 error / npm test 3491 条 31 红且与基线 `742ffbc6` 同一组、原 12 条红全绿 / `/` 仍 Static / 首屏 js gzip 468,388 B 较基线 +0.02%);review 另出 BUG-950~953 见下一行 | `e32ce624` |
|
||||
| `TASK-consult-pass4-streaming-20260918.md` | `PROGRESS-consult-pass4-streaming-20260918.md` | 验收 review 三轮:Pass 4 一 hold 正文就整段蹦出、逐字流式消失(BUG-950 产品拍板按句放行);无出生分钟模式整段被一句拒绝顶掉、一般知识句一起丢(951 改按句丢弃);该模式下日期不留痕(952);校正流 token 级 thinking 是死链,按 P2 删除并把测试翻转成否定合同(953)。基线 `1e553976` | 待验收 | `cd4775ae` |
|
||||
| `TASK-window-consult-contract-20260918.md` | `PROGRESS-window-consult-contract-20260918.md` | **P0 线上**:申报时段模式**自 2026-08-21 起每轮秒败**(69ms、0 token、模型从未被调用)。服务端日志实证根因:窗口 Agent attach 了 `jyotishSkillBinding()`,但 `windowJyotishInstructions` 从来不含方法块 marker,输入处理器直接 abort(BUG-954)。abort 与「模型没调工具」同码,是它藏四周的原因(955);另含合同未绿不得丢正文(956)、计算不该由模型触发(957,须等 954 上线后另轮)、窗口指令应期冲突(958)。基线 `9cdcf96b` | 已验收通过(Claude:tsc 0 / lint 0 error / npm test 3501 条 31 红同基线 / `/` Static / gzip 无变化;实跑确认窗口 Agent 指令已含 marker);review 另出 BUG-959~961 见下一行 | `5b6abc23` |
|
||||
| `TASK-contract-degraded-pass4-20260918.md` | `PROGRESS-contract-degraded-pass4-20260918.md` | 验收 review:BUG-956 新增的降级交付路径绕过 Pass 4,保证句原样送达(BUG-959);`uncontractedText` 跨 attempt 不清零,同一轮正文说两遍(960);降级后还空跑一轮 compose(961)。基线 `877128ce` | 待验收 | `ae2e46a6` |
|
||||
| `TASK-contract-degraded-pass4-20260918.md` | `PROGRESS-contract-degraded-pass4-20260918.md` | 验收 review:BUG-956 新增的降级交付路径绕过 Pass 4,保证句原样送达(BUG-959);`uncontractedText` 跨 attempt 不清零,同一轮正文说两遍(960);降级后还空跑一轮 compose(961)。基线 `877128ce` | 待验收 | `e07d5190` |
|
||||
| `TASK-window-consult-contract-20260918.md` §5 | `PROGRESS-window-consult-precompute-20260918.md` | BUG-957:申报时段计算改为服务端预跑并走同请求缓存。产品确认 BUG-954 已在 staging 验证,本轮单独做。不得 `toolChoice: "required"`,本命不预跑 | 待验收 | `59788ac6` |
|
||||
| `TASK-chat-markdown-list-20260918.md` | — | 真机排版反馈:聊天正文列表**没有项目符号**(Tailwind v4 preflight 清了 `list-style`,`.markdown-list` 没恢复,BUG-962);`promoteDefinitionLists` 把四标题口语体的散文误判成并列项,三段正文被改写成列表(BUG-963,判据太松,收紧而非删除——BUG-356 的场景要留);思考条与正文之间实测 56px=报告 grid gap 24 + 首标题 margin-top 32,后者是被特指度压掉的「首元素清零」规则(BUG-964)。基线 `ea0280c1` | 待领取 | — |
|
||||
| `TASK-secondary-page-entry-20260918.md` | — | 真机反馈:星盘 / 星历 / 报告进入时抖一下——三页都是「矮的等待文案块 → 高的正文块」一次推挤,且 `use-chart-page` 无缓存所以每次进入都抖(BUG-966)。产品已拍板方案一:统一外壳 + 缓存 + 预取消灭中间态,**不加 spinner**,红线不动。另含 BUG-967:标签页跨过部署后客户端导航静默失效(BUG-965 已复现确认,刷新即恢复),要按 `NEXT_PUBLIC_GIT_COMMIT` 与 `/api/health` 比对自愈。基线 `41902067` | 待领取 | — |
|
||||
| `TASK-account-dialog-inert-20260918.md` | — | 真机:账户弹窗打开后整个弹窗点不动、退出登录做不了,刷新依旧——`e4e73f56` 把 `SidebarInset` 搬进 layout 后 `inert={modalOpen}` 罩住了没有 portal 的 `AccountDialogOverlay`(BUG-968,P0,代码级确认)。另含 BUG-969:校正「换一件事问」后无下文,服务端已出下一题且快照重算完整,客户端停在开场状态,GET 路由与客户端两端静默,本单只做可观测 + 不静默 + 题干进正文。基线 `1061514f` | 待领取 | — |
|
||||
|
||||
Reference in New Issue
Block a user