fix(rectification): remove static interview fallbacks
Independent Staging Quality Gate / validate (push) Successful in 10m50s
Independent Staging Quality Gate / publish (push) Successful in 13m29s

This commit is contained in:
Jesse_Chen
2026-08-27 16:40:47 +08:00
parent 5f855c610c
commit f3327235ea
43 changed files with 1798 additions and 509 deletions
+8 -8
View File
@@ -6144,13 +6144,13 @@
- 状态:resolved(本地修复,未提交)
- 首次发现:2026-08-27
- 最近更新:2026-08-27
- 影响面:生时纠正停止意图、方法追问、候选区分探针、结构化选择评分、候选结果投影、Profile freshness、候选采用 RPC、采用后反向核验续跑、A/B/C/D 选项文案
- 用户现象:用户在当前领域回答「没有了」后,系统误结束整个 Case 并提前展示候选;已有感情起止证据仍重复询问是否谈过恋爱;既有教育证据误抑制尚未问过的 D24 高信息量区分机会;一次结构化选择几乎淘汰全部候选;候选卡排名、`representative_time``credible_range` 与 inference 后验互相矛盾;首次采用候选返回 `candidate_profile_changed`;采用后虽已有 `verify_adopted_time` 计划但前端没有发起下一轮,反向前事核验不会出现;选择题标签未按服务端 `answer_class` 动态生成
- 触发条件:局部否定被当作全局停止;方法覆盖只按领域而不看已确认事件语义;候选对比把 Evidence 内容推断成已问 probe;单轮冲突使用硬淘汰;持久化候选与 inference 各自投影;Profile freshness 把展示地点和历史 `active_birth_time` 当作本轮计算输入,却漏掉声明时间窗;候选采用只刷新快照,没有复用结构化选择的 `read_only` 续跑;动态选项按数组位置而非答案类别映射
- 根因:停止语义、语义去重、asked-probe 账本、评分更新、公开候选投影Profile freshness 分别维护了不兼容规则。尤其 Evidence 只能证明事件存在,不能证明某个候选分组问题已经问过;展示地点和历史 `active_birth_time` 也不是本轮计算输入变化。
- 修复:仅明确的「结束校正 / 不想继续 / 直接给结果 / 就到这里」触发全局停止,并排除「不是 / 不要 / 还没」等否定语境;普通「没有 / 没有了 / 想不起来了」只关闭当前领域。已确认感情证据抑制泛化 D9 复问,但不抑制真实候选区分 probestructured/varga probe 只按 inference receipt 的已答 key 去重,普通事件 probe 按 live evidence 的 `domain.year` 去重,保留未问过的 D24/varga 高信息量分组。结构化答案改为累计软评分,累计 3 次唯一 strong conflict 才淘汰,并保证至少一个候选存活。UI、API、Mastra 和报告统一从 active inference 候选投影排名、代表时间和可信区间;候选映射、cluster range、代表时间或 receipt range 任一不一致时隐藏候选并禁止采用。新增向前迁移和统一 fingerprint忽略展示地点与历史 `active_birth_time`出生日期、原始时间、时间来源/时段、声明时间窗、不确定范围、经纬度和时区等真实计算输入变化立即 rebaseline、失效结果并在采用事务内 fail closed。采用期间复用现有 `pending/busy` 锁定输入,刷新快照后再由既有 continuation effect 发起 `read_only`避免采用与普通消息并发,并让 `candidate_accepted` 状态进入 `verify_adopted_time` 反向前事核验;不新增平行状态机。采用 RPC 在存在 append-only inference transition 时以最新 transition 为权威,仅在没有 transition 时回退 immutable result receiptrevision、candidate set 和候选 load-bearing JSON 字段缺失或矛盾时 fail closed。SQL read projection 同样只在没有 transition 时回退 immutable receiptlatest transition 存在但 revision、candidate set 或 nested inference 矛盾时删除 `inference_state``decision_state_fingerprint`,使 GET 隐藏候选并与 POST 采用同步 fail closed。选项标签按 `answer_class` 映射,写死文案只保留为 fail-closed fallback
- 验证:相关 TypeScript 串行全量套件 2109/2109 通过;最终 SQL read/write coherence 修复后的受影响数据库与迁移套件 24/24 通过。新增回归覆盖感情泛化复问、D24 structured probe 不被普通教育 Evidence 屏蔽、累计冲突软淘汰、候选投影不变量、latest inference transition 权威采用、候选 JSON 缺少 status/probability/posterior_score 时 fail closed、矛盾 latest transition 时 GET 隐藏候选且采用 RPC 拒绝、采用/普通消息互斥、展示字段 fingerprint 稳定和声明时间窗 freshness。`tsc --noEmit` 通过;定向 ESLint 0 error2 条既有 warning);`git diff --check``scripts/pre_work_check.py` 通过
- 防复发:Evidence 语义覆盖不得替代 structured probe receipt;单个启发式选择不得一票淘汰候选;公开候选卡、代表时间、可信区间与采用入口必须共享 active inference 投影;投影不变量失败必须 fail closedSQL read projection 与 accept write authority 对 latest transition 必须采用同一权威顺序和一致性条件,禁止 GET 回退旧 receipt 而 POST 拒绝;展示字段和采用输出不得进入计算 fingerprint,声明时间窗必须进入;采用期间必须锁定消息发送,采用后必须续跑现有反向前事核验;采用 RPC 必须优先读取最新 append-only transition,并对候选 schema 做 null-safe fail-closed 校验;局部否定不得结束整个 Case,否定语境不得误触停止词
- 影响面:生时纠正停止意图、方法追问、候选区分探针、结构化选择评分、候选结果投影、Profile freshness、候选采用 RPC、采用后反向核验续跑、动态选项、唯一分钟确认门、VedAstro 缓存验证
- 用户现象:用户在当前领域回答「没有了」后可能误结束整个 Case 并提前展示候选;已有感情起止证据仍重复询问是否谈过恋爱;既有教育证据误抑制尚未问过的 D24 高信息量区分机会;一次结构化选择几乎淘汰全部候选;候选卡排名、`representative_time``credible_range` 与 inference 后验互相矛盾;首次采用候选返回 `candidate_profile_changed`;采用后虽已有 `verify_adopted_time` 计划但前端没有发起下一轮;选择题依赖静态模板兜底;确认链路又被入口硬编码的 `false` 永久关闭,并显示机械式代表时间收口提示
- 触发条件:局部否定被当作全局停止;方法覆盖只按领域而不看已确认事件语义;候选对比把 Evidence 内容推断成已问 probe;单轮冲突使用硬淘汰;持久化候选与 inference 各自投影;Profile freshness 把展示地点和历史 `active_birth_time` 当作本轮计算输入,却漏掉声明时间窗;候选采用只刷新快照,没有复用结构化选择的 `read_only` 续跑;动态选项缺失时回退固定职业、感情、学业或考试文案;Agentic 决策入口和 VedAstro 投影无条件写死不允许精确分钟确认
- 根因:停止语义、语义去重、asked-probe 账本、评分更新、公开候选投影Profile freshness、外部验证和确认门分别维护了不兼容规则。尤其 Evidence 只能证明事件存在,不能证明某个候选分组问题已经问过;展示地点和历史 `active_birth_time` 也不是本轮计算输入变化;临时外部验证失败不应永久污染同一候选结果
- 修复:停止整个校正不再靠词表正则猜测,新增 Agent 语义工具 `rectification-stop-and-review`,由服务端持久化 `paused`;「没有 / 不记得 / 这方面没有」由 Agent 针对当前 active focus 调用 `rectification-resolve-focus`,不会直接终止 Case,后续普通消息可恢复暂停 Case。选择题只在引擎返回完整、合法且恰好覆盖 `yes / weak_yes / no / unsure` 的动态 `style_options` 时显示;缺项、重复、空文案或非法事件家族直接不出卡,不再回退任何职业、考试、感情或学业静态模板。已确认感情证据抑制泛化 D9 复问,但不抑制真实候选区分 probestructured/varga probe 只按 inference receipt 的已答 key 去重,普通事件 probe 按 live evidence 的 `domain.year` 去重。结构化答案改为累计软评分,累计 3 次唯一 strong conflict 才淘汰,并保证至少一个候选存活。UI、API、Mastra 和报告统一从 active inference 候选投影排名、代表时间和可信区间;候选映射、cluster range、代表时间或 receipt range 任一不一致时隐藏候选并禁止采用。统一 fingerprint 忽略展示地点与历史 `active_birth_time`纳入出生日期、原始时间、时间来源/时段、声明时间窗、不确定范围、经纬度和时区等真实计算输入。采用期间复用现有 `pending/busy` 锁定输入,采用后由既有 continuation effect 发起 `read_only`进入 `verify_adopted_time` 反向前事核验。删除 Agentic 入口的 `confirmationAllowed: false` 和 VedAstro 投影的 `canConfirmExactMinute: false`,统一走 `buildConfirmationGate()`;真实证据门仍 fail closed,不把代表分钟伪装成唯一分钟。VedAstro 失败只持久化安全失败码;相同 evidence/range 缓存再次比较时可重试验证,并通过独立 service-role RPC 仅刷新当前 Result 的验证 receipt,不重算或改写候选、排名、inference 和 selection。删除「本轮校正已收口」「本会话以代表性时间收口」及采用后的机械式代表时间提示;只有真实唯一分钟确认后才显示确认时间。发布 immutable Skill `10.0.13``10.0.12` 保留为 deprecated
- 验证:新增/更新回归覆盖 Agent 语义暂停与恢复、局部否定 focus 关闭、动态选项 fail closed、感情泛化复问、D24 structured probe 不被普通教育 Evidence 屏蔽、累计冲突软淘汰、候选投影不变量、latest inference transition 权威采用、候选 schema 缺失时 fail closed、采用/普通消息互斥、Profile freshness、确认门真实输入、VedAstro 安全失败码及缓存重试、验证刷新 RPC 的归属/指纹/Profile freshness/最小更新权限;最终本地类型检查与聚焦套件结果见本次变更验收记录
- 防复发:停止整个流程必须由显式语义工具落库,不得增加停止词正则;动态选项不完整时宁可不出卡,不得恢复任何静态题干或 A/B/C/D 文案;Evidence 语义覆盖不得替代 structured probe receipt;单个启发式选择不得一票淘汰候选;公开候选卡、代表时间、可信区间与采用入口必须共享 active inference 投影;外部验证临时故障必须可重试且不得改写候选状态;入口不得硬编码绕过真实确认门,也不得删除 holdout、相邻分钟、外部验证和用户同意等证据门;代表性采用和唯一分钟确认必须使用不同状态与文案
- 相关记录:BUG-366、BUG-367、BUG-398、BUG-401、BUG-402
- 复发自:BUG-366(覆盖完成被当成收敛)、BUG-367(结构化选择旁路)、BUG-398probe freshness)、BUG-401(伪 probe 与过早出卡)、BUG-402(点选后续跑)
- 修复版本:未提交
- 修复版本:10.0.13未提交