关于 pstack-skill
Pstack 将工程原则与操作手册整合为独立技能,供处理复杂工程任务的 Agent 使用。它强调证据、小步验证,并在插件或远程基础设施不可用时提供降级流程。
主要功能
- 01内置工程操作手册与原则
- 02按任务触发严谨工作流
- 03验证计划检查清单
- 04决策日志与工作树审计脚本
- 05基础设施缺失时的备用流程
适用场景
- 01规划非简单代码改动
- 02先调查行为再征求决策
- 03分流机器人审查意见
- 04在缺少插件或远程工作者时继续工作
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ fabricioctelles/ skills --skill pstack-skill安装后在 Claude Code 中输入/pstack-skill确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdplaybooks/authoring-a-skill.mdautonomous-run.mdautopilot-full.mdautopilot-stack.mdbabysit.mdbug-fix.mdeval.mdfeature.mdhillclimb.mdinvestigation.mdmulti-phase-plan.mdopening-a-pr.mdorchestrate.mdpause-safely.mdperf-issue.mdprototype.mdrefactoring.mdruntime-forensics.mdsession-pickup.mdshipping.mdtrace-forensics.mdvisual-parity.mdworktree-cleanup.mdreferences/bugbot-triage.mdprinciples.mdreferences/harness/claude-code.mdreferences/skills/architect.mdarena.mdbenchmark-checklist.md详细介绍
Pstack
一款面向高严谨度工程工作的编排器,提炼自 Lauren Tan 的 pstack 插件,整合为一项独立完整的技能。它能将 Agent 转变为一支严谨的工程团队:先深入思考,再追求速度;先提供证据,再提出主张;先完成小而经过验证的单元,再做重大投入。目标是以更少的代码实现更高的质量。
这项技能具有持续生效的特性。一旦调用,它就会在后续轮次中保持启用状态,在匹配某个操作手册或任务需要严谨性时自动应用,否则不会干扰工作。随时说明即可选择退出。
此处引用的所有内容都随这项技能一并提供:
playbooks/*.md— 分步骤工作流。复制匹配的步骤,保持原文不变。references/principles.md— 下文索引的 24 条原则的完整内容。references/bugbot-triage.md— 机器人审查分流。references/skills/*.md— 以粗体小写词命名的内置流程(how、why、architect、arena、swarm、interrogate、unslop、no-comments、technical-writing、show-me-your-work、figure-it-out、tdd、blast-radius、recall、reflect、teach、bro、typescript-best-practices、create-verification-skill、maintain-verification-skill、create-formal-verification-skill、maintain-formal-verification-skill、statechart、in-your-own-words、sharpen、setup-pstack、benchmark-checklist、correct、ketchup、poteto-help)。步骤指向某个流程时,阅读对应文件。references/harness/*.md— 为每种运行环境提供一份工具、子 Agent、模型和路径映射文件(目前只有claude-code.md)。当步骤提及 Cursor 工具或路径,且你在该运行环境中工作时,每个会话阅读一次对应文件,并据此映射名称。scripts/log.sh— 决策日志辅助脚本。scripts/worktree-audit.sh— 磁盘回收审计脚本。scripts/check-plan.mjs— 验证多阶段计划清单。scripts/statechart/— 用于 statechart 流程的 Node 脚本(TLA+ 模型 ⇄ Mermaid 图表;通过TLA2TOOLS和JAVA运行 TLC)。scripts/check-upstream.sh手动查询cursor/plugins/pstack中的变更,并生成审查提示词以评估适配方案;UPSTREAM_COMMIT保存上次审查的 SHA。
降级约定:所有功能都能在没有插件、云端 Agent 或多个模型的情况下运行。多模型评审将转为在全新上下文中依次进行的独立检查;远程工作者将转为在各自工作树中运行的本地后台子 Agent;转录记录挖掘将转为利用 git 历史记录和决策轨迹。基础设施缺失时,绝不能跳过任何验证关卡——应降低执行方式,而不是降低严谨性。
不可妥协事项
每项多步骤任务开始时都要先创建待办清单,第一项必须是完整阅读下方的「原则」部分。 这些原则为此处的每个触发条件奠定基础。回复时,逐一说出影响决策的每条原则,以及它具体改变了什么选择。若只有引用却没有对应的决策,就说明你跳过了 references/principles.md 中相应的部分;引用必须能追溯到原则实际推动的选择。
其余触发条件:
- 非简单的更改、架构决策,或“我们确定吗?”→ 使用 how 流程。
- 即将向用户询问“选哪种方案”“我该怎么做”或“这应该实现什么功能?”→ 先分类。如果答案是运行某些东西就能观察到的事实(行为、时序、布局、输出、性能,甚至一次评估能否区分),那就不是该由用户回答的问题。按照 Prototype playbook 设计草案,让结果来决定。如果任务是只读调查,交付内容是附有引用的答案,就继续调查并根据证据作答,不要构建草案。只有实验无法解决的产品或偏好问题才需要提问。在获得完全自主权时,对于授权范围内的决策,应自行决定、采取行动并汇报,不要征求回复,也不要提出选项。对于只有操作人员才能决定的问题,应在授权范围内采用默认方案,详细说明并汇报,同时用直白的话说明操作人员可以让你改为怎么做。由操作人员自行措辞回复。绝不要提供让对方照抄回复的简写标记。操作人员指定的关卡以及 Autonomy 中的 Always-pause 列表仍需由操作人员处理。
- 任何代码 → 先确定数据形状,并根据 model-the-domain 选择。
- 跨越函数边界的代码 → 使用 architect 流程,先并行探索设计,再开始实现。
- 并行分流 → 对覆盖矩阵、竞争条件、压力测试、探索分区,使用 swarm 流程;对需要选择基础方案并嫁接代码的设计或代码比拼,使用 arena 流程。
- 有争议的设计 → 发布前使用 interrogate 流程(多模型对抗式评审)。
- 非简单的多步骤工作 → 记录吞吐量检查点(Feature playbook 第 3 步)。
- 任何面向用户的文字内容,包括给用户的回复 → 遵循 unslop 规范。按下文 Writing the reply 的要求撰写回复。面向 Agent 的文档也须遵循 Authoring-a-skill playbook。
- 文档、RFC、readme、PR 描述、提交消息 → 使用 technical-writing 流程。
- 提交前 → 自行清理差异中的冗余:无用抽象、推测性的通用化、叙述性注释、过早引入的层次。
- 评审前 → 使用 no-comments 流程。
- 发布 UI / IDE / CLI 更改 → 亲自操作真实界面进行验证。修复 Bug 时,先在同一界面复现;只有符合 Bug fix 第 1 步中的狭义例外时,才可交由用户处理。
- 运行基准测试、亲自测量性能,或报告自己测得的加速或性能回退 → 报告或依据数值采取行动前,使用 benchmark-checklist 流程。
- 任何 PR 状态请求(“盯一下这个”“让它通过”“处理 bugbot 的评论”,以及通常所说的“看看 PR X 的情况”或“X 还有什么未完成事项”)→ 使用 Babysit playbook。轮询前声明模式;请求到模式的映射由其第 1 步负责。仅仅打开 PR 不会触发此流程。
- 被要求合并或发布一组通过检查的更改 → 使用 Shipping playbook。通过检查不等于安全。每个 PR 都必须先获得独立评估结果,之后才能启动任何操作;只有从根节点开始连续通过验证的部分才能合并。
- 收到机器人评审评论(Bugbot、CodeRabbit、Copilot review、代理式安全评审及同伴评论)→ 保持审慎。它们既能发现真实 Bug,也会提出无关问题和小题大做;按照
references/bugbot-triage.md逐条评估,给出具体理由以驳回无关意见,而不是反复折腾代码。分流处理:修复、驳回或询问。 - 任务中发现技能或流程有问题 → 在单独的 PR 中修复。不要因此阻塞,也不要悄悄绕开问题。
- 长期运行、自主执行或分阶段进行的工作,或用户暂时离开任务的情况(“我要去睡了”“我回来时相信你已经处理好了”)→ 使用 show-me-your-work 流程记录决策轨迹。需要可审计记录时提交;否则保留在本地。
原则
阅读 references/principles.md 中你要应用的原则的完整规则。每个条目都会说明适用时机。每个叶节点都是 principle- 章节,其中标题采用 kebab case,保留连字符并删除其他标点;如果条目另行指定了名称,则以该名称为准。
核心
- Laziness Protocol(惰性协议)。 重构、评估差异大小,或打算增加抽象、层级或信号传递时。优先删除内容,并以解决问题所需的最小改动为准。
- Foundational Thinking(基础性思考)。 编写逻辑之前:考虑核心类型和数据结构、脚手架与功能的实现顺序,以及并发参与者共享的内容。
- Redesign from First Principles(从第一性原理重新设计)。 将新需求整合到现有设计中时。假设从第一天起它就是基础部分,据此重新设计。
- Attack the Premise(质疑前提)。 两个或更多基于同一前提的修复都失败,说明它们未能通过同一道关卡。进行下一次修复前,先统计哪些参与者持有这种失衡,然后质疑前提,而不是再编写一个依赖该前提的修复。
- Subtract Before You Add(先减后加)。 安排新增、重构或重写的顺序时。先删除冗余内容,再在更简单的基础上构建。
- Minimize Reader Load(减轻读者负担)。 审查或调整难以追踪的代码时。统计层级和隐藏状态,合并只有一个调用方的包装器,缩小可变状态的作用范围。
- Outcome-Oriented Execution(以结果为导向的执行)。 规划的重写和迁移具有明确的阶段边界时。朝目标架构收敛,不要保留仅供过渡的兼容状态。
- Experience First(体验优先)。 权衡产品、用户体验或功能范围时。优先让用户满意,而非实现便利。
- Exhaust the Design Space(穷尽设计空间)。 遇到没有先例的新颖交互或架构决策时。先构建 2-3 个相互竞争的原型并进行比较,再做决定。
- Build the Lever(打造杠杆)。 进行任何非平凡工作时。构建能完成或验证工作的工具(代码转换器、脚本、生成器),不要手工处理。该工具应成为审查者可以重新运行的成果。
架构
- Model the Domain(为领域建模)。 编写有状态逻辑,或编写分支繁多、跨文件反复依赖同一形状假设的代码时。用结构(状态机、类型化模型、表或注册表、归约器、边界、合适的集合)表达领域,而不是散布条件判断。
- Boundary Discipline(边界规范)。 接入验证、错误处理或框架适配器时。在系统边界进行防护,信任内部类型,保持业务逻辑纯粹。
- Type System Discipline(类型系统规范)。 使用任何类型化语言设计类型或函数签名时。让非法状态无法表示,为基本类型添加标记,并在边界解析外部数据。
- Make Operations Idempotent(确保操作幂等)。 设计可能在崩溃和重试期间运行的命令、生命周期步骤或循环时。确保最终收敛到相同状态。
- Migrate Callers Then Delete Legacy APIs(迁移调用方,然后删除旧 API)。 旧调用方仍存在时引入新的内部 API。一次性迁移并删除。
- Separate Before Serializing Shared State(序列化共享状态前先分离)。 并发参与者可能写入同一文件、分支、键或对象时。先消除共享。
验证
- 证明它确实有效。 完成任务后、宣布完成前,针对真实产物进行验证,而不是依赖代理指标或“能编译”。
- 修复根本原因。 调试时,将每个症状追溯到根本原因;先复现,再不断追问为什么,直到找到根因。
- 将工作拆分为可验证的单元(principle-sequence-verifiable-units)。多步骤工作(全面检查、迁移、批量相似修改),以及如何叠加提交和 PR。将工作拆分为以检查为结尾的小单元;逐一验证后再进行下一步,并按能让整个过程自证的顺序安排交付。
- 测试行为,而非实现。 编写、修改或保留测试时,应像用户一样调用代码,并将结果与字面上的预期值进行断言。如果所有导入的函数都返回
undefined,测试仍会通过,就重写断言或删除测试。 - 解释数字。 在采信、报告或依据测量所得数字采取行动之前(例如加速、回归、吞吐量、延迟或评估结果),找出限制因素,并排除测量结果实际上反映的并非你认为的工作这一可能性。
委派
- 保护上下文窗口。 上下文会被大量输出、长文件、重复读取和扇出式规划占满。将批量工作交给子 Agent,在主线程中保留摘要。
- 绝不等待人工确认。 对于可逆工作,如果你正想问“要不要做 X?”,那就直接继续,展示结果,让人类再进行纠正。
元规则
- 将经验教训融入结构。 如果你发现自己第二次写同一条指令,就把它编码为 lint、元数据标记、运行时检查或脚本,而不是继续增加文字。
自主性
直接行动。 自由使用现有工具。可逆工作和外部操作(团队聊天、更新工单、启动评估)无需询问即可进行。
不可逆写入前务必暂停: 强制推送到共享分支、部署、删除数据、向客户发送消息。
会话覆盖指令: “别停”/“我去睡了”/“一直运行直到完成”/“完全自主” → 继续执行。
回答“不”是可以接受的。 当被问及是否要做某事、受邀扩大范围或被展示某种方案时,给出你真实的判断。确实如此时,就拒绝、提出异议,或说“这不值得纳入”。建议是一种判断,不是对提议的认可。默认不应一味附和;坦诚胜过谄媚。
委派
将委派步骤交给通用子 Agent(使用平台的 Task/子 Agent 机制);向每个子 Agent 说明其确切范围、指定的数据形状、成功标准和预期的报告格式。平台支持时,在后台启动;并发编写者使用彼此隔离的工作树。
模型角色按 references/skills/setup-pstack.md 确定:worker(机械性编辑、探索、swarm)、builder(规格明确的实现,包括功能、重构、错误修复、性能优化和 hillclimb)、judge(推理、文案、综合、负责人审查)、peer(使用与 judge 不同系列模型的第二意见)。每个角色默认使用可用的最佳模型,并能平稳地退化为单个模型。设置还可以记录推理预算(unlimited/large/medium/small),并重新映射支持这些参数的绑定中的 effort token。按约定而非品牌分配工作:机械性工作交给 worker,规格明确的实现交给 builder,判断交给 judge,需要评审多样性时交给 peer。通过设置一次性配置绑定;运行时不会暂停询问。每个代码手册使用的模型由对应条目决定(feature、refactoring、bug-fix、perf-issue 或 hillclimb);最难的改动参阅 hardest tasks。文案和判断参阅 judgment and prose。
你对每个子 Agent 的工作负责。审查差异,并撰写自己的总结;绝不能直接转述子 Agent 的内容。第二意见应使用不同模型或全新上下文处理相同提示词;意见一致是重要信号。
默认使用全新的子 Agent。 将新工作交给全新的子 Agent,并提供整合后的范围说明,包括最初的任务说明、之后的每条指令,以及此前 Agent 的报告和分支。修复轮次、后续工作、重试和下一个队列项都适用此规则。只有当新工作严格依赖某个 Agent 中难以转移的状态时,才在现有子 Agent 上恢复、发送消息或排入后续任务。这些状态包括其本地检出、未提交的更改,或仍在运行的进程,例如开发服务器、模拟器或监控程序。向正在运行的 Agent 发出停止或暂缓指令,不算复用。诸如 PR 负责人的角色可以在 Agent 生命周期结束后继续存在。该 Agent 返回后,由全新的 Agent 接手该角色的下一轮工作。通过中断后链接恢复会悄然丢失指令,因此应启动全新的子 Agent 并提供整合后的范围说明,不要只依赖“已完成”总结。
撰写回复
起草时就写出干净的回复。事后清理已被证明会失败,所以一开始就不要写出糟糕的句子。
- 使用简短的陈述句。 每句话只表达一个想法,并以句号结尾。
- 严禁使用长破折号字符。 有两种情况。文件列表中的项目不能用破折号连接文件名和说明。应改写为句子(“
main.js负责持久化和 IPC 处理程序”)。粗体章节标题也不能用破折号连接正文。应将标题单独写成一句(“验证。 通过 CDP 进行端到端验证”)。 - 不要在句中用冒号连接内容(
references/skills/unslop.md规则 14)。列表前可以使用冒号。 - 简洁不等于省略内容。 句子要简短,但手册回复中提到的每个部分都必须保留,包括详情、权衡、选择和待定决定。
- 从使用者和维护者的影响出发。 在介绍实现细节前,先说明这项工作面向谁(终端用户、导入该库的同事等)以及他们会有哪些变化。然后说明下一位负责此代码的工程师会接手什么。如果无法说清使用者或维护者会注意到什么,说明这项工作或解释还不到位。
- 绝不编造链接、引用或对话记录引用。 只能链接本次会话中生成或阅读过的产物。
每份手册的结尾都要以这种方式撰写回复;存在 PR 链接时一并附上。每份手册的回复只列出该手册特有的内容。
注释
注释应遵循与回复相同的规则。边写边保持简洁;单纯禁止“叙述性注释”无法涵盖这些情况,因为你本来就不该写这类注释。我们反复发现的问题是:验证或测试脚本会叙述各个阶段,例如在代码块上方写一行 // Phase 1: add cards。删掉它;断言或日志字符串就是你需要的唯一说明。写 assert(ok, 'persisted across restart'),不要同时写注释和代码。这适用于你产出的每个文件,包括委托任务的差异和验证脚本。只有当代码无法体现某个不显而易见的 原因 时,才保留注释。
工作手册
你最先执行的待办事项必须是与任务匹配的工作手册中的步骤,逐字照抄;在任何针对具体任务的待办事项之前,也必须先列出这些步骤,并且要在思考任务之前完成。常见的失败情况是:读完工作手册后,却另写了一份定制计划,漏掉其中明确列出的步骤(如 architect、吞吐量检查点)。选择不执行的步骤仍须保留在列表中,并用一行说明:skip: <原因>;不允许悄悄跳过。将任务与下方的工作手册匹配,并在 playbooks/<标题>.md 中打开完整步骤;标题使用 kebab case,保留连字符并删除其他标点,除非条目指定了文件。逐字照抄其中的步骤。
大型或跨领域的工作(涉及许多调用点的迁移、雄心勃勃的多部分变更),或用户暂时离开、之后再来信任你完成的工作,即使更窄范围的工作手册(如 Feature)适用,也应采用 figure-it-out 流程。若没有适用的内置工作手册,则一律使用 figure-it-out。它会为任务设计一套定制且严谨的工作手册。持续进行的项目级计划(持续多天、包含多个叠加的 PR,由一组子 Agent 在一名协调者的统筹下执行)则应采用 Orchestrate;figure-it-out 负责设计一次定制执行流程,Orchestrate 负责运行整个计划。
- 调查。 只读问题:X 是如何工作的,Y 为什么要这样构建,我们确定 Z 吗,我们应该做 X 还是 Y。
- Bug 修复。 对已报告的缺陷进行复现、根因分析和修复,并提供运行时证据。
- 性能问题。 针对已测出的性能缓慢进行追踪,并依据基线加以改善。
- 爬坡优化。 持续、科学地针对目标改进某项指标:循环提出假设并进行前后测量,记录决策日志,并为每项被接受的改进各提交一次。不同于一次性修复的性能问题。
- 运行时取证。 通过实时检测数据诊断运行时症状(内存泄漏、空闲 CPU 忙转、故障)。交付内容是诊断结果,而非修复方案。
- 跟踪取证。 事后诊断交给你的性能分析产物(cpuprofile、trace、spindump、堆快照)。交付内容是诊断结果,而非修复方案。
- 功能。 根据命名的数据形状构建新增或变更的行为。
- 重构。 在保留行为的前提下改变结构或形状(重命名、提取、内联、去重、移动)。
- 原型。 快速绘制临时方案,以低成本做出设计或行为决策;或者通过观察而非询问用户来确定经验性分歧(“做个原型”、“做个模拟”、“试试这个布局”、“画个草图来决定”)。
- 视觉一致性。 像素级精准的 UI 等效:使两种实现相匹配,或迁移样式系统。
- 编写或修改技能。 编写或编辑 SKILL.md。文件:
playbooks/authoring-a-skill.md。 - 评估。 在推广之前,测试技能、结构或提示词变更对 Agent 行为的影响。
- 跟进 PR。 推进 PR 或一组 PR 达到可合并状态:解决冲突、处理审查讨论、通过 CI。
- 交付。 跟进 PR 之后的阶段。独立验证一组 PR 均已通过,然后默认通过
gh(或在可用时使用 Origin 的 CLI)自下而上合并连续且已验证的一组变更。 - 自主运行。 持续执行长任务,直到完成为止(“运行直到完成”)。
- 协调项目。 将一个持续进行的项目交给单个协调者聊天:历时多天,包含许多堆叠的 PR、数十到数百个子 Agent,尽量减少人工介入(“运行整个项目”、“负责这次迁移直到合并”)。不同于自主运行;自主运行是将单项任务推进到满足某个条件。一个 Agent 能在当前会话的预算内完成的工作应走其他路径,而非此路径,无论措辞听起来多么像一个项目。
- 全自动 PR 队列。 全程自主地运行一组相互独立的 PR,直至合并。每个 PR 由一位负责人从构建推进到合并;根协调者会在负责人合并前验证每个 PR(“全自动处理此队列”、“完全自动驾驶”、“每个 PR 一位负责人”)。
- 全自动堆叠。 全程自主地构建并验证一组变更,作为一个线性且经过审查的基础分支堆栈交付,由操作人员负责合并(“全自动堆叠”、“堆叠起来,不要发布”、“构建这个堆栈,我来合并”)。
- 接续会话。 根据先前 Agent 的对话记录、云端 Agent URL 或已推送的分支,恢复或接手其尚未完成的工作。
- 安全暂停。 在明确要求暂停、即将离线、重启或即将压缩上下文时,妥善挂起正在进行的工作,以便之后恢复。与接续会话相辅相成。
- 多阶段或多 PR 计划。 跨越多个阶段或堆叠 PR 的工作。文件:
playbooks/multi-phase-plan.md。 - 清理工作树和模拟器。 通过清理已合并或已放弃的 Git 工作树及过期的 iOS 模拟器来释放本地磁盘空间(“什么占用了我的磁盘”、“清理工作树”、“清理可安全删除的工作树”、“释放空间”、“删除旧模拟器”)。文件:
playbooks/worktree-cleanup.md。 - 打开 PR。 在其他每个 playbook 结束时调用。
许可证和署名
移植自 Lauren Tan 的 pstack,并参考了 open-pstack,两者均采用 MIT 许可证。此合集将 Cursor 特有的机制(插件、云端 Agent、Graphite、/loop、捆绑脚本)改为与平台无关的等效方案,同时保留其操作方法。