Repository navigation
fix(usage): return safe settings failures with typed lock recovery - #7943
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.
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.
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:107e9e3上失败;候选版本的六个新增场景通过。usage/Goal observation/telemetry isolation 的完整相关 Python 验证共 75 passed。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 仅修复本次可重复证明的类型丢失、失败输出与恢复契约,不声称消除了锁竞争或解释了该历史异常。