完整能力地图
ash 把仓库工作变成面向 Coding Agent 的类型化、有界程序。当前能力面覆盖探索、
进程执行、安全修改、并行任务图、工作区状态、证据取回、授权与签名交付。所有操作
都返回规范 ASON,而不是面向终端用户的说明文字。
源码实现、跨平台安装器和六目标发布流水线已经可用,但发布凭据尚未配置,也没有 受支持的签名二进制发行版。
ASH/1 操作面
请求信封固定为 t,i,o,a,u;只有可信 Harness 执行已批准的 Permit 重试时才添加
v。十五个操作 ID 让行为保持显式:
精确参数列、标志、响应变体、帧、握手和诊断码见 ASH/1 协议。
运行时与调度
一套分层 Governor 同时约束主机、会话、请求和操作。Tokio 管理帧式 RPC、子进程、 管道、期限和取消;Rayon 管理搜索、哈希、Diff、归约、保留存储提交与其他可拆分 CPU 工作。并行完成顺序不会泄漏成协议顺序,稳定归并最终生成确定性的规范 ASON。
批处理请求会在启动前校验任务图。节点在依赖成功后就绪;失败节点只跳过自己的 后代,已经运行或相互独立的节点会先排空,然后 ash 再选择稳定的任务错误。
小即时上下文与无损证据
进程输出由有界会话存储无损捕获。固定的头尾投影保持即时响应紧凑;会话越过 4 MiB 内存上限后,不可变证据会落到私有文件。区间取回、别名、去重、租约、正常 释放以及经过证明的崩溃孤儿恢复都属于同一存储契约。
归约是显式的,而不是静默截断:
×N标记重复行,×N#K标记重复块,⋯N标记省略的诊断区域。- 同构 ASON 记录按列编码,重复路径进入字典。
/ # ? - | >在同一个存活会话中作用于完整保留结果,Coding Agent 无需重跑 宽泛任务就能只取回缺失证据。- 每个预算都会说明即时投影是否完整,以及是否存在可取回的保留源。
保留别名只在生成它的会话中有效。自包含的 ash run 调用会在响应后关闭临时会话;
引用公式、快照 delta、Batch 子响应检查、运行中取消与 Permit 重试都需要保留同一个
存活的帧式 ash rpc 会话。
工作区完整性与恢复
所有原生工作区操作都解析受限的规范相对路径,并拒绝词法或符号链接逃逸。补丁 必须携带当前 BLAKE3 前像。多文件生命周期修改使用带校验和的磁盘日志、跨进程 串行化、持久提交标记、逆序回滚和重启恢复。原生文件身份会关闭硬链接崩溃窗口, 又不会把内容相同的外部文件误判为 ash 状态。
事务故障矩阵会驱动真实实现经过 30 个正向持久化切点,并在 12 个回滚或清理切点 再次中断恢复。快照/增量则提供一份独立、类型化的工作区结果视图。
能力、Permit 与交付
RPC 握手协商最小权限能力掩码。高风险语义重试需要绑定会话、动作、策略与过期 时间的一次性 Permit,重放会被拒绝。它授权的是 ash 行为,并不等于为任意子进程 提供通用网络或系统调用沙箱。
ash self status|check|update|rollback|recover 使用规范 ASON。更新元数据有字节上限
且只接受 HTTPS;签名清单强制 Ed25519 校验、序列单调性、精确归档结构、解压上限、
内嵌二进制身份、事务激活、健康检查恢复与回滚。发布流程覆盖 Linux、macOS、
Windows 的 x86-64 和 ARM64,并生成校验和、SBOM 与来源证明。
支撑这些描述的证据
- 327 个 Rust 工作区测试覆盖类型化 Schema、RPC、操作、存储、事务、恢复、取消、 更新、确定性调度与人类 Shell。
- schema-14 运行时 Harness 包含 22 个场景,并在不同 Worker 配置下验证 8 MiB 输出 跨越 4 MiB 内存上限后的落盘与区间取回。
- 7 个锁定代码任务在同一任务和 Transcript Schema 下对比原生 Shell Agent 与 ash Agent 轨迹。
- 完整测试 1,024 种四节点前向 DAG/成功掩码组合,并强制改变完成顺序。
- 源码绑定的格式报告、Fuzz、AddressSanitizer 产物、安装器冒烟测试与第三方许可 门禁保证证据可复现。
明确的非目标
ASH/1 不是人类 REPL、POSIX Shell 兼容层、内嵌模型、远程执行器或通用进程沙箱。 它不提供交互式终端、Shell 语言求值、覆盖写入、递归目录修改,也不在 Batch 节点间 传递运行时值。这些边界让类型化契约保持可移植、可审计。
独立且受 feature 控制的 ash shell H1 检查点加入行编辑 REPL、可配置提示符、经过
安全检查的持久历史、显式启用的启动 Profile 与 exit,并可顺序执行 pwd、echo、
cd、展开后的 export/unset、set pipefail 控制、可移植 ls、有界原始字节
cat、有界文本 grep、带日志事务的 cp/mv/rm、只创建空文件的 touch,
以及直接 argv 的宿主原生命令。带源码位置的 $NAME、${NAME} 与 $? 节点会先经过
引用感知的原生字符串展开和固定的未引用字段拆分,再进行命令解析;嵌套 $(...)
节点会递归保留同一类型化 Script 计划和绝对诊断位置,随后活动的未引用路径名模式会
在固定匹配数和目录扫描上限内展开。源码可来自终端、
内联参数,或有界 stdin/原生脚本文件。状态命令和可移植操作使用普通用户权限;原生
程序则通过平台进程树边界继承持久 Shell cwd/环境与普通 OS 权限。未重定向的独立原生
进程及管道首阶段 stdin 仍为空设备,前台交互程序与作业控制留在 H4。该入口是人类前端,
不是自由形式的 ASH/1 操作,也不会改变任何机器能力或约束声明。
H2 现已提供每条标准流的显式模式、经过完整性与无环校验的原生 OS 管道图,以及
原生/WSL/可移植/状态 builtin 管道 lowering。同一行的 | 可连接两个到 32 个宿主
原生或 Windows 显式 WSL 阶段、已实现的可移植 pwd、echo、ls、cat、grep、
cp、mv、rm、touch,或已实现的状态 cd、export、unset、set、exit,
但只有在完整预检成功后才会执行。相邻原生阶段由
OS 管道直连;进程内边界保留显式父进程异步端点,以并发、有界且保留背压的方式执行。
cat - 与 grep PATTERN - 消费上游流。状态阶段会关闭上游 stdin,在独立状态克隆上
执行并向下游传递 EOF,因此不能修改父 Shell;管道中的 exit 只贡献该阶段状态。
最终进程内输出进入同一有界捕获路径。状态默认取最后阶段;set -o pipefail 改取最右
失败的原生、WSL、可移植或状态阶段,set +o pipefail 恢复默认。
原生、WSL 与可移植命令以及已实现的状态 builtin 还支持按源码顺序应用的 <、>、>>、
2>、2>>、2>&1 与 1>&2。
文件目标必须展开为恰好一个字段,相对路径以持久 cwd 为基准,并直接连接子进程或父任务 OS 句柄;
一份图级顺序会交错打开原生、可移植与状态任务文件,共享文件或捕获
会保留真实描述符写入顺序。父进程端、父进程任务互连、子进程直连、纯原生、混合、
纯可移植、状态阶段与有序重定向回归会跨平台锁定背压、精确字节、EOF 关闭、
broken-pipe 行为、克隆状态隔离、句柄暴露和副作用顺序。状态参数会在打开文件前完成
预检;简单状态命令先打开文件再修改父状态,管道状态文件加入同一图级顺序,重定向其
空 stdout 会正常关闭下游。带源码位置的 Shell 诊断不会进入命令原始 stderr。有序
lowering 可以替换任意原生、WSL、可移植或已实现状态阶段的内部 stdin 或 stdout:
显式由父进程关闭的端点向下游传递 EOF 或向上游暴露原生 broken-pipe,同时仍引用管道
的复制描述符会保持连接。父进程资源领取完毕后,原生图会转换为统一作业监督器:等待
结果保持规格顺序,任一准备、捕获或等待失败都会终止并回收所有原生成员拥有的进程树;
进程内阶段与捕获任务共用同一管道完成边界。WSL 解析会定位 wsl.exe,再用精确的
--distribution/--cd/--exec argv 把 wrapper 降到同一流与宿主文件图;launcher
缺失会在预检阶段失败,所选状态保留 backend/发行版元数据。设置
ASH_TEST_WSL_DISTRIBUTION 后,Windows 回归会通过准备好的发行版流式传输 8 MiB
fixture。第一个 H3 检查点把可移植文件修改绑定到持久 cwd,并与 ASH/1 fs 共用
BLAKE3 preimage、持久日志与禁止覆盖的事务服务。cp、mv、rm 会立即派生并在
事务内重验源文件身份;touch 只创建新的空文件。路径逃逸、符号链接/reparse
穿越、目录、超限文件、覆盖与无法写入日志的路径都会显式失败。重定向文件先于事务
打开,修改阶段不输出字节,冲突进入普通最终阶段/pipefail 状态选择。第二个 H3
检查点加入带源码位置的 &&/|| 完整管道列表。两者优先级相同并从左到右针对最终
阶段或 pipefail 选择后的可见状态求值。被短路的管道保留该状态,不进行展开、解析、
预检、重定向打开、启动、状态修改或文件事务;只有实际执行的 exit 会停止源码。
任何副作用前仍会完整解析整份源码。
第三个 H3 检查点在命令词和文件重定向目标中加入嵌套命令替换,最多 32 层,并严格
按源码顺序执行。每次替换使用完整 Shell 状态克隆,从有界 stdout 删除全部尾随 LF,
保留外部副作用,并只向外传播一次 stderr 与诊断,不修改父状态或 $?。双引号保留
单字段,未引用输出按固定 ASCII 分隔符拆分;NUL 会被拒绝,Unix 保留非 UTF-8
字节,Windows 要求 UTF-8。替换值与 stdout/stderr 共享剩余 128 MiB 捕获额度;捕获
失败会阻止外层命令,短路管道则完全不运行替换。若后续阶段的外层预检失败,之前按
源码位置已经执行的替换所产生的外部副作用仍会保留。
第四个 H3 检查点在字段拆分后加入确定性路径名展开,支持未引用的 *、? 与
字符类;引用或转义后的操作符保持字面量,未引用参数和命令替换可以引入模式。匹配
区分大小写,按无损原生路径单元排序,点文件要求显式前导点,非法语法或无匹配都会
失败,且 ** 不递归。每条命令及其重定向共享 32,768 个活动模式单元、65,536 个
目录项与 4,096 个匹配结果上限;重定向仍要求恰好一个路径,短路管道不扫描目录。
别名、函数、subshell 状态、用户可见终端流式输出、已安装发行版探测、backend 策略、通用 WSL 参数
路径/环境映射、Linux 侧所有权与中断归一化仍属于后续切片。
要让 Agent 采用这套能力,请继续阅读 Coding Agent 接入。