diff --git a/AGENTS.md b/AGENTS.md index a4160082..adbad815 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -142,7 +142,7 @@ Deployment safety rules: ## 7. Bug History Workflow Hard Constraint -任何包含“Bug、报错、失败、异常、回归、无法保存、无法删除、状态码错误、线上故障”等现象的任务,开始诊断前必须完整读取并搜索: +任何包含“Bug、报错、失败、异常、回归、无法保存、无法删除、状态码错误、线上故障”等现象的任务,开始诊断前必须用报错原文、接口路径、状态码、模块名和用户操作强制检索,并完整读完命中的记录。该文件体量已不允许通读全文,但检索不是可选步骤,命中记录的防复发措施是否仍然存在必须逐条确认: - `docs/BUG_HISTORY.md` diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 91fe209b..c1d618c4 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -10,7 +10,8 @@ 2. 找到相似记录时,先验证既有防复发措施是否仍存在,再定位新的回归入口。 3. 修复必须包含与风险相称的自动化测试;生产问题还要记录部署版本和脱敏后的生产验证。 4. 完成后更新已有记录,或按下方模板添加新记录。复发问题必须填写 `复发自`,不能伪装成无关的新问题。 -5. 不记录姓名、出生资料、邮箱、用户/案例 ID、Cookie、JWT、密码、密钥、完整请求体或模型原文。 +5. BUG 编号必须唯一。追加新记录前先搜索本文件当前最大编号,并从其后继续分配;出现重复编号时保留较早记录的编号,为后加入的记录分配新编号,并同步修正指向它的 `相关记录` 与 `复发自`。 +6. 不记录姓名、出生资料、邮箱、用户/案例 ID、Cookie、JWT、密码、密钥、完整请求体或模型原文。 ## 状态定义 @@ -347,7 +348,7 @@ - 修复版本:待提交 ## BUG-020 | 生时校正把语言问答包装成高阻力卡片表单 -## BUG-018 | 生时校正把语言问答包装成高阻力卡片表单 +## BUG-221 | 生时校正把语言问答包装成高阻力卡片表单 - 状态:resolved - 首次发现:2026-07-22 @@ -364,7 +365,7 @@ - 修复版本:待提交(本地可测) ## BUG-021 | 自然语言真实事件在分钟评分入口被静默丢弃 -## BUG-019 | 自然语言真实事件在分钟评分入口被静默丢弃 +## BUG-222 | 自然语言真实事件在分钟评分入口被静默丢弃 - 状态:resolved - 首次发现:2026-07-22 @@ -381,11 +382,11 @@ - 修复版本:待提交(本地可测) ## BUG-022 | 生时校正入口等待首轮请求完成后才切换会话 -- 相关记录:BUG-008、BUG-009、BUG-015、BUG-016、BUG-018 -- 复发自:BUG-018 +- 相关记录:BUG-008、BUG-009、BUG-015、BUG-016、BUG-221 +- 复发自:BUG-221 - 修复版本:待提交(本地可测) -## BUG-020 | 生时校正入口等待首轮请求完成后才切换会话 +## BUG-223 | 生时校正入口等待首轮请求完成后才切换会话 - 状态:resolved - 首次发现:2026-07-22 @@ -402,11 +403,11 @@ - 修复版本:待提交(本地可测) ## BUG-023 | 初始化地址保存后的加载提示仍指向生时评估 -- 相关记录:BUG-016、BUG-018、BUG-019 +- 相关记录:BUG-016、BUG-221、BUG-222 - 复发自:无 - 修复版本:待提交(本地可测) -## BUG-021 | 初始化地址保存后的加载提示仍指向生时评估 +## BUG-224 | 初始化地址保存后的加载提示仍指向生时评估 - 状态:resolved - 首次发现:2026-07-22 @@ -423,11 +424,11 @@ - 修复版本:待提交(本地可测) ## BUG-024 | 侧栏会话标题与更多操作被拆成两块 -- 相关记录:BUG-020 +- 相关记录:BUG-223 - 复发自:无 - 修复版本:待提交(本地可测) -## BUG-022 | 侧栏会话标题与更多操作被拆成两块 +## BUG-225 | 侧栏会话标题与更多操作被拆成两块 - 状态:resolved - 首次发现:2026-07-22 @@ -444,7 +445,7 @@ - 修复版本:待提交(本地可测) ## BUG-025 | 健康压力追问被数据库误判为校正操作冲突 -## BUG-023 | 健康压力追问被数据库误判为校正操作冲突 +## BUG-226 | 健康压力追问被数据库误判为校正操作冲突 - 状态:resolved - 首次发现:2026-07-22 @@ -493,11 +494,11 @@ - 修复版本:待提交(production gate) ## BUG-028 | 生时校正收到具体经历后仍重复泛问 -- 相关记录:BUG-007、BUG-018、BUG-019 +- 相关记录:BUG-007、BUG-221、BUG-222 - 复发自:BUG-007 - 修复版本:待提交(测试 Supabase smoke 通过) -## BUG-024 | 生时校正收到具体经历后仍重复泛问 +## BUG-227 | 生时校正收到具体经历后仍重复泛问 - 状态:resolved - 首次发现:2026-07-22 @@ -509,12 +510,12 @@ - 修复:会话组件改用独立的可见叙事函数,优先承接用户最近一条具体但不完整的经历并只追问缺失项;编排器把下一轮仅含日期或仅含内容的补充合并回最近一条待澄清事件,同时用 `correctsEvidenceIds` 保留 append-only 修订链;下一问从技术包允许领域中优先选择尚未回答的领域,并同步覆盖公开 evidence request。 - 验证:相关自然语言抽取、叙事、编排、路由、公开案例回放与端到端测试共 111 条全部通过;回归覆盖“先说离家工作、再补 2023 年 3 月”后合并为 `2023-03 · 离开家去北京开始工作`、具体事件缺日期时回复必须复述该事件并询问年月、关系领域回答后下一问切换到事业领域。目标文件 ESLint 与补丁检查通过。 - 防复发:保持“服务端叙事是用户可见回复真相源”的纯函数测试;每条待澄清证据必须测试跨轮补全与修订链;下一领域必须测试排除有效 recap 已覆盖领域;端到端断言不得只绑定泛化提示词。 -- 相关记录:BUG-018、BUG-019 -- 复发自:BUG-019 +- 相关记录:BUG-221、BUG-222 +- 复发自:BUG-222 - 修复版本:待提交(本地可测) ## BUG-029 | 生时校正仍有未回答区分领域时提前结束 -## BUG-025 | 生时校正仍有未回答区分领域时提前结束 +## BUG-228 | 生时校正仍有未回答区分领域时提前结束 - 状态:resolved - 首次发现:2026-07-22 @@ -526,16 +527,16 @@ - 修复:停滞结束前增加未回答建议领域门禁;仍有可区分领域时继续自然追问,全部建议领域已覆盖后才允许按范围停滞安全结束。证据数量上限和无可区分问题终止保持不变。 - 验证:编排器回归锁定学业、搬迁、事业三轮后必须继续询问尚未覆盖的关系领域,补充关系事件后才保存未确认范围;本地真实流程修复前复现为两轮即结束且范围仍为 `04:30–06:30`。 - 防复发:停滞终止测试必须同时断言候选范围未变化和技术包建议领域已全部回答,不能只按事件条数结束。 -- 相关记录:BUG-019、BUG-028 +- 相关记录:BUG-019、BUG-028(编号存疑:BUG-019 疑为重复编号合并前的旧编号,可能应指 BUG-021) - 复发自:无 - 修复版本:待提交(本地可测) ## BUG-030 | 职位和管理职责变化未识别为事业证据 -- 相关记录:BUG-019、BUG-024 +- 相关记录:BUG-222、BUG-227 - 复发自:无 - 修复版本:待提交(本地可测) -## BUG-026 | 职位和管理职责变化未识别为事业证据 +## BUG-229 | 职位和管理职责变化未识别为事业证据 - 状态:resolved - 首次发现:2026-07-22 @@ -552,11 +553,11 @@ - 修复版本:待提交(本地可测) ## BUG-031 | 生时纠正未收敛仍永久扣费且事件事实未进入评分契约 -- 相关记录:BUG-024、BUG-025 +- 相关记录:BUG-227、BUG-228 - 复发自:无 - 修复版本:待提交(本地可测) -## BUG-027 | 生时纠正未收敛仍永久扣费且事件事实未进入评分契约 +## BUG-230 | 生时纠正未收敛仍永久扣费且事件事实未进入评分契约 - 状态:resolved - 首次发现:2026-07-22 @@ -568,16 +569,16 @@ - 修复:新增向前迁移,在范围完成或主动放弃的同一数据库事务中将已收费状态幂等转换为 `released`、退回点数并更新动作回执;只有通过分钟门禁且用户明确确认的分钟保留收费。评分载荷新增可选 `summary`,Python API 规范化并限制长度,候选输入契约升级为 `rectification-candidate-input-v2`,把具体事件摘要纳入 canonical hash。用户终态文案明确说明未纠正成功、本次不计费、候选代表时间不会替换当前排盘时间。 - 验证:前端生时纠正路由、编排器、存储和旅程引擎聚焦测试 77 条通过;Python 对话数据库契约、事件 API 与候选评分测试 67 条通过。回归明确断言事件摘要变化会改变 canonical input hash,但 `can_apply`、`confirmation_allowed` 和 `can_narrow_to_minute` 仍保持关闭;SQL 契约断言范围结束与放弃均在终态事务内退款,且迁移不写入 `active_birth_time`。 - 防复发:任何新增事件评分字段都必须进入前端载荷、Python 规范化输入和 canonical hash;任何非 `confirmed` 终态都必须有幂等计费回收断言;不得用候选范围中点或代表时间替换用户的当前排盘分钟。真正分钟确认仍依赖独立来源审计、sealed blind replay、准确率/误确认率及 ±1/2/5 分钟稳定性门禁。 -- 相关记录:BUG-019、BUG-028、BUG-029 +- 相关记录:BUG-019、BUG-028、BUG-029(编号存疑:BUG-019 疑为重复编号合并前的旧编号,可能应指 BUG-021) - 复发自:无 - 修复版本:待提交(本地可测) ## BUG-032 | 生时校正覆盖历史回答且完成后无法返回原问题 -- 相关记录:BUG-019、BUG-024、BUG-025 +- 相关记录:BUG-222、BUG-227、BUG-228 - 复发自:无 - 修复版本:待提交(本地可测) -## BUG-028 | 生时校正覆盖历史回答且完成后无法返回原问题 +## BUG-231 | 生时校正覆盖历史回答且完成后无法返回原问题 - 状态:resolved - 首次发现:2026-07-23 @@ -589,16 +590,16 @@ - 修复:controller 为当前 case 维护交错的 `assistant/user` 消息序列,成功提交后原子追加用户原话与新 Agent 回复,聊天区只按该序列渲染;可见层优先采用 Agent 原始 narrative,中间轮 prompt 带入最新事件并要求先具体回应再追问,编排器保留通过校验的 Agent 文本;删除完成态自动 continuation,只在用户点击时领取,并按本地 handoff、持久化 return session、最近普通咨询 session 的顺序寻找真实返回目标。 - 验证:聚焦 controller、Agent narrative、visible narrative、orchestrator 和首页 handoff 测试 89 条通过,覆盖 `assistant → user → assistant` 历史、具体事件进入 prompt、旧模板不覆盖 Agent 回答、仅点击后返回来源 consultation session。组件 SSR 测试在当前 Node 环境仍被仓库既有 GSAP ESM `registerPlugin` 加载错误阻断,尚未进入业务断言。 - 防复发:主聊天区不得从 evidence recap 反推当前会话消息;任何 Agent narrative 后处理不得抹掉已校验的具体回应;完成态 continuation 不得自动领取,也不得以当前 rectification session 作为来源会话兜底。若需要刷新后永久恢复每轮 Agent 原文,必须扩展服务端 turn/RPC 持久化契约,不能用当前 narrative 冒充完整历史。 -- 相关记录:BUG-018、BUG-019、BUG-028 -- 复发自:BUG-018、BUG-028 +- 相关记录:BUG-018、BUG-019、BUG-028(编号存疑:BUG-018、BUG-019 疑为重复编号合并前的旧编号,可能应指 BUG-020、BUG-021) +- 复发自:BUG-018、BUG-028(编号存疑:BUG-018 可能应指 BUG-020) - 修复版本:待提交(本地可测) ## BUG-033 | 生时校正缺少连续事件语义导致模板式跳问 -- 相关记录:BUG-018、BUG-019、BUG-024 -- 复发自:BUG-018、BUG-024 +- 相关记录:BUG-221、BUG-222、BUG-227 +- 复发自:BUG-221、BUG-227 - 修复版本:待提交(本地可测) -## BUG-029 | 生时校正缺少连续事件语义导致模板式跳问 +## BUG-232 | 生时校正缺少连续事件语义导致模板式跳问 - 状态:resolved - 首次发现:2026-07-23 @@ -615,11 +616,11 @@ - 修复版本:待提交(本地可测) ## BUG-034 | 生时校正 Agent 降级只记录 200 导致模板回退不可诊断 -- 相关记录:BUG-024、BUG-025、BUG-028 -- 复发自:BUG-024、BUG-028 +- 相关记录:BUG-227、BUG-228、BUG-231 +- 复发自:BUG-227、BUG-231 - 修复版本:待提交(本地可测) -## BUG-030 | 生时校正 Agent 降级只记录 200 导致模板回退不可诊断 +## BUG-233 | 生时校正 Agent 降级只记录 200 导致模板回退不可诊断 - 状态:resolved - 首次发现:2026-07-23 @@ -636,10 +637,10 @@ - 修复版本:待提交(本地可测) ## BUG-035 | 生时校正发送错误内容后无法撤回修改 -- 相关记录:BUG-028、BUG-029 +- 相关记录:BUG-231、BUG-232 - 修复版本:待提交(本地可测) -## BUG-031 | 生时校正发送错误内容后无法撤回修改 +## BUG-234 | 生时校正发送错误内容后无法撤回修改 - 状态:resolved - 首次发现:2026-07-23 @@ -651,15 +652,15 @@ - 修复:复用普通 session 的安全语义,在真正发起校正命令前提供 2.5 秒撤回窗口;发送后立即显示用户气泡和停止按钮,撤回时取消定时任务、移除临时气泡、把原文恢复到输入框并重新聚焦。只有窗口结束后才调用校正接口,因此成功撤回的本轮不会生成、不会写入证据历史,也不计入校正任务。 - 验证:新增真实 Chromium 回归断言,覆盖发送、停止、草稿恢复和延时后未调用 `answer`;本地登录账号手测中,唯一测试文本撤回后仍保留在输入框,等待超过窗口后未进入“正在核对”、未出现在用户历史消息中。目标文件 ESLint 与 `git diff --check` 通过;独立 Node 组件套件当前仍被既有 GSAP Node 导入错误阻断。 - 防复发:撤回必须发生在业务命令发出前;不得把客户端 `fetch.abort()` 误认为服务端事务已取消。 -- 相关记录:BUG-018、BUG-032 +- 相关记录:BUG-018、BUG-032(编号存疑:BUG-018 疑为重复编号合并前的旧编号,可能应指 BUG-020) - 复发自:无 - 修复版本:待提交(本地可测) ## BUG-036 | Agent 化生时校正上线前被旧模板组件断言阻断 -- 相关记录:BUG-018、BUG-028 +- 相关记录:BUG-221、BUG-231 - 修复版本:待提交(本地可测) -## BUG-032 | 连续事件补充回答丢失状态并重新进入日期模板 +## BUG-235 | 连续事件补充回答丢失状态并重新进入日期模板 - 状态:resolved - 首次发现:2026-07-23 @@ -683,11 +684,11 @@ - 修复:为 evidence request 增加向后兼容的 follow-up 状态机,记录问题类型和目标事件 ID;narrative Agent 被要求在追问已有事实时输出对应状态;进度装饰只维护确定性的下一领域,不再覆盖 Agent 可见问题对应的 follow-up 目标;服务端按状态将日期或细节 append-only 合并到目标事件并保留 `correctsEvidenceIds`,只有 `new_event` 才创建独立事件;细节合并改为单事件解析后覆盖组合摘要,避免标点导致错误拆分。 - 验证:叙事、编排与存储聚焦测试 81/81 通过;真实两轮编排回归覆盖 Agent 先追问已有事件细节并持久化目标,然后“2017-05 参加工作”后回答“正式工作”仍保留 `2017-05`、形成“参加工作;正式工作”并不再出现日期模板;旧 turn 缺少 follow-up 时仍按兼容路径处理。目标文件 ESLint、相关 TypeScript 检查和 `git diff --check` 通过。 - 防复发:每个中间轮必须断言追问类型、目标 evidence ID 和下一轮的事件合并结果;模型回退时默认显式 `new_event`,不得把已有事件细节当成新事实;跨轮测试必须断言用户可见回复不重复已回答的日期问题。 -- 相关记录:BUG-024、BUG-029、BUG-030 -- 复发自:BUG-029 +- 相关记录:BUG-227、BUG-232、BUG-233 +- 复发自:BUG-232 - 修复版本:待提交(本地可测) -## BUG-033 | 首次进入生时校正长期停留在建立记录 +## BUG-236 | 首次进入生时校正长期停留在建立记录 - 状态:resolved - 首次发现:2026-07-23 @@ -710,10 +711,10 @@ - 修复:首轮叙事的两次校验尝试共享 10 秒中止信号,并关闭 Mastra SDK 内部重试;10 秒内生成成功仍使用 Agent 自然回答,超时或两次校验失败则使用现有的安全、可评分 fallback 完成建档。中间轮和最终总结不受该首轮时限影响。 - 验证:新增回归断言,确保首轮两次叙事尝试共享同一个 `AbortSignal`;目标 narrative 测试、ESLint、TypeScript 与生产构建通过后记录最终结果。 - 防复发:首轮建档不得无限等待模型,也不得同时开启 SDK 重试和业务校验重试;耗时预算必须覆盖整个首轮生成,而不是每次尝试单独重新计时。 -- 相关记录:BUG-030 +- 相关记录:BUG-233 - 修复版本:待提交(本地可测) -## BUG-034 | 生时校正入口旧快照重复 start 导致 409 +## BUG-237 | 生时校正入口旧快照重复 start 导致 409 - 状态:resolved - 首次发现:2026-07-23 @@ -737,11 +738,11 @@ - 修复:首次 `start` 收到 409 后刷新账户状态;如果刷新得到可恢复 case,自动使用最新 `caseId` 和 `turnVersion` 执行 `resume`,不重复扣点;如果刷新后仍没有声明匹配的 case,则保留原错误,避免未经用户确认自动放弃旧校正记录。 - 验证:`frontend/tests/consultation-entrypoint.test.ts` 23/23 通过,覆盖 409、刷新账户、使用最新 case 版本恢复;目标文件 ESLint 与 `git diff --check` 通过。完整套件仍有既有 CSS 断言和数据库权限测试失败,与本修复无关。 - 防复发:生时校正入口必须把 `start` 视为可恢复的幂等操作;收到 case 冲突时先刷新 durable 状态,再决定恢复或提示用户;不得直接再次扣费、创建第二个 case,或在声明不一致时静默删除旧 case。 -- 相关记录:BUG-030、BUG-033 +- 相关记录:BUG-233、BUG-236 - 复发自:无 - 修复版本:待提交(本地可测) -## BUG-035 | 服务层重复 start 未在扣费前复用同一声明的未完成 case +## BUG-238 | 服务层重复 start 未在扣费前复用同一声明的未完成 case - 状态:resolved - 首次发现:2026-07-23 @@ -765,11 +766,11 @@ - 修复:在 reserve 前增加账户级未完成 case 查询;同一 `declaredBirthInput` 直接返回已有公开 turn,不重复计算或扣费;声明不一致继续稳定返回冲突。并发竞态在释放本次预留后重新读取账户,复用同声明的胜出 case。 - 验证:`frontend/tests/conversational-rectification-orchestrator.test.ts` 32/32 通过,覆盖同声明重复 start 复用、声明不一致冲突和既有预留重试;后续需补充线上部署后的真实 smoke。 - 防复发:start 幂等性必须同时在入口、编排器和 durable RPC 三层成立;任何新增 actionId 的 start 都必须先检查账户级未完成 case,不能把数据库冲突当成正常流程。 -- 相关记录:BUG-030、BUG-033、BUG-034 -- 复发自:BUG-034 +- 相关记录:BUG-233、BUG-236、BUG-237 +- 复发自:BUG-237 - 修复版本:待提交(本地可测) -## BUG-036 | 旧数据库校验器把首条新事件回答误报为 409 +## BUG-239 | 旧数据库校验器把首条新事件回答误报为 409 - 状态:resolved - 首次发现:2026-07-23 @@ -792,10 +793,10 @@ - 修复:保存任何 turn 时都移除语义冗余的 `followUp: new_event`,兼容旧校验器;`event_date` 与 `event_detail` 仍等待对应数据库迁移后持久化。 - 验证:直接 RPC 探针确认旧格式为 `true`、带 `followUp` 为 `false`;新增 store 回归测试覆盖首轮与后续 turn 的兼容投影。 - 防复发:新增可选持久化字段时,默认语义必须能向旧数据库降级;数据库迁移未应用前不得把兼容字段直接写入 durable RPC。 -- 相关记录:BUG-032、BUG-034、BUG-035 +- 相关记录:BUG-235、BUG-237、BUG-238 - 修复版本:待提交(本地可测) -## BUG-037 | 非评分回答绕过 Agent 并显示固定澄清模板 +## BUG-240 | 非评分回答绕过 Agent 并显示固定澄清模板 - 状态:resolved - 首次发现:2026-07-23 @@ -848,11 +849,11 @@ - 修复:非评分分支先用当前候选技术包、完整事件账本、最新用户原话和未决证据调用现有 narrative Agent;状态机只在后台固定本轮追问属于 `event_date`、`event_detail` 还是 `new_event`,不再替代 Agent 的可见措辞。模型或技术包调用失败时仍保留确定性安全文案,避免正常澄清变成 5xx。 - 验证:编排回归 32/32 通过;相关叙事、编排和存储测试 81/81 通过。新增断言确认无年月事件会得到 Agent 针对该事件生成的单一自然问题,并持久化 `event_date + evidenceId`,不再出现旧固定模板;未来事件、换方向和已有评分事件的行为保持兼容。 - 防复发:任何能继续对话的业务分支都必须优先经过 narrative Agent;状态机可以决定证据目标和可评分性,但不得直接占用正常用户回复。确定性模板只能作为模型或技术计算失败时的技术兜底。 -- 相关记录:BUG-029、BUG-030、BUG-032 -- 复发自:BUG-029 +- 相关记录:BUG-232、BUG-233、BUG-235 +- 复发自:BUG-232 - 修复版本:待提交(本地可测) -## BUG-038 | 全球地点字段未迁移导致账户余额接口整体 500 +## BUG-241 | 全球地点字段未迁移导致账户余额接口整体 500 - 状态:resolved - 首次发现:2026-07-24 @@ -863,10 +864,10 @@ - 修复:GET 检测缺列或 schema cache 错误后,回退到迁移前的 profile 字段集合;全球地点字段在响应中返回空值,余额、出生时间状态和未完成校正 case 继续正常读取。迁移应用后自动使用完整查询。 - 验证:服务角色直接查询确认修复前错误为 `42703`;`frontend/tests/account-api.test.ts` 增加旧表回退回归,另运行 TypeScript、目标 ESLint 与本地登录接口 smoke。 - 防复发:向账户初始化查询增加非关键资料字段时,应用发布必须兼容迁移前后的数据库形状;不能让可选地点元数据阻断余额与核心账户状态。 -- 相关记录:BUG-034、BUG-035 +- 相关记录:BUG-237、BUG-238 - 修复版本:待提交(本地可测) -## BUG-039 | 全球地点迁移漏掉服务角色列权限导致账户保存 500 +## BUG-242 | 全球地点迁移漏掉服务角色列权限导致账户保存 500 - 状态:resolved - 首次发现:2026-07-24 @@ -877,10 +878,10 @@ - 修复:在全球地点迁移中为服务角色补齐六个新字段的最小列级读取、插入和更新权限,不恢复表级宽权限。 - 验证:迁移权限静态回归、生产事务 dry-run、正式授权、字段权限查询和真实登录 PATCH smoke。 - 防复发:扩展服务端账户 upsert 字段时,必须同时审计 authenticated 自助保存和 service_role 并发读取/upsert 两条权限链。 -- 相关记录:BUG-034、BUG-038 +- 相关记录:BUG-237、BUG-241 - 修复版本:待提交(本地可测) -## BUG-040 | 选择全球地点后重复搜索且候选列表被卡片裁切 +## BUG-243 | 选择全球地点后重复搜索且候选列表被卡片裁切 - 状态:resolved - 首次发现:2026-07-24 @@ -891,10 +892,10 @@ - 修复:地点完整性改为接受“合法坐标 + IANA timezoneId”,数字 offset 可暂时为空;选中地点时使在途搜索序列失效并清空候选;出生时间过渡卡片允许候选列表溢出显示。 - 验证:地点选择、出生资料完整性和全球地点目标测试覆盖 nullable offset、缺失 timezoneId、选择竞态保护与候选列表可见性。 - 防复发:前端地点完整性必须与位置 API 的 nullable offset 合同一致;选择类异步组件必须在 commit selection 时废弃旧请求,浮层祖先不得无意裁切。 -- 相关记录:BUG-038、BUG-039 +- 相关记录:BUG-241、BUG-242 - 修复版本:待提交(本地可测) -## BUG-041 | 全球地点资料已保存但初始化接口仍判定未完成 +## BUG-244 | 全球地点资料已保存但初始化接口仍判定未完成 - 状态:resolved - 首次发现:2026-07-24 @@ -905,10 +906,10 @@ - 修复:服务端资料投影补齐全球地点字段;完整性判断接受“有效全球地点”或“旧中国行政区地点”,并复用出生资料共享校验。 - 验证:新增旧金山 `period_only + timezoneOffset null + America/Los_Angeles` 回归用例,确认可生成首页初始问题。 - 防复发:读取全球地点的服务端流程不得继续以中国行政区代码作为唯一地点完成条件。 -- 相关记录:BUG-038、BUG-040 +- 相关记录:BUG-241、BUG-243 - 修复版本:待提交(本地可测) -## BUG-042 | 全球地点缺少数字时区偏移导致生时校正入口 409 +## BUG-245 | 全球地点缺少数字时区偏移导致生时校正入口 409 - 状态:resolved - 首次发现:2026-07-24 @@ -919,10 +920,10 @@ - 修复:生时校正读取资料后复用现有本地时区服务,按出生日期和已申报时间或时间段参考时刻解析历史 offset;进入持久化合同前把经纬度规范为六位小数;旧 case 导入走同一路径。 - 验证:旧金山 `1955-02-24 + evening + America/Los_Angeles` 回归确认请求历史时区服务、得到 `-8`、规范化 Geoapify 坐标后进入校正。 - 防复发:资料保存可以暂缺 offset,但任何进入分钟计算的路径必须先通过 IANA 历史时区解析;外部地理编码坐标必须在进入耐久 JSON 合同前规范化,不能把 offset null 或坐标精度问题误报为资料缺失。 -- 相关记录:BUG-040、BUG-041 +- 相关记录:BUG-243、BUG-244 - 修复版本:待提交(本地可测) -## BUG-043 | 全球出生地点在兄弟接口中被误判、冲突或静默退化 +## BUG-246 | 全球出生地点在兄弟接口中被误判、冲突或静默退化 - 状态:resolved - 首次发现:2026-07-24 @@ -933,7 +934,7 @@ - 修复:抽取共享历史时区解析器,兼容数据库 snake_case 与浏览器 camelCase 资料,并按实际申报/确认时间调用本地 IANA 历史时区服务;账户恢复使用已存 case 的不可变 offset 作为仅用于匹配的 fallback,并把坐标统一到六位耐久精度;咨询在扣点前使用最终 active time 补算 offset;journey 入口和 case loader 在严格解析前补算;今日星语、合盘和遗留评估优先使用真实全球经纬度与时区,中国行政区仅作兼容 fallback。 - 验证:账户 nullable offset + 七位坐标可恢复旧金山已有 case,时区 ID 或地点 ID 不一致仍拒绝恢复;verified consultation 使用最终 active time 解析 `-8` 且解析失败不调用扣点;journey、今日星语、合盘和遗留评估的全球地点回归通过。两组聚焦套件共 84/84 通过,目标文件 ESLint、TypeScript `--noEmit` 与 `git diff --check` 通过。 - 防复发:出生地点完成性与计算就绪性必须分层;资料层可保存 IANA timezoneId 且 offset 暂空,但所有星盘计算入口必须统一补算历史 offset。不得在新接口复制中国专用地点解析,也不得用未经规范化的外部坐标直接比较持久化声明。 -- 相关记录:BUG-040、BUG-041、BUG-042 +- 相关记录:BUG-243、BUG-244、BUG-245 - 修复版本:待提交(本地可测) ## BUG-044 | 数据库出生地点声明校验落后导致创建校正记录误报 409 @@ -947,7 +948,7 @@ - 修复:新增向前迁移同步数据库地点声明白名单,接受全球地点身份、IANA 时区来源及坐标字段;地点身份允许 `city`、`cityCode` 或 `placeId` 任一存在,同时保留旧中国地点兼容和数值边界校验。 - 验证:数据库迁移单独执行成功;使用新的 actionId 对本地接口真实 smoke 返回 `200 active`,创建可恢复 case,首轮 narrative 非空;相同 actionId 重放仍返回同一 case,账户积分只从 100 扣至 99;无待交接内容时 handoff 按合同返回 `204`。相关持久化与全球地点测试 28/28 通过。 - 防复发:任何扩展 `declaredBirthInput.birthplace` 的应用字段都必须同步更新数据库 JSON 校验函数并增加迁移文本回归断言;不得把声明校验失败笼统诊断为旧 case 冲突。 -- 相关记录:BUG-034、BUG-035、BUG-042、BUG-043 +- 相关记录:BUG-237、BUG-238、BUG-245、BUG-246 - 修复版本:待提交(本地可测) ## BUG-045 | 数据库追问合同落后导致第一条回答误报 409 @@ -961,7 +962,7 @@ - 修复:在 Supabase 项目 `vtvnfqmonbfuxmqkqdlc` 单独执行已有向前迁移,使数据库 evidence request 校验与当前 TypeScript 持久化合同一致;未执行其他迁移,也未重新部署应用。 - 验证:对原 case 使用新 actionId 重试第一条回答返回 HTTP 200,`turnVersion` 从 0 递增到 1,narrative 和目标 `event_detail` follow-up 正常返回;用同一 actionId 重放返回相同 turn,账户积分保持 99。服务端日志两次均为 `actionKind=answer`、`resultCategory=success`、`billingState=unchanged`;持久化与迁移聚焦测试 27/27 通过。 - 防复发:应用扩展 durable JSON 合同时,数据库迁移必须进入环境迁移账本并在发布验收中执行第一条真实写入 smoke;不能只用迁移文件存在或静态测试通过代替远端数据库合同验证。 -- 相关记录:BUG-034、BUG-035、BUG-044 +- 相关记录:BUG-237、BUG-238、BUG-044 - 修复版本:数据库向前迁移已应用;应用代码待提交(本地可测) ## BUG-046 | 生时校正刷新丢失首条引导并堆叠历史用户气泡 @@ -975,7 +976,7 @@ - 修复:新会话从首条 Agent narrative 开始持久化完整消息序列,每次回答后保存真实的 `Agent → 用户 → Agent` transcript;resume 接口按 turn version 读取 narrative,并用 evidence 的 source turn 关联用户原文,返回耐久的交替历史;页面优先用数据库历史修复旧 session。无法可靠恢复用户原文的残缺旧 turn 不再伪造模板回复,相邻 Agent 状态只保留最新一条;最末级 legacy fallback 也只恢复最近一组可靠消息,不再展开全部累计 evidence。 - 验证:client、controller、route 聚焦测试 52/52 通过;component 非 Chromium 测试 8/8 通过;TypeScript `--noEmit`、目标文件 ESLint 与 `git diff --check` 通过。按用户要求未运行 Chrome/Playwright。 - 防复发:聊天历史必须以逐轮 durable transcript 或可验证的 turn/evidence 关联为真源;累计业务证据只能用于评分与摘要,不能被前端推断成消息列表,也不能为缺失历史生成看似真实的 Agent 文案。 -- 相关记录:BUG-024、BUG-029、BUG-032、BUG-045 +- 相关记录:BUG-024、BUG-029、BUG-032、BUG-045(编号存疑:BUG-024、BUG-029、BUG-032 无法判定指向原记录还是 BUG-227、BUG-232、BUG-235) - 修复版本:待提交(本地可测) ## BUG-047 | 相对日期缺少上下文解析并触发模板式重复追问 @@ -989,7 +990,7 @@ - 修复:对 `event_date` 和 `event_detail` 追问使用目标事件或最近明确事件作为年份锚点,将“来年、次年、第二年、翌年”和“同年、当年、那年”的月份上下文化后再提取,同时保留用户原始文本;允许带自然描述的日期补充完成原事件,但仅在纯日期、同领域或低信息细节时合并,避免把“搬家”等明确新事件吞入上一条澄清;普通澄清优先显示 narrative Agent 的自然回答,确定性模板仅保留为模型失败兜底。 - 验证:事件提取与编排聚焦测试 59/59 通过,覆盖“2022年12月正式退学 → 来年1月彻底离校”解析为 `2023-01`、带描述日期补充、相对日期无上下文时不臆造年份,以及不同领域新事件不误合并。目标 TypeScript、ESLint 与补丁检查通过;按用户要求未运行 Chrome/Playwright。 - 防复发:事件状态机只负责持久化目标、证据质量与评分边界,不得替代 Agent 的可见对话;相对日期必须在明确的当前事件上下文内解析,缺少可靠锚点时保持待澄清;澄清合并必须同时判断日期、摘要和领域连续性。 -- 相关记录:BUG-029、BUG-032、BUG-037 +- 相关记录:BUG-232、BUG-235、BUG-240 - 修复版本:待提交(本地可测) ## BUG-048 | 生时校正消息更新后没有自动滚动到最新内容 @@ -1018,7 +1019,7 @@ - 重跑边界:新增独立、幂等的 `regenerate` 命令,使用上一轮已经持久化的用户原文和事件台账重新生成当前 Agent narrative;不重新提取事件、不追加用户消息、不重复评分、不改变候选范围、不扣点,并在当前消息列表和刷新后的耐久历史中替换原 Agent 回答。 - 验证:TypeScript `--noEmit` 通过;叙事、Controller、client、route、orchestrator 聚焦测试 119/119 通过,覆盖悬空提问补全、无 payload 重跑、消息原位替换、证据与候选保持不变;组件静态/SSR 检查 9 项通过;目标 ESLint 与 `git diff --check` 通过。测试过滤器未按预期排除文件内的真实 Chromium 用例,该用例误启动后以 `SIGTRAP` 退出,未作为本次 UI 验收依据,且不再重试。 - 防复发:结构化回答校验必须区分“出现疑问相关词”与“存在完整可回答的问题”;任何重新生成操作都必须与 evidence mutation、评分和计费分离,并通过相同 action receipt 保持幂等。 -- 相关记录:BUG-029、BUG-046、BUG-047、BUG-048 +- 相关记录:BUG-232、BUG-046、BUG-047、BUG-048 - 修复版本:待提交(本地可测) ## BUG-050 | 生时校正重跑期间重复显示旧回答和新思考气泡 @@ -1047,7 +1048,7 @@ - 修复:当上一轮可见问题明确包含原因、表现或“哪些方面”等细节追问语义时,即使 metadata 错标为 `new_event`,也把回答合并回最近一条带日期的有效事件;同时移除“这件事很有用,但还差时间定位”的固定话术,保留不假定上下文的简短兜底。 - 验证:orchestrator 回归覆盖“1972年12月退学 → 追问压力原因但 metadata 错标 → 经济负担导致无法继续”,断言沿用原日期、合并为同一有效事件且不再出现固定索时模板;目标 ESLint、TypeScript 与补丁检查。 - 防复发:事件追问的可见语义必须能够兜底结构化 metadata 的偶发错标;已有日期事件的原因、性质和具体表现回答不得强制再次提供日期。 -- 相关记录:BUG-029、BUG-047 +- 相关记录:BUG-232、BUG-047 - 复发自:BUG-047 - 修复版本:待提交(本地可测) @@ -1124,7 +1125,7 @@ - 修复:单条事件落入 `other` 时,优先调用 narrative Agent 结合最近事件上下文返回允许的语义领域;模型不可用、超时或仍返回 `other` 时才保留确定性结果。首轮和中间轮叙事连续失败统一返回可重试服务错误且不保存本轮,只有最终确认阶段保留包含安全边界与三类表的确定性 fallback。 - 验证:新增“2020年4月去石油化工研究院实习做研究员”语义分类回归,确认保存为 `career` 并可评分;新增中间轮不合格输出回归,确认返回 `service_unavailable`、不保存事件、不推进版本且不产生模板消息。事件提取、叙事、编排和路由定向测试 134/134 通过。 - 防复发:正则只负责低成本初筛和模型不可用时的降级,不得覆盖 Agent 对自然语言事件的语义判断;非最终轮生成失败不得用业务模板伪装成成功回答;候选时间、分盘事实、未来事件和重复计分仍由程序校验。 -- 相关记录:BUG-029、BUG-032、BUG-047、BUG-053 +- 相关记录:BUG-232、BUG-235、BUG-047、BUG-053 - 复发自:BUG-053 - 修复版本:待提交(本地可测) @@ -1228,7 +1229,7 @@ - 修复:仅在明确指向既有事件的 `event_date` 追问中,从目标事件继承年份或年月;允许兼容的年到月、月到日精度提升,并继续以 `correctsEvidenceIds` 保存修订链。普通新事件不猜测缺失年份。 - 验证:新增 `2026-07 · 决定开公司 → 7 月 10 号` 回归,断言生成 `2026-07-10` 修订、保留原事件、沿用原摘要且不再次询问日期归属。 - 防复发:无年份月日只能在定向日期追问且存在可靠目标日期时补全;日期精度提升必须与目标已有年份或月份前缀一致。 -- 相关记录:BUG-024、BUG-047、BUG-062 +- 相关记录:BUG-227、BUG-047、BUG-062 - 修复版本:待提交(本地可测) ## BUG-064 | 窄候选被本地稳定性前置门控阻断导致长对话无法进入 VedAstro 验证 @@ -1305,7 +1306,7 @@ - 修复:复用现有 turn 与 event evidence 存储,每轮向 Agent 注入同一 case 最近 40 条连续问答;同时在共享 follow-up 合同和数据库 JSON 校验中持久化 `prompt`、`answerMode` 与 `proposedDate`。Orchestrator 在事件提取前确定性处理 yes/no:肯定时把候选日期作为 append-only correction 合并到目标 evidence,否定时不生成事件并把同一目标切换为开放式日期追问。模型成功返回时,其 follow-up 不再被提取器的自动澄清覆盖;Narrative Agent 拒绝缺少结构化候选、重复已解决问题或继续指向已完成 evidence 的输出。 - 验证:回归覆盖“2020年10月吗?→是的”、单独“不是”、“不是,是2021年10月”、刷新/resume 后候选日期仍存在,以及同一 actionId 重放不重复写入;断言确认词不成为独立事件、修正 lineage 正确、否定后切换为 `free_text`,并断言叙事 prompt 末尾连续包含上一条 Assistant 问题和当前 User 回答。 - 防复发:任何承接式回答必须以持久化会话历史为第一语境;确认或否认是否改变业务事实必须由持久化 follow-up 状态和确定性状态机执行,不得再从自然语言文案反推候选日期。 -- 相关记录:BUG-032、BUG-063、BUG-067 +- 相关记录:BUG-235、BUG-063、BUG-067 - 复发自:无 - 修复版本:待提交(本地可测) @@ -2779,7 +2780,7 @@ 5. 新增 Case Service + 五个 API:`POST /api/rectification/cases/open`(homepage resume-or-create / session 精确恢复 / new 安全冲突)、`GET entry-summary`(首页 CTA 真值)、`GET cases/[caseId]`(脱敏投影,绝不返回 baseline_birth_snapshot)、`POST close`、`POST upgrade-skill`;profile 不完整不建案;错误不泄露身份、出生资料或 DB 原文。 - 验证:新增 `rectification-v9-contracts.test.ts`(12)、`rectification-v9-case-service.test.ts`(14)、`rectification-v9-migration.test.ts`(17 静态合同)本地共 43 项全部通过;`rectification-v9-database.test.ts`(真实 PostgreSQL 迁移 apply/re-apply、open 原子+幂等+resume、profile 门禁、所有权、terminal 只读、evidence 生命周期、backfill 状态分布/单 active/结果映射/幂等)在本机因无 Docker 按环境 skip(5 项),待远端完整 runner 执行;既有生时校正相关测试 60/60 通过;`tsc --noEmit` 对本 lane 文件零错误(全量 6 个既有错误全部位于未触碰文件);目标 ESLint 0 error 0 warning;`git diff --check` 通过;`database-local-business.test.ts` 精确 public 表清单同步新增 5 张 v9 表并断言新迁移 applied(BUG-127/144 防复发)。 - 防复发:Case 状态、resumable/terminal、shouldStartOpening 必须只由服务端决定;侧边栏必须以精确 sessionId 恢复并校验所有权;open/create 必须走 requestId 幂等账本 + 同用户 advisory 串行化;新增 self-hosted 业务表必须同时更新全迁移 applied ledger 与精确 public 表集合,且只进 `frontend/supabase/migrations`;新页面/新 API 必须同步能力审计;浏览器任何入参都不允许携带 userId、出生资料、range 或权限决定。 -- 相关记录:BUG-004、BUG-027、BUG-033、BUG-067、BUG-068、BUG-069、BUG-072、BUG-074、BUG-085、BUG-086、BUG-095、BUG-112、BUG-113、BUG-114、BUG-115、BUG-116、BUG-117、BUG-118、BUG-119、BUG-120、BUG-121、BUG-127、BUG-143、BUG-144 +- 相关记录:BUG-004、BUG-027、BUG-033、BUG-067、BUG-068、BUG-069、BUG-072、BUG-074、BUG-085、BUG-086、BUG-095、BUG-112、BUG-113、BUG-114、BUG-115、BUG-116、BUG-117、BUG-118、BUG-119、BUG-120、BUG-121、BUG-127、BUG-143、BUG-144(编号存疑:BUG-033 无法判定指向原记录还是 BUG-236) - 复发自:无(新 Agentic Domain 主链;旧防线缺失的直接原因见下) - 修复版本:本地 staging 候选(未 push / deploy) @@ -3511,7 +3512,7 @@ - 相关记录:BUG-177、BUG-198、BUG-206 - 修复版本:本次 staging 发布候选(精确 SHA 以远端 staging 与健康检查验收为准) -## BUG-209 | 用户选择准确出生时间后仍停留 reported,个人报告固定返回 birth_time_not_usable +## BUG-247 | 用户选择准确出生时间后仍停留 reported,个人报告固定返回 birth_time_not_usable - 状态:resolved(本地候选,待 staging 迁移、精确 SHA 发布与登录态报告验收) - 首次发现:2026-08-16 @@ -3687,4 +3688,90 @@ - 验证:`npx next build` 退出码 0;构建产物显示用户端 CSS chunk 184,968 字节且不含任何后台规则,后台规则独立成 5,358 字节 chunk 且仅被 `.next/server/app/admin/` 下 18 个 client-reference-manifest 引用。以 `react-dom/server` 配 `ServerInsertedHTMLContext` 实测 registry 服务端输出 90,132 字节含主题色 `#85432f` 的 `