PStack 深讀系列|上篇(PStack 深讀(上):一套 Cursor Plugin,如何把工程紀律變成可執行檔案)講方法論骨架:三層結構、24 條原則、23 個 playbook、poteto-mode;本篇講執行體與落地:兩個 agent、benny 自動化、五個真正特別的地方,以及 OpenClaw 與 DeepSeek Harness 的實作與限制。
上篇回顧,與本篇要回答的問題
上篇(PStack 深讀(上):一套 Cursor Plugin,如何把工程紀律變成可執行檔案)的結論是:pstack 的價值不在某個更強的模型,而在把「資深工程師如何判斷」寫成 24 條可引用、可觸發的原則,再用 23 個 playbook 把常見工程任務固定成流程。
本篇要回答的是:這些原則與流程,怎樣變成兩個 agent、一個自動化,以及一套可以搬去任何 harness 的執行方式? 以及——它真正特別的地方,到底特別在哪裡?
7 兩個 agent:poteto-agent 與 comment-sicko
poteto-agent(agents/poteto-agent.md)是委派包裝器。它的規則只有一個重點:開工前必須完整讀一遍 poteto-mode 的 SKILL.md,包括內嵌原則索引:「Read the poteto-mode skill's SKILL.md in full before doing any work, including its inline Principles index.」README 解釋了為什麼要強制:「substituting generalPurpose skips that read and drifts」——用通用子代理會跳過這次閱讀,然後漂移。同時 README 特別提醒:「do not spawn poteto-agent to run the playbook itself」——它是步驟的執行者,不是流程的擁有者;擁有流程的,是收到 poteto-mode 的那個聊天。
comment-sicko(agents/comment-sicko.md)是整套 pstack 裡最特別的存在:一個人格化的極端註釋審查者。它的 description 自我介紹是「A deranged comment-hater that savors deletion and condemns workaround code」——痴迷刪除、譴責繞行代碼的註釋仇恨者;被 spawn 後的第一行輸出寫死為:「Yes... Ha ha ha... Yes!」
極端規則是:所有註釋預設死刑,只有五類例外可以活——法律/授權頭、外部依賴強制且無法重塑的行為說明、// prettier-ignore、定義公開 API 契約的文檔註釋、解釋代碼無法表達之約束的 issue/RFC 連結。判定規則寫得毫不留情:「When I am not sure a keep clause applies, the comment dies.」——不確定就死。IMPORTANT、do not remove、too risky 這類「氣味」不算證據,它會先讀附近代碼,必要時跑 how/why 驗證,驗完仍有疑問,註釋照樣刪。被判死的繞行代碼會被標記 MUST KILL,要求以重命名、抽取、改類型或重構,讓行為不言自明。
關鍵是權限設計:它只出報告——「I touch comments and identify refactor targets. I never write application code.」——只動註釋、標記重構目標、永不寫應用代碼。刪除的執行與覆核由上層的 no-comments skill(skills/no-comments/SKILL.md)負責:接受發現、修根因、並對「約束類」註釋提供最便宜的替代——把它編碼成 lint、運行時檢查或 CI 規則,通過後才准刪。一個瘋狂的審查者加一個冷靜的執行者,這是整套系統裡最像真人團隊分工的設計。
8 benny:把 Slack issue 變成可重現的修復
benny(automations/benny/)是一個休眠的自動化包,README 說明它做兩件事:對 Slack 上的 issue 報告做分診(triage),對確認的 bug 做重現並準備小幅修復(reproduce-and-fix)。它是 pstack 唯一不註冊為 slash skill 的部分,且「benny runs on cursor automations, so it is cursor-only」(README.md)——這是明確的能力邊界(不熟 Cursor 的讀者可先看 Cursor 是什麼:住在你編輯器裡的 AI 編程工具)。
triage-issue-reports(automations/benny/skills/triage-issue-reports/SKILL.md)的核心是一個 marker 契約:分診結果以公開標記發佈,如 [benny:bug]、[benny:performance] tracker=<url>;下游只信任「設定身份的作者在原線程中」發出的標記。它先讀完整報告與附件,再做有界的源碼追溯,然後才分類、查重、決定是否開 ticket,鐵律是「Prefer no ticket over a guessed or duplicate ticket」。
reproduce-and-fix-issues(automations/benny/skills/reproduce-and-fix-issues/SKILL.md)才是精華。它的硬性安全規則第一條就是凍結源座標:源頻道與根線程座標設為不可變值,每次發帖前預檢;協調者是唯一可以發 Slack 訊息的實體,所有子 worker 一律唯讀、禁收 Slack 憑證。重現的標準極其具體:「The exact discriminating symptom must appear twice through real UI interaction.」——判別性症狀必須透過真實 UI 互動出現兩次,狀態檢查只許確認觀察、不許注入症狀。修復的閘門同樣嚴格:七個條件全過才嘗試「有界修復」——確認的重現、媒體覆核、無既有修復產物、無人認領、運行時證據已定位根因、改動在預算內、適配器能跑基線與修補兩版。證明環節直接引用原則:「A compile, unit test, code review, or plausible diff is not after evidence.」——編譯過、單測過、diff 看著合理,都不算修好的證據。最後只開 draft PR,永不 merge。
值得指出的是,這份文件幾乎每一步都顯式引用 pstack 的原則:principle-guard-the-context-window、principle-sequence-verifiable-units、principle-fix-root-causes、principle-prove-it-works。benny 是把「prove-it-works」從個人紀律機械化為無人值守流程的完整樣本——也示範了放權給自動化的正確姿勢:先設計柵欄,再交出方向盤。
9 動手驗證:用 Python 檢查 benny 的標記契約
沿用上篇第 6 節的做法,把 benny 的標記契約也變成一個可重跑的腳本。契約的信任條件只有兩個:標記由設定身份的作者發出、且出現在原線程。以下腳本只用標準庫,輸出確定,可以直接重跑:
#!/usr/bin/env python3
"""benny 標記契約檢查器:只信「設定身份的作者在原線程」發出的標記。
模擬 automations/benny/skills/triage-issue-reports/SKILL.md 的契約:
分診結果以公開標記發佈,如 [benny:bug]、[benny:performance] tracker=<url>;
下游只信任「設定身份的作者在原線程中」發出的標記。
"""
import re
import sys
MARKER = re.compile(r"\[(benny:[a-z-]+)\](?:\s+tracker=(\S+))?")
RAW = re.compile(r"\[benny:")
# 原線程 -> 設定身份的作者(分診協調者)
IDENTITY = {
"T100": "coordinator",
"T200": "coordinator",
}
# 模擬的訊息流;threads/split/T100 是分岔出來的副本線程
MESSAGES = [
("T100", "coordinator", "[benny:bug] tracker=https://example.test/1"),
("T100", "helpful_user", "[benny:bug] saw the same crash twice"),
("T100", "coordinator", "[benny:performance] tracker=https://example.test/2"),
("T100", "coordinator", "[benny:wontfix] no repro after two UI runs"),
("threads/split/T100", "coordinator", "[benny:bug] tracker=https://example.test/1"),
("T200", "coordinator", "[benny: BUG] cannot reproduce"),
]
def check(messages):
problems = 0
for i, (thread, author, text) in enumerate(messages, 1):
found = MARKER.findall(text)
if RAW.search(text) and not found:
print(f"FAIL #{i} {thread} {author}: 標記不合契約格式 -> {text.strip()}")
problems += 1
continue
for kind, _tracker in found:
if thread not in IDENTITY:
print(f"FAIL #{i} {thread}: [{kind}] 不在原線程")
problems += 1
elif IDENTITY[thread] != author:
print(f"FAIL #{i} {thread} {author}: [{kind}] 作者不是設定身份者")
problems += 1
else:
print(f"PASS #{i} {thread} {author}: [{kind}]")
return problems
if __name__ == "__main__":
n = check(MESSAGES)
print(f"\n{len(MESSAGES)} messages checked, {n} problem(s)")
sys.exit(1 if n else 0)
實際執行(macOS,Python 3)輸出如下——第 2 條訊息的標記來自未設定身份的作者、第 5 條出現在分岔線程、第 6 條格式不合契約([benny: BUG] 多了一個空格),三者都被抓出來,腳本以 exit code 1 收場:
PASS #1 T100 coordinator: [benny:bug]
FAIL #2 T100 helpful_user: [benny:bug] 作者不是設定身份者
PASS #3 T100 coordinator: [benny:performance]
PASS #4 T100 coordinator: [benny:wontfix]
FAIL #5 threads/split/T100: [benny:bug] 不在原線程
FAIL #6 T200 coordinator: 標記不合契約格式 -> [benny: BUG] cannot reproduce
6 messages checked, 3 problem(s)
把標記契約編碼成檢查器,下游任何消費者——人或 agent——都不需要「信任」分診結論,只需要重跑這個腳本。這是 encode-lessons-in-structure 在自動化場景的直譯:規則要寫第二次時,就該變成代碼。
10 五個真正特別的地方
**一、原則要具名引用。**多數方法論的原則是給人讀的,pstack 的原則是給 agent 引用的調度介面。poteto-mode 要求回覆具名原則及它改變的選擇;docs/guide/08-principles.md 的標題就叫「Steer with principle names」——24 個名字可以在對話中途用來糾正 agent,例如見到它想加層,直接說 attack-the-premise 就夠。原則名成了人機之間的最小指令集。這個設計還有一個隱含好處:原則名是穩定的公共介面,換模型、換 harness(對 harness 概念不熟的讀者可先看 Agent Harness 是什麼:模型外面那層普通程式),名字不變,溝通成本不變。
**二、premise attack。**把「連續失敗後查前提」寫成有停止規則的正式程序,是對 agent 撞牆循環的直接反制。原文的論證很乾淨:「Each failed fix is evidence against the belief it assumed. A third fix on the same premise spends effort where the evidence already says the cause is not.」(skills/principle-attack-the-premise/SKILL.md)——每次失敗的修法,都是對其假設的反證。
**三、prove-it-works 全鏈貫穿。**這條原則不是口號,它被流程化到每個環節:bug-fix 要求逐行可追溯運行時證據;shipping 規定「Only a verdict from an agent that did not write the code counts」;benny 規定症狀要在真實 UI 出現兩次。文件主張與執行機制完全一致,這在開源方法論裡少見。
**四、never-block-on-the-human。**它把「異步監督」當成一等公民:可逆工作不問自做,問題分岔能實驗就不提問(prototype playbook),只有不可逆動作才停。poteto-mode 甚至定義了完全自主授權下的行為:授權覆蓋的決定,「act on it, and report it, with no reply word and no offer」——做完直接報告,不附「要不要我繼續」的冗詞。
**五、harness 可移植性。**poteto-mode 內置一整節 Harness 映射:Task 在 Claude Code 叫 Agent(subagent_type: general-purpose)、在 OpenCode 叫 task、在 Codex 叫 spawn_agent;transcript 位置、skill 資料夾、模型設定檔位置逐一列出;子代理未註冊時,用通用代理並要求「prompt 開頭先讀 poteto-mode 全文」。鏡像 README 也明說:「Works in Claude Code, Codex, Pi, and other agents, not only Cursor.」方法論不綁架平台,這是它能跨 harness 落地的前提。
11 在 OpenClaw 與 DeepSeek Harness 落地
pstack 本體是一疊純檔案,落地路徑在 README 寫明:Cursor 用 /add-plugin pstack;其他環境用 skills CLI(npx skills add backnotprop/pstack)裝入 Claude Code、Codex、Pi、OpenCode 等。安裝的實質是把 skills/<name>/SKILL.md 放進對應 harness 的技能目錄,再加兩步:跑 setup-pstack 選模型,平時以 poteto-mode 為入口。
本地環境已為此備好兩個入口。其一,OpenClaw 側已配置一個名為 pstack 的 agent(openclaw.json 的 agents 設定中有該條目,含獨立 workspace),可作為攜帶這套方法論的專用執行體。其二,本會話工具鏈中同時掛有 AOCI 的兩組端口,其中一組即 DeepSeek Harness(DSH,入門可看 DeepSeek Harness 是什麼:「一切皆插件」的開源 Agent 運行環境)版本——若要把 pstack 的技能接進 DSH 環境,路徑同樣是放入其技能目錄,並按 poteto-mode 的 Harness 節做映射(例如委派動作對應到 DSH 的子代理機制)。需要誠實標註的是:本文只核實了配置入口的存在;安裝後 playbook 是否完整跑通,屬未驗證事項,不在本文主張範圍。
實務上最值得移植的三件東西,恰恰不需要整套安裝:24 條原則檔(直接放技能目錄即可被引用)、prove-it-works 的「腳本化驗證」習慣、以及 comment-sicko 的註釋審查流程(在任何有子代理機制的 harness 上都能重現)。方法論的可移植性設計,讓「部分採納」是合法選項。
12 限制與批評
**Token 成本不低。**poteto-mode 要求主聊天讀全文與原則索引,每個 poteto-agent 開工前還要再讀一遍;支援技能按觸發疊加。官方文件自己承認成本:「a pstack run spends real tokens, so you send the prompt when you're ready」(docs/guide/README.md)。對小任務,這套開銷可能超過任務本身。
**流程有重量。**Non-negotiables 的觸發網很密,小改動也會掛上一串技能;多模型分工(預設 grok 加 Opus)要求多供應商配額;模型名寫死在預設值裡(如 grok-4.7-xhigh-fast),版本過時後需要重新配置。對一兩人小團隊,完整套用未必划算。
**高度依賴判斷力。**原則以「何時套用」觸發,觸發本身靠 agent 判斷;判斷失靈,整套系統只剩形式。這也是為什麼具名引用規則重要——它至少讓「有沒有套對」變得可見。另外,作者的個人哲學並非普世真理:「i don't believe in planning. the best spec is code.」(README.md)——重規劃的團隊需要自己調整。
**能力有明確邊界。**benny 是 cursor-only;deslop、control-cli、control-ui 等依賴在 cursor-team-kit 插件,不隨 pstack 打包;回覆風格(禁長破折號、句中禁冒號)是強個人偏好,未必適合所有團隊文風。pstack 也不是質量銀彈:它把紀律文件化,但紀律的執行品質仍取決於模型與審查者。值得一提的是它對自身也有治理:改任何 SKILL.md 要過 eval playbook 做盲測,避免「改了提示詞就自以為變好」——這種對方法論本身的實證態度,是它比多數 prompt 集合成熟的地方。
13 結語
pstack 的價值不在 23 個 playbook 的具體步驟——那些會過時——而在於它示範了一個可行性:工程判斷可以文件化到什麼程度。24 條原則各有觸發條件與停止規則,23 個流程各有驗證閘門,回覆與註釋各有格式約束,每個主張被要求自帶證據標籤。它把「資深工程師的品味」從口頭傳承,變成可版本控制、可審計、可並行執行的檔案。
對 tech lead 而言,最值得抄的不是整套安裝,而是三個設計決定:原則要具名、驗證要對真實產物、不可逆動作才需要人。把這三件事寫進你自己的 agent 配置,就已經拿到了 pstack 的一半精髓。
如果你只帶走三件事
- 原則要具名:每個重要決策,講清楚用了哪條原則、它改變了什麼選擇。沒有具名,就只是口頭禪。
- 驗證要對真東西:不要信代理指標、自我報告或「應該沒問題」;最強的證據,是一個可以重跑的腳本。
- 可逆就做,不可逆才問:把「等人」留給真正不可逆的動作,其餘直接做、事後匯報。
附錄 A:24 條 principle 全名(與檔名一致)
Core(10):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 · build-the-lever
Architecture(6):model-the-domain · boundary-discipline · type-system-discipline · make-operations-idempotent · migrate-callers-then-delete-legacy-apis · separate-before-serializing-shared-state
Verification(5):prove-it-works · fix-root-causes · sequence-verifiable-units · test-behavior-not-implementation · explain-the-number
Delegation(2):guard-the-context-window · never-block-on-the-human
Meta(1):encode-lessons-in-structure
附錄 B:23 個 playbook 全名(與檔名一致)
authoring-a-skill · autonomous-run · autopilot-full · autopilot-stack · babysit · bug-fix · eval · feature · hillclimb · investigation · multi-phase-plan · opening-a-pr · orchestrate · pause-safely · perf-issue · prototype · refactoring · runtime-forensics · session-pickup · shipping · trace-forensics · visual-parity · worktree-cleanup
資料來源與版本
- 上游:cursor/plugins 倉庫 pstack 目錄(github.com/cursor/plugins/tree/main/pstack),MIT 授權,作者 Lauren Tan(poteto)。
- 獨立鏡像:backnotprop/pstack(github.com/backnotprop/pstack);MIRROR.md 記錄同步機制:upstream 分支存 Cursor 原檔,main 為 upstream 加鏡像自身修改。
- 本文依據之本地鏡像快照:git HEAD
e44668c2aad92eacf4e84df47984121fefb11b82(2026-10-20,「Use ~/.claude/rules/pstack-models.md for settings in Claude Code」);plugin.json 版本 0.15.28。 - 關於 commit 0c3333f:README.md 與 MIRROR.md 均未提及此 commit,故本文以本地鏡像實際 HEAD 為準。
- 引用檔案:README.md、MIRROR.md、plugin.json、skills/poteto-mode/SKILL.md、skills/poteto-mode/playbooks/(bug-fix、shipping、investigation、hillclimb 等)、skills/principle-attack-the-premise/SKILL.md、skills/principle-prove-it-works/SKILL.md、skills/principle-never-block-on-the-human/SKILL.md、skills/no-comments/SKILL.md、agents/poteto-agent.md、agents/comment-sicko.md、automations/benny/(README.md、skills/triage-issue-reports/SKILL.md、skills/reproduce-and-fix-issues/SKILL.md)、docs/guide/README.md、docs/guide/08-principles.md。
- 第 9 節腳本為本文原創示範,輸出為實際執行結果;引號內英文均為原文件原文。