在执行此工作流之前,请先阅读运行时适配器。其运行时映射适用于所有引用的剧本和脚本。
Pstack 三人组
三个智能体,一个 Herdr 或 Rex 会话,一个仓库。主管拥有判断权,副手拥有工作树的所有权,顾问拥有第二意见的所有权。它们之间的每条消息都是三人组存储区中的一个文件,外加一条命名该文件的一行提示。终端永远不会是记录介质,因为在备用屏幕上的智能体不会留下滚动缓冲区。
三人组是在 pstack-pair 的基础上增加了一个顾问。该配对的计划轮次、简报、检查、引导和评审保持不变;顾问参与每一轮计划,并在发现会改变设计时回答咨询。顾问永不向副手发送消息,也永不写入共享工作树。
前置条件
- 必须在 Herdr(
test "${HERDR_ENV:-}" = 1)或 Rex(REX_BLOCK已设置)内部。如果两者都不是,则说明情况并停止。 - 加载多路复用器的技能,用于窗格和智能体控制:Herdr 的
~/.agents/skills/herdr/SKILL.md(或当该文件不存在时的herdr --skill),或 Rex 的rex skill show。其安全规则在整个过程中适用。在 Rex 中,请阅读在 Rex 中运行。 herdr或rex,以及 Python 3.11 或更高版本(python3)需在 PATH 中。scripts/pair.sh help列出每个存储区和通道操作;对于三人组,请使用它代替手动构建的herdr或rex调用。- 主管、副手和顾问中至少要有两种不同的智能体种类。
pair.sh spawn从多路复用器读取主管的种类,如果三者完全相同则退出并返回代码 8;请告知人类选择另一种种类或使用pstack-pair。副手和顾问可以是同一种类。 - 以自动模式启动主管。Devin 默认使用
--permission-mode dangerous绕过权限检查。其他种类继承主管的模式。pair.sh permission打印检测到的主管模式。--permission <mode>覆盖两个生成角色的模式;--consultant-permission <mode>仅覆盖顾问的模式。--后的原生权限标志会覆盖该次调用生成的每个角色的默认值。--permission auto选择 Devin 的智能模式。没有对应权限翻译的种类会使用--后的原生标志。spawn还会跳过每种智能体的文件夹信任提示,否则该提示会让无人值守的智能体在一个它从未见过的文件夹中挂起:对于 pi 会使用--approve,对于 Devin 会使用--respect-workspace-trust false。--后的信任标志会覆盖它。生成的 Claude 也会在没有任何 MCP 服务器的情况下启动(使用--strict-mcp-config和空配置),因为每个服务器在每个会话中都是一个进程;--后的--mcp-config会保留你的配置。Claude 和 Codex 会改用询问来信任一个它们从未见过的文件夹;这个决定属于人类,所以spawn会拒绝该对话框并停止,告诉你该怎么做:在仓库中打开该智能体一次并信任它。
角色
| 主管 | 副手 | 顾问 | |
|---|---|---|---|
| 拥有 | 计划、简报、咨询、评审、决策、与人类的沟通 | 工作树、测试、诊断、证据 | 设计评审、二次阅读、原型 |
| 使用pstack作为 | poteto模式下的框架、how、architect、评审技能 | 每个简报命名的剧本,及其待办列表 | how、why、architect 的替代方案、interrogate 立场、对差异的 blast-radius |
| 写入 | 仅三人组存储区 | 简报范围内 Scope 的文件,以及其进度日志和报告 | 建议文件,以及一个它会在完成后删除的临时工作树 |
| 读取树 | 始终,只读;在某个提交点上于临时工作树中运行检查 | 始终 | 始终,只读 |
| 通过...沟通 | 计划、简报、引导、咨询、评审、长期命令、关卡 | 进度行、报告 | 建议 |
进入你的角色。主管:references/master.md。副手:references/sidekick.md。顾问:references/consultant.md。
三人组存储区
${XDG_STATE_HOME:-$HOME/.local/state}/pstack/trio/<slug>/,由 pair.sh init 创建。每个文件只有一个写入者。
| 路径 | 写入者 | 内容 |
|---|---|---|
pair.json | 通过 pair.sh 的主管 | 智能体名称、窗格 ID、种类、当前工作目录、git 根目录、打开的临时工作树列表、副手的备用和故障转移、窗格布局(分割或标签页) |
standing-orders.md | 主管 | 通过路径粘贴到每个简报中的编号约束 |
plans/NNN-<slug>.md | 主管 | 一轮计划,来自计划模板 |
briefs/NNN-<slug>.md | 主管 | 一个单元,来自简报模板 |
progress/NNN-<slug>.md | 通过 pair.sh progress 的副手 | 每个完成步骤或方法变更的时间戳行 |
steers/NNN-<slug>-s<k>.md | 主管 | 针对单元 NNN 的引导 k,来自引导模板 |
consults/NNN-<slug>-c<k>.md | 主管 | 关于单元 NNN 的咨询 k,来自咨询模板,包含 kind: 字段,值为 design、finding、objection 或 review |
reports/NNN-<slug>-s<k>.md | 副手 | 对引导 k 的反对意见,来自引导响应模板 |
reports/NNN-<slug>.md | 副手 | 简报 NNN 的证据,来自报告模板,或是对计划 NNN 的同意/反对响应,来自计划响应模板 |
advice/NNN-<slug>.md | 顾问 | 对计划 NNN 的设计评审,来自计划建议模板 |
advice/NNN-<slug>-c<k>.md | 顾问 | 对咨询 k 的答案,来自建议模板 |
scratch/<id> | 通过 pair.sh scratch 的顾问或主管 | 指向一个临时工作树的链接,用于一次咨询 (NNN-<slug>-c<k>) 或评审 (NNN-<slug>-review),基于某个提交或实时状态,保存在仓库外部,位于 ${XDG_STATE_HOME:-~/.local/state}/pstack/scratch/ (PSTACK_SCRATCH_ROOT 可移动该位置),Claude 和 Codex 必须每台主机信任一次(kitchen.py doctor 检查);完成后删除 |
reviews/NNN-<slug>.md | 主管 | 对单元 NNN 的裁决,来自评审模板;指明其依赖的建议以及任何推翻 |
gates.md | 主管 | 留给人类的待决问题 |
decisions.tsv | 通过 pair.sh log 的主管 | 工作展示追踪记录 |
status.md | pair.sh status | 衍生表;禁止手动编辑 |
queue | 通过 pair.sh queue 和 dispatch 的主管 | 下一个简报的路径,只有一个槽位 |
steps/NNN-<slug>.tsv | 通过 pair.sh step 的副手 | 每行代表一个已提交的步骤:编号、提交、时间、它解决的备注、摘要 |
notes/NNN-<slug>-n<k>.md | 通过 pair.sh new-note 和 note 的主管 | 对单元步骤到步骤 k 的评审,来自备注模板:阻塞项和后续行动 |
followups.md | 通过 pair.sh note 的主管 | 来自每个备注的后续行动,用于后续简报或 Issue |
session-handoff.md | 主管 | 紧凑的恢复和下一个任务上下文,在启动时读取 |
sessions/ | pair.sh spawn / rotate | 先前的就绪报告;保留的会话导出和计时证据 |
events.tsv | 每个 pair.sh 命令 | 每条消息、报告、唤醒和日志条目一行,由 pair.sh metrics 读取 |
NNN 是计划或简报、报告、建议和评审共享的零填充序列,因此同一单元的文件会排序在一起。
消息
| 提示文本 | 方向 | 发送者的辅助工具 | 接收者的行动 |
|---|---|---|---|
| bootstrap (命名技能、角色和存储区) | 主管到副手和顾问 | pair.sh spawn | 启动步骤,reports/000-ready.md 或 advice/000-ready.md,回复 READY |
pstack-trio PLAN <plan-path> | 主管同时发送给副手和顾问 | pair.sh discuss | 副手将计划与代码对齐;顾问评审设计;各自写入同意或反对,结束该轮 |
pstack-trio BRIEF <brief-path> | 主管到副手 | pair.sh dispatch | 执行简报,写入其报告,运行 pair.sh finish,然后以 REPORT 行结束该回合 |
pstack-trio BRIEF <brief-path>,已排队 | 主管到一个正在工作的副手 | pair.sh queue | 主管在新会话后分派它;pair.sh next 会拒绝 |
pstack-trio STEER <steer-path> | 主管到一个正在工作的副手,或一个因反对暂停的副手 | pair.sh steer | 在工具调用之间读取它;同意并继续,或用证据反对并结束该回合 |
pstack-trio CONSULT <consult-path> | 主管到顾问 | pair.sh consult | 读取相关文件,必要时在临时工作树中制作原型,写入建议,结束该回合 |
pstack-trio REPORT <report-path> | 副手到主管 | pair.sh finish (或 notify) | 读取报告,进行评审 |
pstack-trio ADVICE <advice-path> | 顾问到主管 | pair.sh notify | 读取建议,做出决定 |
pstack-trio STOP <store> | 主管到副手和顾问 | pair.sh stop | 安全暂停,写入停止报告或建议 |
discuss 在两个智能体都达成一致时返回,并为每个角色提供一个响应路径和状态。正在忙于一个单元的副手不会阻碍一轮:顾问立即获得计划,副手的一半被标记为 deferred(退出代码 4),当副手报告后再次运行 discuss 将只发送那一半。consult 在顾问进入 idle、done 或 blocked 状态时返回。dispatch 和 wait 在副手的回复到达、消息后的报告已写入,或副手处于 blocked 状态时返回;仅凭多路复用器的“稳定”状态并不可信:一个 Devin 副手在提示到达和步骤之间显示为空闲,在一个窄窗格中可能显示为整个运行完成,因此会将稳定状态与窗格中的“按 Esc 中断”行进行核对,如果一个没有报告且持续一分钟的稳定状态,则等待以 report: missing 结束。dispatch 和 wait 还会在检查间隔以摘要形式返回。wait 还会在分派的简报报告一经到达时立即返回,即使副手已经开始处理排队的简报;此时 running: 会指明副手正在处理的简报名称。notify 仅在主管空闲时提示主管。你在压缩后收到的消息仍然会命名此技能和要读取的文件,因此请重新加载技能并从该文件继续。
先计划
实施只有在副手同意并且顾问提出建议的计划之后才能开始。主管起草 plans/NNN-<slug>.md,包含所选设计、其权衡的备选方案及其优缺点,然后通过 pair.sh discuss 发送,该命令同时到达两个智能体。副手检查每个步骤是否与代码一致,并带着证据回答同意或不同意。顾问评审设计本身:数据结构、边界、备选方案表遗漏的内容,并回答同意或不同意。主管将两者合并到下一轮或一个裁决为 agreed 的评审中。
顾问是咨询性质的。来自顾问的 object 不会阻止 agreed 的达成;主管可以在评审的“已推翻”部分和决策行中说明理由来推翻它。但必须存在对应计划轮的建议文件:pair.sh dispatch 会拒绝一个特性、错误修复、重构、性能问题或 pstack-tdd 类型的简报,如果其计划没有存档的顾问建议或没有 agreed 评审。只读和取证类简报不需要计划;一个错误诊断的简报在其计划之前运行。三轮未能达成一致将变为一个需要人类解决的关卡,所有立场记录在 gates.md 中。
咨询
咨询是主管在计划轮次之外向顾问提出的问题。pair.sh new-consult <store> <NNN> --kind <kind> 为单元 NNN 创建文件;pair.sh consult 发送文件并等待建议。
| 种类 | 何时使用 | 顾问回答 |
|---|---|---|
| design | 主管在计划或引导之前权衡方向 | 选择哪个方向以及原因,附上权衡 |
| finding | 检查摘要、报告或差异揭示了意外情况 | 是否如所见那样,以及它改变了什么 |
| objection | 副手反对一个引导 | 基于证据谁是正确的,以及替代方案 |
| review | 裁决有争议,或单元处于第二次修订 | 接受、修订或拒绝,附上发现 |
| glance | 检查显示第一次提交或较大的差异,而该单元修订成本最高 | 五分钟内:评审是否会建议修订,以及原因,或 none |
以下情况咨询是强制性的:在引导偏离已商定设计之前,在副手反对后发出后续引导之前,以及对单元进行第二次尝试做出 revise 裁决之前。其他情况下是可选的,并且不会为落地单元发送咨询:所有讨论和评审在落地之前结束。每单元最多三次咨询;new-consult 会在没有 --force 的情况下拒绝第四次,因为第四次意味着设计有误,应属于计划轮次。Glance 咨询不在此上限之内,每单元一次,并且从不强制:顾问的配额是稀缺资源,因此应将其用于后期修订成本最高的地方。
每次咨询可在任何时间运行,无论副手是否在工作。consult 将副手的状态和 HEAD 提交信息印在咨询文件上;顾问在该时间点读取已提交的工作,任何未提交的内容只能通过 pair.sh scratch 快照读取,绝不会读取可能发生变化的实时工作树。每个咨询都附带一个时间盒,默认为十五分钟,glance 为五分钟;超过时间盒后,顾问会写入 partial 建议并结束该回合。
检查与引导
与 pstack-pair 相比没有变化:副手追加进度行,dispatch 和 wait 在间隔时间返回检查摘要,引导是唯一可能到达正在工作的副手的消息。每个简报最多两个新的引导,每个引导最多两轮。顾问增加了一个步骤:当摘要或反对意见显示一个会改变设计的发现时,主管在引导之前进行咨询,并且引导的“方向”部分会引用建议路径。
各种类型的任务会话
任何类型的副手(Claude、Codex、Devin、pi、Prime、Muse)都使用一个全新的会话
…
[已截断,无法完整翻译]