Skip to content

[Experimental / RFC] Windows fail-closed、native typed argv/逐流输出与Agent显式选路 - #26

Merged
KannaKuron merged 9 commits into
KannaKuron:mainfrom
KouzakiUmi:experiment/windows-native-argv-path-routing
Oct 15, 2026
Merged

KannaKuron merged 9 commits into
KannaKuron:mainfrom
KouzakiUmi:experiment/windows-native-argv-path-routing

Conversation

@KouzakiUmi

@KouzakiUmi KouzakiUmi commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

[Experimental / RFC] Windows fail-closed、native typed argv/逐流输出与 Agent 显式选路

Draft / RFC,尚未完成正式验收。
已 rebase 到上游 v0.39.3 与 PR #28 后续修复后的 main。前置 PR #24 已合并;PR #28 的兼容与 scope 清理改进已被上游吸收。本 PR 的完整 diff 现在仅包含实验增量。
最新所有权修复与验证更新。包版本跟随基线 0.39.3,实验功能未正式发布。

行为与维护者裁决

按照维护者裁决,gitbash-shell 行 Config 提供 volatile 布尔 experimentalNative,默认 true(旧配置缺键同样开启),统一控制 fail-closed 和两个 companions。

设置路径:设置 → 插件 → dsh-gitbash-shell → 实验原生执行 / fail-closed。

状态 自有 Windows Bash 两个新工具
ON(默认) RO/WW/未确定策略执行前拒绝;实际 resolved danger-full-access 才执行 公开能力可用且不冲突时注册
OFF 恢复旧版明确标注 enforcement:unconfined 的 Bash 及实例级日志;未确定策略保留旧宿主委派 实时注销,旧 SDK 引用也拒绝

修改作用于现有会话后续调用,无需重启;已开始的后台 producer 保留生命周期。关闭后 shell 文件写入限制不执行,不能视为恢复真 Windows 围栏。路径方言/codePaths/子代理方言开关独立。

拒绝错误说明设置关闭路径以及用户在会话访问模式控件选择 danger-full-access 的路径;Agent 不得自行放宽权限、换工具或文件 I/O 绕拒绝。native 在准备入口、异步准备后、执行入口和最终 spawn 重验开关与 policy。

实验实现

  • gitbash_to_native_path: 完整 caller-declared MSYS 值转 native_path,复用 fresh mount facts,不转换 route/search/code,不授文件权限。
  • gitbash_native: 绝对 typed executable/cwd 与 literal/path argv;literal 不经过 MSYS,只显式 path 转换。复用公开 Core LocalBashExecutor.executeArgv、managed provider、Jobs 与 credential scrub。
  • 输出: stdout/stderr 独立 utf8/gbk/utf16le/raw、incremental decoding、raw/normalized UTF8 artifacts、独立 byte cursor、closed facts DTO。未知同流混编码不猜;显示失败保留真实 producer outcome,不盲目重跑。
  • 生命周期: operation-owned cancel、准备有界期限、有限 drain;默认两流 raw+decoded 磁盘 8MiB、自有 payload 16MiB。不是 RSS/跨调用硬 quota;完成 artifacts 保留,无自动 purge。
  • Agent 路由: shell 语法优先 bash;精确 native argv/已知编码选可见 native;完整 MSYS 值交 Node 选可见 helper;真 cmdlet/WMI 选可见且开关允许的 pwsh。普通提示与 PTC SDK 有送达验证。

