身為每天都在追新事情的人,我要舊票有固定管道被消化,我才不會 229 張票永遠躺著 #83
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
問題
leo 2026-08-27 原話:
現在的實況是:全 org 229 張 open 票,而每天在動的只有掛在 active milestone 上的那些。沒掛的就永遠不會被碰到——不是因為不重要,是因為沒有任何機制會去拿它們。
worklist-guard.sh已經在擋「還有未完成步驟就收工」,但它管的是這一輪已經領到的工作。它不會去把舊票撈出來。目標
每天固定產出一份「今天可以領什麼」的清單,並且整包整包地領,不是逐票跳著挑。
清單的來源是固定查詢,不靠記憶:
排序可以有多個條件(leo 明講),大致是:出事的 → 擋住別人的 → 答應過人家的 → 放最久的 → 最快做完的。「距離目標的遠近」只在有緊急事件要趕的時候才拿來排,那是緊急線的判準,不是還債線的。
相關的票要成包一起領,不要拆散:互相 blocked 的必然同包、同一條使用者旅程的同包、同一張母票分出來的同包。
驗收條件
deliverable 類型
code(→ PR)
細節
這條在 SOP 裡的位置:S10(每日開工·雙線)+ §5(優先級判準)。
leo 對優先級的訂正(2026-08-27,
InkStoneCo#40留言):總管原本把「CP 距離」和「票齡」當成互斥的二選一問 leo,leo 直接指出「這是兩件不同的事,你根本沒搞清楚」。正解是雙線並行、各用各的判準:實查數字(2026-08-27):inkstone 組織 15 個 repo,open issue 229、open PR 9、open milestone 14。
已經撞過的:
InkStoneCo#52「該動沒動的事沒有人會叫——催辦要變成會自己發生的動作」(s/triage)講的是同一個病的另一半(催辦),本票講的是「每天固定去拿」。兩張要互相連結。紅線:不准做成 Gitea Actions/webhook fan-out(
CLAUDE.md避免再被 flag 的硬規則,且issue-handleskill 明寫「有事才讀,禁止自動輪詢」換成 Gitea 也不放寬)。第一版做成手動可跑的腳本+SessionStart 順手跑,同 v0.6.0 §8.2。【身份】subagent/inkstone/ISEP/feat/debt-worklist
交件:PR #101
scripts/debt-worklist——還債線每天撈一次「今天可以領什麼」,整包整包地領。leo 的訂正被當成前提寫進工具裡:兩條線各用各的判準。
掛 open milestone 的 56 張=緊急線(既有機制在管);沒掛的 188 張=還債線,
用多條件排(事故/擋人/承諾/票齡/估工)。
四條驗收條件,逐條的證據(真實 229 張唯讀實跑)
① 排好序的清單 +「我查了哪些 repo」的證明 ✅
15 個 repo 逐一列名與數量,並講出扣掉了什麼:
扣掉:掛在 open milestone 上的 56 張/等 leo 的 9 張(Human・human/exec・s/stage)/已經領走的 0 張② 空清單會說話 ✅
✅ 查詢跑過了,結果是零。+ 一樣附那份 repo 清單——沒有證明的空清單,分不出「今天真的沒有」與「查詢壞了」。
③ 第二天看得出第一天領走的不在清單上 ✅
領走兩張後再跑:
📦 之前領走的 2 張:已關 0、還開著 2,可領從 188 → 186。④ 前幾名排出來像那麼回事 ✅
🔴 每張票旁邊都印出「為什麼排這裡」的分項——排錯可以指著某一項說它給太多,
不必猜。權重全在
score()一個函式裡。兩個我自己裁的判斷(不同意都是一行的事)
s/stage跟Human/human/exec一起排除在「可領」之外——它們是等 leo,正確動作是催不是領(催辦= #93)。今天 9 張。
190 張裡 121 張黏成一坨(大家都會順手引用 hub 票)=一包沒有人領得動。
代價:同旅程但沒互指、沒建相依的不會成包。寧可漏成包,不要成一包沒人領得動的。
測試
bash scripts/test-debt-worklist.sh→ 通過 40 條,失敗 0 條。全程離線(fixture/定住時鐘/狀態目錄可換),不打 Gitea、不留測試票、不碰
$HOME。另補
docs/TESTING.mdA16 一節。紅線
SessionStart那一段只看狀態檔日期講一句話,不打網路(測試裡有一條專門守這件事)。
plugin.json);定版時 description 的「28 支腳本」要 +2。沒有新增 hook,
hooks-inventory.md不用改。🏃 棒子交回 →
claude-code下一步:review PR #101 併掉;併之前決定兩件事:s/stage 要不要留在「不可領」那堆、以及成包只認強訊號夠不夠;併後定版(plugin.json 版本+description 的腳本數 28→30)
證據:bash scripts/test-debt-worklist.sh → 40/40;真實 229 張唯讀實跑:可領 188 張/185 包,領走 2 張後隔天剩 186
【身份】subagent/inkstone/ISEP/feat/debt-worklist
併好了:
PR #101現在 mergeable=True(headd301810,base5d6c4b5)main 在我做的期間動了四次,所以併了三輪:
#96+#100+#99→v0.13.0(#102)→#98。衝突只有兩個檔、各一處:
docs/TESTING.md.claude-plugin/plugin.json今天 main 上
A16、A17各被佔兩次、A19被佔兩次——撞號是這條線今天的常態。讓號的成本比要求別人改小,所以一律我讓。
盤點數字在合併後的樹上自己重數
🔴 那個 +3 不全是我的:
+2是本 PR(debt-worklist、test-debt-worklist.sh),+1是#98帶進來的scripts/test-ticket-handoff-writeback.sh——#98併進 main 時沒有回頭改這個數字。docs/hooks-inventory.md不用改(閘的兩個數字都沒變)。接上「主線唯一答案」了(你點的那件事)
我原本的規則是「掛 open milestone 就排除」——那是
#82之前沒有唯一答案時的權宜。現在改成呼叫
hooks/lib/mainline.py,不自己養第二套判斷:ML.belongs(),跨 repo 同名照舊算同一條);掛在別條 milestone 的仍然算債——那條線現在沒有人在推,正是它躺著的原因
+15「答應過人家的日期已經過了」測試 40 → 47 條(+7 全給這段),並把
ISEP_COUNTDOWN_STATE_DIR也隔離——不然這支測試的結果會取決於「這台機器現在標了哪條主線」,那就不是測試了。
合併後所有測試重跑(不只我那支)
唯一沒跑的:
ask-user-question-guard.live.test.sh(會真的叫 haiku、要花錢)——這一格我沒驗。⚠️ 順手撞到一個不是我造成的問題(給你決定要不要開票)
hooks/tests/dispatch-format-guard.test.sh兩份同時跑會互相打死:它用固定路徑
/tmp/.dispatch-ok-S-TEST當豁免戳記,一份跑完clean()會把另一份的戳記刪掉。我第一次全掃時看到
31/33、第二次32/33,單獨跑卻永遠33/33——所以我實際重現了一次:今天四條線並行 ⇒ 這個假紅還會再出現,而它長得跟「閘壞了」一模一樣。
修法是把
S-TEST換成帶 PID 的路徑(一行)。不在我這張票的範圍,我沒動它。🏃 棒子交回 →
claude-code下一步:PR #101 已 mergeable=True,可以併;併前決定兩件:① s/stage 要不要留在「不可領」那堆 ② 成包只認強訊號夠不夠。另外 plugin.json 的腳本數我重數成 43(含 #98 漏數的那 1 支),定版時再確認一次
證據:合併後全套重跑:hooks/tests 18 支全綠、scripts/test-* 11 支全綠、版本一致性 ✅;本 PR 自己那支 47/47。唯一沒跑 ask-user-question-guard.live(會花錢)