Skip to content

fix(usage): return safe settings failures with typed lock recovery - #7943

Merged
huangruiteng merged 1 commit into
mainfrom
codex/usage-settings-recovery-20261103
Nov 3, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/usage-settings-recovery-20261103

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

usage-ping disable --format json 在设置锁被占用时原先会丢失既有 mutation_lock_timeout,返回空 JSON 输出和 Python traceback。损坏响应、无效 UTF-8 或本地 Node 不可用也缺少稳定的失败回读。此变更沿用 TypeScript 设置/锁 owner,把失败呈现为公开安全的 JSON 或 Markdown,退出码为 1。

锁拒绝发生在写入前,提示等待当前设置操作后重试。其他传输失败不推断修改结果,要求先运行 loopx usage-ping status;真实修改成功但响应丢失的场景验证了无自动重试、无同意状态误报。既有 1 秒锁期限、4 秒桥接期限、同意策略、generation fencing 和无效设备用途输入的退出码 2 保持不变。中英文参考文档同步说明恢复路径。

Validation at 24b2c449fce3fdde948541b3f9af3bd75ad2df7a:

  • 五个新增反例在未修改的 main 107e9e3 上失败;候选版本的六个新增场景通过。usage/Goal observation/telemetry isolation 的完整相关 Python 验证共 75 passed。
  • 两个未修改的真实 native settlement CLI 场景通过,包括一次记账与重放回读;这些合成 File fixtures 不表示 SQLite、PostgreSQL 或 Host 验收。
  • 重新构建 frontend 与 wheel,在隔离的 site-packages 安装中运行 15 个真实 CLI 场景(含 7 个预期失败结果),所有断言通过。六个生产源文件与提交字节一致。没有全局安装或修改真实设置。
  • 完整 control-plane typecheck、改动文件 Ruff、diff/bilingual 检查和六文件公共边界扫描通过。没有 UI 布局变化;现有 Settings 不可用状态继续指向 CLI status 回读。
  • 必需 mypy 原配置检查仍失败:786 errors / 125 files;完整诊断与此前 main 基线相同。独立 PR fix(context): isolate native output defaults from capture IO #7938 的修复尚未纳入。
  • 必需全量 TypeScript 检查仍失败:5906 passed / 1 failed / 77 conditional skips;失败为既有 delegation.ts 未使用的 ENVELOPED_SHA256_PATTERN,由 fix(collaboration): remove unused digest owner binding #7936 单独提案处理。跳过项不算后端验收。

Change-quality receipt cqr_2de4000aa0691176df6d 为 fail,保留两项必检失败,不申请豁免。标准 premerge 的 6 项 direct checks 通过,17 项 selected checks 中 16 项通过、1 项既有 maintainability ratchet advisory failure;完整 semantic vocabulary 检查通过。整体 gate 仍是 quality_invalid_receipt,独立评审、必检修复和明确 maintainer 合并授权仍缺失。

先前更大诊断中偶发的 settings disable 异常没有足够载荷归因;此 PR 仅修复本次可重复证明的类型丢失、失败输出与恢复契约,不声称消除了锁竞争或解释了该历史异常。

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

动机 / Motivation

通过 CLI 或设置页管理整机统计开关的操作者,以及捕获 JSON 结果的 Agent。
设置锁被占用时,disable 尚未取得锁,却丢失原 typed 错误并抛出 traceback;传输损坏时,调用者拿不到可用的失败结果,也无法判断修改是否提交。
锁拒绝现在返回安全错误与退出码1,原同意状态保持;修改已经提交但响应丢失时不自动重试,而是用 status 读回真实选择。
不更改统计默认、告知/同意、generation、锁期限或发送策略;不认证历史偶发异常根因、远端 CI、打包/安装态 Host 或长程收益。

改动思路 / Approach

复用既有 TypeScript 设置与文件锁 owner;Python 只白名单映射错误并呈现同一安全结果。比重试写操作或新建设置控制器更小,也避免把未知效果说成未修改。

当前 PR 完成现有 usage-ping 设置操作的失败呈现和合法恢复,保留已有成功、明确关闭及无效用途输入契约。

原设置 owner 已有真实锁、同意策略和 generation;本次不需要第二个设置服务。拒绝取得锁可以证明该次没有进入修改,子进程失联却不能证明没有提交。因此两种失败必须给不同恢复建议:前者等当前操作结束,后者先读回。不会为了显示一个失败而自动重试写入,也不要求操作者重新确认已经给出的选择。

具体改动 / Changes

完整精确 head 24b2c449fce3fdde948541b3f9af3bd75ad2df7a,实际 merge base 107e9e32e8f3df29f63b94524250f4044cc01a80;6文件 +171/-6,生产3文件 +35/-6,既有测试 +118,中英文参考文档 +18。独立依据是预先读取的 docs/reference/usage-ping.md,spec_revision 107e9e32e8f3df29f63b94524250f4044cc01a80:Delivery, local state and withdrawal 在本修复的关闭/修复/不发送/无自动重试边界为 implemented;Disclosure and precedence 在存储关闭、环境退出、consent-required 与无效用途输入上为 implemented。修改后的文档只是披露,不反过来当独立 oracle。

