fix(consult): BUG-945~949 领域截断、思考分片、Pass 4 按模式分流

schema 上限与执行上限解耦;校正思考改分片门;日期观察不删字,保证句与无分钟个人盘退回重写。
This commit is contained in:
jesse-ux
2026-09-18 13:17:35 +08:00
parent b4fcb9466f
commit e32ce6247e
22 changed files with 617 additions and 205 deletions
+80
View File
@@ -12365,3 +12365,83 @@
- 相关记录:BUG-942、BUG-943
- 复发自:无
- 修复版本:`94c1e81f`
## BUG-945 | 三领域问题被 schema 整次拒绝,一个领域都不算
- 状态:resolved
- 首次发现:2026-09-18
- 最近更新:2026-09-18
- 影响面:`consultation-tools.ts` 工具入参 `domains.max``executableDomainPlan`
- 用户现象:一次问事业+财富+家庭时整轮没有排盘,回答空或只剩道歉。
- 触发条件:模型列出 ≥3 个领域。`MAX_CONSULTATION_DOMAINS` 因 31s/领域降到 2schema `.max(2)` 在 execute 前拒绝整次调用。
- 根因:执行上限与计划上限绑在同一个常数上。工具描述承诺截断进 `omitted_domains`,zod 却整次拒绝,截断逻辑成死代码。
- 修复:schema 上限改为 `MAX_CONSULTATION_DOMAIN_PLAN_VALUES = 6`;真正执行仍按墙钟上限 2 截断,其余进 `omitted_domains`。描述与 mastra 指令对齐。
- 验证:`consultation-agentic-runtime.test.ts` 超限计划 `runWorkflow` ≥1、`omitted_domains` 非空、schema 接受 3–6 条拒绝 7 条。
- 防复发:计划长度与执行长度必须是两个常数;超限合同必须走到 execute。
- 相关记录:BUG-944、BUG-946
- 复发自:BUG-944
- 修复版本:见本批合入 SHA
## BUG-946 | 领域时长改 31s 后 6 条预算断言仍按 21s / cap=3
- 状态:resolved
- 首次发现:2026-09-18
- 最近更新:2026-09-18
- 影响面:`consultation-agentic-runtime.test.ts`
- 用户现象:无(测试红)。门禁 `npm test` 过不了,镜像不发布。
- 触发条件:`94c1e81f` 把领域时长改成 31s 后跑全量测试。
- 根因:实现改了常数,断言没跟。三领域调用被 BUG-945 的 schema 拒绝后,合并合同读 `undefined`
- 修复:按 MAX=2 / 31s 重写 6 条断言,写原值/新值/原因。不得弱化成 `cap >= 1`
- 验证:同文件预算与超限截断用例。
- 防复发:改 `CONSULTATION_DOMAIN_DURATION_MS` 必须同步预算合同。
- 相关记录:BUG-944、BUG-945
- 复发自:BUG-944
- 修复版本:见本批合入 SHA
## BUG-947 | 校正流思考分片被条目门整条丢掉
- 状态:resolved
- 首次发现:2026-09-18
- 最近更新:2026-09-18
- 影响面:`rectification-agentic/v9/stream-mapping.ts``think-step-gate.ts`
- 用户现象:生时校正计算期思考行大面积空白。
- 触发条件:provider `reasoning-delta` 分片短于 8 字或没有句末标点。`先核对经历。`7 字)被 `acceptThinkStepText` 判空。
- 根因:本命 Pass 2 的整条门被误用到校正分片通道。
- 修复:选任务书方案 (b)。校正流保留分片通道,改走 `acceptThinkingFragment`(只判 CJK / 工具名,不改写、不设 8 字下限)。另提供 assembler 给连续分片测可见行。
- 验证:`rectification-step-answer.test.ts`,含「连续中文分片最终能产出一条可见思考行」。
- 防复发:条目门不得接到分片通道。新增正则必须能回答「门还是刀」。
- 相关记录:BUG-942
- 复发自:BUG-942
- 修复版本:见本批合入 SHA
## BUG-948 | 三类检测器没人调用,范围用户应期被旧口径挖空
- 状态:resolved
- 首次发现:2026-09-18
- 最近更新:2026-09-18
- 影响面:`timing-output-guard.ts``stream-agent-response.ts``consult/route.ts`、出生时间模式
- 用户现象:只知道出生范围、或已校正后问应期,日期被挖成「[具体时间已省略]」;同时保证句和个人盘断言在恒等壳下什么都不拦。
- 触发条件:`94c1e81f` 把守卫改成恒等,Pass 4 只接了方法学记账检测。产品 2026-09-18 授权按模式分开处置。
- 根因:检测器保留了,生产路径没接线。身份壳看起来在保护。旧红线把分钟敏感主题一律挖日期,范围用户不能用。
- 修复:删除恒等壳。Pass 4 按模式:`exact-timing` 在有盘/窗口模式只记 `pass4-observe` 不改写;`guarantee` 全模式 `pass4-reject`,退回 Pass 3 一次,二次丢句;`personal-chart``general_no_birth_time` 退回,二次整段换成拒绝句。正文先 hold 再一次发出,避免闪两次。
- 验证:timing-output-guard / birth-time-mode / range-reading / birth-accuracy / agentic-runtime Pass 4 合同。范围用户含日期正文原样通过。
- 防复发:全仓不得再出现 `guardPreciseTimingOutput` / `guardGeneralNoBirthTimeOutput` / `createBirthTimeModeOutputGuard`。回执步骤名带 `pass4-observe:<kind>` / `pass4-reject:<kind>`
- 相关记录:BUG-298、BUG-943
- 复发自:BUG-298
- 修复版本:见本批合入 SHA
## BUG-949 | 思考计划变小后容量算术两条红
- 状态:resolved
- 首次发现:2026-09-18
- 最近更新:2026-09-18
- 影响面:`consultation-session-capacity.test.ts`
- 用户现象:无(测试红)。门禁过不了。
- 触发条件:本命思考计划改成四标题后,1 域 JSON 1053 < 旧下限 120019 轮旧口径不再 > 200,000。
- 根因:断言按旧计划形状写死上下界。
- 修复:按 2026-09-18 实测重算:分节 1053/1267/126719 轮详情 533,113 B、旧口径 177,97350 轮 1,402,384 B。三栏说明。19→50 轮产品口径不变。
- 验证:同文件两条容量合同。
- 防复发:改 thinking plan 形状必须重测这两条,不得放宽成「大于 0」。
- 相关记录:BUG-732、BUG-943
- 复发自:无
- 修复版本:见本批合入 SHA
@@ -0,0 +1,54 @@
# PROGRESS · 三通道重做修复单(2026-09-18
工作树:`.worktrees/consult-three-channels-fix-20260918`
分支:`codex/consult-three-channels-fix-20260918`
基线:`origin/staging` @ `b4fcb946`(任务书写 `7ae3aa9a`,其后两笔纯文档已快进)
任务书:`docs/tasks/TASK-consult-three-channels-fix-20260918.md`
## 任务状态
| 任务 | 状态 | 说明 |
| --- | --- | --- |
| BUG-945 领域 schema 与执行上限解耦 | 完成 | 计划最多 6 条,执行仍按墙钟 2 条,其余 `omitted_domains` |
| BUG-946 31s 预算断言 | 完成 | 6 条按 MAX=2 / 31s 重写,附三栏 |
| BUG-947 校正思考分片 | 完成 | 选方案 (b):分片级 CJK 门,不复用 8 字条目门 |
| BUG-948 Pass 4 按模式分流 | 完成 | 日期观察、保证句退回、无分钟个人盘整段拒绝 |
| BUG-949 容量算术 | 完成 | 按四标题计划重测上下界 |
## 947 选型
**(b)**。校正流仍按 `reasoning-delta` 分片推到浏览器,不能拿 Pass 2 的整条门(≥8 字 + 句末标点)去滤。新门 `acceptThinkingFragment` 只判非空、含 CJK、不含工具名,不改写、不删词。另给 `createThinkingFragmentAssembler` 证明连续分片能拼出可见行。
## 948 让步
1.`composeAnswer` 的本命路径:Pass 4 命中保证句 / 个人盘时退回 Pass 3 一次,二次再落地(丢保证句或整段拒绝句)。正文 hold 到判定结束再发,避免闪两次。
2.`composeAnswer` 的一般 / 窗口路径:不另开一轮模型,直接二次落地。
3. 非 agentic 的 `streamTextResponse` 旧路径不再套恒等壳,也不在流上改写。日期因此能出来;保证句在这条旧路径上没有模型重写。
4. `exact-timing``general_no_birth_time` 不记 observe、也不拦——产品表只给有盘 / 窗口模式观察日期。
## 断言三栏(既有测试)
| 测试 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| `MAX_CONSULTATION_DOMAINS` | 3 | 2 | 31s/领域,墙钟 65s 只能付 2 个 |
| `executableDomainPlan` 5 个领域 | 执行 3 | 执行 2 | 同上 |
| `domainFitsRunBudget(42_000, 2)` | true(按 21s | 改为 31s 口径的 0/1/2 组 | 预算公式跟新时长 |
| 超限计划 | schema 失败、execute 0 | schema 接受 ≤6execute ≥1`omitted_domains` 非空 | BUG-945 |
| 未校正 / 分钟敏感日期 | `[具体时间已省略]` | 原文保留 + `pass4-observe:exact-timing` | BUG-948 产品授权 |
| 无分钟个人盘 | 半句替换或恒等 | 二次整段 `GENERAL_NO_BIRTH_TIME_REFUSAL` | 不得半句替换 |
| 1 域 thinkingSections JSON | 12002500 | 9001300(实测 1053 | 四标题计划更小 |
| 2/3 域 thinkingSections JSON | 18003500 / 24004500 | 11001600(实测 126712 步封顶同长) | 同上 |
| 19 轮旧口径字符 | > 200,000 | 170k190k(实测 177,973 | 分节变小后 19 轮不再必然撞旧额度 |
| 19/50 轮详情字节 | 540k590k / 1.45M1.51M | 520k550k / 1.38M1.43M533,113 / 1,402,384 | 同上;比例仍约 2.63 |
## 测试
| 项 | 结果 |
| --- | --- |
| `tsc --noEmit` | 0 错 |
| `npm run lint` | 0 error121 warning,与基线同量级) |
| 原 12 条红 | 全绿(见上表) |
| 全量 `npm test`(本机 Windows | tests 3449 / pass 3371 / fail 78。多出来的失败是本机 symlink/EPERM、bash、无 Docker 的既有缺口,不是本单 12 条 |
| 本单新增 | Pass 4 观察/退回/拒绝合同、范围用户日期合同、分片 assembler、容量上下界 |
Linux 门禁才是验收数字:目标 fail 回到 31,总数 ≥ 3484。本机无法跑 skill symlink 的两条 Agent 探针(`personal Agent exposes…` / `general agent runtime has no Jyotish skill package…`),CI Linux 上应仍绿。
+1 -1
View File
@@ -136,7 +136,7 @@
| `TASK-session-list-single-source-fix-20260917.md` | `PROGRESS-session-list-single-source-fix-20260917.md` | 验收修复单:F1 四条源码合同搬到 `(app)/layout.tsx` 两端对断(BUG-933);F2 两条陈旧 Python 入口断言(BUG-934,既有欠账);F3 无活跃会话时输入框静默吞发送(BUG-935);交付前必须跑全量测试 | 待验收 | `codex/session-list-single-source-fix-20260917` |
| — | `PROGRESS-birth-time-journey-page-path-20260918.md` | **P0 门禁**`test_birth_time_journey_contract` 仍读已搬走的 `app/page.tsx`BUG-939);修好后 run 2764 又露出 5 条校正守卫后的前端源码合同(BUG-940)。均复发自 BUG-933 | 已合入 | `39a0d7a9` / `0378d9e0` |
| `TASK-consult-three-channels-20260918.md` | `PROGRESS-consult-three-channels-20260918.md` | 咨询运行时三通道:进度 / 思考 / 正文生成时分离。设计分支误用 BUG-939/940/941,落地改号 942944 | 验收未通过(见修复单) | `94c1e81f` |
| `TASK-consult-three-channels-fix-20260918.md` | — | 验收修复单:领域上限 3→2 且超限被 zod 整次拒绝、三领域问题零执行(BUG-945 P0);21s→31s 后 6 条预算断言未跟946校正思考分片被条目门整条丢弃(947);时间 / 保证 / 个人盘三类检测器无生产调用方 → 按模式分开处置:日期照出不删字(含出生范围用户)、保证句与无出生时间下的个人盘断言退回重写(948,产品 09-18 授权,推翻分钟敏感主题一律套精确时间守卫的旧红线);容量算术两条红949。基线 `7ae3aa9a`npm test 43 红 vs 基线 31 红 | 待领取 | — |
| `TASK-consult-three-channels-fix-20260918.md` | `PROGRESS-consult-three-channels-fix-20260918.md` | 验收修复单:领域上限解耦(945)、31s 预算断言(946校正思考分片门(947)、Pass 4 按模式分流(948)、容量算术(949 | 待验收 | `codex/consult-three-channels-fix-20260918` |
| `TASK-first-paint-dead-screen-fallback-20260917.md` | — | 真机:首页永远停在「正在载入账户」,兜底全在没跑起来的 bundle 里(BUG-936 investigating)。根 layout 加与 bundle 无关的内联兜底 + 去掉本仓正则后行断言 | 待领取 | — |
| `TASK-consultation-answer-start-anchor-20260917.md` | `PROGRESS-consultation-answer-start-anchor-20260917.md` | 主会话回答落在结尾:`useConversationScrollAnchor` 是贴底跟随,流式期间视口钉在最后一个字,回答开头滚出视口;改为发送后问题钉顶、回答向下长、长出视口显示「跳到最新」、末尾动态留白;产品追加拍板:校正面同一语义(推翻 BUG-041/048 贴底),本轮开头 = 用户行或新助手行。BUG 段 930 起 | 已验收(经修复单) | `worktree/green-harbor-5be3` |
| `TASK-consultation-answer-start-anchor-fix-20260917.md` | `PROGRESS-consultation-answer-start-anchor-fix-20260917.md` | 验收修复单:F1 头就是留白行时留白按整视口算(BUG-931);F2 留白只在钉住期间存在(BUG-932);前置:先修 e4e73f56 的两处 TS 错否则门禁不过 | 已验收 | `cc1a8980`Claude 验收:tsc 0 / lint 0 error / npm test 3457 条 39 红与 11c0028d 逐条一致、新增 2 条绿 / `next build --webpack` 通过、`/` Static、首屏 gzip 591,242(较 09-16 基线 582,800 +1.45%,含会话列表单)/ Chrome 真实布局 S1–S6 全部通过,S6 新助手行距顶 16px 且增高不动,S5 不再写留白);真机六条欠 |