Repository navigation
Fix PowerShell quoting for pinned Windows settlement commands - #8641
huangruiteng merged 7 commits into
Conversation
Signed-off-by: Tartar <xiaoyx67@mail2.sysu.edu.cn>
cocolord
left a comment
There was a problem hiding this comment.
Reviewer: model_agent · GPT-6 · OpenAI · self_reported
精确提交:8871adaa38dffcf524ff547c2eb71ef0802df647。结论暂为 REQUEST_CHANGES:补齐原生 Windows 的关键路径验证。本轮没有独立确认新的运行时缺陷;尚未验证的恰好是这项修复承诺的 PowerShell 执行与结算路径。
动机 / Motivation
Windows 上从已验证写回继续补结算的 Agent 和操作者,需要直接执行返回的命令。旧的 POSIX 引号不能正确调用带空格及单引号的 PowerShell 启动器,可能在 LoopX 启动前失败,使原 Turn 留在待结算状态。补丁旨在让手工命令与组合调用都保留原绑定、完成一次扣额并安全重放。范围限于现有补结算入口,不增加执行权限或新的结算 owner。
改动思路 / Approach
保留既有 settlement plan、收据校验和扣额 owner 是正确方向。attach_settlement_progress 在需要 PowerShell 调用运算符的启动器上重用宿主引号工具,并同时提供参数数组;settle_refreshed_turn 校验数组与命令文本的一致性,再通过原有 CLI parser 和当前 Python 包执行结算。这个边界没有复制结算规则,也没有通过显示字段扩大权限。最小后续动作是把已经写好的原生用例接入现有 Windows 验证路径并实际执行;不需要改动额外的状态、协议层或性能阈值。
具体改动 / Changes
规范依据是 docs/architecture/rfcs/monorepo-distribution-split-v0.md 与 docs/reference/protocols/turn-envelope-v0.md,版本 fdda55ce8fe9e952725428a10a788b7edbea251d。小内核 RFC 的 V2 要求原身份及单次结算,V3 要求可执行的命令与兼容诊断;这两项在新增原生 Windows 路径上仍有验证缺口。其他发行拆分、真实模型采用与跨平台完整资格保持原验收范围。
关键代码讲解
render_owed_host_command用现有宿主工具处理启动器和参数;需要&的路径在attach_settlement_progress中保留command_argv,普通路径继续使用原命令表示。settle_refreshed_turn在数组类型或文本不一致时拒绝执行,随后仍校验原 Goal、Agent、Todo、Turn、runtime、workspace 和一次扣额参数。子进程继续使用当前包与原 CLI,未直接调用底层扣额。test_pinned_powershell_launcher_settles_original_turn_once覆盖 File/SQLite 与手工/组合四种情况,并使用带空格和单引号的.ps1路径、原身份读回及重放计数。本地 macOS 因平台条件跳过全部四项。- 协议新增英中说明,区分 PowerShell 文本与直接参数调用,并保留原工作目录、启动器及结算身份。未新增必须执行的步骤、存储记录或工作权限。
对主干的风险 / Risks
[P2] 当前自动验证没有执行新增原生回归。 此头的 .github/workflows/python-tests.yml 中 Windows lifecycle 文件列表没有 tests/control_plane/test_refresh_settle_turn.py;六个普通 pytest 分片运行在 Linux,会跳过新增 Windows-only 用例。现有 Windows job 131038620350 的已完成日志在更早的 CLI 输出预算检查处失败,不能提供这四项的通过证据。作者声明本地 Windows 六项通过;本轮未取得能独立核对该执行的原生结果,不把该声明当作已完成评审验证。
最低补齐方式是沿用现有 Windows job 执行新增的四种组合及 workspace 拒绝恢复用例,读回原绑定、首次单次扣额、重放无新增扣额,并与不可变基线的原始引号失败作对照。相邻无关预算失败保留原归因和状态,无需由这个 PR 放宽阈值。
PASS:31 项 import-boundary 测试,以及变更文件 Ruff、diff whitespace 与 RFC bilingual 检查。聚焦结算测试为 4 passed、4 skipped;跳过项就是原生 Windows 四种组合。较宽结算套件由评审者中断并收敛到上述聚焦范围,不能记为全量通过。静态阅读确认原结算和 workspace 检查仍在;PowerShell 真正启动、异常恢复及 Windows 一次扣额仍为 UNVERIFIED。
语义与 CI 对齐
新增数组是命令的派生表示,不能单独取得权限;原身份与收据仍决定能否结算。V2/V3 的验证缺口应由原生宿主回归补齐,不能用模拟 _is_windows_host 后得到正确字符串代替实际执行。现有 CI 红项和待运行项另属 merge-readiness,不据此断言补丁引入了其他浏览器或预算回归。
我的整体评价 / Verdict
这是贴近小内核 V2/V3 的集中修复,源码层面的 owner、兼容分支与体量均合理。长程恢复和操作者体验的实际改善仍待原生关键路径证明,因此当前不批准、不合入。这里没有渲染界面变化,无截图要求;未验证原生 Windows、安装后采用及真实模型消费。补齐已写用例的自动执行和不可变基线对照后,可直接沿同一边界复审。
English verdict: REQUEST_CHANGES - 8871ada: the focused PowerShell repair uses the existing settlement owner, but its native Windows launcher/replay tests are not exercised by the current Windows workflow and all four skip locally. Execute and read back the native recovery cases before approval; unrelated CI failures remain separate.
Signed-off-by: Tartar <xiaoyx67@mail2.sysu.edu.cn>
|
已按 review 补齐原生 Windows 关键路径,更新后的 exact head 为 作者验证(不是独立批准):
Frontstage、browser shard 2 和既有 CLI output differential 仍按原归因保留在 #8641 范围外;本提交没有修改这些实现、fixture 或阈值。新的 hosted CI 已由 push 触发,待 exact-head readback。 |
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
复审提交:05cfe10e623a388081690d25193d8d3c51772e46。
请求修改。Windows 测试已接入 workflow,但相对 launcher 的恢复命令仍可把 registry 参数传错。
动机 / Motivation
在 Windows 上补结算已生成 durable readback 的 LoopX 运营者。 上一轮缺失的 Windows 测试调用已加入。用合法相对 launcher 并将单引号放在后面的 registry 路径时,当前命令仍错误拆分参数。 实际 PowerShell 7.7.0 和精确提交的 CLI parser 对照:相对 ./bin/loopx.ps1 配合 C:\Users\O'Neil\registry.json,生成的命令把 registry 截成 C:\Users\O 并使 parser 返回 2;同一参数向量经现有 PowerShell renderer 后完整到达且 parser 接受。 独立验证使用 macOS 上的 PowerShell 7.7.0 和源码 CLI 参数解析,Windows 原生账本、已安装路径和远端 CI 未独立运行。
合法的相对 launcher 不触发 PowerShell renderer,仍有恢复缺口。 依据 docs/reference/protocols/turn-envelope-v0.md(fdda55ce8fe9e952725428a10a788b7edbea251d)。 核验项:Q-ORIGINAL-TURN, Q-POWERSHELL-ARGV, Q-WINDOWS-TEST-WIRING。
改动思路 / Approach
现有 quota owner 继续生成原 Turn 的结算路由,shell renderer 只负责传递完整参数;保留 CLI parser 和原权威校验。 修复 Windows 恢复命令的参数保真;保留同一 Turn 身份、额度和原有权限。 durable readback → 构造原路由 → host 渲染 → CLI parser → 原 Turn 结算校验。 复用现有 PowerShell renderer,不新增结算协议或权限。
具体改动 / Changes
- render_owed_host_command:用 host 规则渲染整个 argv。
- attach_settlement_progress:组装 owed settlement 的同一 Turn 和 provider 路由。
- host_command:只看 launcher 是否渲染为 &,因而可能让后续参数走 POSIX 格式。
路径仅有空格时,相对 launcher 正确;launcher 自身需要引号时进入现有 renderer,含单引号的 registry 也正确。 POSIX 恢复与重放 6 项通过,Windows workflow 的本地覆盖检查 3 项与 19 个子项通过。
对主干的风险 / Risks
实际参数解析在结算动作前拒绝。证据没有显示错误扣费;它证明受影响的恢复命令无法推进。相同输入在合并基点与当前都失败,现有补丁未覆盖这个 launcher 分支。Windows workflow 已接入但未查询其远端结果。 这条路径应通过参数向量保存原 registry,而不能在调用前改写原路由。 Ruff、签署、diff、双语 RFC 和与 708c68e 的合入模拟已检查。
我的整体评价 / Verdict
上一轮关于测试未被 Windows workflow 调用的意见已落实;新发现影响补结算能否到达原路由,需修复后复审。 按 Windows host 为整条恢复命令选择现有 render_owed_host_command,不依赖 launcher token 是否需要 &。补相对 launcher 和含单引号的后续路径,覆盖 File / SQLite 的原 Turn 结算与重放。 未改变渲染界面;该行为通过源码命令和调用方回读。
English verdict: REQUEST_CHANGES. Head 05cfe10. A valid relative PowerShell launcher still selects POSIX escaping for later arguments. Render the complete Windows recovery command with the existing host renderer and test the original Turn and replay.
| } | ||
| # A quoted PowerShell executable needs the call operator. Keep the argv | ||
| # separately in this case so the composed CLI can execute it without a shell. | ||
| if host_command(route[0]).startswith("& "): |
There was a problem hiding this comment.
[P2] 实际 PowerShell 7.7.0 和精确提交的 CLI parser 对照:相对 ./bin/loopx.ps1 配合 C:\Users\O'Neil\registry.json,生成的命令把 registry 截成 C:\Users\O 并使 parser 返回 2;同一参数向量经现有 PowerShell renderer 后完整到达且 parser 接受。 按 Windows host 为整条恢复命令选择现有 render_owed_host_command,不依赖 launcher token 是否需要 &。补相对 launcher 和含单引号的后续路径,覆盖 File / SQLite 的原 Turn 结算与重放。
…ent-owed-command Signed-off-by: Tartar <xiaoyx67@mail2.sysu.edu.cn>
Signed-off-by: Tartar <xiaoyx67@mail2.sysu.edu.cn>
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
复审提交:356e4e11f175f9858f9c75d3ad8677972cfb4e45。
[P2] 恢复命令仍无法执行包含弯单引号的合法 Windows 路径。
动机 / Motivation
复制执行 Windows 补结算命令,或通过既有组合 CLI 恢复原 Turn 的操作者。 这版让全部 Windows 参数走 host renderer,普通单引号路径已修;合法路径含 U+2019 弯单引号时,命令仍在 Launcher 启动前失败。 实际 PowerShell 7.7.0 对照:相对 ./bin/loopx.ps1 与已加引号的 launcher 都无法执行含 C:\Users\O’Neil\registry.json 的 emitted command(exit 1,启动标记未出现);将同一 argv 的弯单引号正确转义后,参数原样到达且现有 CLI parser 接受。 独立 shell 证据来自 macOS 的真实 PowerShell 7.7.0,显式选择 Windows 渲染分支;未独立运行原生 Windows 账本、已安装入口或远端 CI。
PowerShell 把未转义的 U+2019 当作引号。合法的 registry 路径使手动恢复命令在启动前退出;argv 没有丢字节,缺口在 command 的渲染。 依据 docs/reference/protocols/turn-envelope-v0.md(708c68e7040559b2a4368002439570b90bc080b2)。 核验项:Q-ORIGINAL-TURN, Q-POWERSHELL-ARGV, Q-WINDOWS-TEST-WIRING。
改动思路 / Approach
现有 TypeScript settlement owner 定义原身份及步序,Python 适配只负责 host 参数表示;组合调用继续校验 command_argv 与文本以及原路由。 仅 Windows 补结算命令显示与组合入口;既有 POSIX 命令路径、权限和额度 owner 保持。 生成原结算路由 → 渲染全部 Windows 参数 → PowerShell 传参 → CLI 核验原身份。 继续分支于首 token 会重开已修场景;只修共享宿主引号即可,无需新结算 owner。
具体改动 / Changes
- render_owed_host_command:用现有宿主工具渲染整条命令;弯单引号也需要转义。
- attach_settlement_progress:所有 Windows 路径现在携带原 command_argv,同时展示 host 命令。
- settle_refreshed_turn:校验文本和参数向量一致,再用旧的 parser 和结算权限检查。
- test_pinned_powershell_launcher_settles_original_turn_once:覆盖相对和带引号 launcher 以及重放。
- windows-powershell:接入原生恢复与工作区检查,结束后恢复其余步骤的 Node。
真实 shell 在相对和带引号两种 launcher 上均接受含空格、ASCII 单引号的 registry;原失败用例现在 argv 保真。 POSIX 原工作区/结算/重放和本地 Windows lane 结构合计 9 项、6 子项通过。
对主干的风险 / Risks
组合入口保留原向量。此次对照验证的是手动补结算的可执行文本,错误发生在启动前,没有观察到错扣。修复应在原宿主工具保持同一套转义。参见 PowerShell 官方引号规则。 本次属于现有入口修复,分阶段 RFC 经验不改变验收范围。精确源码的 Ruff、签署、diff、双语门和主干合入模拟均检查;不以 CI 结论代替以上对照。
我的整体评价 / Verdict
请求修改。先完成这条现有入口的独立反例,再复审。 在既有 PowerShell 参数及可执行文件引号工具里把弯单引号与 ASCII 单引号统一安全转义;在真实 PowerShell 下验证相对 launcher 和带弯单引号的路径,保留原 identity 与重放对照。 未改变渲染界面;该行为通过源码命令和调用方回读。
English verdict: REQUEST_CHANGES. Head 356e4e1. The relative launcher and ASCII apostrophe now work. An unescaped typographic apostrophe still prevents the emitted PowerShell command from starting; escape it in the shared renderer.
| # Keep the argv for the composed CLI so it does not have to parse shell text. | ||
| if os.name == "nt": | ||
| argv = shlex.split(command) | ||
| owed.update(command=render_owed_host_command(argv), command_argv=argv) |
There was a problem hiding this comment.
[P2] 实际 PowerShell 7.7.0 对照:相对 ./bin/loopx.ps1 与已加引号的 launcher 都无法执行含 C:\Users\O’Neil\registry.json 的 emitted command(exit 1,启动标记未出现);将同一 argv 的弯单引号正确转义后,参数原样到达且现有 CLI parser 接受。 在既有 PowerShell 参数及可执行文件引号工具里把弯单引号与 ASCII 单引号统一安全转义;在真实 PowerShell 下验证相对 launcher 和带弯单引号的路径,保留原 identity 与重放对照。
Signed-off-by: Tartar <xiaoyx67@mail2.sysu.edu.cn>
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
复审提交:6927981a2f29b7305dbda2772752acf77b34f60d。
[P2] 弯单引号已修,但返回的命令仍无法通过仓库自带的 PowerShell 启动脚本。
动机 / Motivation
用 Windows PowerShell 复制补结算命令,继续已经写回的工作轮次的操作者。 上一轮的弯单引号问题已修。当前命令经仓库自带的启动脚本执行时,裸写的两个数字会先被 PowerShell 解析成整数,补结算依然启动不了。 真实 PowerShell 执行精确提交的 scripts/loopx.ps1:File 和 SQLite 都在 Python 启动前报 System.Int32 没有 StartsWith,扣额为零。只给 --slots 1 加引号仍失败;同时保留 --max-page-output-bytes 64000 的字符串类型后,同一原轮次各扣一笔,重跑没有新增。 独立验证在 macOS 的真实 PowerShell 7.6.9 运行精确源码与实际 .ps1;对呈现层显式选择 Windows 分支。未运行 Windows 原生系统或远端 CI。
返回的 PowerShell 命令仍不能经仓库自带的启动脚本恢复:数字参数被解析成整数,脚本扫描参数时抛错。 依据 docs/reference/protocols/turn-envelope-v0.md(708c68e7040559b2a4368002439570b90bc080b2)。 核验项:Q-ORIGINAL-TURN, Q-POWERSHELL-ARGV, Q-WINDOWS-TEST-WIRING。
改动思路 / Approach
TypeScript 继续拥有原结算身份和步骤,Python 只生成宿主命令文本与同源 argv,随后由现有 CLI 验证原身份。 现有补结算入口、共享引号工具和 Windows 测试接线;原工作区、权限、账本及 POSIX 命令保持。 按原回执生成待扣额参数 → 用现有宿主工具渲染 → 正式 PowerShell 启动脚本处理参数 → 原 CLI 复核身份和回执。 继续扩展转发夹具不能证明正式脚本可用;保留现有 renderer 和结算 owner,在实际启动边界约束参数类型即可。
具体改动 / Changes
关键代码讲解
- powershell_literal:统一倍写 ASCII 及四种弯单引号,安装提示、doctor 和项目提示共用该函数。
- render_owed_host_command:从原 argv 生成 Windows 文本,数字仍以裸词出现。
- attach_settlement_progress:Windows 同时投影原参数数组和可复制文本,不改原回执。
- settle_refreshed_turn:核对数组与文本一致后交给原 parser、工作区和原身份检查。
- windows-powershell:把原生 Windows 用例接入原 lane,运行后恢复后续步骤使用的 Node。
12 种相对或需加引号的启动器、路径及四种弯单引号都传入完整 argv;上一头仅 2 种、合并基点仅 1 种。POSIX 输出逐字一致。
Q-ORIGINAL-TURN:原身份和工作区保持。Q-POWERSHELL-ARGV:参数转发用例通过,正式启动器仍失败。Q-WINDOWS-TEST-WIRING:现有 lane 已接入,测试的转发脚本未走正式启动器的参数扫描。
对主干的风险 / Risks
这个 renderer 仍把数值作为裸词输出。真实 PowerShell 调用仓库的 scripts/loopx.ps1 时,裸写的 --slots 1 或 --max-page-output-bytes 64000 会进入 $args 成为 Int32;脚本在第 47 行扫描参数时调用 StartsWith,Python 尚未启动。两种存储均零扣额。将两个数字都作为字符串后,原轮次各结算一次,重跑无新增。请在正式启动路径保留参数类型,并用自带的 .ps1 作回归。
最小修法:在既有启动脚本扫描前统一将传入参数转成字符串,或在生成命令时把数值参数呈现为 PowerShell 字符串;用仓库自带的脚本执行原样返回的命令,对照零扣额、原身份单次结算和重跑。
全源码聚焦套件 77 过、11 跳过、19 个失败节点与基点相同;保留失败,不计为通过。Windows lane 的接线检查、工作区拒绝、单次扣额用例、Ruff、diff、双语门和主干合入模拟已核对。
语义与 CI 对齐
参数和文本是同一身份的派生表示;原工作区和回执仍负责授权与单次扣额。没有用远端 CI 代替上述对照。
我的整体评价 / Verdict
请求修改。弯单引号已修;请让正式启动脚本能够执行补结算命令,再在同一范围复审。 数值类型问题在启动脚本中已经存在。这次修复让命令通过了引号解析,但已写回的轮次仍卡在启动脚本,所以可复制执行的恢复路径还未验证通过。
English verdict: REQUEST_CHANGES. Head 6927981. The Unicode quoting fix passes, but the shipped PowerShell launcher rejects bare numeric options before Python. Keep the options as strings and test the emitted command through the shipped launcher.
|
|
||
|
|
||
| def render_owed_host_command(argv: list[str]) -> str: | ||
| return " ".join([host_command(argv[0]), *(shell_arg_for_host(arg) for arg in argv[1:])]) |
There was a problem hiding this comment.
这个 renderer 仍把数值作为裸词输出。真实 PowerShell 调用仓库的 scripts/loopx.ps1 时,裸写的 --slots 1 或 --max-page-output-bytes 64000 会进入 $args 成为 Int32;脚本在第 47 行扫描参数时调用 StartsWith,Python 尚未启动。两种存储均零扣额。将两个数字都作为字符串后,原轮次各结算一次,重跑无新增。请在正式启动路径保留参数类型,并用自带的 .ps1 作回归。
…ent-owed-command Signed-off-by: Tartar <xiaoyx67@mail2.sysu.edu.cn>
Signed-off-by: Tartar <xiaoyx67@mail2.sysu.edu.cn>
loopx-agent
left a comment
There was a problem hiding this comment.
复审提交 3a43c89。
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max
动机 / Motivation
在 PowerShell 从原工作区复制补结算命令的操作者会遇到这个问题。 上一版把数字形态参数传成整数,这一版按 PowerShell 字符串逐项呈现 argv。 原样执行新命令后,File 和 SQLite 各结算原轮次一次。重跑返回原回执,账本字节相同。 独立复验在 macOS 的 PowerShell 7.6.9 中使用实际仓库启动脚本,并显式选用 Windows renderer。原生 Windows 系统与远端 CI 未在本轮独立验证。 Q-ORIGINAL-TURN、Q-POWERSHELL-ARGV、Q-WINDOWS-TEST-WIRING 对应以下验收。原生 Windows 的执行结果仍由 Windows lane 验证。 已接受的规范
改动思路 / Approach
本次范围是现有补结算命令的宿主呈现、同一入口的校验及 Windows 测试接线。共享字面量工具保留直引号和弯引号,结算渲染逐项引用参数,包括 --slots 和 --max-page-output-bytes 的数字值。组合结算入口用同一 renderer 重核文本。 结算命令渲染 · 组合结算
具体改动 / Changes
- 同一已写回轮次用旧 POSIX 命令文本时,实际启动脚本退出 1,补扣额仍为零。 新增验证也覆盖带空格、普通引号及弯引号的 registry 路径,以及相对启动器路径。调用通过正式脚本进入原结算。 共享转义
- 聚焦源码测试 96 通过、11 项原生 Windows 用例跳过、19 个子测试通过。 精确 10 文件范围的 6 项直接检查和 19 项标准检查通过,且同范围 change-quality 回执已验证。 七个非合并提交均有 DCO 签署。 补结算测试
对主干的风险 / Risks
独立复验在 macOS 的 PowerShell 7.6.9 中使用实际仓库启动脚本,并显式选用 Windows renderer。原生 Windows 系统与远端 CI 未在本轮独立验证。 错误工作区和普通刷新由聚焦测试覆盖。错误工作区会在扣额前返回原命令及修复指引,重试使用原轮次回执。 结算协议
我的整体评价 / Verdict
批准这个提交。实际启动器复验解决了上一版的数值参数错误。现有工作区校验仍挡住不匹配的调用,合并还需单独核对其余评审门。独立的重放对照也确认原账本只记一笔。
English verdict: APPROVE. The emitted command settles the original Turn through the shipped PowerShell launcher on File and SQLite. Replaying it preserves the ledger. Exact-scope local checks passed.
Goal And Delivered Outcome
fdda55ce8fe9.settlement_owed.commandinto PowerShell now runs the pinned launcher. The first run settles the original Turn and replay leaves exactly one debit.main; standalone repair for the existing quota settlement projection.Author Declaration
Implemented against
attach_settlement_progresstest_pinned_powershell_launcher_settles_original_turn_oncesettle_refreshed_turntest_wrong_or_missing_child_workspace_retains_owed_command_for_exact_recoveryScope And Continuation
Validation
8871adaa38dffcf524ff547c2eb71ef0802df647regression_paritypassedreal_entrypointpassed.ps1path with spaces and an apostrophe. Manual and composed settlement for File and SQLite, including replay.integrationpassedstaticpassedgit diff --check.