Repository navigation
fix(registry): reject unknown tracking in strict checks - #8162
Conversation
Signed-off-by: ZKDplz <2646995705@qq.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
动机 / Motivation
维护者在提交私有 registry 前运行严格 Git 跟踪检查。 这里的“严格”是要求工具证明目标没有被 Git 跟踪。坏索引使跟踪查询失败时,旧版仍报告检查通过;本补丁会返回失败,但根目录查询超时仍可能误报通过。 如果自动化把退出 0 当成安全证明,私有运行状态可能未经有效检查就进入提交。已验证坏索引被拒绝;根查询超时这一同域负例仍未满足严格检查目标。 本次不改写 registry、不自动修改 Git 索引,也不新增发布或合并权限。
改动思路 / Approach
入口仍是 registry-boundary --require-not-tracked:现有 probe 读取 Git 事实,classifier 判断路径是否可公开,CLI 负责显式严格退出。这样的职责和成本合适,当前边界只是跟踪证明与诊断,没有新增存储、配置或发布动作。ls-files 的 0/1 分别表示已跟踪/未跟踪,其他返回码或超时不能充当“未跟踪”。补丁修正了这一层,但把“根目录发现失败”继续编码成 inside_worktree=False,新 guard 又依赖 inside 为真,因此漏掉更早的同类不确定状态。
具体改动 / Changes
评审完整 base 927d0b389096a9ca8702c4da14a43836063ed29b 到 head 861746d7624f3effd9623993b3b0529dd786ae88,三文件 +44/−8。先读的规范是 docs/operations/authority-source-registration.md#registry-boundary-classes,固定版本 927d0b389096a9ca8702c4da14a43836063ed29b。该段没有原生条款编号,以下为本次段落映射:private-registry-boundary 未满足,根查询未知仍给严格成功;public-example-boundary 已实现,真实已跟踪 public example 在两端都允许。这里不要求普通非 Git 目录被误判成失败。
关键代码讲解
_registry_git_probe增加 tracking return code 有效性判断;根查询为 None 时提前返回,尚未形成可靠的 outside 结论。inspect_registry_boundary继续保留路径分类与已跟踪私有 registry 的风险;这部分不应由 CLI 复制。- 严格 CLI 分支 在 inside 与 git_unavailable 同时成立时拒绝。新增测试覆盖坏索引,却未覆盖根查询失败导致 inside 为假的分支。
对主干的风险 / Risks
[P1] 根查询失败仍可通过严格检查。 在独立真实 Git 仓库先暂存私有 .loopx/registry.json,用真实 Git 确认它确已跟踪,再仅让 git rev-parse --show-toplevel 超过生产 1.5 秒上限,实际 CLI 于约 1.99 秒返回 exit 0、ok=true、git_unavailable、inside_worktree=false、空 risks。该问题在 base 也存在,属于本次要解决的同域残留,不能当成新引入回归,也不能归为无关旧故障。根查询返回 128 时也仍给成功。最小修复是在现有 owner 区分 confirmed outside 与 unknown discovery,让私有目标的未知证明失败,同时保留确实非 Git 目录和可公开例子的合法路径。
| 实际 CLI 对照 | base | head |
|---|---|---|
| 坏索引,严格检查 | 0,误通过 | 1,已修复 |
| 根查询超时,严格检查 | 0,误通过 | 0,仍误通过 |
| 已跟踪私有 / 恢复正常 Git | 1 | 1 |
| 已确认 outside / public example | 0 | 0 |
PASS:三个完整 pytest 模块 head 22/base 21;CI 指定 Ruff 范围、配置的 mypy 范围、变更文件编译、semantic vocabulary 与 advisory、public boundary。修正测试目录位置后的 20 次实际 CLI 观察是验收依据;早期放在 .local 下的 public/outside 对照无效并保留,未混作通过证据。六组健康路径全 JSON 完全相同,registry 字节均未改写。
FAIL(独立归因):原有完整 public smoke 在两端都因只 mock run 而没有拦住 Popen 的 no-git 断言失败,完整失败身份和细节相同,fixture 整体未变;#8163 修复这个 harness 边界。原始 maintainability ratchet 两端也同样失败于未改动的 _admitted_interaction_next_cli_actions,不是这里引入。native quick 的直接检查通过,但总门禁因本次失败的 change-quality receipt 保持 hold。UNVERIFIED:Windows 与完整 pytest/远端 CI,未等待或轮询 CI。
语义与 CI 对齐
复用现有 git_unavailable 词汇,不添加共享状态。CLI help 将未知跟踪列为硬拒绝,实际坏索引行为匹配,根查询失败不匹配;不要用 inside=False 或相同布尔值证明来源完整。复核时请在现有 probe pytest 和 python examples/project/registry-boundary-contract-smoke.py 之外重跑上述真实 CLI 的根超时、confirmed outside、public example 与恢复对照。
我的整体评价 / Verdict
机制大小合理,保留单一 probe/classifier/strict owner 是合适的简化;当前严格目标仍未完成,因此请求修改。长程效果尚未证明:重复使用时仍可能积累错误安全判断;用户体验也尚未证明完整,失败必须可见且可恢复。没有新增确认轮次,也没有渲染界面变更,视觉检查不适用;Windows 执行仍未验证。修复应只补齐未知根查询的语义与回归用例,不扩展成新服务。补丁的坏索引修复是有效成果,但不能替代其余同域失败分支。
English verdict: REQUEST_CHANGES — strict checks still accept unknown Git-root discovery.
Signed-off-by: ZKDplz <2646995705@qq.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
动机 / Motivation
在提交 registry 相关工作前运行严格 Git 跟踪检查的维护者和自动化调用者。 私有文件已被 Git 暂存,但索引损坏或根目录查询失败时,旧版仍返回退出 0,容易被当成检查通过;当前版本拒绝这个未知结果,同时保留正常非 Git 目录和公开示例的合法路径。 同一真实 Git fixture 的独立对照确认:坏索引、根查询错误、生产期限超时和缺失 Git 时,严格私有检查从退出 0 改为 1;健康路径完整 JSON 保持一致,修复环境并排除跟踪、加入忽略后能够再次通过检查。 本 PR 不自动修改 registry、Git 索引或忽略文件,不授予发布、合并或安装权限,也不声称完成其他 registry 检查或安装态验收。
改动思路 / Approach
沿用现有 Git probe、边界分类器和严格 CLI 分支,只增加从查询结果派生的未知发现事实,不再把“未证明在仓库内”误当成“已证明在仓库外”。 当前 PR 交付边界是显式 --require-not-tracked 的跟踪证明,以及共享诊断对未知结果的如实表达。 Git 子进程只提供查询事实,原有分类器继续负责私有路径、公开示例及泄漏标记,CLI 只把显式严格要求转成退出结果。现有“确定不在 Git 仓库中”的快速路径继续保留,不能把所有 outside 都拒绝;公开例子的允许也不代表获得新的发布权限。没有新增服务、重试器、配置表或手工同步状态,查询本身仍不写 registry 和索引,正常调用不增加确认轮次。
具体改动 / Changes
审查完整 927d0b389096a9ca8702c4da14a43836063ed29b → 92168b73461a2501369a16a4143a91680da3d642:三文件 +63/−26,两个生产 owner 与40行测试;另核对上一轮 861746d7624f3effd9623993b3b0529dd786ae88 → 当前的 +28/−27 修复,没有继承旧版结论。先读Registry Boundary Classes,固定修订 927d0b389096a9ca8702c4da14a43836063ed29b,并对照上一轮根查询反例。该文没有编号,沿用段落映射:private-registry-boundary 和 public-example-boundary 在本 head 均为 implemented,前者覆盖未知跟踪不能充当严格安全证明,后者保留公开例子及确定的普通非 Git 路径。
关键代码讲解
_registry_git_probe:保留已证明 outside 的现有分支;真实根查询失败则返回git_unavailable和派生的worktree_discovery_unknown。只有ls-files的0/1代表已跟踪/未匹配,其他结果不能假装查询成功;原1.5秒时钟和进程清理 owner 未改。inspect_registry_boundary:原私有路径、公开例子、内容标记与风险仍由同一分类器判断。把私有路径的 role 改成 public 不能逃逸;公开例子出现私有来源标记时仍保留更早的拒绝,不被新错误覆盖。- 严格 CLI 分支:既有显式 flag、禁止公开的目标、查询不可用及 inside/unknown 事实共同决定拒绝。普通诊断仍可读取,未默默启用新发布策略或改动其他 require 检查。
独立使用相同真实 Git/索引 fixture 获得42次两端 CLI 观察,另有同一文件的6次纠正恢复观察;每次读取前后 registry、索引和配置字节不变。关键对照如下:
| 实际调用 | base | 当前 head |
|---|---|---|
| 已暂存私有目标,坏索引 / 根错误 / 根超时 / 缺失 Git,显式严格检查 | 退出0,错误安全结论 | 退出1,明确不能确定跟踪状态 |
| 健康已跟踪私有 / 未跟踪或已忽略私有 | 1 / 0 | 1 / 0,完整 JSON 相同 |
| 已跟踪公开例子 / 确定的非 Git 项目 | 0 / 0 | 0 / 0,完整 JSON 相同 |
| 同一故障文件恢复 Git,再依法取消跟踪并加入忽略 | 正确跟踪拒绝,随后成功 | 正确跟踪拒绝,随后两个严格 flag 一起通过 |
PASS:当前26/base24个聚焦测试;两端变更文件严格 Ruff、CI lint roots、配置指定17根 mypy;标准 premerge 门禁通过:6项直接检查通过、5项选中检查执行,保留其中1项旧 ratchet advisory;编译、双语差异、完整词汇及输出预算通过。真实根超时观察在6秒内返回,启动的查询进程已消失;没有靠增加期限或删断言获得通过。
对主干的风险 / Risks
未发现当前 head 的阻塞问题。最强风险是只修索引仍漏掉根失败,或为补拒绝而误伤公开/普通 outside 路径;上述真实反例及相反方向对照均覆盖。错误恢复也走到了可用结果:不只拿到一张失败回执,而是修复查询后正确辨认跟踪状态,再经合法 fixture 修正让检查成功。没有改运行中的项目或宿主安装。
原始红项分别保留:完整 TypeScript 检查仍报 conversation_binding.ts:1144 的 TS2345,两端完整158字节相同;raw ratchet 仍报既有 interaction 函数规模债,完整399字节相同;原完整 boundary smoke 的隐式默认路由在 dispatch 前冲突,未到达被改动的 handler。该 smoke 两端完整规范化 traceback 及捕获的完整内层错误相同,smoke/路径解析 owner 未改;它也尚未走到旧评审提过的 no-Git mock 断言,不能把那个旧原因冒充本轮原因。显式隔离路由的48次实际调用独立覆盖本次变化,因此这些属于 pre_existing_unrelated,仍不能宣称所有检查全绿。未获取、轮询或等待远端 CI。
语义与 CI 对齐
复用现有 git_unavailable,新增的是每次从查询派生的诊断事实,没有持久化的第二份状态。help 从“已跟踪时失败”明确扩展到“无法证明跟踪状态也失败”,与当前严格私有行为相符。普通检查的退出仍为0,但未知诊断本来就是故意纠正的变化;不将相同退出码包装成字段完全无变化。原有私有标记、公开例外、无副作用及合法恢复边界均保留。
我的整体评价 / Verdict
APPROVE 当前 92168b73461a2501369a16a4143a91680da3d642,本次显式严格跟踪检查目标 goal_achieved。long_horizon 为 preserved:没有新调度、状态、自动重试或义务,且同一失败到合法可用检查的接续已验证;user_experience 为 improved:同一命令给出准确失败,健康路径不增加配置、导航或确认。三文件切片比例合适,既有 Git provider 和分类 owner 足够,无须为此新建抽象或强制语言重写。
已检查 registry.py、support_control.py 及 contract.check 消费者;没有页面、布局或首屏改动,视觉审查不适用。 当前 Windows、安装态及自然 Agent 使用和长期完整成本未验证;作者正文的861版本验证不是当前921版本的独立验收。 这些范围未被当作已证明收益。当前批准针对具体精确版本,保留独立红项、review thread/readiness 与维护者合并权限;本轮没有执行合并、安装或部署。
English verdict: APPROVE — 92168b7. Unknown root/index tracking now fails the explicit strict check while healthy outside/public paths and useful recovery remain valid. Separate local validation failures remain disclosed.
Goal And Delivered Outcome
loopx registry-boundary --require-not-trackedcould exit0for a staged private registry when Git found the worktree but could not read its index. The tracking lookup failed with exit128, and LoopX reported the path as untracked.The strict check now reports
git_unavailable, explains that it could not determine whether the registry is tracked, and exits1when publication is disallowed.Intended base:
mainat927d0b389096a9ca8702c4da14a43836063ed29b.Author Declaration
model_agent, OpenAI Codex (GPT-6 family).Implemented against
Registry Boundary Classes and the reproduced strict CLI failure.
_registry_git_proberegistry-boundary --require-not-trackedtest_registry_boundary_require_not_tracked_rejects_unreadable_indexSelf-check: reviewed the three-file diff and reproduced the failure with the same staged registry and unreadable alternate index on base and candidate.
Scope And Continuation
Complete within Git tracking diagnostics and the strict registry boundary check.
Validation
861746d7624f3effd9623993b3b0529dd786ae88finishedsyntheticregression_paritypassed128in both runs. LoopX changed from exit0to exit1.real_entrypointpassed1for a tracked private registry,0for an untracked one,1for an unreadable index,0for a tracked public example, and0outside a worktree.integrationpassedstaticpassedgit diff --check, and the public boundary scan for all three changed files.integrationfailedloopx.capabilities.issue_fix.cli. The same assertion failed on clean upstream and the candidate.Frontend / Visual Evidence
noneType of Change
LoopX Area
Shared-authority RFC fixture impact
N/A.
Boundary Checklist
Signed-off-byverified.