pstack子代理策略详解:何时用poteto-agent,何时用全新子代理
【免费下载链接】pstack-claudeClaude Code, Codex, Copilot, Pi, OpenCode, Gemini, and Prime Agent versions of Poteto's pstack. Rigorous agent workflows with Cursor primitives translated for other harnesses.项目地址: https://gitcode.com/GitHub_Trending/ps/pstack-claude
这篇文章面向新手,讲清 pstack 的子代理(subagent)调度策略:poteto-agent 在 playbook 步骤内何时登场,以及为什么 pstack 要求"新任务默认交给全新子代理",避免指令丢失和上下文漂移。
先认识 pstack 和它的主力子代理
pstack 是把 Lauren Tan 的 pstack 技能栈移植到 Claude Code、Codex、Pi 等代理运行时的项目。核心玩法很简单:向poteto-mode描述目标,它会自动调用匹配的工作流(查 bug、设计评审、并行探索等),并保证代码简洁、可验证。
pstack 内置了两个角色代理:
- poteto-agent:
/poteto-mode的路由目标,任何"按 poteto 风格干活"的请求都走它。定义见 poteto-agent.md - comment-sicko:一个专门"恨注释"的特色代理,负责清理叙述性注释和 workaround 说教,定义见 comment-sicko.md
poteto-agent 有一个硬性规则:动手前必须完整读取poteto-mode技能的 SKILL.md(含其中的 Principles 索引)。用general-purpose替代它会跳过这次阅读,风格就会漂移。这一点是理解整套子代理策略的关键。
规则一:playbook 步骤内,用 pstack:poteto-agent
poteto-mode 的 SKILL.md 中 Subagents 一节给出了明确的分工规则:
| 场景 | 该用哪个子代理 |
|---|---|
| playbook 步骤内的代码委派、临时帮手 | subagent_type: "pstack:poteto-agent" |
how、why、interrogate、reflect、swarm等路由型技能 | 技能自己设定的subagent_type(多模型评审用general-purpose),不要覆盖成 poteto-agent |
| 需要指定推理等级时 | pstack:poteto-agent-<level>(low / medium / high / xhigh / max) |
为什么路由型技能要排除在外?因为interrogate、arena、swarm这类技能的对抗信号来自模型多样性(不同模型各审一遍、互相投票),而不是来自 poteto 风格。尊重技能自己的设定,是第一条铁律。
按难度给子代理配模型
每次Agent调用都有默认约定:后台运行(run_in_background: true)、完整工具权限、用文件指针而非内联上下文传资料、按角色显式指定模型。模型分级策略是:
- 最难的变更(跨模块设计、棘手的并发、微妙算法)→ 最强判断力模型
- 琐碎的机械性编辑→ 快速代码模型
- 其余任务→ 单角色默认模型
角色默认值写在 models.json(默认 opus、最强 fable、评审小组 opus/fable/sonnet),各推理等级对应的代理文件在 effort-agents/,并可通过/setup-pstack命令逐角色改写。
规则二:新任务默认交给全新子代理
这是 pstack 子代理策略里最容易忽视的一条:Fresh subagents by default(默认用全新子代理)。
什么是"合并范围"(consolidated scope)
新工作要交给一个全新子代理,并带上合并范围,即:
- 原始任务简报
- 之后所有补充指令
- 上一个代理的报告和分支
修复轮次、后续跟进、重试、队列里的下一项,全都适用。
为什么不能图省事直接"续命"?
官方给出的理由很直接:resume 链式恢复会悄悄丢掉指令(interrupt-chained resumes silently drop directives)。你以为旧代理还记得"别动那个配置",其实那条指令早没了。所以正确做法是开一个全新子代理,把全部上下文重新打包给它,而不是信任一句"已完成"的摘要。
严格的例外:什么时候可以 Resume
只有当新工作严格依赖只存在于那个代理里的状态、且搬走代价很高时,才允许 resume 原代理,包括三类:
- 它本地的 checkout(本地检出)
- 它未提交的改动
- 它仍在运行的进程:开发服务器、模拟器、babysit 监视器等
注意两个易错点:
- 给运行中代理下达"停止/暂停"指令,不算复用
- 角色(如 PR owner)比代理活得久:代理一返回,角色下一轮就该由全新代理接手
停止旧代理要"确认它真的停了"
换新代理前,先停掉被弃用者并确认停止。因为列表里的completed状态只代表"完成已被通知",不代表进程已退出——带着后台子任务(live background children)的代理可以报告 completed 后继续复活。只有显式 stop 才能终结它。一个典型信号:代理声称工作树处于某个状态,但git status与它矛盾——说明它还在动。
为什么要把大量工作丢给子代理?
这与 pstack 的原则之一Guard the Context Window(守护上下文窗口)直接相关:上下文窗口有限且会话内不可再生,大输出、长文件、反复读取都会挤占主线程。策略是把大块内容路由给子代理,主线程只留摘要。子代理就是 pstack 用来"扩容"上下文的核心手段,因此"何时派子代理"和"派哪种子代理"同样重要。
常见错误清单
- ❌ 用
general-purpose顶替pstack:poteto-agent:跳过 SKILL.md 阅读,风格漂移 - ❌ 把路由型技能(how / why / interrogate / swarm)的子代理强制改成 poteto-agent:失去多模型多样性信号
- ❌ 修复轮、重试时 resume 旧代理省得重新交代:指令在链式 resume 中悄悄丢失
- ❌ 看到
completed就认为旧代理已退出:它可能只是通知了完成,进程仍在跑
小结:两张判断卡
选类型时:playbook 步骤内干活 →pstack:poteto-agent;路由型评审技能 → 技能自己指定。
选新旧时:默认全新子代理 + 合并范围;仅当工作严格依赖旧代理的本地检出、未提交改动或运行中进程时,才 resume 它。
把这两条记住,就能像 poteto-mode 一样调度子代理:简洁、可验证、不漂移。
【免费下载链接】pstack-claudeClaude Code, Codex, Copilot, Pi, OpenCode, Gemini, and Prime Agent versions of Poteto's pstack. Rigorous agent workflows with Cursor primitives translated for other harnesses.项目地址: https://gitcode.com/GitHub_Trending/ps/pstack-claude
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考