<!-- codsh-publication:grok-cli-dsh-rewrite:ticket-11 --> ## Parent https://github.com/Blackman99/codsh/issues/132 **Ticket:** 11 **Status:** ready-for-agent **User Stories:** 26, 27(见父规格) ## What to build 用户启用文件限制配置后,内置文件工具与子进程只能访问声明允许的路径,界面如实显示生效范围。 ## Acceptance criteria - [ ] 通过适配、可复用操作系统机制或上游接口实际实施已声明的读写/重命名边界,不 fork dsh。 - [ ] 用受控样本验证工作区外路径、符号链接、重命名绕过、配置/Hook 保护和 glob 的平台差异。 - [ ] 请求保护无法实施时拒绝启用;不能以 UI 报错或单个文件工具检查冒充全执行范围约束。 - [ ] 在已交付平台记录内核级效果证据、限制和错误路径;后续平台票必须复验,不把未测平台标为支持。 ## Blocked by - #142 — Ticket 10: 权限模式与持久规则 ## Delivery contract 用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。
Activity
Blackman99 commentedon Sep 23, 2026
按用户2026-09-20的实施授权领取 Ticket11 / #143;本次只记录领取,未启动实施工作者,也不表示已实现。已重新读取 #132 及全部80票正文/评论和实际 blocked-by(native 177 边,无截断,无第二页)。#142/#150/#152/#153 已在
rewrite/grok-dsh-20260920集成并关闭;当前独立就绪且无人领取的票为 #143、#145、#147、#151、#156、#158、#159、#163、#171。本波并行领取前四张(#143、#145、#147、#151),未领取任何被阻塞后继(含 #144/#146/#148/#155/#157/#164/#169/#170/#175/#179),也未领取本波未选的其他就绪票(#156/#158/#159/#163/#171)。实施必须从独立集成树精确基线
065170b46c44491f53abd6f21ed8ac438ba9906a开始。前置 #142 已关闭,同一提交已保留在rewrite/grok-dsh-20260920;集成证据见 #142 (comment) 。#153/#152/#150/#192/#193/#189/#165/#154/#160/#141/#161/#140/#139/#138/#137/#136/#135/#134/#133 仍为已集成关闭基线。范围按原验收:通过适配、可复用操作系统机制或上游接口实际实施已声明的读写/重命名边界,不 fork dsh;用受控样本验证工作区外路径、符号链接、重命名绕过、配置/Hook 保护和 glob 的平台差异;请求保护无法实施时拒绝启用,不能以 UI 报错或单个文件工具检查冒充全执行范围约束;在已交付平台记录内核级效果证据、限制和错误路径,后续平台票必须复验,不把未测平台标为支持。后续实施/审查子代理使用 My CPA - Grok 4.7 Fast(
grk-4.7-build-fast,effortxhigh)。仅在实施、独立审查和集成验收通过后关闭。main、现有未跟踪文件及其他工作树不改动;不授权付费资源,#212仍须新的明确最终发布/默认切换批准。Blackman99 commentedon Sep 23, 2026
Ticket 11 / #143 未集成。隔离集成树
rewrite/grok-dsh-20260920仍是065170b46c44491f53abd6f21ed8ac438ba9906a。worker 工作树/Users/zhaodongsheng/.grok/worktrees/my-projects-codsh/subagent-01a0ce48-f379-71e2-98d3-f22af6741795的 HEADa835f24832dba32bd30c39751f7b9855bdf575c1是该基线的后代(4a55bf0、886bab9、65ef111、a835f24)。未 cherry-pick,未推送,未关闭。工作树保留。四轮独立审查都没有双批准。最后一轮审的就是
a835f24,两名审查者均为approved: false(base_is_ancestor: true)。前一轮65ef111是一否一过,不能当作批准。仍须在同一工作树修复后再审:
classify_deny把相对模式接到 workspace 上,glob_to_regex把**译成.*,于是**/.env变成^<workspace>/.*\.env$,certs/**/*.pem变成^<workspace>/certs/.*[^/]*\.pem$。审查探针因此拒绝了工作区外的outside/.env和outside/certs/a.pem。**不能跨出工作区。glob_to_regex原样拷贝[!a]和[^a],Seatbelt 把!和^当字面量。file[!a].txt拒绝了filea.txt却允许fileb.txt;note[^b].txt拒绝了notec.txt却允许noteb.txt。两种否定都要译成 Seatbelt 形式;POSIX 类、空段和尾斜杠应拒绝而不是接受。fail_closed下受信任项目的[sandbox]无法启动。config.rs的KNOWN_POLICY_KEYS没有sandbox,diagnose_unknown_security拒绝.grok/config.toml。已签名的fail_closed inspect以该错误退出 1,尽管 strict 配置已经套上。把sandbox加入已知策略键,并同时覆盖用户文件和项目文件。本控制器在
a835f24上核对了源码:glob_to_regex(rust/src/filesystem_sandbox.rs约 1220 行)仍把**译成.*并原样拷贝[];KNOWN_POLICY_KEYS(rust/src/config.rs约 2463 行)仍没有sandbox。deny_subpath在非 macOS 上已经改为拒绝,不再静默返回Ok。Linux 与 Windows 仍未执行,不能标为支持。未跑组合树测试。main 未改。#132 与 #212 不关闭。Blackman99 commentedon Sep 24, 2026
Ticket 11 / #143 已合入
rewrite/grok-dsh-20260920的dcfa48c。沙箱在 macOS Seatbelt 上于 dsh 启动前施加到本进程,子进程继承。拒绝规则按解析后的路径生效。相对 glob(
**/.env、certs/**/*.pem)不会匹配工作区外的同名路径。/tmp、/var、/etc的符号链接前缀会先解析。无法解析的拒绝项拒绝启动。glob 尾部目录(包括启动后新建的)不能改名挪到另一个可写根;工作区根上的**/.env不会把/tmp本身钉住。inspect --json在配置了沙箱时仍打印全部诊断,并且不施加策略。launchctl submit / bootstrap 在策略下不能把内容送出去,探测会自行清理。验证:
scripts/rust-filesystem-sandbox-test.py与scripts/rust-sandbox-pty-test.py在合并后的树上通过。pnpm run typecheck、pnpm test(2288)、cargo fmt --check、cargo clippy -D warnings、cargo test --locked --workspace通过。Linux 与 Windows 未在本机验证,不记为已支持。