沿用 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)

  1. 完成到最新 main 的 rebase,保留 v0.39.3 的工作目录、sidebar 命名空间与失败 scope 清理修复;正式 CHANGELOG 原文保留。
  2. Bash/native 共用可选目录读取适配器:有服务使用官方 ensure,错误不降级;缺服务走 policy.workspaceRoot ?? session.header.cwd。native 不再硬 inject workingDirectory。
  3. Companion 要求 apply 已执行;scope 就绪、实际注册成功和让位分别记录。每次初始挂载、开关更新及 native Jobs 刷新均检查当前 agent 的工具所有权,外部同名工具让位,避免关闭/冲突状态的假成功日志。
  4. 21 份字典已完成开关本地化;欢迎维护者继续校对译文。测试检查关键工具名、UNCONFINED 和 danger-full-access 事实齐备。
  5. 新增旧宿主缺服务形状下的三入口注册/cwd/双向开关,以及真实 native producer 的 policy/header 默认目录。
  6. 真实 Git Bash 验证 RO/WW 中 OFF 执行并标注 unconfined、ON 再拒绝,以及未确定 policy 的拒绝;代表性解释器抽测 cmd.exe literal /c 和 PowerShell EncodedCommand + UTF16 中文输出。

独立审查与本轮修复

未继承对话历史的子代理重新审查完整增量,确认一项 P2:OFF 期间外部注册同名工具,恢复 ON 后全局工具被遮蔽,同 agent 工具则抛 duplicate 异常并阻断后续 companion 注册。本轮已修复全部确认问题:

  • gitbash_to_native_path 与 gitbash_native 共用按 agent 检查所有权的注册入口,每次刷新先注销自身注册,再检查外部全局/同 agent 所有者。实际 Core 的 knownNames 包含隐藏工具;旧宿主回退 schemas 检查,旧宿主隐藏工具行为尚未独立验证。
  • 冲突时保留待命 scope 并记录让位;外部所有者移除后,下次刷新恢复。所有权检查或注册失败明确记录,不向 volatile 事件抛错,也不阻断另一工具更新。
  • 新增六项实际 Core 回归覆盖两工具×两注册层级、重复开关、恢复、Jobs 刷新及隐藏工具,另新增一项普通回归覆盖失败隔离与恢复。
  • 独立子代理复核原始所有权复现与新增专项 9/9 通过,未发现新的确认缺陷;这些专项与完整回归有重叠,不累加覆盖数。
  • 最初疑似 Bash policy 时序问题已依据宿主逐操作快照契约撤回,本轮保持该行为。正式四项验收仍待,继续保持 Draft/RFC。

分步审查建议

继续建议两步 review:① Bash fail-closed、唯一 Config 开关/UI、拒绝引导与旧行为回退;② native/path、输出生命周期与可见性路由。第二步复用第一步的同一字段。当前保留完整 Draft/RFC 和跨层回归,尚未另开子 PR。

验证

环境:Windows / Node 24.13.0 / Core 0.2.1-alpha.2。

项目 结果 证据范围
普通完整回归 232/232,exit0,无 skip/cancel 原护栏、本地化、旧 SDK 拒绝、policy/header 与 ensure 错误不降级
实际 Core 完整 preview 85/85,exit0,无 skip/cancel 实际 ToolRuntime/Cordis;包括真实 Git Bash/Node/cmd/PowerShell 进程及受控 provider/Jobs 场景
syntax / diff / npm pack dry-run 通过 新适配器、native/live gate 与文档均进入包清单;不是发布

已安装实验构建的三入口实机报告提供有限外部证据:入口主路径、RO/WW 拒绝、单次 Bash 批准不粘滞。报告未记录精确提交,也明确未覆盖开关 OFF、真实 LLM 自主选路、生产 GUI 与非 CRT 矩阵,不作为当前 rebase 构建的完整生产验收。

正式 review / release 尚待

  • 默认开启的 volatile 运行时开关、拒绝引导与旧行为回退。
  • 前置合并后 rebase、同步旧宿主兼容与激活验证。
  • 21 份设置文案本地化。
  • 分步审查范围评估。
  • 真实 Agent 自主选路。
  • 生产 GUI(非 preview)。
  • 维护者 Windows 真机全量验证(维护者执行)。
  • 非 CRT 解释器矩阵正式确认。 已有 cmd/PowerShell 固定脚本抽测,但不代表任意引号/元字符/parser 均可用。

