Repository navigation
[Experimental / RFC] Windows fail-closed、native typed argv/逐流输出与Agent显式选路 - #26
Conversation
|
感谢这份 RFC——克制的标注(Experimental/RFC、明确「不是恢复真正 Windows 围栏」、不因测试绿请求合并)和两份设计文档正是我们希望看到的提交方式。维护者已对核心问题做出裁决: 裁决:接受 fail-closed 方向,但必须加运行时开关,且默认开启
在开关落地 + rebase 之前,本 PR 保持 RFC 状态,不进入正式 review。 再次感谢克制与文档质量——这正是这个仓库需要的贡献方式。 |
124f8f7 to
1c0248b
Compare
实机测试报告(本机已装插件,非源码/单元脚本)针对本 PR 已部署到本机 desktop profile 的 环境:Windows 10 / Git for Windows Bash 5.3.15( 会话政策分三段:
结论三条入口在本机 主路径可用,关键门控有效。
1.
|
| 用例 | 结果 |
|---|---|
身份:BASH_VERSION / uname / git --version |
Bash 5.3.15,MINGW64_NT,git 2.56.0.windows.2 |
~ /tmp /dev/null 盘根 |
解析正常 |
管道、glob(/usr/bin/bash*)、重定向、中文 UTF-8 |
通过 |
workdir=/tmp |
pwd → /tmp |
后台 sleep 3 |
completed,exit 0,输出含 bg-done-* |
false 后 $? |
1 |
ipconfig /all |
失败 exit 1(MSYS 吃掉 /all,打印用法) |
ipconfig //all |
成功,但 bash 按 UTF-8 收 GBK,中文乱码 |
cmd /c echo ... |
失败(/c 被当成盘根,进入交互 cmd) |
cmd //c echo ... |
成功 |
2. gitbash_to_native_path
| 输入 | 结果 |
|---|---|
/c/Users/<user> |
C:/Users/<user> |
~ / $HOME |
<home>(C:/Users/<user>) |
/tmp |
C:/Users/<user>/AppData/Local/Temp |
/dev/null |
\\.\NUL |
/usr/bin/bash |
c:/program files/git/usr/bin/bash |
/c/Program Files/Git/usr/bin/bash(空格) |
C:/Program Files/Git/usr/bin/bash |
/c/Users/<user>/测试 目录#hash(中文/空格/#) |
原样映射到 C:/Users/<user>/测试 目录#hash |
已是原生 C:\Users\<user> |
保留反斜杠 |
相对路径 foo/bar |
原样返回 |
/ucrt64/bin/git |
拒绝 NO_MOUNT_MAPPING(不把 POSIX 原样冒充 native) |
https://example.com/path |
拒绝 [URL] |
| 空字符串 | 拒绝 [EMPTY] |
3. gitbash_native
| 用例 | 结果 |
|---|---|
ipconfig.exe + 字面 /all,stdout=gbk |
exit 0,中文「Windows IP 配置」正常(未记录适配器/地址) |
whoami.exe utf-8 |
<host>\<user> |
可执行文件用 MSYS 路径 /c/Windows/System32/whoami.exe |
同样成功 |
git.exe --version |
git version 2.56.0.windows.2 |
git -C + kind:path 指向本机一个 git worktree + rev-parse --short HEAD |
exit 0,打印该 worktree 的 short HEAD(路径 argv 已翻译) |
typed cwd = /tmp |
whoami 仍成功 |
cmd.exe /c 未声明 entrypoint: interpreter |
拒绝(已知解释器必须显式 interpreter) |
补上 entrypoint: interpreter 后字面 /c echo native-cmd-ok |
native-cmd-ok,/c 未被转成盘根 |
foo.cmd / foo.bat |
拒绝:only native .exe;never wrap .cmd/.bat |
非绝对路径 whoami |
拒绝:unresolved or non-absolute typed path |
stdout=raw(whoami) |
exit 0;reliableText=false,保留 raw bytes,不把原文当 UTF-8 文本 |
stdout=utf16le 套在实际并非 UTF-16 的 whoami 上 |
exit 0 仍保留;解码呈乱码(声明编码被应用,不是自动探测) |
后台 ping.exe 127.0.0.1 -n 2,encoding=gbk |
completed,exit 0;中文 Ping 统计正常 |
4. 沙箱 / fail-closed
4.1 workspace-write
| 用例 | 结果 |
|---|---|
WW 下 bash(echo + pwd + 写 /tmp/dsh-pr26-ww-probe.txt),不升权 |
执行前拒绝。无可用 Windows Git Bash 围栏;命令未启动;禁止 unconfined 降级;禁止换工具绕过 |
WW 下 gitbash_native whoami.exe,不升权 |
执行前拒绝。无 confined backend adapter;RO/WW/缺失策略在 spawn/artifact 前拦截 |
WW 下 gitbash_to_native_path /c/Users/<user> |
仍可用:C:/Users/<user>(纯转换,不启动进程) |
对同一条 bash 探测单次批准 danger-full-access |
真正执行:pwd → 会话工作区;写出 /tmp/dsh-pr26-ww-probe.txt,内容 sandbox-write-probe |
升权之后、不再带批准再打 bash |
再次 fail-closed,命令未启动(单次批准未变成长期 full-access) |
升权之后、不再带批准再打 gitbash_native |
再次 fail-closed。该工具无 per-call 升权参数,WW 下只能拒绝 |
4.2 read-only
| 用例 | 结果 |
|---|---|
RO 下 bash(echo + pwd),不升权 |
执行前拒绝。文案与 WW 同类:无可用 Windows Git Bash 围栏;命令未启动;禁止 unconfined 降级;禁止换工具绕过。错误串标明 requested mode 为 read-only |
RO 下 gitbash_native whoami.exe,不升权 |
执行前拒绝。无 confined backend adapter;RO/WW/缺失策略在 spawn/artifact 前拦截 |
RO 下 gitbash_to_native_path /c/Users/<user> |
仍可用:C:/Users/<user> |
对同一条 bash 探测单次批准 danger-full-access |
真正执行:输出 ro-should-refuse,pwd → 会话工作区 |
升权之后、不再带批准再打 bash |
再次 fail-closed,命令未启动 |
升权之后、不再带批准再打 gitbash_native |
再次 fail-closed。无 per-call 升权参数 |
WW 与 RO 的拒绝语义一致,仅 requested mode 字符串不同。
仍未覆盖(不能当成通过)
- 未解析 / 缺失策略的实机 fail-closed(本机只打到明确的
danger-full-access/workspace-write/read-only) - 关闭
experimentalNative后的旧行为回退 - 真实 LLM 自主选路、生产 GUI、非 CRT 解释器 quoting 矩阵
- 真 Windows confinement / ACL / token / IPC
gb_*FastCtx、变体 preset、pwsh显隐(不是本 PR 三条入口的实机范围)
在上述缺口补齐前,这份报告只证明:本机已装实验构建上,三条路由入口和所列门控可工作;workspace-write 与 read-only 下自有 Bash/native 会 fail-closed,单次 full-access 批准可以放行 bash 且不粘滞。 不能当作发布或安全放行。
ddf82cf to
771c618
Compare
设计层 Review(第一轮,RFC 状态)基于分支当前头(771c618 / 33fa213,基线 114dcde = v0.39.3)与两份设计文档。结论先行:裁决全部落实,设计质量很高;有三个点需要处理/确认,然后 rebase 一次即可进入正式 review。 裁决落实核对(全部通过)
需要处理的三个点① Rebase 到 v0.39.4(硬性,机械冲突)。main 在你的基线(114dcde)之后前进了 v0.39.4(52da331): ② 组合盲区知情确认(裁决已给,请知悉并落一条文档)。「experimentalNative 默认 true」×「dsh-ops 同装」×「受限会话(read-only/workspace-write)」的组合:我们的 bash 拒绝(fail-closed)、 ③ session-workdir 双实现收敛(rebase 时定)。分支携带你的 下一步Rebase 完成 + ①的场景断言补上后,请把 PR 从 Draft 转为 ready(或直接说明),我们按你建议的两步拆分进入正式 review:① fail-closed + 开关/UI/拒绝引导/回退;② native/path、逐流输出与选路。转正式的四项门槛(真实 Agent 选路、生产 GUI、维护者 win32 真机、非 CRT 矩阵)保持不变。 |
…companions - smoke: drop main-side text assertions for GITBASH_ROUTE_ADDENDUM sentences that moved into applyToolRouting (inline-tools.js) with the native RFC; keep the branch's applyToolRouting/pwshVisible/msys wiring assertions. - runtime-preview: new actual-Core assertion for review item 1 — on a single-install face (no gb_*, no ops_*) with fastctxTools OFF (the v0.39.4 default), companion registration detection still mounts gitbash_native / gitbash_to_native_path (design doc §10 semantics); the disabled bridge never resolves the payload (createRequireFrom / msysToWin tripwires prove the gate).
- design doc §3 experience table: state the combined blind spot — a restricted session with dsh-ops co-installed has zero command tools under both plugins' defaults (our bash is fail-closed, ops_bash publishes full-access only, gb_* defaults off); the escape is turning off experimentalNative or switching the session mode. - design doc §12: mark the upstream sync checkbox at v0.39.4 (52da331) and point at the new fastctxTools-OFF companion assertion. - CHANGELOG: new Unreleased section covering the rebase onto v0.39.4, review items 1-3, and the 235/235 + 86/86 green runs.
- verification doc: move the baseline reference to v0.39.4 (52da331) and append the 2026-10-15 round (235+1 guard / 86 green runs, cross-check and mutation-test notes, inherited FastCtx card copy flagged as an upstream issue to report in the PR). - smoke: source assertion that the session-workdir seam stays modular (bash-tool.js imports resolveSessionCwd, no inline workingDirectory fallback returns), guarding review item 3 against silent divergence. - CHANGELOG: accurate disabled-bridge wording (unpublish short-circuit judged by the disabled log assertion), the new guard count, and the PR ready-state per the maintainer's first-round instruction.
33fa213 to
8603357
Compare
|
第一轮设计评审的三项要求已全部实施完毕,分支已推送( ① rebase 到 v0.39.4(52da331)+ 新断言
② 组合盲点文档
③ session-workdir 双实现收敛
验证:普通完整回归 236/236、实际 Core 完整 preview 86/86(desktop-next host,Core 0.2.0-rc.1),均 exit0、无 skip/cancel;经两轮隔离子代理交叉核验(含变异测试)通过。CHANGELOG 与验证文档已同步本轮记录。 状态声明:PR 已为非 draft,按评审意见「rebase + ①断言完成后声明 ready」——本 PR ready for review。 遗留说明(未在本分支改动,供裁决)
四项正式验收门槛(真实 Agent 自主选路、生产 GUI、维护者 Windows 全量验证、非 CRT 矩阵)仍列于设计文档 §12。 |
…ated) in all 21 locales Found by KouzakiUmi's PR #26 review follow-up: v0.39.4 flipped the fastctxTools default but left the 21-locale fctx.hint copy saying 'on by default'. Copy-only fix; the reader logic (=== true) was already correct in v0.39.4.
Round 1 验收:三项全部确认 ✅,遗留说明两条采纳,进入正式 review① Rebase + 场景断言:确认 rebase 到 52da331(v0.39.4)、MERGEABLE;新增的「单装 + ② 盲点文档:采纳,且你的遗留说明 ② 观察正确,请修正措辞:同装 dsh-ops(file 组件默认开)时 ③ session-workdir 收敛:保留模块化版 + smoke 防双实现静默回归断言——采纳。 遗留说明 ①(卡文案):确认是 main 的 v0.39.4 疏漏—— 状态:PR ready 接受。按两步拆分进入正式 review——第一步:fail-closed + 另外告知:main 在你 rebase 之后又前进了一笔(上面的 0e46277,纯 client 文案,不触你的分支文件)——本轮不需要再 rebase,下一步 review 若有基线要求会明说。 |
Maintainer review — merged 🎉Thank you @KouzakiUmi for a model contribution: the full RFC (design + verification docs with honest evidence tiers), the isolated-subagent self-review that caught the P2 companion-ownership bug before we did, and a clean rebase onto v0.39.4. Review passed against the maintainer checklist, both rounds:
Two follow-ups we are taking on the main branch right after the merge (per the maintainer's call to merge now):
The experimental hat stays on until the four graduation gates (real agent self-routing, production GUI, maintainer Windows full validation, non-CRT interpreter matrix) are met. Merged as squash; you are in the release notes. Thanks again! |
…sed) and fix the §3 co-install blind-spot sentence
[Experimental / RFC] Windows fail-closed、native typed argv/逐流输出与 Agent 显式选路
行为与维护者裁决
按照维护者裁决,
gitbash-shell行 Config 提供 volatile 布尔 experimentalNative,默认 true(旧配置缺键同样开启),统一控制 fail-closed 和两个 companions。设置路径:设置 → 插件 → dsh-gitbash-shell → 实验原生执行 / fail-closed。
修改作用于现有会话后续调用,无需重启;已开始的后台 producer 保留生命周期。关闭后 shell 文件写入限制不执行,不能视为恢复真 Windows 围栏。路径方言/codePaths/子代理方言开关独立。
拒绝错误说明设置关闭路径以及用户在会话访问模式控件选择 danger-full-access 的路径;Agent 不得自行放宽权限、换工具或文件 I/O 绕拒绝。native 在准备入口、异步准备后、执行入口和最终 spawn 重验开关与 policy。
实验实现
沿用 route B 的 agent-owned 工具 scope 与 operation-owned 执行 scope,官方 root PowerShell/provider 保留。已有同名工具不覆盖;缺 native 公开能力不撤 Bash/path。官方未来开放对应 native/encoding/closed DTO API 时,按官方优先纪律整体迁移并退役插件私有实现。Artifact ownership/quota/retention 由插件自管;后台 Jobs/controller admission 不可用时明确拒绝,不静默改前台重复执行。
本轮进展(2026-10-14)
独立审查与本轮修复
未继承对话历史的子代理重新审查完整增量,确认一项 P2:OFF 期间外部注册同名工具,恢复 ON 后全局工具被遮蔽,同 agent 工具则抛 duplicate 异常并阻断后续 companion 注册。本轮已修复全部确认问题:
gitbash_to_native_path与gitbash_native共用按 agent 检查所有权的注册入口,每次刷新先注销自身注册,再检查外部全局/同 agent 所有者。实际 Core 的 knownNames 包含隐藏工具;旧宿主回退 schemas 检查,旧宿主隐藏工具行为尚未独立验证。分步审查建议
继续建议两步 review:① Bash fail-closed、唯一 Config 开关/UI、拒绝引导与旧行为回退;② native/path、输出生命周期与可见性路由。第二步复用第一步的同一字段。当前保留完整 Draft/RFC 和跨层回归,尚未另开子 PR。
验证
环境:Windows / Node 24.13.0 / Core 0.2.1-alpha.2。
已安装实验构建的三入口实机报告提供有限外部证据:入口主路径、RO/WW 拒绝、单次 Bash 批准不粘滞。报告未记录精确提交,也明确未覆盖开关 OFF、真实 LLM 自主选路、生产 GUI 与非 CRT 矩阵,不作为当前 rebase 构建的完整生产验收。
正式 review / release 尚待
四项齐后才谈 ready for review → release。真 Windows confinement/ACL/token/IPC/VM、SSH/PTY、真实磁盘耗尽/吞吐/RSS/跨任务 quota/purge 仍无完整验收,不据测试绿色宣称生产可用。