Repository navigation
fix(chat): recover watches after identity-read refusal - #7650
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机
已启用原生状态巡检的管家用户。 身份在准备上下文时读取失败,旧版保留失败和到期时间,却在身份恢复后继续拒绝接续;新版只在完整无副作用证据成立时,让原宿主自动完成一次同窗观察。
File 与 SQLite 的真实 Chat worker、重启和监控提交链路已验证一次接续及下一独立周期,旧失败不改,观察不调用模型、不发送业务消息。 本 PR 不更改登录、账号额度切换、日报生成、业务重放或默认启用策略。 安装采用与原服务自然恢复仍待本次合入后的验收;完整自然语言周期任务和日报质量由现有工作继续。 这解决的是一次读取失败后原巡检长期停在旧截止时间的实际问题。仅重新验证身份不会改变原恢复准入;修改截止时间或重开旧失败会丢失原义务,因此不能作为修复。
规范依据是 docs/product/periodic-reports.md,spec_revision bcb1a8710844bda6b84c2a00cf5d86ba78e126d9。按变更前合同核查 original-observation-identity、independent-no-effect-proof、current-authority-and-one-attempt:保原失败及同一 native 身份/截止时间,独立证明无效果,并重新检查当前权限与用户工作。文档新增身份拒绝说明属于本次有证据的合同扩展,不能反过来充当独立验证。
改动思路
复用现有的原生恢复准入及完整事件读回,宿主只提供阶段事实,typed owner 决定资格,监控提交仍由原 owner 幂等完成。 当前 PR 仅交付已经接受的无模型巡检在身份读取拒绝后的有界自动接续,原会话、截止时间、当前授权和旧失败保持可追溯。
最强反对理由是:依赖历史错误文字的兼容分支可能变成通用重试。这里保留的是已存在的原生观察恢复 owner,并同时要求完整事件、唯一采集阶段、未发布上下文、无上游模型/结果/原生 poll、原 worker 已排除及 lease 可用。字符串单独匹配不能放行。无需新增恢复 worker、配置项或影子时钟;其他运行错误继续保持失败。
| 条件 | 精确 head 的行为 |
|---|---|
| 原身份拒绝、唯一采集阶段、完整无效果证据,当前来源恢复 | 原 idle pump 接续一次,同一 native 身份与截止时间 |
| 阶段缺失/重复、已有上下文、原生效果未知或来源仍不可用 | 保留原失败和截止时间,不创建新 carrier |
| 一次接续又失败 | 保留失败,不递归接续 |
表格是源码导出的说明,不是运行证据;运行结论来自下面的真实宿主与两种存储用例。
具体改动
宿主的 monitor_restart_basis 从原完整事件日志派生 phase payload,仅传事实;admitMonitorRestartRecovery 将其与精确旧错误、未发布上下文及原有安全门组合判定。原 submit 的单次关联身份与 monitor-poll 的幂等提交未另造实现,也未改变原 actor、来源或业务执行通道。
相同最终用例在不可变基线 bcb1a8710844bda6b84c2a00cf5d86ba78e126d9 上复现两个身份恢复失败,两个授权变化控制通过;disabled 与 unknown local-watch 两控制也通过。当前 head 536673503648aabe7639d9e1d2de713750e8f39b 的 199 项 Python 回归与 10 项 TS 测试通过,覆盖 File/SQLite、真实 Chat worker/原 idle wake、重启、原失败字节保持、一次原生提交及下一独立周期。不是由 mock 直接提供“已恢复”结果;provider 仅在真实 commission-evidence 读取处模拟不可用。
对主干的风险
主要风险是将缺失证据误当无执行、误放行其他 Session/业务、重复提交同窗,或为了恢复挤占用户任务。新的缺失/不同/重复 phase、context_present、不同错误、provider unavailable、retry_fails 负例与现有 model/poll/历史损坏/worker busy/queue/撤权控制共同约束这些情况。受管 Session 和普通模型恢复没有因此扩大;后续新周期仍从原 canonical Todo 取得新身份。
首两轮新 fixture 的 16 个 setup 断言失败均保留:它们分别触发更早的身份准入和被容错转换的 scope 拒绝,并未重现实际晚期读取边界。最终将故障放在真实 commission-evidence 的身份读取,仍保留独立三事件断言,没有删安全断言或降低限额。最终 199 项回归为零失败;Ruff、控制面 typecheck、6 直接/15 标准检查通过,CQR 本 Goal 为 disabled,没有伪造 receipt,也未查询 CI。原临时读取的具体传输原因仍未知,不能由约 30 秒时长推断。
我的整体评价
此改动在原 owner 里交付了可测试、可回滚的有效增量;最小实现只增加原事件阶段的派生读取和 typed 资格分支,保留旧失败、授权及一次恢复边界。持续工作收益是身份恢复后不再要求用户重配或手工改时钟;从已有意图到接续没有新增问题、选择或确认轮次。恢复失败或证据未知时保留具体等待,不能为继续运行而丢弃门禁。
本次只改宿主读取与内部准入及说明文档;检查了原会话与设置消费者,没有渲染或页面布局变化。 真实账户的临时传输原因、安装后的自然接续及真人体验尚未由本 PR 的合成 provider 证明。 原配置、消息展示和页面没有变化,因此本 PR 无新增截图资格要求。合入后仍需正常安装并独立观察原服务自然接续;该后续验收与代码/合成 provider 验证分列,不能用本评审宣称真实业务或整个周期报告目标已完成。
English verdict: APPROVE. The existing recovery owner now admits one independently proven identity-read refusal while retaining current authority, original identity and all unknown-effect fences. Production adoption remains a separate qualification.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max. Author-owned self-review; COMMENTED is not GitHub formal approval.
An accepted no-model status watch can fail while verifying its App identity during context preparation. The original deadline then stays due after the provider recovers because restart admission only recognizes host restarts and the earlier authorization-snapshot refusal.
The existing recovery owner now accepts one correlated continuation only when the exact original identity refusal has one recorded collector phase, no published context, strict complete history, no model/result/poll effects, and an available original worker and lease. Current identity, scope, user priority and the original deadline are checked again; the failed request remains intact.
原生无模型巡检在准备上下文时遇到 App 身份读取失败,身份恢复后仍被原恢复准入拒绝。本改动沿既有 owner 补齐一次受证据约束的接续;不改原窗口、失败记录、权限或业务执行路径。
Validation: 199 native Python regressions and 10 typed tests pass, including actual File/SQLite Chat workers, host reopen, one original native poll, unchanged failed history and the next independent period. The identical four-case harness fails only in the two identity scenarios at the immutable base; two authorization controls and two disabled/unknown-effect controls pass there. Ruff, control-plane typecheck and the standard premerge gate (6 direct / 15 selected checks) pass with no holds. Installation and natural production recovery remain unverified until normal adoption after review.