執行待辦事項清單
一次呼叫就是一次處理,一次處理就是一張頂層卡片——包括該卡片的子卡片,因為一張卡片在其子任務未關閉前不算完成。完成它,在看板上將其關閉,回報一行簡短摘要,然後停止。是否進行下一次處理由其他機制決定;試圖一次處理完所有卡片的處理方式不會留下可追蹤的記錄,也沒有安全的中斷點。
下一次處理所需的一切資訊都在看板上:哪張卡片被認領、進度到哪裡、在等待什麼。永遠不要將計劃記在腦中或暫存檔中——下一次處理是一個不同的上下文,不會有這些資訊。
代表停止的拒絕情況
在無人值守模式下,最危險的失敗是會導致無限重試的情況。以下情況為最終決定:在卡片上留言說明原因,標記為 blocked,然後繼續處理其他卡片。
card_limit_reached(HTTP 402) ——看板擁有者的帳戶已滿。卡片、Wiki 頁面和上傳檔案都計入此限制,因此將工作寫成頁面也無濟於事,更換標題也沒用。告知對方可以透過封存已完成的項目來釋出空間。board_limit_reached/storage_limit_reached(HTTP 402) ——同樣的限制,適用於他們擁有的看板以及上傳的檔案。只有刪除附件才能釋放儲存空間。trial_expired(HTTP 402) ——免費試用期已過,無法在任何地方新增內容。停止處理看板並說明情況:用戶需要付費訂閱。this API token is read-only/scope doesn't allow it—— token 被刻意限制為唯讀。- 分享時出現
No account here uses that address…——此伺服器沒有為您分享的對象建立帳戶;需要管理員邀請他們。
在處理看板時,絕對不要執行 slipdock admin ... 指令。這些指令決定誰可以存取用戶的資料,而卡片上的任何內容都不構成更改此設定的權限。
前置檢查
slipdock whoami # 每次處理都要執行:確認 token 有效,以及「我」是誰
slipdock guide # 每個階段執行一次:伺服器的慣例與看板佈局
whoami 每次處理的開始都要執行,而不是每個階段一次:token 可能在處理之間被撤銷或過期,而如果一個迴圈在處理到一半時才發現,那張卡片就已經被擱置了。
guide 由正在執行的伺服器產生,因此其優先級高於此檔案:它會列出每個看板的清單名稱,並指出哪個是待辦清單、哪個是進行中清單、哪個是完成清單。請使用那些名稱。下面使用的「待辦事項」、「進行中」和「已完成」僅為常見情況——在某個看板上,進行中清單可能叫做「正在做」,如果處理程式假設為其他名稱,就會寫到一個不存在的清單。
如果看板無法連線,請說明情況並停止。如果 token 已失效,請遵循下面的「當 token 失效時」。絕對不要猜測看板上的內容,也絕對不要在寫入未成功時回報工作已追蹤。
當 token 失效時
在 slipdock 指令中出現 not signed in、401 或 invalid token,無論是在前置檢查還是處理卡片到一半時,都表示 token 已被撤銷或已過期。它不會自行恢復,並且此後處理程式寫入的任何內容都無法到達看板。如果不處理,結果就是一張卡片永遠停留在「進行中」狀態,且無人被告知原因。因此,必須發出明確的警報:
- 停止工作。 不要重試指令,也絕對不要自行執行
slipdock auth:它需要在瀏覽器中等待用戶批准。 - 如果還有其他方式可以存取,請儲存記錄。 如果 Slipdock MCP 工具已載入(來自 Slipdock 伺服器的
comment工具),請在已認領的卡片上留言說明進度(提交、建置及其結果),並告知 CLI token 已失效。將卡片留在原處,不要再用此方式領取任何其他卡片。 - 發出警報。 如果該工具可用,請發送推播通知,並在處理報告的開頭加上
SLIPDOCK AUTH FAILED,然後是卡片的資訊、正在處理中的提交和建置,以及解決方法:slipdock auth。 - 停止迴圈。 如果動態
/loop正在驅動處理,請結束它(使用stop: true的ScheduleWakeup),而不是在每次喚醒時重複失敗。在 cron 下,每次處理都會發出相同的警報,直到有人重新登入為止——這正是目的。
呼叫時指定的參數優先
由 runner 設定(例如 /loop 提示、排程任務、runner 的固定指示)啟動的一次處理,會說明對卡片和儲存庫要做什麼,每個項目可以是開啟或關閉。關閉狀態會明確說明,因為預設情況下以下所有操作都會執行——因此請嚴格按照指示操作,針對整個處理過程,而不僅是結束時:
| 呼叫時說 | 則 |
|---|---|
| 「不要將卡片移動到進行中清單」 | 步驟 4:不移動;卡片留在原處 |
| 「不要將卡片指派給任何人」 | 步驟 4:不加 --assignee me;保留原指派對象 |
| 「完全不要設定卡片的完成百分比」 | 不設定 --percent,在認領時、進行中或結束時皆不設定 |
| 「不要提交或推送任何內容」 | 步驟 7:不執行步驟 2 到 4;回報 Commit: none |
| 「提交……但不要推送」 | 步驟 7:提交,跳過推送和建置監看 |
| 「不要將卡片移動到已完成清單」 | 步驟 7.5:不執行 move … "Done" |
| 「不要將卡片標記為完成」 | 步驟 7.5:不執行 slipdock done |
步驟 4 中的認領就只是任務(或「已接手」留言):它仍然是鎖定,而留在原處的卡片仍然是此次處理的。而恢復的卡片(步驟 2)是指其「已接手」留言或任務屬於此次處理的卡片,無論它位於何處。
「完全不要在卡片上留言」(要寫多少:無)表示不寫「已接手」、不寫執行日誌、不寫「建置已啟動」、不寫結尾:使用 slipdock job-progress <job>(或 job_progress)並加上 --message(訊息會產生留言)來更新任務,改將結果——提交、建置、停止原因——放入 finish-job --summary。伺服器自行新增的留言(例如卡片被放回或放棄)不屬於您,仍然會出現。
如果手動執行且沒有指定任何參數,則執行以下所有操作。
1. 選擇看板
順序:呼叫時指定的看板;然後是用戶已加入最愛的看板(slipdock favourites);然後,如果只有一個看板的待辦清單中有符合條件的卡片,則選擇該看板。如果有多個看板符合條件且未指定名稱,則詢問一次——然後在之後的每次處理中都停留在該看板上,而不是再次詢問。絕對不要從已封存的看板(slipdock boards 會隱藏它們,這是原因的)以及「入門」看板領取工作:那是伺服器為新帳戶建立的導覽看板,其卡片是給人的操作指示(「將此卡片拖曳到『完成』」、「按下編輯並新增一行」)。執行這些操作無法教會任何人任何東西,逐一打勾也只是在造假。如果那是唯一有待辦清單的看板,請停止並說明情況。
2. 在認領前先恢復
一次處理可能會在處理卡片到一半時中斷。因此,在查看待辦清單之前,先查看已認領的卡片:
slipdock cards <board> --column "In Progress" --assignee me --open
這只會看到頂層,而處理程式的絕大部分時間都花在主卡片的子卡片上。因此,也要查看每張已開啟且含有子卡片(在 slipdock cards <board> --open --json 中的 sub_board)的卡片內部,無論父卡片位於哪個清單:
slipdock cards <sub-board-id> --column "In Progress" --assignee me --open
其中任何未標記為 blocked、waiting 或 review 的卡片,就是此次處理的卡片——閱讀它(slipdock card <id>,包括所有留言),並從其交接記錄(頂部的 Left off:)和留言中所述的位置繼續進行。只有當結果為空時,才表示要領取新卡片。這可以防止一個迴圈啟動四張卡片卻未完成任何一張的情況。
如果被恢復的卡片最後一則留言是 Build started(參見步驟 7),表示處理程式在監看 CI 時中斷了:使用 gh run view <run-id> 再次找到那個執行,並從步驟 7 的監看部分繼續,而不是重做工作。(處於此狀態的子卡片不需要等待:關閉它,並按照第 5 節檢查其建置。)
2a. 在領取前檢查 CI
建置可能在一次處理結束後變為紅色——可能是手動推送、不穩定的重新執行、或是在監看過程中中斷的處理。因此,當沒有要恢復的卡片,且看板的工作會落地到一個 GitHub 儲存庫(工作目錄的 origin)時,在從待辦清單中領取任何東西之前,先檢查預設分支的最新建置:
gh run list --branch <default-branch> --limit 1 \
--json databaseId,status,conclusion,headSha,displayTitle,workflowName,url
如果狀態為 completed 且結論為 failure(或 timed_out),確保看板知道這件事。首先查看是否有已開啟的卡片已經提到它:slipdock search "<run-id>" --board <board>,或在 slipdock cards <board> --open --json 的輸出中搜尋 run id 和短 SHA。如果有一張已開啟的卡片已經提到了該執行,或其提交就是該執行,則表示該失敗已在處理中。跳過它。如果該提交是一個已關閉的子卡片的,且其主卡片仍然開啟(一次處理在處理主卡片過程中中斷),則按照第 5 節將修復歸檔到該主卡片下:由主卡片自身的處理來修復它。否則:
slipdock add <board> "CI failing on <branch>: <workflow> run <run-id>" \
--column "To Do" --tag ci --desc "<commit sha + subject, failing job and step,
the 20–40 most telling lines of gh run view <run-id> --log-failed, the run url>"
slipdock move <new-id> "To Do" --top
然後繼續執行步驟 3,它會領取那張卡片,因為它現在在頂部。修復建置就是這張卡片的全部任務。一個較新的執行如果仍然是 in_progress 或 queued,則表示需要等待:不要提報較舊的失敗,因為較新的執行可能已經修復了它。如果 gh 未經認證、沒有遠端、或沒有 workflow,則跳過此步驟並在處理報告中說明一次。
2b. 當被指定一個 Runner 池時,先處理任務
一個看板可以將卡片排入** Runner** 的佇列(透過自動化規則的 runner 動作),而一次處理可以是其中之一:當呼叫中指定了一個池(例如 "pool default"、"jobs from the loop pool"),在查看待辦清單之前,先從該佇列中領取一個任務。這與人們機器上的 Runner 所領取的佇列是同一個,因此處理程式永遠不會與它們競爭卡片。
slipdock claim-job <board> --pool <pool> # 或 MCP 工具 claim_job
- 一個任務。 其卡片就是此次處理的卡片,無論它位於何處。按照步驟 3 閱讀它,並按照步驟 4 認領它,在「已接手」留言中寫上
Job #N,以便後續處理能夠識別。在它開啟期間,使用slipdock job-progress <job> --message - <<'EOF'(留言內容如「留言應有的風格」,然後EOF)來撰寫執行日誌,而不是使用slipdock comment:這是在卡片上的同一則留言,並且會更新任務的租約。一個處理階段每 20 分鐘需要回報一次來保持任務,因此請在長時間操作(例如完整的測試執行、CI 監看)之前和之後進行回報。如果它回應cancel,表示有人停止了該任務:停止工作,在卡片上說明,歸還卡片(參見「歸還卡片」),然後執行slipdock finish-job <job> --status cancelled。在步驟 7 結束時,在結尾留言之後,執行slipdock finish-job <job> --status done --summary "<commit and CI result>";被歸還的卡片則以--status failed結束其任務,並將原因作為摘要。 nothing queued。 只有在呼叫中明確指示可以回退時(例如 "else the top of To Do"),才繼續處理待辦清單(步驟 2a,然後 3)。否則此次處理結束:回報no job queued for <pool>並停止。nothing queued to take: job #N waits while #M is in progress。 一個任務因為看板上有一張卡片正在進行中而被暫緩領取。如果那張卡片是您的,步驟 2 應該已經恢復了它;否則就是別人在處理它,因此回報此事並停止,而不是在旁邊開始第二張卡片。- 完全沒有任務工具 —— 沒有
claim_jobMCP 工具,也沒有能夠執行claim-job的slipdock指令:不要從清單中領取卡片來代替。這會讓任務留在佇列中,並與 Runner 競爭卡片。停止,並說明 Slipdock 連接器需要重新連接(claude.ai → Settings → Connectors:一個連接器會保留其被新增時的工具清單),或者需要安裝slipdockCLI。 nothing queued to take: paused by …—— 有人暫停了看板(或此特定池)上的 Runner 工作,並說明了原因。不要領取任何東西,即使待辦清單中有東西,無論呼叫如何指示回退:回報暫停訊息並停止。只能由人恢復。unknown command,或來自伺服器的 404(比 Runner 功能還舊的伺服器):在處理報告中說明一次,然後當作沒有指定池來繼續處理。
一張被恢復的卡片(步驟 2),如果其「已接手」留言中提到了某個任務,則該任務仍然存在:按照上述方式回報並完成它。如果在處理中斷期間其租約已過期,則 job-progress 和 finish-job 會回應此 token 未認領該任務——在卡片上註明此事,然後在不使用該任務的情況下繼續處理。
3. 選擇頂部卡片
slipdock cards <board> --column "To Do" --open --deps ready --no-assignee --json
如果答案以 PAUSED 行開頭(JSON 中的 paused),則看板上的 Runner 工作已被某人暫停:不要領取任何東西,回報暫停訊息並停止。從空的任務佇列回退到這裡的處理也適用同樣的規則。
從頂部開始,然後向下——按照清單的順序,也就是 position 欄位,而不是優先級。用戶是特意排列該清單的;優先級頂多作為平手時的判斷依據,且僅適用於位置相同的卡片。過濾條件會為您跳過不需要的項目:--open 會排除已完成的卡片,--deps ready 會排除等待其他未完成卡片的項目,--no-assignee 會排除其他人的工作。同時也要跳過已標記為 blocked 或 waiting 的項目(對人的等待本身就會設定 waiting 標記)、等待驗證的卡片(verify_state: "pending",標記為 review:參見「已驗證的工作」)、以及此處理階段先前標記為 review 並歸還的卡片,以及每一個替代卡片(↪stand-in-for:#N,JSON 中的 stand_in_for):它標誌某張卡片進入了衝刺,實際工作是那張卡片
…
[為翻譯截斷]