@adlc/ fleet (英语)
在ADLC上进行平行出道会. 舰队阅读了从
.adlc/tickets.json,每个发去一个沙箱 无头 克劳德代码
在一个孤立的工地上工作 管理着决定性的大门
使用截断的跨模式审查更改,并将其合并为每个运行
融合处——与 确定性控制流动 (ADLC D0: 控制流量)
是代码,判断是模型。 没有LLM呼叫决定命令,重试,或合并.
设计合同: docs/specs/fleet-orchestration.md
· 决定和威胁模式: docs/adr/0010-adlc-fleet-orchestration.md。 。 。 .
它会做什么
- 计划来源是
.adlc/tickets.json本身 (通过)@adlc/core) ——不是一个新的 格式.completed:true门票经过过滤(重复的不变量为 #104),但仍 满足边缘。 范围重叠的门票是系列的;一个作家持有 一个分区一次. - 沙盒倒置命令平面 输入、构建和测试命令运行在 OS sandbox( 网络被拒绝、 读取/ 写入工作树、 合成) 回家来。 如果没有沙盒后端,舰队就失效了.
- 模拟飞机 - 那个
claude -p工人的经营与网络入侵 和它自己的 这样它就能发挥功能,并被包裹在 文件系统 沙盒:它的 写入 被捆绑在票面上的工作树上 加上国家名录 声明 网络和文件系统是独立的轴; K2 仅需要 (# 395) 不同的网络。 阅读不设界限——有记录 剩余,参见安全科. - 决定性的预置闸门 建造/试验,
rails-guard一张当地票 范围检查,以及封闭式保护控制文件完整性扫描(覆盖.adlc/tickets.json信任根). - 阻止跨模式起诉 每张票都必须清空
adversarial-review合并前通过; 如果没有提供者, 则无法关闭 可达. - 一体化分支,永远不要打基础 ——成票相继合并为
fleet/run-<runId>;舰队最多打开一个公关到基地,从不推进. - 通过合并闸门自动完成 ——一经票后出闸
通过,舰队标记它
completed:true综合处通过 不变adlc ticket complete(单位:千美元)planComplete+应用) 人类将使用的道路,所以 仅附加注释及其明显证据 单公关。 《同上》 门票 门票 门票 开放). - 二击失败政策 通报
flail-detector(故障打开).
使用量
fleet run --dry-run # preview the plan; no worktrees, no workers
fleet run --dry-run --json # machine-readable plan
fleet run [--concurrency N] [--tickets T1,T2] [--base main] [--json]
fleet run --tickets T1 --no-pr --no-complete --max-strikes 14 --wall-clock-minutes 60 \
--pre-strike-argv '["/abs/adlc","autopilot","quota","--json"]' --pre-strike-env '{"PATH":"/usr/bin","HOME":"/home/me"}' \
--model-plane-read bounded --model-plane-read-only /opt/tools/rg \
--model-plane-git mirror --model-plane-git-mirror /abs/mirror.git \
--model-plane-egress allowlist --worker-deps /abs/worker-deps/node_modules --json
fleet status [--json] # show the current run's per-ticket state
fleet unlock # release a stale run lock (guarded)
干燥烟雾(AC5)
面对这堆积案:
node packages/fleet/bin/fleet.mjs run --dry-run
输出 0,打印备妥的套件 + 首个发货批次 + 等待道具的门票,
不包括 completed:true 罚单,而不创造任何树git worktree list
原文不变).
现场直播——先决条件
现场直播 fleet run (无) --dry-run)要求:
- a 一个 OS 沙盒后端 有关东道主的
bwrap编号 :unshare在Linux上,sandbox-exec操作员-本地--i-am-in-a-disposable-container主张整个运行已经孤立( 承诺的 repo 配置永远不会 设置此选项); - 页:1 ADLC Claude 代码插件 如此安装的会场铁钩臂
在工人的树上
ADLC_P4_ENFORCEMENT=1+ 键ADLC_TICKET(三); - (单位:千美元) 克劳德代码 二进制( e)
claude继续PATH· ; - (单位:千美元) 信赖
adversarial-review二进制可溶于管弦乐器PATH(或被钉住)fleet.reviewBin) ——被阻断的检方操纵 名称与信任的路径对齐, 永远不要npx从工人的树,所以工人 无法掩盖检察官 如果无法解决,起诉即告失败 没有合并的票; fleet.gate配置在fleet键.adlc/config.json。 。 。 .
当沙盒的前提条件未得到满足时(失败),舰队拒绝发送 (已关闭).
工人(适应人员)
调度器是无意识的:它通过一个 WorkerAdapter
接缝( 接缝)lib/adapters/),因此,哪个编码代理 构建一张票是一个配置选择,
不是代码更改。 注册的适配器 : claude-code (违约), codex, (中文(简体) ), agy
(谷歌反重力), opencode, (中文(简体) ), pi, (中文(简体) ), cursor每一个都是纯正的 I/O shim
以无头模式产出它的被子 模型飞机 (网络进取+
拥有 auth, 文件系统写有边框 – K2 + # 395 。 选择一个带有
运营商- 本地 --adapter 旗帜( 默认) claude-code) (中文(简体) ).
每个适配器也声明 egressHosts - 那个 host:port 配对它的绳子必须
到达(模型 API 及其 OAuth 主机)。 下 --model-plane-egress allowlist 这些是东道方CONNECT代理许可的唯一目的地;
一个适配器,它宣布无人无法在允许列表模式下运行(无法关闭).
每个适配器也声明 homeState ——目录并存其被子
写入 HOME。该声明是模型飞机书面赠款:一个适配器
宣布什么也得不到 在工作树之外, 所以一个新的绳子失败了
而不是继承一揽子赠款。 如果绳子需要一条路
声明没有赶上, 与操作员- 本地
--model-plane-writable <path> (可重复);a fleet.modelPlaneWritable 内
由于让候选树拓宽
包含它的边界将会使它本身失效.
牵引装置是操作员-局部的,而不是Repo配置(对抗-审查K1/A2): 仅限
claude-code 安装每个工作树的许可列表, 所以要重置
fleet.adapter编号 :fleet.adapterCommand 能够悄悄地将无人照料的工人转移到一个
腰带不全 因此,选择系带(以及任何二进制的覆被)是一种
运营商信任决定——通过 --adapter 编号 : --adapter-command 编号 : --adapter-args· ;
一个值 .adlc/config.json 以警告方式被忽略.
模型及其证书也是本地操作员 (运营-存储 第4/§10条).
fleet.model 财务报告和审定财务报表 fleet.modelAuthKey 内 .adlc/config.json 现在 忽略
并警告; 使用 --model 财务报告和审定财务报表 --model-auth-key。 。 。 .
model曾被作为"不可执行的数据"处理,这只能通过 事故:claude-code, (中文(简体) ),codex,以及opencode都悄悄地放弃了 所以 除了那个适应器什么也没有 现在,每个适配器 迫使它的模型 在命令行上,重投承诺值会让候选树选择 建造和判断它的模式.modelAuthKey更危险的是: 它命名了免予执行的 ONE 变量modelPlaneEnv秘密剥取, 所以一个回波值选择了哪个主机密钥 输入了可编码的工人。 候选人可以提名ADLC_MANIFEST_KEY并读取签下跨模范证明的密钥.ADLC_MANIFEST_KEY被附加在一个硬拒绝列表上——没有modelAuthKey打开它,连接线员都不打开.
仅 adapterStdin (快速运输形状,而不是供应或证书选择)
仍然从 repo 配置读取.
模型-平面沙盒所做的和没有关闭(# 395)
工人的许可名单包含重写 fleet.gate 命令
(他们来自候选树) .adlc/config.json和建筑商的章程
告诉工人去操作它们。 这样就可以命令普通候选密码
在模型飞机上运行.
关闭 : 它不能在售票树外写作。 不是本地操作员
军需登记,没有 ~/.claude/settings.json 或者说 ~/.claude/hooks/没有
已经安装的工具包,而不是另一个雷波的工作树。 已经不是了 告诉
任何一种环境 ADLC_* 变量从
示范飞机环境,以及《宪章》需要什么ADLC_TICKET, (中文(简体) ),
ADLC_P4_ENFORCEMENT)被明确注入.
未关闭 : 模型飞机 读取 不受限制, 和egress是开放的,所以 读取和过滤路径仍然存在。 校对:Soup 将 macOS 密钥链项保存在每个平台上 - 而且没有尝试。 {\fn华文楷体\fs20\bord1\shad1\1cHE0E0E0\2cH000000}跑出一隊去取回一筆你不相信的錢 在设计假设之外.
没有后端时没有新的失败模式 . 模型飞机重用
运行宽沙盒决定:没有主机 bwrap编号 :sandbox-exec 已经拒绝
在飞行前发送 --i-am-in-a-disposable-container 已声明
整个运行被控制。 没有模型飞机 唯一的选择退出.
每个适配器都停放 默认引用 (单位:千美元)agy --print <prompt> 编号 :
jetski --print <prompt> 财务报告和审定财务报表 pi --print <prompt> 将提示传递为
旗帜的 argv 值, 不在 stdin 上 - codex exec, (中文(简体) ), opencode run, (中文(简体) ), cursor-agent -p,其余则记录默认,并注明每个
适配器头. 因为驾驭CLI 进化,命令和参数是
压倒一切 通过本地操作员 --adapter-command 编号 : --adapter-args 国 际
旗帜(和 --model)——所以CLI的改变是一行的固定,一个未知的
--adapter 运行启动时未关闭 。 有了军需登记处
argv 覆盖被断然拒绝,因为注册人选择一个适配器
罚单和一个全球二进制不能为所有人服务。 现场直播
每个牵引装置的端到端行为应对照已安装的CLI进行核实.
供应——军需登记处(可选)
当操作员-本地信道登记簿存在时,它不是 --adapter编号 :--model —— 说
决定: {adapter, model, transport} 页:1 每张票,以
@adlc/quartermaster 从票类和CPM
浮来. 当 ADLC_QUARTERMASTER_REGISTRY 设置或
$XDG_CONFIG_HOME/adlc/quartermaster.json 已存在; 没有, 舰队行为
完全如上所述.
订婚后就是了 关闭失败: 缺少、已禁用或无效的登记册
发送前中止,以及 --adapter-command编号 :--adapter-args 被拒绝
(一个全局二进制不能服务于每克适配器的选择,以及批发的 argv)
超接会丢弃强制模式). fleet run --dry-run 打印
已解析的座位和适配器本身的正文 --json。 。 。 .
席位取自分类账前科
在干流中,未安装的系统作为标准通知报告(文本和 --json(中文(简体) )
和现场运行.
所审查的回购中没有任何内容参与:
树以通知被忽略, 并配置相对或内部的路径
repo 禁用加载而不是读取它。 司马和有记载
限制 : docs/integrations/quartermaster-registry.md。 。 。 .
配置( E).adlc/config.json(中文(简体) )
{
"fleet": {
"gate": { "build": "npm run build --workspaces --if-present", "test": "npm test" },
"init": "npm install",
"adapterStdin": false,
"concurrency": 2,
"base": "main",
"timeoutMinutes": 30,
"prosecuteFailOn": "medium",
"allowedCommands": ["npm test", "npm run build:*", "node --test *"]
}
}
fleet.reviewMaxBytes (默认) 262144页:1
adversarial-review 作为 --max-bytes· ; --allow-summary-review 从来没有通过,
因为在审查员的立足点之上 限制只进行摘要审查
放弃每一个发现——一个虚假的绿色,而不是审查.
编组船队——接线员-局部分机
编队的管弦乐手(问题自动驾驶,
docs/specs/issue-autopilot-local.md
§14需要交出一张票,一张预算,一张配额门和一张封口
配置文件,并读取机器可读结果返回。 下面的每个把手都是
运营商- 本地: 仅从 argv 获得荣誉,并在 fleet 键
.adlc/config.json 被警告(SECURITY: … operator-local … — ignored和
被忽略了,完全一样 fleet.adapter编号 :fleet.model。没有改变舰队的
缺席时的行为.
| 旗帜 | 效果 |
|---|---|
--no-pr | 跳过运行端的PR;整合分支留给呼叫者. |
--no-complete | 跳过 completeTicketOnIntegration 后相接出闸后;呼叫者拥有完票. |
--dead-end-file <path> | 文件的内容(fenced, 12.000-char cap)是一击的初始死板材料,因此再试可以手取前一回合的失败. |
--max-strikes <n> | 出击盖,整数 1.50 (默认 2). |
--wall-clock-minutes <m> | WHOLE 运行的外部截止时间: 之后没有发出新的消息, 短短的一击会杀死它的流程组( SIGTERM, 然后是 SIGKILLL 15 s), 运行记录的原因 wall-clock,退出 2 并保留可恢复. |
--charter-file <path> | 附加给建筑商在限制区块(限制仍具有权威性)之后的快速ATER. |
--pre-strike-argv <json-array> + 键 --pre-strike-env <json-object> | 在Everyy攻击前用一个 argv 阵列进行命令运行, 没有外壳, 并带有给定的环境( fleet 添加了任何内容 ); ADLC_MANIFEST_KEY 将遭拒绝; argv[0] 必须是绝对的。 非零出站 ——票房暂停quota-paused——没有 --resume 旗帜,不需要任何旗帜. |
--model-plane-read host|bounded + 键 --model-plane-read-only <abs,…> | bounded 给 MODEL 平面 沙盒 模块的边框读取策略( 工作树 + 合成家 + 允许列表) —— 主机的固定系统根 (/usr, (中文(简体) ), /lib, (中文(简体) ), /lib64, (中文(简体) ), /etc/ssl, (中文(简体) ), /etc/resolv.conf, (中文(简体) ), /etc/hosts)总是在其中,所以每个适配器的TLS和名称解析工作;设置了私有空tmpfs的旗子 EXTENDS /tmp;一个FILE条目被绑定为单一文件,因此单个可执行文件无需其母目录即可被曝光. |
--model-plane-git mirror + 键 --model-plane-git-mirror <abs bare repo> | 工人的工作树被从呼叫者提供的光镜上剪去(它只提供git数据库);工人出站后,用比较和分页取回分行回呼叫者仓库(取回分行)fetch 临时法官 merge-base --is-ancestor → update-ref … <cutTip> − 删除临时参考),该分行的闸口/起诉/相机运行为共享模式. 任何步骤失败 + 原因 mirror-fetch-failed反弹没有动过 要求数 bounded 读取. |
--model-plane-egress open|allowlist | allowlist 使用 --unshare-net 加上unix socket上的主机侧 CONNECT 代理机,唯一允许的目标就是适配器宣布的型号主机, 连接到 127.0.0.1 沙盒内HTTPS_PROXY编号 :HTTP_PROXY 设定, NO_PROXY ) (无. |
--worker-deps <abs node_modules> | 在每次罢工之前,一个普通的复制品(绝不是npm跑道)被叫客所建的依赖树打入工人的树上 init 不运行. |
这个 --json 结果和理由设定
fleet run --json 在 stdout 上打印一个文档( 人类行到 stderr ):
fleetRunId, (中文(简体) ), exitCode, (中文(简体) ), reason, (中文(简体) ), results, (中文(简体) ), strikes, (中文(简体) ), strikesConsumed, (中文(简体) ),
review: { provider, verdict, revision, rounds } (单表顶级)
运行; 总是每张票下 tickets有效的政策反应
(单位:千美元)readPolicy, (中文(简体) ), privateTmp, (中文(简体) ), gitSource, (中文(简体) ), mirror, (中文(简体) ), egress, (中文(简体) ), egressAllowlist, (中文(简体) ),
homeBinds, (中文(简体) ), writableRoots) (中文(简体) ).
reason 对呼叫者具有权威性;退出代码不变. 每个
非零出口带一。 门票是关闭的
quota-paused • 妇女 lock-held • 妇女 wall-clock • 妇女 strikes-exhausted • 妇女
ticket-blocked • 妇女 flail • 妇女 review-unavailable • 妇女 mirror-fetch-failed
(单位:千美元)quota-paused编号 :wall-clock 是可重复的停顿, lock-held 是一个跳转到
稍后再试,其余为售票终点站. 运行级别失败
不是罚单结果 - quarantined, (中文(简体) ), pr-open-failed, (中文(简体) ), preflight, (中文(简体) ),
resume-refused, (中文(简体) ), dispatch-refused - 使用同样的钥匙,但坐在外面
设置,所以闭合的enum上的呼叫键将它们视为操作错误
需要一个人类,这是正确的解读。 A 类 dispatch-refused 罚单是左侧的
它的打击还击: 修正沙盒政策并恢复.
退出代码
0——每张发票合并(或清洁干线).1操作错误(不良的配置、肮脏的树、锁被扣、缺失的门, 沙盒先决条件未得到满足).2至少有一张罚单失败,被阻断,或者被罢工前的PAUSED 命令 / 外墙钟( 参见--jsonreason) (中文(简体) ).
ADLC 阶段
P4(平行建设)+P5(平板起诉). 舰队是指挥家
使 ADLC P4 并行性可执行; 它消耗已认证的车票 DAG
以 merge-forecast (D2)和每张票通过出站口.
核心差距
没有任何核心变化。 船队代表所有原始票
(单位:千美元)loadTickets, (中文(简体) ), topoSort, (中文(简体) ), scopesOverlap, (中文(简体) ), globMatch, (中文(简体) ), inScope改为:
@adlc/core 并且不增加第三方运行时间依赖.