关键代码讲解

  • UsageSettingsUnavailable 仅保留既有 typed 锁超时码,其他未知失败归入 unavailable;输出固定安全信息,不传递 child stdout/stderr、原始异常或本机路径。没有新增同意状态或策略 owner。
  • control 仍调用同一 Node/TS 模块和4秒桥接期限;处理坏 JSON/UTF-8、OS/timeout 和 Node 缺失。原用途校验独立保留为 UsageSettingsInputError,失败不构造 consent 或自动重放。
  • handle_usage_ping_command 对同一安全 payload 提供 JSON 和 Markdown,退出1;用途输入拒绝仍退出2。现有成功 renderer、参数和实际 mutation 没有替换。
  • TS 错误出口 用实际 EffectRuntimeLockTimeoutError 身份保留 code,既有 configure/withFileMutationLock 才拥有锁和写入。现有 HTTP 设置适配器仍捕获 RuntimeError 并返回安全503,前端仍给 status 恢复入口;没有页面/控件修改。

独立75项完整 usage/Goal/telemetry 测试 PASS。另写的9场景通过真实 CLI dispatch、真实 TS 和可丢弃机器文件:实际锁占用时 JSON/Markdown 同一消息、状态字节不变;释放后 disable 成功。对子进程故障只注入运输层:坏 JSON、无效 UTF-8、OS 错误、Node 缺失;不模拟 consent 后置条件。实际 Node 先成功修改,再丢弃回复,独立 status 读回 disabled,后台只调用一次,没有重试。相同9场景在不可变基线为6项缺陷 FAIL、3项原关闭语义 PASS,修复头全部 PASS。

16组完整 status/无效用途输入 × JSON/Markdown × fresh/存储关闭/环境关闭/consent-required 的返回,包含退出码、stdout、stderr,合计20,734B,与基线逐字节相同且零归一化;status 没有修改存储。正常环境和存储退出不会因新的失败类而变成启用。

对主干的风险 / Risks

最强风险是将“回复未知”错误地说成“未修改”,诱发重复写入。上面的真实修改后丢响应对照验证了反方向:失败 payload 没有 consent,原选择保持,下一步读回而非重试。锁超时则在取得锁之前拒绝,1秒锁期限和4秒桥接期限不变;这与发送任务丢数或 collector 可达性不同。新类是 Python host 适配,不是第二份 TS 同意/发送政策;没有新 feature activation 或工作权限。

保留最初完整基线中的一次安装统计载荷未到达:68 PASS/1 StopIteration。相同具名用例单独在 base/head 均 PASS,当前头完整75 PASS;这没有解释原失败或证明稳定性已修复,不能把原结果改绿。这里对设置错误/恢复的判断另有上述真实状态、六个缺陷敏感反例和完整输出对照;不声称改善遥测投递可靠性。

当前配置17根 mypy 仍 FAIL:786 errors/125 files。base 与两个评审头的完整119,338B诊断逐字相同,全部125报错文件及 tracked pyproject/package lock 的 Git 对象未变。digest-owner 模块当前16 PASS/1 FAIL,基线同一断言也 FAIL:未改的 delegation.ts 导入 ENVELOPED_SHA256_PATTERN 却未使用;只替换 checkout 前缀的完整819B失败块相同。最初基线缺 TypeScript 依赖的加载失败没有用于此归因;在相同锁定依赖准备后才重验。

完整声明的 TS typecheck、CI Ruff roots、diff/双语/编译及六路径公开边界检查 PASS。标准 native premerge 为6 direct、17 selected,整体 PASS,但其中一个 raw maintainability ratchet advisory 仍 FAIL,未删除或豁免。严格 exact-scope CQR 保留 required mypy/digest FAIL;代码结论不代表该质量门已通过。没有查询、轮询或等待远端 CI,也未重新执行作者的 wheel/全仓 Python/全量 TS/其他平台。

第一次私有丢响应 wrapper 未设置 text=True,子进程在写入前就失败,故“已提交”的断言不成立;保留这条测试驱动失败,修正运输捕获后才取得9场景结果。没有改产品或减弱同意/一次调用断言。

我的整体评价 / Verdict

APPROVE 这项有界设置失败修复。 未发现当前改动的新增阻塞问题。原操作可通过既有 CLI 获得可读、公开安全且不捏造修改结果的失败;恢复保持实际选择和原同意 owner。long_horizon=preserved、user_experience=improved 只指这个已执行的调用与读回,没有推断模型或长期效益。

复用既有 TypeScript 设置与文件锁 owner;Python 只白名单映射错误并呈现同一安全结果。比重试写操作或新建设置控制器更小,也避免把未知效果说成未修改。 当前 PR 完成现有 usage-ping 设置操作的失败呈现和合法恢复,保留已有成功、明确关闭及无效用途输入契约。

已检查 CLI、现有设置/请求读取消费者;没有渲染组件、布局或首屏变化,视觉评审不适用。 安装态 App/Lark、真实模型采用与其他平台未验;本次为源码真实 CLI/后端验证。 全仓和安装态资格、历史载荷失败原因仍未验;required 质量失败、后续 exact-head readiness 与维护者合并授权继续分别判断。作者同账号仅能用 COMMENTED 承载批准结论,不是平台 formal APPROVED;本评审不进行合并或撤销其它结论。

English verdict: APPROVE 24b2c449fce3fdde948541b3f9af3bd75ad2df7a for the bounded safe-failure and recovery repair. All75 owning tests and9 independent cases pass;6 matching base defect controls fail and16 full output pairs match. Required mypy/digest failures and the unexplained initial base telemetry observation remain disclosed. This COMMENTED author-account conclusion grants no merge or installed-host qualification.

@huangruiteng
huangruiteng merged commit dda5515 into main Nov 3, 2026
30 of 40 checks passed
@huangruiteng
huangruiteng deleted the codex/usage-settings-recovery-20261103 branch November 3, 2026 07:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants