身為每天都在追新事情的人,我要舊票有固定管道被消化,我才不會 229 張票永遠躺著 #83

Closed
opened 2026-08-27 14:30:22 +00:00 by claude-code · 4 comments
Member

問題

leo 2026-08-27 原話:

「距離是在確定有個緊急事件要儘速達成時,現在每天都在追新的,所以要用 Routine 去消化舊的,可以有多個條件」

現在的實況是:全 org 229 張 open 票,而每天在動的只有掛在 active milestone 上的那些。沒掛的就永遠不會被碰到——不是因為不重要,是因為沒有任何機制會去拿它們

worklist-guard.sh 已經在擋「還有未完成步驟就收工」,但它管的是這一輪已經領到的工作。它不會去把舊票撈出來。

目標

每天固定產出一份「今天可以領什麼」的清單,並且整包整包地領,不是逐票跳著挑。

清單的來源是固定查詢,不靠記憶:

  • 全 org 所有 repo 的 open issue + open PR
  • 扣掉已經掛在主線 milestone 上的(那些歸緊急線管)
  • 剩下的照優先順序排出來

排序可以有多個條件(leo 明講),大致是:出事的 → 擋住別人的 → 答應過人家的 → 放最久的 → 最快做完的。「距離目標的遠近」只在有緊急事件要趕的時候才拿來排,那是緊急線的判準,不是還債線的。

相關的票要成包一起領,不要拆散:互相 blocked 的必然同包、同一條使用者旅程的同包、同一張母票分出來的同包。

驗收條件

  1. 跑一次 → 要吐出一份排好序的清單,而且附上「我查了哪些 repo」的證明
  2. 清單是空的時候 → 要說「查詢跑過了,結果是零」,不能默默結束
  3. 連續兩天跑 → 第二天要看得出第一天領走的已經不在清單上
  4. 拿今天的 229 張進去跑 → 排出來的前幾名,leo 看了要覺得「對,這幾件確實該先做」

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-handle skill 明寫「有事才讀,禁止自動輪詢」換成 Gitea 也不放寬)。第一版做成手動可跑的腳本+SessionStart 順手跑,同 v0.6.0 §8.2。


🔎 為什麼另開一張票而不是貼進既有的(開票時聲明):#52 講催辦(提醒面),本票講每天固定撈舊票排序領取(供給面)。worklist-guard 管已領工作不准半途收工,不會去撈舊票。
當時搜尋:還債 舊票 每日 領取 排序 → 命中 44 張。

## 問題 leo 2026-08-27 原話: > 「距離是在確定有個緊急事件要儘速達成時,**現在每天都在追新的,所以要用 Routine 去消化舊的**,可以有多個條件」 現在的實況是:全 org **229 張 open 票**,而每天在動的只有掛在 active milestone 上的那些。沒掛的就永遠不會被碰到——不是因為不重要,是因為**沒有任何機制會去拿它們**。 `worklist-guard.sh` 已經在擋「還有未完成步驟就收工」,但它管的是**這一輪已經領到的工作**。它不會去把舊票撈出來。 ## 目標 每天固定產出一份「今天可以領什麼」的清單,並且整包整包地領,不是逐票跳著挑。 清單的來源是固定查詢,不靠記憶: - 全 org 所有 repo 的 open issue + open PR - 扣掉已經掛在主線 milestone 上的(那些歸緊急線管) - 剩下的照優先順序排出來 **排序可以有多個條件**(leo 明講),大致是:出事的 → 擋住別人的 → 答應過人家的 → 放最久的 → 最快做完的。**「距離目標的遠近」只在有緊急事件要趕的時候才拿來排**,那是緊急線的判準,不是還債線的。 相關的票要成包一起領,不要拆散:互相 blocked 的必然同包、同一條使用者旅程的同包、同一張母票分出來的同包。 ## 驗收條件 1. 跑一次 → **要吐出一份排好序的清單**,而且附上「我查了哪些 repo」的證明 2. 清單是空的時候 → 要說「查詢跑過了,結果是零」,**不能默默結束** 3. 連續兩天跑 → 第二天要看得出第一天領走的已經不在清單上 4. 拿今天的 229 張進去跑 → 排出來的前幾名,leo 看了要覺得「對,這幾件確實該先做」 ## deliverable 類型 code(→ PR) --- <details><summary>細節</summary> **這條在 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-handle` skill 明寫「有事才讀,禁止自動輪詢」換成 Gitea 也不放寬)。第一版做成手動可跑的腳本+SessionStart 順手跑,同 v0.6.0 §8.2。 </details> --- > 🔎 **為什麼另開一張票而不是貼進既有的**(開票時聲明):#52 講催辦(提醒面),本票講每天固定撈舊票排序領取(供給面)。worklist-guard 管已領工作不准半途收工,不會去撈舊票。 > 當時搜尋:`還債 舊票 每日 領取 排序` → 命中 44 張。
claude-code added this to the SOP 變成閘 milestone 2026-08-27 14:32:27 +00:00
claude-code added the
s
todo
type
governance
p
high
labels 2026-08-27 14:32:41 +00:00
Author
Member

【身份】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。

④ 前幾名排出來像那麼回事

1. [88]   arcrun-rag#104   事故+40、擋住6張+36、有人接了+12
2. [70.7] Arcrun#85        高優先+20、擋住2張+24、已開工(s/doing)+18、擱置14天+8.7
3. [70]   Arcrun#134       事故+40、已開工(s/review)+18、有人接了+12
4. [68.6] InkStoneCo#34    擋住3張+36、已開工(s/doing)+18、擱置7天+4.6、看起來小+10
5. [67.7] arcrun-rag#41    高優先+20、擋住2張+24、已開工(s/doing)+18、擱置9天+5.7

🔴 每張票旁邊都印出「為什麼排這裡」的分項——排錯可以指著某一項說它給太多,
不必猜。權重全在 score() 一個函式裡。

兩個我自己裁的判斷(不同意都是一行的事)

  1. s/stageHumanhuman/exec 一起排除在「可領」之外——它們是等 leo,
    正確動作是不是(催辦= #93)。今天 9 張。
  2. 成包只認強訊號(互相指著/Gitea 原生相依)。第一版用單向引用成包,
    190 張裡 121 張黏成一坨(大家都會順手引用 hub 票)=一包沒有人領得動。
    代價:同旅程但沒互指、沒建相依的不會成包。寧可漏成包,不要成一包沒人領得動的。

測試

bash scripts/test-debt-worklist.sh通過 40 條,失敗 0 條
全程離線(fixture/定住時鐘/狀態目錄可換),不打 Gitea、不留測試票、不碰 $HOME
另補 docs/TESTING.md A16 一節。

紅線

  • 不是輪詢、不是 fan-out:腳本自己不會醒。SessionStart 那一段
    只看狀態檔日期講一句話,不打網路(測試裡有一條專門守這件事)。
  • 沒推 main、沒部署任何東西。版本號待總管定版(本 PR 沒動 plugin.json);
    定版時 description 的「28 支腳本」要 +2。沒有新增 hook,hooks-inventory.md 不用改。
【身份】subagent/inkstone/ISEP/feat/debt-worklist ## 交件:PR https://git.uncle6.me/inkstone/ISEP/pulls/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。 **④ 前幾名排出來像那麼回事** ✅ ``` 1. [88] arcrun-rag#104 事故+40、擋住6張+36、有人接了+12 2. [70.7] Arcrun#85 高優先+20、擋住2張+24、已開工(s/doing)+18、擱置14天+8.7 3. [70] Arcrun#134 事故+40、已開工(s/review)+18、有人接了+12 4. [68.6] InkStoneCo#34 擋住3張+36、已開工(s/doing)+18、擱置7天+4.6、看起來小+10 5. [67.7] arcrun-rag#41 高優先+20、擋住2張+24、已開工(s/doing)+18、擱置9天+5.7 ``` 🔴 **每張票旁邊都印出「為什麼排這裡」的分項**——排錯可以指著某一項說它給太多, 不必猜。權重全在 `score()` 一個函式裡。 ### 兩個我自己裁的判斷(不同意都是一行的事) 1. **`s/stage` 跟 `Human`/`human/exec` 一起排除在「可領」之外**——它們是等 leo, 正確動作是**催**不是**領**(催辦= #93)。今天 9 張。 2. **成包只認強訊號**(互相指著/Gitea 原生相依)。第一版用單向引用成包, **190 張裡 121 張黏成一坨**(大家都會順手引用 hub 票)=一包沒有人領得動。 代價:同旅程但沒互指、沒建相依的不會成包。**寧可漏成包,不要成一包沒人領得動的。** ### 測試 `bash scripts/test-debt-worklist.sh` → **通過 40 條,失敗 0 條**。 全程離線(fixture/定住時鐘/狀態目錄可換),不打 Gitea、不留測試票、不碰 `$HOME`。 另補 `docs/TESTING.md` A16 一節。 ### 紅線 - **不是輪詢、不是 fan-out**:腳本自己不會醒。`SessionStart` 那一段 **只看狀態檔日期講一句話,不打網路**(測試裡有一條專門守這件事)。 - 沒推 main、沒部署任何東西。**版本號待總管定版**(本 PR 沒動 `plugin.json`); 定版時 description 的「28 支腳本」要 +2。**沒有新增 hook,`hooks-inventory.md` 不用改。**
Author
Member

🏃 棒子交回 → 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

🏃 **棒子交回** → `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
claude-code self-assigned this 2026-08-28 00:39:53 +00:00
claude-code added
s
review
and removed
s
todo
labels 2026-08-28 00:39:54 +00:00
Author
Member

【身份】subagent/inkstone/ISEP/feat/debt-worklist

併好了:PR #101 現在 mergeable=True(head d301810,base 5d6c4b5

main 在我做的期間動了四次,所以併了三輪:#96#100#99v0.13.0#102)→ #98

衝突只有兩個檔、各一處

衝突 怎麼解
docs/TESTING.md 兩次都是編號撞號 兩邊內容都留,我讓號:A16 → A19 → A20,整節搬到 A19 後面
.claude-plugin/plugin.json 一行(版本+描述) 取 main 的 0.13.0(我不定版),只重數腳本數

今天 main 上 A16A17 各被佔兩次、A19 被佔兩次——撞號是這條線今天的常態
讓號的成本比要求別人改小,所以一律我讓。

盤點數字在合併後的樹上自己重數

hooks/*.sh                    54     ← 沒變(本 PR 沒新增 hook)
hooks.json 的 "command":      71     ← 沒變(沒新增註冊)
ls scripts | wc -l            43     ← 40 → 43

🔴 那個 +3 不全是我的+2 是本 PR(debt-worklisttest-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 的仍然算債——那條線現在沒有人在推,正是它躺著的原因
  • 沒標主線 ⇒ 退回保守:掛 open milestone 的一律不領,且清單上照實說「現在沒有標主線」(不編一條出來)
  • 順帶多一條排序條件:別條 milestone 已逾期 ⇒ +15「答應過人家的日期已經過了」

測試 40 → 47 條(+7 全給這段),並把 ISEP_COUNTDOWN_STATE_DIR 也隔離
——不然這支測試的結果會取決於「這台機器現在標了哪條主線」,那就不是測試了。

合併後所有測試重跑(不只我那支)

hooks/tests:ask-user-question 14/14 countdown 20/20 dispatch-format 33/33
             factory-idle 33/33 gate-ok 17/17 gitea-arm-check 16/16
             beacon 14/14 main-and-prod-push 10/10+跨 repo 19/19
             mainline-focus 24/24 mainline-idle 61/61 pr-verdict 52/52
             prod-write 37/37 reply-identity 11/11 sdd 8/8
             search-is-not-proof 31/31 stage-before-prod 16/16 unpushed 10/10
scripts:    debt-worklist 47/47 handoff-writeback 49/49 baton 10/10
             comment-carries-task 22/22 github-contact 14/14 kbdb-api-wall 10/10
             main-and-prod-push 13/13 release-tag 8/8 stage-before-prod 13/13
             ticket-api-bypass 24/24 ticket-where-seen 17/17
版本一致性: ✅ plugin.json=0.13.0,最新 tag=v0.13.0

唯一沒跑的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——所以我實際重現了一次:

$ (bash …/dispatch-format-guard.test.sh > /tmp/d1 & bash …/dispatch-format-guard.test.sh > /tmp/d2 & wait)
d1: ══ 33/33 通過 ══
d2: ══ 32/33 通過,1 個失敗 ══
    ❌ ⑧ 明示豁免戳記在 → 放行一次 —— 期望 exit=0,實得 exit=2

今天四條線並行 ⇒ 這個假紅還會再出現,而它長得跟「閘壞了」一模一樣。
修法是把 S-TEST 換成帶 PID 的路徑(一行)。不在我這張票的範圍,我沒動它。

【身份】subagent/inkstone/ISEP/feat/debt-worklist ## 併好了:`PR #101` 現在 **mergeable=True**(head `d301810`,base `5d6c4b5`) main 在我做的期間動了**四次**,所以併了三輪:`#96`+`#100`+`#99` → `v0.13.0`(`#102`)→ `#98`。 **衝突只有兩個檔、各一處**: | 檔 | 衝突 | 怎麼解 | |---|---|---| | `docs/TESTING.md` | 兩次都是**編號撞號** | 兩邊內容都留,**我讓號**:A16 → A19 → **A20**,整節搬到 A19 後面 | | `.claude-plugin/plugin.json` | 一行(版本+描述) | 取 main 的 **0.13.0**(我不定版),只重數腳本數 | 今天 main 上 `A16`、`A17` 各被佔兩次、`A19` 被佔兩次——**撞號是這條線今天的常態**。 讓號的成本比要求別人改小,所以一律我讓。 ## 盤點數字在合併後的樹上自己重數 ``` hooks/*.sh 54 ← 沒變(本 PR 沒新增 hook) hooks.json 的 "command": 71 ← 沒變(沒新增註冊) ls scripts | wc -l 43 ← 40 → 43 ``` 🔴 **那個 +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 的**仍然算債**——那條線現在沒有人在推,正是它躺著的原因 - **沒標主線** ⇒ 退回保守:掛 open milestone 的一律不領,且清單上**照實說「現在沒有標主線」**(不編一條出來) - 順帶多一條排序條件:**別條 milestone 已逾期 ⇒ `+15`「答應過人家的日期已經過了」** 測試 **40 → 47 條**(+7 全給這段),並把 `ISEP_COUNTDOWN_STATE_DIR` 也隔離 ——不然這支測試的結果會取決於「這台機器現在標了哪條主線」,那就不是測試了。 ## 合併後所有測試重跑(不只我那支) ``` hooks/tests:ask-user-question 14/14 countdown 20/20 dispatch-format 33/33 factory-idle 33/33 gate-ok 17/17 gitea-arm-check 16/16 beacon 14/14 main-and-prod-push 10/10+跨 repo 19/19 mainline-focus 24/24 mainline-idle 61/61 pr-verdict 52/52 prod-write 37/37 reply-identity 11/11 sdd 8/8 search-is-not-proof 31/31 stage-before-prod 16/16 unpushed 10/10 scripts: debt-worklist 47/47 handoff-writeback 49/49 baton 10/10 comment-carries-task 22/22 github-contact 14/14 kbdb-api-wall 10/10 main-and-prod-push 13/13 release-tag 8/8 stage-before-prod 13/13 ticket-api-bypass 24/24 ticket-where-seen 17/17 版本一致性: ✅ plugin.json=0.13.0,最新 tag=v0.13.0 ``` **唯一沒跑的**:`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`——所以我實際重現了一次: ``` $ (bash …/dispatch-format-guard.test.sh > /tmp/d1 & bash …/dispatch-format-guard.test.sh > /tmp/d2 & wait) d1: ══ 33/33 通過 ══ d2: ══ 32/33 通過,1 個失敗 ══ ❌ ⑧ 明示豁免戳記在 → 放行一次 —— 期望 exit=0,實得 exit=2 ``` **今天四條線並行 ⇒ 這個假紅還會再出現**,而它長得跟「閘壞了」一模一樣。 修法是把 `S-TEST` 換成帶 PID 的路徑(一行)。**不在我這張票的範圍,我沒動它。**
Author
Member

🏃 棒子交回 → 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(會花錢)

🏃 **棒子交回** → `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(會花錢)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: inkstone/ISEP#83