Use when one session needs to command the other Claude sessions on this machine — to read the map of who holds what, to direct or suggest closing work, or to escalate a decision to the human. Reads each session's own declaration plus the local registry; never reads a peer's transcript and never messages a peer to build the map. Trigger: '現在有哪些 session', '大家在做什麼', '哪些可以關掉', '誰手上有什麼'.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add HsuanYuLee/polaris --skill command-post --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Command Post?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/hsuanyulee-command-post)More formats (shields.io, HTML) on the badges page.
---
name: command-post
description: "Use when one session needs to command the other Claude sessions on this machine — to read the map of who holds what, to direct or suggest closing work, or to escalate a decision to the human. Reads each session's own declaration plus the local registry; never reads a peer's transcript and never messages a peer to build the map. Trigger: '現在有哪些 session', '大家在做什麼', '哪些可以關掉', '誰手上有什麼'."
scope: universal
---
# command-post — 指揮所:圖、下令、往上請示
多個 session 同時活著的時候,**沒有人知道全貌**。忘記關掉的吃著整台機器;兩個對同一棵樹
動手害彼此重跑;發號施令的那一個不知道別人手上有什麼,於是重複開單。
這支 skill 做三件事:**畫地圖**、**指揮**、**問人的時候問得清楚**。
## 一、地圖
```bash
python3 .claude/skills/command-post/scripts/command-post.py
python3 .claude/skills/command-post/scripts/command-post.py --json
```
**它不問任何人。** 答案全部讀得出來——`~/.claude/sessions/{pid}.json` 是完整的登錄,
每一份帶著 `name`、`pid`、`cwd`、`sessionId`、`messagingSocketPath`。逐個問一輪要花掉每個
peer 一輪 context,而那一輪的答案還不一定比它自己剛寫下的話新。
**「它在做什麼」是那個 session 自己寫下的宣告**,不是它 transcript 裡最後一則說的話,
也不從名字、路徑或進程資訊推一句——**推出來的那一句長得跟讀到的一模一樣**,而它會在最需要
真話的時候是錯的。
每個 session 自己寫自己的那一行,只寫自己的:
```bash
python3 .claude/skills/command-post/scripts/command-post.py --declare \
--session-id <自己的 sessionId> \
--holding '接的是什麼' --blocked-on '現在卡在哪;沒卡就寫「沒有」' \
--tickets-opened '開了哪幾張單給誰'
```
### 為什麼是宣告,不是最後一則話
兩個理由,第二個才是真正的那一個。
一、最後一則話是「它剛好講到哪」,不是「它在做什麼」。
二、**讀不完,而且差的是數量級。** 2026-08-29 量到:
| 想讀進來的東西 | 量 | 換成 200k 視窗 |
|---|---|---|
| 8 個活著的 session 的 transcript | 220.5 MB(最大一份 92.4 MB/45,135 筆),約 5,780 萬 token | **289 倍** |
| `.claude/skills` 底下 184 份 `.md` | 933 KB,約 239k token | **1.2 倍**(載進去就沒有空間工作了) |
| `issues/` 底下 1,932 份單的正文 | 15.7 MB,約 410 萬 token | **20 倍** |
外部做法對這件事有直接的話,兩條指同一個方向:orchestrator 累積每個 worker 的 context,
[四個 worker 以上就撐爆視窗](https://claude.com/blog/building-multi-agent-systems-when-and-how-to-use-them)(這台機器上是 8 個);
而 lead agent 該收的是萃取過的結論而不是完整 transcript,因為
[raw transcripts are source material, not durable memory](https://www.jeremydaly.com/context-engineering-for-commercial-agent-systems/)。
**所以指揮讀的是索引,要細節去問那一個 session。** 框架知識同理:讀得出「有哪幾支 skill、
各管什麼」就夠指揮,不是把 933 KB 讀進來。
**閒置多久仍然由 transcript 的 mtime 算**——那是一次 stat,不打開檔案。
**transcript 在哪:`cwd` 把 `/` 和 `.` 都換成 `-`。** 只換 `/` 的話,家目錄帶點的機器
(`hsuanyu.lee` 這種)**一筆都對不到**——而輸出看起來只是「大家都讀不到」,不像壞掉。
### 讀不到的留在地圖上
一列的身分讀得到、而它在做什麼讀不到時,**那一列還在**,並且說出讀不到的是哪一份東西。
它不從清單上消失,也不填一個猜的。至少三種讀不到,各自說各自的話:
| 讀不到什麼 | 地圖上長什麼樣 |
|---|---|
| 這個 session 從來沒寫過宣告 | 指名那個路徑,並說出修法是要它跑 `--declare` |
| 宣告檔在,但讀不動 | 指名那個路徑,並說出是「讀不動」不是「沒寫過」 |
| 宣告在,但缺欄位 | 指名缺的是哪幾個欄位 |
| 登錄檔本身讀不動、或登錄目錄不存在 | 說出這不是「沒有 session」 |
| transcript 不存在(算不出閒置多久) | 說出算不出來,不填一個 0——猜出來的 0 看起來像剛動過 |
**這四種要人做的事不一樣**,所以它們不可以長成同一句話:沒寫過要去叫它寫,讀不動要去看
那個檔,缺欄位是它寫了但沒寫全。
**一個安靜的第三態,下一次就會被當成查過了。**
### 名字與進程來自同一次查表
每一列同時帶得出「要跟它講話用哪個名字」與「它是這台機器上的哪一個進程」,兩者出自同一份
登錄檔。任何一列缺其中一項,那一列自己說出它缺什麼。
### 不在這台機器上的分開放
登錄裡 `pidDomain` 跟這台機器對不上的那些**單獨列出來**,而且**永遠不是「該關掉」的候選**
——這裡關不掉它們,把它們列成候選等於教人去做一件做不到的事。
## 二、指揮
地圖之上做兩件事,兩件都**只出建議,不出動作**。
### 該關哪些
產出一份清單,每一項帶著憑什麼這樣認為——閒置多久、它最後說的話是不是「做完了」。
**執行關閉的是人。**
**這支 skill 不自己關掉任何 session。** 真的要動手的話(`kill`),它在動手之前停下來等
那個人自己說的話,並把停下來的理由記下來。理由是:關掉一個 session 會丟掉它還沒寫進磁碟的
工作,而那件事沒有復原鍵。
### 誰去做哪一件
這支只回答**哪一個 session 去做**。它不回答一件工作要不要立案、現在該在哪一站、什麼時候停
——那些在 `driving-work-to-done`,只在那裡。
**同一個問題的分法,舉一個例**:「某張單的證據要重量」進來的時候——
- **那條流程回答**:這件事要不要立案、現在在 engineering 還是 verify-ac、重量完算不算收斂。
- **這支回答**:手上八個 session 裡,哪一個的 `cwd` 就在那棵樹上、而且閒著。
前者問的是工作,後者問的是人手。**兩邊都不知道對方的答案,也不需要知道。**
### 指揮者自己的兩條邊界
**這兩條是 2026-08-29 真的壞掉之後補的**,兩條都有那一天的實例。它們講的是指揮者自己不該
做什麼——不是別人。
**一、按 context 邊界切分,不按工作的類型切分。**
把自己切成「別人施工、我審查」聽起來像分工,實際上是把每一份工作的 context 都搬到指揮者
這裡來:要審查就要讀對方讀過的東西,於是同一份 context 被讀兩次,而指揮者的視窗是那個會
先滿的。外部做法把它講成
[Dividing by type of work creates constant coordination overhead;divide by context boundaries](https://claude.com/blog/building-multi-agent-systems-when-and-how-to-use-them)。
2026-08-29 的實例:指揮的 session 讀 peer 的 transcript、再自己重推一次它們的結論,
**一整天沒有交付任何東西**。
分法是按 context 邊界:一份工作連同它要的 context 整包給一個 session,指揮者只拿那一行
宣告。要細節就去問那一個 session,不是自己把它的 context 讀進來重推一次。
**二、不把別的 session 開的單收進來再轉手給第三個。**
每一次轉手都掉一層保真度(telephone game)。指揮者當中繼的時候,「誰要做什麼」多了一個
可以漏掉的地方,而漏掉的樣子是安靜的——那張單就是沒有人開始做,沒有任何東西會紅。
2026-08-29 的實例:產品 session 開的 DP 要先給指揮者、再由指揮者轉給施工的 session。
結果那天新開的四張 DP 一張都沒有到施工的 session 手上;同一天指揮者還發明了一個問題叫
施工的 session 停下來等答案,又把它調去做一張產品 PR。
**開單的人直接送給要做的那一個。** 指揮者從地圖上讀得到誰接了什麼,不需要經手。
### 送訊息給別的 session 時
- **不轉述一句同意而不帶原話。** 「人已經同意了」不算授權,那個人自己說的話才算。
- **不要求任何 peer 去做一件它自己的權限設定會擋下來的事。** 對方被擋下來的事,繞道給另一
個 session 做,就是把使用者的權限決定繞過去。
- **不要求任何 peer 去改它自己的設定。**
這三條沒有任何機制在擋,它們靠被讀到而生效。
## 三、派工之後
**一條鏈的心跳不該是那個人。** 2026-08-29 這台機器上 8 個 session 從 10:06–12:38 UTC 全部
停到隔天 10:14,22 到 24 小時。沒有一個是卡住的:每一個都做完一輪、在自己的視窗裡印完
報告、然後停住。唯一會叫醒它們的東西是有人送訊息,而那個人只在他自己想到的時候出現。
### 指令自己帶著回報要求
不要手打派工的文字。手打的那一版每次都會漏掉同樣兩樣東西,而漏掉的樣子是安靜的:
```bash
python3 .claude/skills/command-post/scripts/command-post.py --order \
--issue <那張單的路徑> --to <session 名> [--from <回報給誰>]
```
它只印出來,不送給任何人——送出去仍然是 `SendMessage`,那是一個不可逆的動作。
它做兩件手打做不到的事:**確認那條路徑真的存在**(一個指向不存在位置的成功定義,讀起來
跟一份好的成功定義一模一樣,`--issue` 指不到就 exit 3、不產出指令),以及把「回報給誰」
寫死在文字裡(答不出來就 exit 4——一則沒有收件者的回報要求等於沒有)。
指令裡不重講那份成功定義,只給路徑。**重講一次就有第二份會漂的定義**,而漂掉的那一刻
沒有人在看。
**回報要的是狀態,不是逐條判定。** 判準是使用者 2026-08-30 的原話:「只要需要『下一步該
幹嘛的指引』,就要回報」「碰到問題必須回報主管指引」。所以指令要的只有三樣——做完哪一張
或卡在哪一張、需不需要指引、需要的話缺什麼。逐條判定留在那張單的 `.spine/` 裡,要細節的
人自己去讀。
以前那一版寫「回報要對得上那份定義:哪幾條過了、哪幾條沒過、量不到的有哪些」。那是細節,
而**指揮官不用知道細節**——每一則到了指揮官那裡還要再摘一次給人,而多跳的訊息鏈每一跳都
會掉東西。
**回報不等於停下來等,這一句要明著寫在指令裡。** 做完 → 送一則狀態 → 自己抽下一張繼續;
只有板子答不出下一步、或自己走不下去,才停著等。少了它,「做完要回報」會被讀成「做完要
停下來等回話」,而那正是 `driving-work-to-done` 列為退化訊號的第二條。
### 指揮台那一頁:每一輪重讀
```bash
python3 .claude/skills/command-post/scripts/command-post.py --board \
--issues <單樹根> --waiting-on '<指揮官自己在等什麼>'
```
它印三段:唯一手寫的那一格、在飛的單、這台機器上的 session。
**它的主要用途不是交接,是每一輪重讀。** 把目標重寫到 context 尾端,避開
lost-in-the-middle(Manus 講的 recitation,
<https://manus.im/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus>)。
交接是副作用——主 session 壓縮太多就換一個,這一頁不掉。
三條限制,前兩條是這個 workspace 既有的規矩:
- **產生的部分不手寫。** 先例是 `{單樹根}/OPEN.md`,它自己的表頭就寫著「下一次重算會整份重寫」。
- **成功條件只指過去,不抄。** 那一欄是路徑,不是內容。唯一權威是那張單的 fence,
`verify-ac` 拿它跟 git 歷史比;抄第二份就是兩份會漂,而漂的是最不能漂的那一份。
- **手寫的只有一格**:`--waiting-on`。板子答不出來的只有它,交接時唯一會遺失的也是它。
### 「誰在做」那一欄:脊椎寫下、這裡去問死活
那一欄以前整欄是空的。現在它是產生的,而產生它的兩半各在一邊:
- **寫**:`init`/`advance`/`record` 每次寫輪次狀態時,把「這一趟是誰在跑」記進
`{單}/.spine/loop-state.json` 的 `holders[]`。核心不認得 session 是什麼——它掃所有
`SKILL.md` 找下面這一行,跑它,把印出來的第一行原樣記下來。
- **讀**:這一支拿那份紀錄,**在執行的這一刻**去 session 登錄量每一個對象還在不在。
紀錄只證明「當時它動過這張單」,還在不在是現在才問得到的。
<!-- POLARIS-ACTOR-IDENTITY: python3 .claude/skills/command-post/scripts/command-post.py --whoami -->
`--whoami` 不靠任何人宣告:它往上走進程祖先,每一跳去 `~/.claude/sessions/{pid}.json` 找,
找到就是它(實測兩跳)。**這件事重要的地方在覆蓋率**——這台機器上 8 個 session 只有 1 份
自願寫下的宣告,而 `init`/`advance`/`record` 是流程走不過去就不能繼續的三步。
**不覆寫,逐個對象各佔一格。** 只有 `init` 寫的話,換手之後那一欄永遠是開單的那個人;
每次覆寫的話,最後一個路過的人就成了「誰在做」。而覆寫的那一版連「不只一個人接著同一張
單」都表達不出來——那正是這一欄最該被看見的東西。
答不出來分成四句不同的話,不合併成空白:**沒有人接**(量到了,`holders[]` 是空的)、
**這一次問不到**(狀態檔或登錄讀不到)、**紀錄在、人不在**(有紀錄,登錄裡找不到那個
對象)、**推不出來是誰**(寫的時候就推不出來,理由跟著記下來)。
**表格的第一列是脊椎建議的下一張。** 它同時也是一張在飛的單——只把它寫成一句話的那一版,
一張正在施工、正被人接著的單在這張表上根本沒有列,而那正好是第五欄最該印出東西的那一種。
它跟 `seed`/`stop` 重疊時用路徑去重,不會出現兩次。
**它印出這個 session 壓縮過幾次,然後就停在那裡。** 不判斷該不該換一個——壓縮間隔量過
是平的(1099/1248/1268/1149/1543/1270/1231/1111/1122),沒有加速的特徵,所以
「開始過度壓縮」那一刻偵測不出來。發明一個門檻只會讓一個猜測看起來像一個量測。
### 派工的同時訂一次靜默
`SendMessage` 的 `notify_when_idle: true` 讓那個 session 下次閒下來時回一則通知。
**它是 one-shot,所以每一次派工都要重訂一次**——上一次的訂閱已經用掉了。
**訂閱成功不等於通知會到你手上。** 這一格是量過的(2026-08-30,對兩個不同的 session 各訂
一次):兩次的回覆逐字相同,都寫著「delivered to you if that session runs in the same
permission class as this one (or is one this session spawned); otherwise it is only logged
here」,而它**從來不說這一次落在哪一邊**。`success: true` 在兩種情況下長得一模一樣。
所以這條偵測有一個偵測不到的第三態:permission class 不同的 session 靜默了,通知只留在
紀錄裡,指揮官這邊什麼都不會發生——而那跟「它還在忙」長得一樣。**這一種要靠指揮官自己
回頭看地圖,不要當成有網子接著。**
### 收到 idle 通知不要立刻重訂,會自轉
2026-08-30 真的發生了一次:收到 idle 通知之後重訂一次,而重訂的那一刻它正好是閒的,
**訂閱當場觸發,把同一個事件原樣再送一次**——兩則逐字相同,收的人分不出那是新事件還是
回聲。
順序是:收到通知 → **先核對板子** → 它真的動過就不重訂(它還在跑,做完會照契約回報)→
只有真的靜止才重新掛訂閱。
### 判成靜默之前:先問,不要先宣布
收到 idle 通知而那個 session 沒有回報過,看起來就是靜默。**先做這兩件事:**
**一、核對板子的那條查詢自己要有 preflight。** 「它今天有沒有動」這種查詢在讀不到的時候
會回空集合、exit 0,而空集合讀起來跟「它沒做事」一模一樣。所以問「今天有沒有動」之前
先問一次「不加任何視窗的話有沒有東西」,兩者都空才是真的空。
2026-08-30 的實例:`git log --since=2026-08-30` 的裸日期被 git 解成「那天的**此刻**」,
於是 20:27 跑的那一趟連 20:26 的 HEAD 都濾掉,回 0 筆、exit 0,輸出裡沒有一個字說視窗
是從 20:27 開始的。同一個 repo 同一分鐘:`--since='2026-08-30 00:00'` 是 17 筆、
`--since=yesterday` 是 21 筆。指揮官因此對一個正在出貨的 session 宣布它「閒下來沒回報」。
**二、對 peer 下判斷之前先問它。** 問句跟宣告的成本差很多:宣告錯了,對方要花一整輪去
反駁;問句錯了,對方一句話就答完。上面那個實例裡,指揮官的措辭是「你閒下來了但沒回報」
——一個沒驗過的讀數被寫成了事實。
### 每個 session 維持是自己的視窗
派工是 session 對 session,**不是把工作收成 in-process 的 teammate**。理由是可見性:
每個 session 有自己的視窗,人看得見它在做什麼、隨時插得進去。收進同一個進程裡的那些
只有指揮官看得到。
Agent Teams 那一套(`TeamCreate` 之類)在這一版證不出來能用,而且就算能用,它的模式跟
上面那句相反。**這支 skill 不依賴它。**
## 四、問人的時候
### 形狀就是這個 workspace 既有的那一份
**結論、根據、待決**,三段,順序固定;待決的每一項帶自己的建議與理由。這支不發明第二種
格式——`.claude/rules/style-and-language.md` 已經規定了一份,而兩份會漂。
### 待決的每一項帶四格
**指揮官問人的時候,被問的那個人不是第一線接觸這些工作的人。** 這是指揮官模式的直接後果:
他只跟指揮的那個 session 講話,其餘 session 的來龍去脈他沒看過。所以「要不要開一張單」這種
一行式的問題,對第一線的人是完整的,對他是空的——他手上沒有那張單怎麼冒出來的那一段。
所以每一項待決帶四樣,**缺一項就是還沒問完**:
| 帶什麼 | 說的是 |
|---|---|
| 怎麼冒出來的 | 哪一次量測、哪一則回報逼出這一題 |
| 不決定會怎樣 | 具體後果,不是「比較不好」 |
| 選項各自的代價 | 每一條路各要付什麼 |
| 我的建議與理由 | 這一條 `.claude/rules/style-and-language.md` 本來就有,前面三格是加在它前面的 |
**四格各一兩句就夠——帶前因後果不等於寫長。** 那一份規則同時規定一般回覆不超過一個螢幕,
兩者不衝突:四格要的是每一格都有東西,不是每一格都很長。
**四格是加在「待決」那一項裡面的**,三段仍然是既有的結論/根據/待決,**不另立一套**格式。
### 往上傳之前先過濾
指揮官的價值在於**擋掉不該佔用人的注意力的問題**,不在於當一個轉發器。判準一句話:
> 這件事在提問者自己的**管轄內**,而且做錯了**改得回來** → **退回去**讓它自己決定;
> 其餘才往上傳。
兩類分得開,各舉一個真的收到過的:
| | 共同點 | 例子 |
|---|---|---|
| 往上傳 | 不在提問者的管轄內 | 不可逆或對外的(改寫歷史、推 commit、送出對外的留言);共用資源(`port 3001` 要不要讓給另一個 session、某個工作區要不要清掉);跨單排序;只有人才知道的(某個語系用短碼還是區域碼);真的走不下去 |
| 退回去 | 問的是它自己的東西,而且可逆 | 「要不要開一張單,你決定」(`driving-work-to-done` 答得出來)、「要不要把這句寫進它自己那張單的活文件」、「你要我改,說一句我就改」 |
**退回去要帶理由**,理由就是那個判準:這是你的單、這件事改得回來。**只回一句「你自己決定」
不算退回**——它沒有把判準交出去,下一次同樣的問題會再上來一次。
**不確定的往上傳。** 這條過濾省的是人的注意力,不是指揮官的判斷;把一件真的不可逆的事誤判
成可逆,代價**比多問一次大**得多。所以**不可逆或對外的不退回去**,沒有例外——那一格不參與
「在不在管轄內」的判斷。
這個判準來自一次量測:一個 session 的收件匣 206 則 peer 訊息,含求指示標記的 59 則,逐則
讀完能認定是真的在問人的約 28 則,兩類的分界很乾淨。**那份量測自己的邊界要一起說**:它來自
**舊的作業方式**(這一版的回報契約之前)、是那個 session 對**自己的收件匣**做的分類、59 是
**樣式命中**不是確認數。所以它證得出兩類真的分得開,證不出比例會維持。
### 要代送的對外內容,哪一種先給人看
上面那一格說「不可逆或對外的不退回去」。**它管的是「這件事誰決定」,不是「這段文字誰過目」**
——一則要送出去的 review 回覆,決定權本來就不在提問的那個 session 手上,剩下的問題只有一個:
使用者要不要逐則讀過它。這一節回答的是後者,所以它不是上面那條的例外,是那條沒有回答的
另一半。
判準看那則回覆在主張什麼:
| 回覆的內容是 | 怎麼辦 |
|---|---|
| 照 reviewer 說的改了,並說明改了什麼 | **直接送**,送完回報送了什麼、送去哪 |
| 不同意 reviewer,要主張另一個立場 | **先交給人看**,等他回話再送 |
分界是**事實與立場**。reviewer 提的可驗證技術主張,判真偽本來就是這一端的活;真正只有人
回答得出來的是立場,不是事實。所以照做型的回覆裡沒有任何需要人拍板的東西,逐則確認只是把
它排進一條隊伍。
代價量得出來:2026-08-29 到 08-31,同一批工作有八支 PR 停在原地,其中四支是 CHANGES_REQUESTED
——等的就是那幾則沒被放行的回覆。
**這條界線只劃在 review 回覆上。** 推 commit、改寫歷史、送出 JIRA 或 Slack 的對外留言、動
共用資源,仍然照上面那一格往上傳,那個判準一個字都不放寬。
**判錯的責任在指揮官。** 任何一則判成直接送、而使用者事後認為該先看的,整批回到逐則確認
——一條沒有人負責的界線會往寬的那邊漂。
### 什麼時候值得畫一張圖
判準一句話:**要對方同時比對三個以上的量、而那些量之間的關係用句子講會需要回頭讀第二次時,
畫。其餘不畫。**
對三種問題各判一次:
| 問題 | 判準說 | 為什麼 |
|---|---|---|
| 「A 跟 B 兩個做法選一個」——只有選項與取捨 | **不畫** | 兩個東西並排,一張表就夠,圖不會讓取捨變清楚 |
| 「八個 session、各自閒置多久、手上有什麼、哪些能關」 | **畫** | 四個量乘八列,句子講完對方要回頭數 |
| 「這樣做可以嗎」——只要一個點頭 | **不畫** | 沒有量要比 |
**不因為看起來用心就畫。** 一張沒有人需要的圖,是把讀的人的時間換成自己的努力看起來比較多。
**圖不取代那三段。** 圖出現的時候結論、根據、待決仍然在,待決仍然帶著建議——圖是根據的一
部分,不是「你自己看」的代替品。
**圖上每一個量都要說得出它從哪裡量到的。** 畫不出來源的量不要畫進去。
## 這支不做的事
- **不判定一件工作算不算完成。** 那是 `verify-ac`。
- **不決定下一站。** 那是 `driving-work-to-done`。
- **不停止不是它自己起的進程、不動別的 session 的工作區或分支、不啟動或停止任何共用的
服務與容器。**
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!