Repository navigation
fix(quota): require full write-scope coverage - #8271
Conversation
Signed-off-by: Jim-jimu <3230103159@zju.edu.cn>
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 864409e3d8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
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
[P2] 保留原来拒绝的字面写路径。 同一条现有 grant 下,公开评审批注中的字面请求在基线返回范围修复,当前提交返回 normal_delivery_allowed=true。在真实 File 和 SQLite 上都复现了这次放行,也复现了另一条原已覆盖路径反向被拒。请在共用的大小写敏感 matcher 内保留旧字符类语义,让字面路径和 glob 集合比较使用一致的解释。 已公开的复现输入 · 调用点
[P2] 迁移原投影修复 smoke 的调用。 write_scope_allowed 已从实现移除,原 smoke 仍导入它。同一个脚本在基线退出 0,在当前提交退出 1,所有范围修复、过期来源和回退断言都未执行。请把这条 smoke 迁移到现有 typed 投影入口,保留原有场景。 原调用
动机 / Motivation
Goal 操作者通过 quota should-run 决定能否继续写入,子任务准入也使用同一范围判定。 旧路径把 required glob 的拼写当成一个文件名。单字符 grant 会误放更宽的请求,也会拒绝完全覆盖的字符类。 用同一条单字符 grant 检查宽通配和已覆盖字符类,候选修正了两种结果。但同一旧 grant 的字面请求在迁移后出现新的误放和误拒。 在真实 File 和 SQLite 上,宽 glob 被拒绝、有效并集可继续、过期授权只提供提示。已有字面范围的兼容仍有阻塞。 本评审聚焦既有授权校验、诊断和测试入口。评审不执行实际受保护写入,产品安装态和长期收益留待验证。 旧字面路径的正反结果必须恢复,旧投影修复 smoke 也需要重新可运行。
改动思路 / Approach
保留 TypeScript 作为写范围判定的单一 owner,并让旧字面匹配和新集合包含检查共享同一种大小写敏感语义。旧 smoke 改走现有入口,保留其断言。 本 PR 可独立交付既有准入与修复路径上的完整范围校验;合并前需恢复旧字面授权语义,并让原 smoke 继续运行。
单个字符串匹配无法证明多个 grant 的并集覆盖。现有 TypeScript owner 用区间划分字符集,再寻找能通过 required glob 却无法通过任何 active grant 的路径。Python 按批调用判定,先计算真正缺失的范围,再从失效的 checkpoint 给出来源提示。过期 grant 在两个真实 provider 都保持提示用途。
具体改动 / Changes
当前提交 864409e3d850ccb0a841bc2534b2c627c2195c03,比较基线 44376963f8adb310f5f96d9407720a447c3b330e。完整差异 6 个文件,+371/-28。按原规范核对 Active Goal write authority(完整覆盖及旧字面语义)与 Boundary repair and inactive grants(修复投影和失效来源)。 原写权限规范
关键代码讲解
schedulingWriteScopeAllowed保留字面分支并为 glob 增加集合包含检查。scopeLanguageCovered比较 required 与 active grants 的并集,状态数和字符区间步数耗尽时拒绝。已公开的字符类边例在新旧 parser 上有分歧,迁移使分歧影响普通写入准入。 授权 matcher · 包含检查quota.write_scope_coverage经现有 Effect Runtime 注册。投影使用返回布尔值定位缺失范围,active group 独立决定准入,inactive group 只生成可追溯提示。读取失败和畸形返回有拒绝边界。 handler · 投影- 两组新测试覆盖独立 fnmatch oracle、typed handler 和批传输。既有本地工作区测试在基线与当前均通过,现有投影状态机 smoke 的 import 需要迁移。 TS 测试 · Python 测试
对主干的风险 / Risks
基线与当前各通过 21 个本地写入、结算与重放测试。两版分别有 28 个显式选择的真实 CLI 场景,另有 16 和 14 个未显式绑定的拒绝复验。宽 glob、完整并集、失效来源、正常读取均做了 File/SQLite 对照。宽 glob 已正确拒绝,既有字面拒绝与允许仍发生双向偏移。准入观察未扣额。在同一隔离 Goal 新建未覆盖 Todo 后,改 note 仍被拒绝。通过 configure-goal 加入实际授权后,同一 Todo 才能产出验证文件并结算,重放未重复扣额。
Ruff、17 个 mypy 文件、TS typecheck 通过。TS 基线 110 通过,当前 144 通过,两边各跳过 1 个未配置的 PostgreSQL 场景。当前 Python 批传输 15 通过。6 个直接和 4 个选中的 quick 命令通过,旧投影 smoke 基线通过、当前导入失败。严格回执 cqr_65fa0d5e88444272807a 为 fail。作者原先报告的运行时权限限制在本轮的隔离源码环境中已越过,完整 standard 检查与远端 CI 未独立重跑。
语义与 CI 对齐
这项改动复用现有授权语义,新增的是内部 typed 方法。应修复原 grant 与字面路径的解释,并在 File/SQLite 重跑正反例,再运行 uv run --extra test python examples/control_plane/quota-projection-repair-state-machine-smoke.py。审查了唯一提交的 DCO trailer。并集覆盖与失效诊断的改进仍应保留。 授权规范
我的整体评价 / Verdict
本次改的是 quota/子任务准入和既有修复投影。前端沿用原提示通道,diff 没有视觉改动。 源码验证覆盖 macOS 上的 File 和 SQLite。安装态、原生 Windows、PostgreSQL 与远端 CI 未验证。
全量范围判断修复了最初的宽 glob 问题。恢复既有字面路径的拒绝与允许,并修复原验证入口之后,再评审当前范围。
English verdict: REQUEST_CHANGES for 864409e3d850ccb0a841bc2534b2c627c2195c03. Full glob coverage and inactive-grant hints work in the managed File and SQLite probes. The migration changes legacy literal authorization in both directions and breaks an existing projection smoke. Preserve the existing case-sensitive matching semantics and migrate the smoke caller.
Signed-off-by: Jim-jimu <49069997+bmh201708@users.noreply.github.com>
Signed-off-by: Jim-jimu <49069997+bmh201708@users.noreply.github.com>
Signed-off-by: Jim-jimu <49069997+bmh201708@users.noreply.github.com>
…erage Signed-off-by: Jim-jimu <49069997+bmh201708@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 694163d8b7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
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
[P2] 旧字符类会中断准入,过期授权也能触发。 用 src/[z-a!-b].ts 授权 src/a.ts,同一输入在主干允许,在当前提交返回 quota_unexpected_collection_error。对 src/b.ts,主干给出范围修复,当前提交同样报错。在 File 和 SQLite 上,即使另有活跃的 src/a.ts 精确授权,只把这条字符类留在过期记录里也能中断准入。反向区间清理后,前导否定符耗尽第一个片段,下一步读取不存在的端点。请保留剩下的字面连字符,并让过期诊断失败留在诊断分支。 解析点 · 批处理入口 · 已有定位
动机 / Motivation
Goal 操作者提交带写入范围的任务后,quota should-run 会据此判定能否执行。 旧实现把范围表达式当作文件名,单字符授权可能放行一个更宽的通配范围。 以 src/?.ts 授权 src/*.ts,主干误放,当前提交正确进入修复;两条有效授权的并集也可覆盖一个字符类。 错误准入会扩大写入权限,错误拒绝或异常会使已授权任务停在准入。 File 和 SQLite 均确认了完整覆盖与上一轮两项修复。同一轮还复现了一种旧字符类让准入中断。 本轮验证既有源码入口、授权修复和回执重放。 修复字符类解析,并让过期授权的诊断计算与已获授权任务的准入隔离。
改动思路 / Approach
保留现有 TypeScript 写范围判定和 Python 投影适配。解析和集合比较可共用一种大小写敏感语义,过期诊断的失败需要留在诊断分支。 当前 PR 的交付边界是完整范围准入、既有字面授权兼容和修复提示。 判定每条 required scope 时,现有 TypeScript owner 搜索能匹配请求却落在所有活跃授权之外的路径。这样可验证多条授权的并集。Python 从当前任务和 Goal 读出范围,沿现有 runtime 入口调用判定。缺失范围仍进入原修复流程,失效来源供解释。
具体改动 / Changes
当前提交 694163d8b768ba8f20e010c17fb3c3924240c9c9,验证基线 7108b92337949ddcd6c59f773cc2e0ef10c185c5。完整差异七个文件,+475/-34。按 docs/state-interaction-model.md 在 44376963f8adb310f5f96d9407720a447c3b330e 的规范核对 Active Goal write authority 和 Boundary repair and inactive grants。前者的宽通配拒绝、并集覆盖已验证,后者的普通过期提示有效,复合字符类仍会中断两条路径。 写权限规范
关键代码讲解
fnmatchCharacterClass处理大小写敏感字符类,恢复了前一轮[z-a!b]的允许和拒绝。带第二段连字符的反例会清空首段,在构造区间时抛错。 字符类解析schedulingWriteScopeAllowed用同一解释匹配字面路径和计算集合包含。真实 File 和 SQLite 均拒绝过宽声明,允许已证明的并集;折叠大小写的 lease 冲突比较仍走自己的匹配分支。 范围判定build_boundary_projection_repair_hint将活跃范围与过期范围合入一次判定,再从活跃组算缺口。当前提前计算了无需显示的过期诊断,它抛错时,已经覆盖的任务也收不到准入结果。原状态机 smoke 已迁移到此调用并通过。 修复投影 · 原 smoke
对主干的风险 / Risks
两版各跑 26 个真实准入场景。候选修复了前一轮两种字面匹配偏差与 smoke 导入失败,另有六个场景在新头返回内部错误。既有本地写入与结算测试每版 21 项通过。两个 provider 上,新建未覆盖 Todo 后只改 note 仍被拒,补真实授权后同一 Todo 可写回,结算重放没有重复扣额。
TS 基线 110 项通过,候选 153 项通过,两版各有一项未配置的 PostgreSQL 测试跳过。候选 Python 传输测试 21 项、原 smoke、Ruff、mypy 及 quick 的六项直接与四项选中检查均通过。全量 TS typecheck 在两版都报同一个未改文件的 JsonValue 导入错误。当前严格回执 cqr_cb6e103a81f87f0227d5 判定失败。
语义与 CI 对齐
复用现有写入范围和修复动作的语义。完整覆盖是准入条件,过期记录承担诊断。请在同一 TypeScript owner 中修正剩余连字符,再用相同 File/SQLite 正反例复验活跃与过期两条路径。随后运行 uv run --extra test python examples/control_plane/quota-projection-repair-state-machine-smoke.py,保留现有修复断言。
我的整体评价 / Verdict
共享判定能解决原范围漏洞。现有字符类触发内部错误会让合法任务重复停在准入,也使操作者失去可执行的修复提示。这两个影响已在原生入口复现。改动沿用 quota 的现有命令与修复提示,本次差异没有视觉界面改动。 实际安装采用、原生 Windows、PostgreSQL 和远端 CI 留待验证。
English verdict: REQUEST_CHANGES for 694163d8b768ba8f20e010c17fb3c3924240c9c9. The previous findings are fixed. A legacy character class aborts File and SQLite admission, including when it appears only in an expired diagnostic for an independently authorized task. Preserve legacy class semantics and isolate optional diagnostics before re-review.
…erage Signed-off-by: Jim-jimu <49069997+bmh201708@users.noreply.github.com>
…yphens Signed-off-by: Jim-jimu <49069997+bmh201708@users.noreply.github.com>
…erage Signed-off-by: Jim-jimu <49069997+bmh201708@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
动机 / Motivation
Goal 操作者提交带写入范围的 Todo,准入检查据此决定任务能否继续。旧实现把范围表达式当成一个路径名。只有 src/?.ts 授权时,src/*.ts 会误获准入,而完整覆盖的 src/[ab].ts 可能被拒绝。
当前提交按完整路径集合验证授权。File 和 SQLite 上的 36 个对照用例均符合预期,复合字符类与过期诊断都返回了正确结果。本轮覆盖现有源码准入、子任务入口、拒绝提示和授权后恢复。原生 Windows、PostgreSQL、已安装宿主和完整运行成本仍待验证。
改动思路 / Approach
TypeScript 现有写范围判定负责覆盖关系,Python 继续投影准入和修复提示。活跃授权先判定,只有仍缺范围时才计算过期来源。当前交付范围为完整写范围准入、旧字符类兼容和过期来源提示。 单个授权或字符串比较无法判断两个授权的并集是否覆盖所需范围。现有 matcher 负责字面路径和范围表达式,复杂范围在搜索上限内无法证明覆盖时保留拒绝。
具体改动 / Changes
关键代码讲解
-
loopx/control_plane/work_items/task_lease_acquire_decision.ts:233的fnmatchCharacterClass清理反向范围后保留[!-b]中作为字面量的连字符。字面路径和范围判定共享这份字符类语义,lease 冲突仍用自己的大小写折叠规则。 -
loopx/control_plane/work_items/task_lease_acquire_decision.ts:830的schedulingWriteScopeAllowed检查是否存在未被任何活跃授权覆盖的路径。普通字面路径仍直接匹配。 -
loopx/control_plane/quota/projection_repair.py:226先使用活跃授权。缺少授权时,loopx/control_plane/quota/projection_repair.py:280单独查询对应的过期来源,失败仍返回原修复提示。
按 docs/state-interaction-model.md 在 32167518b3c2646fd9b6a3a6e0aaf74b258a7b70 的版本核对两项既有要求。Active Goal write authority 由同一范围判定覆盖选中 Todo 和子任务。Boundary repair and inactive grants 通过两个后端的拒绝、提示、正式授权与恢复读回。 固定版本的写入权限约定
对主干的风险 / Risks
-
[z-a!b]继续按原规则拒绝b,原投影 smoke 通过。[z-a!-b]准入a,拒绝b和-;已有活跃授权的任务在附带过期范围时照常继续。 上一轮报告的两处故障在当前提交上均已复核。 上轮审查 -
主干在 36 个输入中有 8 个与目标语义不符,当前提交全部符合预期。原来的误准入和覆盖误拒绝均已复核,单侧缺失授权与 Unicode 组合也包含在对照中。 独立
fnmatch对照覆盖 38,815 种字符类、737,485 次匹配,结果一致。 -
在两个真实存储后端,补写说明或新建仍缺授权的 Todo 都无法通过准入。通过原生命令补齐正式授权后,同一 Todo 恢复、验证实际输出并结算,重放后仍只有一次扣额。 所有准入探针自身均未扣额。只读 Todo 和现有 lease 冲突测试通过。
-
聚焦 Python 验证 87 项通过,主干对应相邻用例 41 项通过。TypeScript 160 项通过,PostgreSQL 1 项跳过。quick premerge 的 6 项直接检查与 3 项 smoke 均通过,工作流的 Ruff 和 7 项仓库检查、聚焦 mypy、全控制面 TypeScript 类型检查通过。 托管 CI 未查询。独立对照采用源码运行和隔离的真实 File/SQLite。
语义与 CI 对齐
沿用现有 Goal 授权、Todo 需求和修复动作。新注册的方法只传输有序的覆盖结果,既有语义门通过。覆盖无法证明时继续走修复路径,过期来源仅解释缺失范围。
我的整体评价 / Verdict
同意当前提交。正式授权补齐后,原任务能产生输出并正常结算,后续重放保留一次扣额。使用者在活跃授权足够时直接继续,范围确实不足时收到具体缺项。当前证据覆盖此次代码变更与实际恢复路径。
English verdict: APPROVE for 3dab48aecaba4763a83f6cf6072078aed32e2762. Whole-scope coverage is enforced, legacy character classes retain their behavior, and inactive hints no longer interrupt authorized work.
Goal And Delivered Outcome
src/?.tsgranted,src/*.tswas incorrectly admitted andsrc/[ab].tsincorrectly rejected.loopx-project/loopx:main, verified at44376963f8adb310f5f96d9407720a447c3b330e.Author Declaration
Implemented against
schedulingWriteScopeAllowedbuild_boundary_projection_repair_hintScope And Continuation
Validation
864409e3d850ccb0a841bc2534b2c627c2195c03.f16ecf72c71c05c27edbbdd64884cf04a5258c12; checks ran at30c6f9b6e0039495c36ea09ee3ded525e816c1b6. The final commit changes author/sign-off metadata only and has the identical tree.1175fc0; Python boundary subset: 4 failed / 4 passed. Those cases pass after repair. Both original decision modules are byte-identical at the updated base4437696.tests/control_plane_ts/write_scope_coverage.test.ts.python -m pytest -q -o addopts='' tests/control_plane/test_write_scope_coverage.py: 15 passed. Uses an isolated subprocess test transport with the real registered typed handler; does not exercise the managed daemon.npm run -s typecheck:control-plane; required kernel Ruff scope; configured mypy (17 source files); bilingual RFC check; diff hygiene.loopx canary premerge --from-git-diff --git-diff-base upstream/main: seven catalog checks failed. All direct checks, eight risk-profile smokes and the public boundary scan passed. The required gate is not green.runtime_host_permission_deniedbefore request dispatch. Observed in the existing Goal scope-projection test and semantic-vocabulary smoke; complete CLI and full-suite qualification remain outstanding.Frontend / Visual Evidence
Type of Change
LoopX Area
Technical Direction
Shared-authority RFC fixture impact
Boundary Checklist
none.Signed-off-bytrailer.Maintainer merge authorization and successful required validation remain outstanding.