fix(consult): pin daily entrypoint domains and sentence-filter thinking (BUG-612/613)
Homepage「深入看今日」was rewritten to natal 综合, then each compose slice burned its only step on a tool call, so the answer stayed empty. Pin the route theme, write the three daily sections with tools disabled, and filter thinking by sentence so English word-salad cannot leak. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9494,3 +9494,34 @@
|
||||
- 复发自:无
|
||||
- 修复版本:`7d3bb0c5`
|
||||
|
||||
## BUG-612 | 首页「深入看今日」计算完成却没有回答(empty_answer)
|
||||
|
||||
- 状态:resolved(本地修复,待提交与发布)
|
||||
- 首次发现:2026-09-09
|
||||
- 最近更新:2026-09-09
|
||||
- 影响面:首页「深入看今日」、`POST /api/consult` agentic 路径、`canonicalDomainPlan`、分段写作 `composeSection` / `composeByHeadings`
|
||||
- 用户现象:活动区走完「读取分析方法 → 计算本命盘 → 先整理本盘的统一参数 → 接下来分析你的综合 → 用审计表收口后再落到生活」后,正文只有「计算已完成,但这次没有生成回答,本次不会扣点。请再发送一次。」(`empty_answer`)。不扣点是对的,但用户拿不到回答。
|
||||
- 触发条件:已校验星盘账号从首页点「深入看今日」(`theme: timing` + `entrypoint: daily_starlanguage`);计费配置已有 `chat.standard`。staging 观测到该 run `retryCount=5`、`modelFinishReason=tripwire`、墙钟约 110s。
|
||||
- 根因:两层叠在一起。其一,`canonicalDomainPlan` 在模型显式传了 `domains` 时以模型为准,路由选的 `timing` 被改成 `general`,分段标题变成本命「综合 / 技法审计表 / 现代生活」,与入口扩展的「今日趋势 / 适合推进 / 避开 / 行动」错位。其二,每个分段 `maxSteps = 1` 且工具仍可调,模型在分段里再发起工具调用(想换回 `timing`),一步用完、零正文;四个分段全空后再走 BUG-280 的 `retryForAnswer`,面对的还是同一套错位标题,救不回来。
|
||||
- 修复:`daily_starlanguage` / `birth_time_rectification` 入口钉死路由 `theme`,模型改写只记 `planOverrideIgnored`,不报错不扣步。今日入口改用三节写作计划(`今日趋势` / `适合推进 / 需要避开` / `一个行动`,审计表和边界句折进最后一节)。分段 `toolChoice: "none"`;某一节没有新正文时同节再写一次(`section-empty-retry`),仍空才进入既有 `answer-retry`。
|
||||
- 验证:`frontend/tests/consultation-agentic-runtime.test.ts` 新增入口钉死、分段空写重试、全空才 `answer-retry`;`consultation-thinking-plan.test.ts` 锁三节标题与 `applyThinkingSectionProgress`;`consultation-workflow-contract.test.ts` 锁 `toolChoice: "none"` 与 entrypoint 接线。定向 `tsx --test` 上述文件 + `public-thinking` + `consultation-entrypoint` 共 119 项通过;`tsc --noEmit` 清洁。staging `[agent-observability]` 已见活动区「综合」、`tripwire`、110s、`retryCount=5`。`tool.input.domains` 未出现在该次日志里,记 `investigating`,不挡住决策 1–3(模型改写领域是活动区文案已证明的事实)。
|
||||
- 防复发:入口请求不得执行模型自选领域。分段写作禁用工具。空切片必须先就地重试,不能把「标题错了所以写不出」交给 BUG-280 的整轮回答重试。
|
||||
- 相关记录:BUG-280(同一「计算成功、模型没写」出口;本条是新来路)、BUG-613(同一次事故的思考区词渣)、`TASK-consultation-daily-empty-answer-20260909.md`
|
||||
- 复发自:BUG-280(现象同类,防线只覆盖「整轮没写」;没有挡住入口领域被改写,也没有挡住分段再调工具)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-613 | 咨询思考流按 chunk 过滤,英文被削成词渣
|
||||
|
||||
- 状态:resolved(本地修复,待提交与发布)
|
||||
- 首次发现:2026-09-09
|
||||
- 最近更新:2026-09-09
|
||||
- 影响面:`frontend/src/lib/public-thinking.ts`、咨询 `thinking.delta`、校正思考映射复用同一 sanitizer
|
||||
- 用户现象:与 BUG-612 同一次「深入看今日」里,思考区出现缺词英文(`The a for 2026-09-09 (, per). The is a - an, not a. … Let me run-jyotish-.`),夹杂工具名前缀。
|
||||
- 触发条件:模型思考以 1–2 个英文词为一个 `reasoning-delta` chunk 流出;其中部分 chunk 含 ≥4 字母英文且无中文。
|
||||
- 根因:`sanitizePublicThinkingText` 按单个 chunk 判定「含 ≥4 字母英文且无中文就丢」。长词所在 chunk 被丢,短词(The / a / for / is)和带中文的 chunk 被放行,拼出来就是词渣。工具名正则只剥了带后缀的完整 id,留下 `run-jyotish-`。
|
||||
- 修复:改为有状态的按句缓冲(`。!?`、换行、英文 `.!?`)。无中文句整句丢;中文句里再删 ≥4 字母英文词和完整工具名/UUID;未闭合的尾巴等下一个 chunk,一次模型循环结束时 flush。咨询流式通道共用同一个 sanitizer 实例。`sanitizePublicThinkingText(text)` 仍是 push+flush,校正映射不用改调用点。
|
||||
- 验证:`frontend/tests/public-thinking.test.ts` 把事故英文按 3–6 字符切开喂入,输出不含 ≥4 字母英文词、不含 `run-jyotish`,中文句完整;另锁「未闭合英文不得粘到后一句中文」。既有 `consultation-agentic-runtime` / `rectification-v9-stream` 思考通道回归仍绿。
|
||||
- 防复发:思考过滤不得按流式 chunk 单独判定英文。工具名要从 `run-jyotish` 前缀整段删,不能只剥后缀。
|
||||
- 相关记录:BUG-612(同一次事故的空回答)、`TASK-consultation-daily-empty-answer-20260909.md`
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# PROGRESS · 「深入看今日」empty_answer + 思考区英文词渣(2026-09-09)
|
||||
|
||||
- 工作树:`.worktrees/consultation-daily-empty-answer-20260909`
|
||||
- 分支:`codex/consultation-daily-empty-answer-20260909`(track 当时的 `origin/staging` @ `48d2ff80`)
|
||||
- 基线:任务书 `docs/tasks/TASK-consultation-daily-empty-answer-20260909.md`
|
||||
- BUG:**BUG-612**、**BUG-613**
|
||||
- 未改计费、`AGENT_MAX_STEPS = 8`、`AGENT_TIMEOUT_MS = 110s`、Skill;未 commit / 未 push
|
||||
|
||||
## 做了什么
|
||||
|
||||
| 任务 | 状态 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 4.1 入口钉死领域 | 完成 | `entrypoint` 为 `daily_starlanguage` / `birth_time_rectification` 时 `canonicalDomainPlan` 只执行路由 `theme`;模型改写记 `planOverrideIgnored` |
|
||||
| 4.3 分段禁用工具 + 空切片重试 | 完成 | `composeSection` 传 `toolChoice: "none"`;`composeByHeadings` 对无新正文的标题再写一次 `section-empty-retry` |
|
||||
| 4.2 今日三节写作计划 | 完成 | `dailyConsultationThinkingPlan()`:今日趋势 / 适合推进 / 需要避开 / 一个行动;id 不是 `close`,不会被拆成审计表+现代生活 |
|
||||
| 4.4 思考流按句过滤 | 完成 | `createPublicThinkingSanitizer`;事故英文 3–6 字符切开后无 ≥4 字母英文、无 `run-jyotish` |
|
||||
| 4.5 记录 | 完成 | BUG-612/613、CHANGELOG、本文件、走查清单;任务板改「待验收」。staging 已把 609~611 给 sync2 修复单,本单改用 612/613。 |
|
||||
|
||||
没有砍让步项。额外做了:`getJyotishAgent` 在今日入口换成 daily 标题规则,避免 `retryForAnswer` 仍按本命骨架写。
|
||||
|
||||
## 口径(与任务书一致)
|
||||
|
||||
- 普通问题仍允许模型传 `domains`。
|
||||
- 模型在入口请求里传了不同或非法领域:忽略,不抛、不扣步。
|
||||
- `planOverrideIgnored` 只在为真时出现在 receipt,既有 `deepEqual` 回执测试不用改。
|
||||
- 空回答仍走 `empty_answer`、不扣点。
|
||||
|
||||
## 偏离
|
||||
|
||||
1. **路由里用 `consultEntrypoint` 闭包变量,而不是在嵌套函数里读 `parsed.data.entrypoint`。** `runAgenticConsultation` 是内嵌函数,TS 不把外层 `safeParse` 的收窄传进去。取值仍来自同一份请求。
|
||||
2. **无终止符的英文思考若后面直接接中文句,按中文句起点切开,英文前缀丢掉。** 任务书只写了按句号切;不这样切,既有「The proposedKind…」+「先看事业宫的结构。」回归会把英文残词粘进中文。
|
||||
|
||||
## 测试数字
|
||||
|
||||
```
|
||||
cd frontend
|
||||
./node_modules/.bin/tsc --noEmit
|
||||
./node_modules/.bin/tsx --test \
|
||||
tests/consultation-agentic-runtime.test.ts \
|
||||
tests/consultation-thinking-plan.test.ts \
|
||||
tests/consultation-workflow-contract.test.ts \
|
||||
tests/public-thinking.test.ts \
|
||||
tests/consultation-entrypoint.test.ts
|
||||
```
|
||||
|
||||
119/119 通过。另跑 `application-billing-contract` 与 `rectification-v9-stream` 思考通道,未红。未跑全量 `npm test`。
|
||||
|
||||
## 待验收
|
||||
|
||||
见 `docs/testing/consultation-daily-empty-answer-20260909.md`。需要 staging 部署本分支后,用已校验星盘账号从首页点「深入看今日」。
|
||||
@@ -86,7 +86,7 @@
|
||||
| `TASK-rectification-timeline-20260909.md` | — | 常驻吸顶时间轴:轴锁**当前**搜索窗口并随放宽缩放、时段/分钟两套标记、候选点二元编码不分置信度(BUG-560 blocked)、无 hover(BUG-575)、只读不可采用。实现用第三个 grid 行而非 `position: sticky`,`useConversationScrollAnchor` 一行不改;条高固定是正确性要求;吸顶条只留区间与宽度两个元素 | 已验收通过;宽度口径与空心点两处未通过→修复单 | `ce91a0d2` |
|
||||
| `TASK-rectification-timeline-fix-20260909.md` | `PROGRESS-rectification-timeline-fix-20260909.md` | 时间轴修复单:宽度读数改含两端分钟数(与 BUG-593 报告/卡片一致);标记改读推断层候选全集,被淘汰分钟留在原地变空心(客户端投影只含 active,DESIGN §10 描述在真实数据下画不出) | 已验收通过 | `92e3d5e7`(BUG-602~603) |
|
||||
| `TASK-rectification-conversation-economy-20260909.md` | `PROGRESS-rectification-conversation-economy-20260909.md` | 对照竞品后产品拍板三条:开场三句讲做法 + 一次收多件(推翻 opening brief「不要一次说完/不举例」与 SKILL L52);采集题「没有 / 记不清」按钮(不做示例骨架条);每轮只留一句(方法句进活动记录、点选旁白去领先落后、证据轮正文一句复述 + 服务端裁剪);Skill 10.0.19 | 已验收通过(2 条 P3 备注) | `aa7ccb30` + `1453fb16`(BUG-604~606,Skill 10.0.19) |
|
||||
| `TASK-consultation-daily-empty-answer-20260909.md` | `PROGRESS-consultation-daily-empty-answer-20260909.md` | 首页「深入看今日」计算完成却 `empty_answer`:入口定的 `timing` 被模型改成 `general`(`canonicalDomainPlan` 以模型为准),分段写作标题与今日格式错位,分段 `maxSteps=1` 且工具仍可调 → 模型在分段里再调工具、零正文;思考流按 chunk 过滤漏出缺词英文 | 待执行 | `codex/consultation-daily-empty-answer-20260909`(BUG-612~613;609~611 已被 sync2 修复单占用) |
|
||||
| `TASK-consultation-daily-empty-answer-20260909.md` | `PROGRESS-consultation-daily-empty-answer-20260909.md` | 首页「深入看今日」计算完成却 `empty_answer`:入口定的 `timing` 被模型改成 `general`(`canonicalDomainPlan` 以模型为准),分段写作标题与今日格式错位,分段 `maxSteps=1` 且工具仍可调 → 模型在分段里再调工具、零正文;思考流按 chunk 过滤漏出缺词英文 | 待验收 | `codex/consultation-daily-empty-answer-20260909`(BUG-612~613);走查 `docs/testing/consultation-daily-empty-answer-20260909.md` |
|
||||
| `TASK-rectification-compare-card-polish-20260909.md` | `PROGRESS-rectification-compare-card-polish-20260909.md` | 三列卡两列经历对照 0、三列无未来窗:引擎按引擎前三算 by_time,卡片按推断前三查表,键不匹配(BUG-614);交付旁白被 BUG-606 裁成一句(BUG-615);设计减法:相同性格句只写一次、经历对照说人话、删小标题、右栏本命宫位改北印星盘、换升时刻默认折叠 | 待执行 | `codex/rectification-compare-card-polish-20260909`(BUG-614~615) |
|
||||
|
||||
### 聊天主链路与首页
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
# Staging 人肉复核 · 首页「深入看今日」必须写出三节、思考区不得出现英文词渣(2026-09-09)
|
||||
|
||||
给产品负责人。不要把真实出生资料或对话正文写进任何记录。
|
||||
|
||||
对应 BUG-612、BUG-613。测之前先做第 0 条。
|
||||
|
||||
## 0. 确认测的是新版本
|
||||
|
||||
浏览器打开 `https://staging.jyotisha.chat/api/health`,看 `deployment.gitCommit` 前 8 位是否等于本单合入 staging 后的提交。不一致 = 先别测。
|
||||
|
||||
账号需要已校验星盘,且标准咨询计费已配置(否则会先撞到计费 503,不是本单)。
|
||||
|
||||
## 1. 首页点「深入看今日」必须得到三节回答(P0)
|
||||
|
||||
1. 打开首页,点「深入看今日」。
|
||||
2. 等活动区走完计算。
|
||||
3. 看助手正文。
|
||||
|
||||
- ✅ 预期:有可见回答,且出现三个二级标题,顺序为 **今日趋势**、**适合推进 / 需要避开**、**一个行动**。最后一节里有技法审计表,并有「探索性日提示,不是确定预测」。活动区不应再出现「接下来分析你的综合」。
|
||||
- ❌ 失败:只有「计算已完成,但这次没有生成回答」;或标题仍是「统一参数与原始结构 / 综合 / 技法审计表 / 现代生活」。
|
||||
|
||||
## 2. 思考区不得出现英文词渣(P0)
|
||||
|
||||
同一轮回答,打开思考区。
|
||||
|
||||
- ✅ 预期:思考是中文句子,或思考区为空。没有 `The a for`、`Let me`、`run-jyotish-` 这类缺词英文。
|
||||
- ❌ 失败:思考区能读出一段被削过的英文,或残留 `run-jyotish`。
|
||||
|
||||
## 3. 空回答仍不扣点(P1,仅当第 1 条失败时)
|
||||
|
||||
如果这次仍然没有正文:
|
||||
|
||||
- ✅ 预期:提示本次不会扣点;账户余额不变。
|
||||
- ❌ 失败:没回答却扣了点。
|
||||
|
||||
## 4. 普通咨询不被入口钉死(P1)
|
||||
|
||||
在对话里问一句普通的「事业方向怎么样」,不要走首页今日入口。
|
||||
|
||||
- ✅ 预期:仍按事业(或模型列出的多领域)作答,不是被钉成时运三节。
|
||||
- ❌ 失败:普通问题也被写成「今日趋势」。
|
||||
Reference in New Issue
Block a user