Repository navigation
fix(native-accounts): identify managers of orphaned auth holders - #7431
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; runtime_reported; gpt-6.1-sol; OpenAI; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机
在原生账号自动切换因残留文件占用而等待时,需要定位占用归属的本机操作者。例如,脱离 App 父进程树的虚拟机服务仍持有登录目录:旧清单只显示未管理占用;新清单在核验后显示真实管理器与实例,同时保留重启等待。可观察结果是同一只读 CLI 能给出占用来源和具体等待原因,既有 App/服务重启资格不变。本次不实现虚拟机重启,也不证明真实额度耗尽后已经采用新登录。设置页的完整占用诊断、外部工作负载空闲与恢复资格,以及真实换号验收仍需原账号维护工作继续完成。
改动思路
该实现沿用同一原生占用清单和进程 IO 适配器,只派生来源诊断;账号选择、退出、恢复及原权限仍归既有 owner,不新增状态存储或决策器。当前 PR 交付边界是经真实只读 CLI 核验的占用管理器诊断;外部工作负载重启与设置页交互继续保留为后续验收。与无改动相比,它消除了“是谁持有”的实证缺口;按进程名或旧 App 归属扩大重启范围更危险,新建虚拟机生命周期管理器又超出当前可证明的业务恢复条件。入口仍是 loopx-codex-accounts clients,原有账号策略与切换事务没有第二套来源。责任进程只是来源线索,可信可执行文件、私有 pidfile、原管理器 JSON 与内核启动身份共同核验后,才显示实例信息。任何一步未知仍显示等待,身份变化则拒绝本次清单。
具体改动
规范基线:packages/loopx-codex-provider-routing/NATIVE.md,spec_revision:22196e81db063cbfabb4ca5591fbb83c7bc987c0。该不可变版本的原生账号合同先于本次文字增补。AUTH-INVENTORY 对应只读清单;AUTH-PRIVACY 对应参数和环境不投影;AUTH-OWNERSHIP 对应未知占用保持等待;AUTH-RESTORE 对应原部分失败后恢复校验。这四项在本 head 实现或保持,并分别由真实 CLI、负例及原恢复回归验证。
关键代码讲解
- responsible_pid 读取 Darwin 可选责任关系。API 不存在或拒绝时返回未知,不按名称猜测,也不发信号。
- lima_pidfile 复用单一私有进程参数解析,只允许 hostagent 的唯一绝对 pidfile;环境或参数中的伪装值不能越过边界,原 CODEX_HOME 解析反例仍通过。
- _lima_instance 要求真实进程的二进制等于已安装可信命令,核原目录、pidfile 和唯一运行实例;只执行有超时的 list,不执行 guest 命令。
- _external_manager / clients 前后核对 holder、manager 与责任关系,再派生诊断;原 kind/restartable 不变。7 文件 +233/-11,生产 IO、既有 smoke、文档与三处版本号相互一致,没有新增存储、命令或生成物。
对主干的风险
未发现阻断项。主要风险是把可选系统 API 或管理器信息误当重启授权。本 head 通过 PID 复用、同名 App、责任变化、错误/重复/停止实例、错误目录、pidfile 变化、不可信或不同二进制、API 不可用等反例挑战,只允许保留等待或拒绝。真实只读 CLI 的同一独立 oracle 在旧版失败、打包新版通过,登录文件元数据和原分类保持;该证据不等于 guest 缓存或业务恢复资格。
原 App/LaunchAgent 的退出、部分失败恢复、未知占用与 restart-off 路径,在不可变基线和当前 head 的既有 smoke 均通过,相关七个 owner 的 AST 一致。全部 provider/host/operator/recovery smoke、4 个 observer 和 10 个 TS 策略用例、changed Ruff、standard premerge 4 项直接检查及编译通过;catalog 没有选中 canary,未以零项声称覆盖。全仓 check 的旧 authority 缺口在相同检查的原 owner 与 head 完整错误相同,85 条非字面引用对应源码行均已存在于基线;该旧 registry 事项独立保留。按当前合同未查询或等待 CI。
语义与 CI 对齐
本次增加的是 native provider 局部派生诊断,不是 Core 生命周期或新授权词汇。源码检索确认选择与重启策略仍在原 owner;无新 journal、手填标记、调度器或授权提示。语义 advisory 未覆盖此 package,零发现不能代替本次人工 diff/调用者审查。旧效果默认值保持,新的只读字段已在文档明确披露。
我的整体评价
APPROVE,交付判断为 justified_increment。long_horizon 保持:没有新增重试链或状态同步成本,既有换号/恢复路径与原失败边界保留。user_experience 改善的是既有诊断入口的可操作性,不要求新的配置、复制或确认。已检查现有账号设置页和 HTTP 入口;本次只扩展只读 CLI 数据,没有渲染、布局或响应式改动,视觉检查不适用。本次没有新增页面验收;设置页仍保留已有忙碌提示,不宣称已显示管理器或完成虚拟机恢复。
该实现沿用同一原生占用清单和进程 IO 适配器,只派生来源诊断;账号选择、退出、恢复及原权限仍归既有 owner,不新增状态存储或决策器。当前 PR 交付边界是经真实只读 CLI 核验的占用管理器诊断;外部工作负载重启与设置页交互继续保留为后续验收。小型重构已将两种私有读取复用同一参数解析,避免复制;当前无需引入更大的 manager 框架。真实耗尽、新 auth 采用与外部业务安全恢复继续保持未验收,不以本次来源诊断关闭更宽目标。若后续增加停止效果,必须重新审查工作负载身份、空闲/恢复条件、失败回滚和设置页旅程。
English verdict: APPROVE — 84c37da. Useful read-only manager diagnostics with exact launch fences, real CLI base/head evidence and preserved restart holds. VM recovery, settings diagnostics and real exhausted-account adoption remain outside this staged change.
A process that outlives its App can still hold the native auth home, while the client inventory only reports an anonymous unmanaged holder. The optional provider now fences Darwin responsibility with kernel launch identities and corroborates an installed Lima hostagent against its original pidfile and instance inventory. It returns the manager and an explicit restart hold without exposing raw argv, environment or catalog paths.
This is a staged read-only diagnostic in provider 0.12.9. App/LaunchAgent restart behavior is unchanged. A running VM is still held until its own workload and recovery path are qualified; this does not implement VM restart or prove a real exhausted-account cutover. The settings page retains its existing busy message.
Validation: all native host/client, provider, operator and recovery smokes; 4 observer tests; 10 TypeScript policy tests; changed Python Ruff; standard premerge (4 direct checks and compilation, no catalog canaries selected). The built wheel was exercised through the actual read-only CLI. Counterexamples cover reused holder/manager PIDs, changed responsibility, a same-name App, wrong/duplicate/stopped instances, changed pidfiles, untrusted or different executables, missing SPI and private argv/env lookalikes. Public-boundary scanning found only existing non-literal references; the full registry check retains an unrelated legacy Goal authority failure.