四项齐后才谈 ready for review → release。真 Windows confinement/ACL/token/IPC/VM、SSH/PTY、真实磁盘耗尽/吞吐/RSS/跨任务 quota/purge 仍无完整验收,不据测试绿色宣称生产可用。

@KannaKuron

Copy link
Copy Markdown
Owner

感谢这份 RFC——克制的标注(Experimental/RFC、明确「不是恢复真正 Windows 围栏」、不因测试绿请求合并)和两份设计文档正是我们希望看到的提交方式。维护者已对核心问题做出裁决:

裁决:接受 fail-closed 方向,但必须加运行时开关,且默认开启

  1. 开关是硬性前置:受限模式从「绕过+标注」改为「拒绝」是推翻仓库既有裁决(【Bug】Git Bash 执行器在 workspace-write 沙箱模式下"假成功"(exit 0、无输出、无文件副作用) #1/[BUG] README「保留官方沙箱语义」与 Windows 受限模式的实际行为不一致(0.33.0) #14)的产品行为变更,不允许「装上即生效」。请为 fail-closed 行为与两个新工具(gitbash_to_native_path/gitbash_native)提供行 Config 的 volatile 布尔开关(可与既有开关同卡),默认 true。你 PR 中「不改 Config/UI 或 21 语言设置词典」的自我约束需要为这一个开关解禁——开关文案可先行,词典不齐的部分我们合并前一起补。
  2. 默认开启、可随时关闭:维护者评估后的取舍是——现状(假围栏+标注)与 fail-closed(拒跑)之间,后者更诚实;出问题时用户在设置里一键回到旧行为,升级风险可控。拒绝路径的报错文案请写明「如何在设置中关闭」与「如何切换会话访问模式」,别让用户只看到一堵墙。
  3. 其余讨论项的答复:
    • Q3(上移 Core):native typed argv / 逐流 encoding / closed DTO 这类能力,若官方未来开放对应公开 API,本插件按「官方优先」纪律整体切换并退役私有实现——先记录为长期跟踪项,不阻塞本 PR。
    • Q4(artifact ownership/quota/retention):插件层自管,不要求宿主承担。
    • Q5(Jobs/controller 缺失):拒绝并如实报错,不得静默改前台重复执行——与你现行设计一致,保持。
    • Q6(实验转正式最小验收集):真实 Agent 自主选路 + 生产 GUI(非 preview)+ 维护者 win32 真机全量验证(我方执行)+ 非 CRT 解释器矩阵抽测。四项齐了才谈 ready for review→release。
    • Q7(合并顺序):修复:MSYS兼容边界、run_code路径扫描与unconfined反馈 #24 先行(已核实、即将 review);本 PR 在 修复:MSYS兼容边界、run_code路径扫描与unconfined反馈 #24 合并后 rebase,并请评估拆分——fail-closed 行为变更与 native 工具/选路提示至少值得拆成两步走,降低单次 review 的裁决密度。

在开关落地 + rebase 之前,本 PR 保持 RFC 状态,不进入正式 review。 再次感谢克制与文档质量——这正是这个仓库需要的贡献方式。

@KouzakiUmi

KouzakiUmi commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor Author

实机测试报告(本机已装插件,非源码/单元脚本)

针对本 PR 已部署到本机 desktop profile 的 dsh-gitbash-shell@0.39.2 做了 Agent 实机调用(bash / gitbash_to_native_path / gitbash_native)。未跑仓库 npm test / test:preview。

环境:Windows 10 / Git for Windows Bash 5.3.15(MSYSTEM=UCRT64),git 2.56.0.windows.2。路径与账户在下文用占位符:<user>、<host>、<home>、<repo>。

会话政策分三段:

  • 先在 danger-full-access 下测三条入口主路径与门控
  • 再切到 workspace-write 补 fail-closed / 单次升权
  • 再切到 read-only 重复 fail-closed / 单次升权

结论

三条入口在本机 主路径可用,关键门控有效。bash 仍会做 MSYS /all、/c 转换;对应场景必须走 gitbash_native 字面 argv。

workspace-write 与 read-only 下自有 bash 与 gitbash_native 均为 执行前拒绝、命令未启动、无 unconfined 降级。单次批准 danger-full-access 后同一条 bash 探测可以跑通;随后不带升权再次调用,两条入口重新拒绝。gitbash_to_native_path 不 spawn,受限模式下仍可用。没有关 experimentalNative,未测开关 OFF 的旧 unconfined 回退。


1. bash(Git Bash)

用例 结果
身份: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 且不粘滞。 不能当作发布或安全放行。

@KouzakiUmi
KouzakiUmi force-pushed the experiment/windows-native-argv-path-routing branch from ddf82cf to 771c618 Compare October 13, 2026 17:34
@KouzakiUmi
KouzakiUmi marked this pull request as ready for review October 14, 2026 05:30
@KannaKuron

Copy link
Copy Markdown
Owner

设计层 Review(第一轮,RFC 状态)

基于分支当前头(771c618 / 33fa213,基线 114dcde = v0.39.3)与两份设计文档。结论先行:裁决全部落实,设计质量很高;有三个点需要处理/确认,然后 rebase 一次即可进入正式 review。

裁决落实核对(全部通过)

  1. 开关:experimentalNative volatile 布尔、默认 true(含缺键)、同卡实时编辑、21 词典补齐——与维护者裁决(「开关硬性前置、默认开、可关」)逐字吻合。
  2. 关闭语义正确:关 = 实时注销两个 companion(旧 SDK 引用也拒绝)+ bash 恢复 unconfined 标注执行 + 一次性日志;开 = RO/WW/缺失策略执行前拒绝。作用于现有会话,无需重启,不杀已开始的后台 producer。
  3. 拒绝文案:指明设置关闭路径与会话访问模式控件的 danger-full-access 路径,「Agent 不得自行调整」——不是一堵墙。
  4. Controller 缺失拒绝(不静默改前台重复执行)、artifact/quota 插件层自管、Core 开放 API 后整体切换退役(长期跟踪项)——三个讨论项的答复均按维护者意见落实。
  5. 与 v0.39.4 的交互天然安全:msys_path/native_path 参数名刻意避开本插件字段白名单(path/root/...)与回流名单——文档 §7.1 明确写了这个设计意图,与本版(v0.39.4)为 dsh-ops ops_* 加的翻译/回流互不碰撞。
  6. companion 注册让位逻辑保守正确:外部全局或同 agent 同名即让位、knownNames 含隐藏工具、检查失败也让位——宁让不抢。
  7. 文档与验证的诚实度是仓库标杆:证据分级表、负向断言清单、「计数不累加」「失败观察不算修复通过」、§2.4 主动纠正旧 MSYS 根因泛化——全部保留。

需要处理的三个点

① Rebase 到 v0.39.4(硬性,机械冲突)。main 在你的基线(114dcde)之后前进了 v0.39.4(52da331):fastctxTools 默认翻转为关(gb_* 从默认工具面消失)、ops_*(dsh-ops)六件加入入参翻译/出参回流/失败名单。当前 CONFLICTING 落在 index.js/client.js(本版同文件双改)。rebase 后请复验一件事:fastctxTools 关闭后,你的 companion 注册检测(knownNames/faceNames)在「无 gb_、无 ops_」的单装工具面上的行为——按文档 §10 的语义应当照常挂载 companions,请补一条该场景的断言。

② 组合盲区知情确认(裁决已给,请知悉并落一条文档)。「experimentalNative 默认 true」×「dsh-ops 同装」×「受限会话(read-only/workspace-write)」的组合:我们的 bash 拒绝(fail-closed)、ops_bash 不发布(dsh-ops 仅 full-access)、gb_* 默认关 → 受限会话零命令工具。这是三个默认值叠加的合法结果,维护者已接受「默认开、不行再关」的取舍,但请把这一组合场景写进设计文档 §3 的体验表(一句「同装 dsh-ops 的受限会话在两插件默认值下均无命令工具,需关 experimentalNative 或切换会话模式」),避免未来用户报告时被当作未知缺陷。

③ session-workdir 双实现收敛(rebase 时定)。分支携带你的 src/session-workdir.js(#28 的模块化实现),main 在 v0.39.3 用了内联接缝(bash-tool.js 内联 ctx.get('workingDirectory') fallback)——同一问题两个实现并存。你的 gitbash_native 也依赖这条接缝,rebase 时请二选一:保留模块(则 main 的内联读取改调它)或复用 main 内联(native 侧内联同款)。倾向前者(模块化 + throwIfAborted 更完整),但不强制——取改动静音较小的一侧即可。

下一步

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.
@KouzakiUmi
KouzakiUmi force-pushed the experiment/windows-native-argv-path-routing branch from 33fa213 to 8603357 Compare October 15, 2026 05:01
@KouzakiUmi

Copy link
Copy Markdown
Contributor Author

第一轮设计评审的三项要求已全部实施完毕,分支已推送(8603357,9 个提交)。

① rebase 到 v0.39.4(52da331)+ 新断言

  • 实验分支已重放到 v0.39.4 之上,冲突集中在 CHANGELOG、smoke 路由文本断言、index.js/client.js 的开关读法(experimentalNative 默认 true 读 !== false;fastctxTools 默认 OFF 读 === true,与 main 一致)。
  • 新增实际 Core 断言(tests/runtime-preview.mjs「companions mount on the single-install face with fastctxTools OFF」):fastctxTools OFF(v0.39.4 新默认值)且工具面无 gb_*/ops_* 的单装场景下,companion 注册检测(knownNames/faceNames)照常挂载 gitbash_native 与 gitbash_to_native_path,符合设计文档 §10 语义;禁用的桥走 unpublish 短路、不进入 publish(disabled 日志断言)。隔离子代理的变异测试确认该用例对 fastctx 门控移除有唯一检测力。

② 组合盲点文档

  • 设计文档 §3 体验表已按原话补行;§12 同步上游复选框更新到 v0.39.4/52da331 并指向新断言。

③ session-workdir 双实现收敛

  • 保留模块化 src/session-workdir.js(throwIfAborted 更完整、diff 噪声更小);52da331 未触及 bash-tool.js,收敛在 rebase 中自动完成,另加 smoke 源码断言防双实现静默回归。

验证:普通完整回归 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。

遗留说明(未在本分支改动,供裁决)

  1. 客户端 FastCtx 设置卡 21 语言 hint 仍写「默认开启」,而 v0.39.4 起实际默认 OFF。该文案继承自 main 52da331,非本分支引入;按评审③的最小 diff 原则未在本分支修复,建议作为上游 v0.39.4 问题处理。
  2. §3 盲点句「两插件默认值下均无命令工具」依赖一个维度:本插件在 ops_* 在场时会让还官方 pwsh(inlineNeeds 的 hidePwsh 要求 !opsPresent)。「零命令工具」是否成立取决于 dsh-ops 侧对官方 pwsh 的处置,建议确认。

四项正式验收门槛(真实 Agent 自主选路、生产 GUI、维护者 Windows 全量验证、非 CRT 矩阵)仍列于设计文档 §12。

KannaKuron added a commit that referenced this pull request Oct 15, 2026
…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.
@KannaKuron

Copy link
Copy Markdown
Owner

Round 1 验收:三项全部确认 ✅,遗留说明两条采纳,进入正式 review

① Rebase + 场景断言:确认 rebase 到 52da331(v0.39.4)、MERGEABLE;新增的「单装 + fastctxTools OFF」实际 Core 断言正是要求的场景(companion 照常挂载、禁用桥走 unpublish 短路),变异测试确认检测力——采纳。

② 盲点文档:采纳,且你的遗留说明 ② 观察正确,请修正措辞:同装 dsh-ops(file 组件默认开)时 opsPresent → 本插件的 hidePwsh 不生效 → 官方 pwsh 可见可用(真 PowerShell,走官方 pwsh-sandbox 执行器,匿名管道不受 MSYS2 限制)。所以受限会话不是「零命令工具」,而是「无 bash(两家的都是),但 pwsh 经 dsh-ops 路由仍可用」。请把设计文档 §3 的盲点句改成这个准确表述——这也让组合场景的实际代价比原文更温和。

③ session-workdir 收敛:保留模块化版 + smoke 防双实现静默回归断言——采纳。

遗留说明 ①(卡文案):确认是 main 的 v0.39.4 疏漏——fastctxTools 翻转默认时只改了四处 reader,漏了 21 语言 fctx.hint 的「默认开启」文案。已由维护者修复并推 main(0e46277,21 处 copy-only;reader 逻辑 v0.39.4 里本来就对)。好眼力——这正是「最小 diff 原则」该被表扬的地方:你没有顺手在本分支改无关文案,而是指给上游。

状态:PR ready 接受。按两步拆分进入正式 review——第一步:fail-closed + experimentalNative 开关/UI/拒绝引导/回退(逐代码核拒绝路径、预检时序、旧 SDK 引用拒绝、开关四态);第二步(native/path、逐流输出、选路)在第一步收敛后接续。四项转正式门槛不变。

另外告知:main 在你 rebase 之后又前进了一笔(上面的 0e46277,纯 client 文案,不触你的分支文件)——本轮不需要再 rebase,下一步 review 若有基线要求会明说。

@KannaKuron

Copy link
Copy Markdown
Owner

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:

  • fail-closed + switch: refusal ordering verified (before workdir prep, Jobs admission, argv resolution and spawn — proven by requireBashPath-throws + empty call logs in tests); host-real SandboxUnavailableError with a code-carrying fallback; the experimentalNative four-state switch re-read at every consumption point with mid-session flips covered; controller-missing defaults to refusal; refusal copy points at the switch and the access-mode control on all three faces (bash/native/path).
  • no collision with the v0.39.4 translation layer: msys_path/native_path/executable/argv/cwd are all outside TRANSLATABLE_PATH_FIELDS; typed paths translate explicitly and only in kind:path.
  • companion yield: knownNames includes hidden tools, schemas fallback for older hosts, a failed registration neither aborts the volatile update nor blocks another companion, OFF→ON recovers.
  • native/path tools: typed argv (literal/path only, 4096 args / 30000 chars, .exe only, interpreters require explicit entrypoint), per-stream encoding matrix (spawn-time fatal TextDecoder probe, no auto), prepared-capability WeakMap, 8MiB/16MiB budgets with aligned UTF-8 cursors, explicit refusal when Jobs are absent, and decode failure never rewrites the command outcome.
  • Tests: local 235 pass + 1 skip (pre-existing macOS-only) / 0 fail; your Windows matrix 236/236 + real-Core preview 86/86; branch CI green on ubuntu+windows × Node 22/24.

Two follow-ups we are taking on the main branch right after the merge (per the maintainer's call to merge now):

  1. The §3 co-install blind-spot sentence says a dsh-ops-restricted session has "no command tools under both defaults" — but inlineNeeds short-circuits the pwsh hide when opsPresent (dsh-ops present -> hands off entirely), so that session still has pwsh with a real fence. We'll correct the doc/CHANGELOG wording on main.
  2. Minor: enableRunInBackground/promoteOnTimeout are read from the agent scope where the row Config is unreachable, so they are effectively always-on. Harmless; we'll clean it up later.

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!

@KannaKuron
KannaKuron merged commit 74f0186 into KannaKuron:main Oct 15, 2026
4 checks passed
KannaKuron added a commit that referenced this pull request Oct 15, 2026
…sed) and fix the §3 co-install blind-spot sentence
@KouzakiUmi
KouzakiUmi deleted the experiment/windows-native-argv-path-routing branch October 15, 2026 11:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants