舊票每天有固定管道被撈出來(inkstone/ISEP#83) #101

Merged
claude-code merged 4 commits from feat/debt-worklist into main 2026-08-28 01:01:54 +00:00
Member

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

closes #83

這一版做了什麼

scripts/debt-worklist —— 還債線:每天撈一次「今天可以領什麼」,整包整包地領。

leo 2026-08-27 的訂正是這件事的全部前提:兩條線各用各的判準,不是二選一

緊急線  掛在 open milestone 上的 56 張   用「距離目標的遠近」排(既有機制在管)
還債線  沒掛的那 188 張                  用多條件排 ← 本 PR

三個動詞:

python3 scripts/debt-worklist list            撈一次,排好序印出來
python3 scripts/debt-worklist claim <票...>   領走(明天不會再出現)
python3 scripts/debt-worklist forget <票...>  放回去

票上四條驗收條件,逐條的證據

1. 跑一次要吐出排好序的清單+「我查了哪些 repo」的證明
15 個 repo 逐一列出 issue/PR 數,並講出扣掉了什麼:

🔎 查過的 repo:15 個(inkstone 全組織) open issue 244、open PR 9
     · inkstone/Arcrun issue 82/PR 3
     · inkstone/arcrun-rag issue 73/PR 1
     …(15 個全列)
   扣掉:掛在 open milestone 上的 56 張(那些歸緊急線管)/等 leo 的 9 張
   (Human・human/exec・s/stage——那些要催不是要領,見 inkstone/ISEP#93)/已經領走的 0 張

2. 空清單要說話
✅ 查詢跑過了,結果是零。 + 一樣附上那份 repo 清單
——沒有證明的空清單分不出「今天真的沒有」與「查詢壞了」

3. 連續兩天跑,第一天領走的不在清單上 (真實資料實跑)

📦 之前領走的 2 張:已關 0、還開著 2
     ◻ inkstone/arcrun-rag#104 (2026-08-28 領的)…
     ◻ inkstone/arcrun-rag#121 (2026-08-28 領的)…
── 今天可以領的:186 張(前一次是 188)

4. 拿今天的 229 張進去跑,前幾名要像那麼回事

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

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

兩個判斷,請總管看一眼(不同意就改,都是一行的事)

  1. s/stageHumanhuman/exec 一起被排除在「可領」之外。
    它們是「等 leo」,正確動作是不是(催辦是 inkstone/ISEP#93)。
    今天有 9 張。不同意就把 WAITING_LEO_LABELS 裡的 s/stage 拿掉。
  2. 成包只認強訊號:互相指著、或 Gitea 原生相依(ticket subtask 建的母子票)。
    第一版用單向引用成包,結果 190 張裡 121 張黏成一包——大家都會順手引用 hub 票,
    一包 121 張等於沒有人領得動。代價是「同一條旅程但沒互指也沒建相依」的兩張不會成包,
    寧可漏成包,不要成一包沒人領得動的

測試

bash scripts/test-debt-worklist.sh      →  通過 40 條,失敗 0 條

全程離線(資料走 ISEP_DEBT_FIXTURE、時鐘走 ISEP_DEBT_NOW、狀態走 ISEP_DEBT_STATE_DIR
——不打 Gitea、不留測試票、不碰 $HOME。四條驗收條件各一組,另含誤用、--json
以及兩條紅線檢查(原始碼沒有排程/輪詢的形狀、SessionStart 那一段不打網路)。
真實資料另外唯讀實跑過(229 張),見上面四格。

紅線

  • 不是輪詢、不是 webhook fan-out:這支腳本自己不會醒。SessionStart 那一段
    只看狀態檔的日期講一句話,不打網路(測試裡有一條就在守這件事)。
  • 沒推 main、沒部署任何東西。

給總管的兩件事

  • 版本號待總管定版(本 PR 沒動 .claude-plugin/plugin.json)。
    定版時該檔 description 的「28 支腳本」要 +2(本 PR 新增 debt-worklist
    test-debt-worklist.sh)。
  • docs/hooks-inventory.md 不用改:本 PR 沒有新增 hook
    只在既有的 session-start-recall.sh 末尾加一段輸出,註冊數不變。
  • 共用檔只碰兩個,且都是尾端/單點追加,好合:
    docs/TESTING.md(新增 A16 一節+狀態表一列)、hooks/session-start-recall.sh(末尾一段)。
    A16 這個編號是我挑的——現行表上 A14/A15 各有兩個(平行線各自加的),本 PR 不動別人的編號。
【身份】subagent/inkstone/ISEP/feat/debt-worklist closes #83 ## 這一版做了什麼 `scripts/debt-worklist` —— **還債線**:每天撈一次「今天可以領什麼」,整包整包地領。 leo 2026-08-27 的訂正是這件事的全部前提:**兩條線各用各的判準,不是二選一**。 ``` 緊急線 掛在 open milestone 上的 56 張 用「距離目標的遠近」排(既有機制在管) 還債線 沒掛的那 188 張 用多條件排 ← 本 PR ``` 三個動詞: ``` python3 scripts/debt-worklist list 撈一次,排好序印出來 python3 scripts/debt-worklist claim <票...> 領走(明天不會再出現) python3 scripts/debt-worklist forget <票...> 放回去 ``` ## 票上四條驗收條件,逐條的證據 **1. 跑一次要吐出排好序的清單+「我查了哪些 repo」的證明** ✅ 15 個 repo 逐一列出 issue/PR 數,並講出扣掉了什麼: ``` 🔎 查過的 repo:15 個(inkstone 全組織) open issue 244、open PR 9 · inkstone/Arcrun issue 82/PR 3 · inkstone/arcrun-rag issue 73/PR 1 …(15 個全列) 扣掉:掛在 open milestone 上的 56 張(那些歸緊急線管)/等 leo 的 9 張 (Human・human/exec・s/stage——那些要催不是要領,見 inkstone/ISEP#93)/已經領走的 0 張 ``` **2. 空清單要說話** ✅ `✅ 查詢跑過了,結果是零。` + 一樣附上那份 repo 清單 ——**沒有證明的空清單分不出「今天真的沒有」與「查詢壞了」**。 **3. 連續兩天跑,第一天領走的不在清單上** ✅(真實資料實跑) ``` 📦 之前領走的 2 張:已關 0、還開著 2 ◻ inkstone/arcrun-rag#104 (2026-08-28 領的)… ◻ inkstone/arcrun-rag#121 (2026-08-28 領的)… ── 今天可以領的:186 張(前一次是 188) ``` **4. 拿今天的 229 張進去跑,前幾名要像那麼回事** ✅ ``` 1. [88] inkstone/arcrun-rag#104 事故+40、擋住6張+36、有人接了+12 2. [70.7] inkstone/Arcrun#85 高優先+20、擋住2張+24、已開工(s/doing)+18、擱置14天+8.7 3. [70] inkstone/Arcrun#134 事故+40、已開工(s/review)+18、有人接了+12 4. [68.6] inkstone/InkStoneCo#34 擋住3張+36、已開工(s/doing)+18、擱置7天+4.6、看起來小+10 5. [67.7] inkstone/arcrun-rag#41 高優先+20、擋住2張+24、已開工(s/doing)+18、擱置9天+5.7 ``` 🔴 **每一張旁邊都印出「為什麼排這裡」的分項**——排錯的時候可以指著某一項說「這個給太多」, 而不是猜它為什麼在第一名。權重全部在 `score()` 一個函式裡。 ## 兩個判斷,請總管看一眼(不同意就改,都是一行的事) 1. **`s/stage` 跟 `Human`/`human/exec` 一起被排除在「可領」之外。** 它們是「等 leo」,正確動作是**催**不是**領**(催辦是 `inkstone/ISEP#93`)。 今天有 9 張。不同意就把 `WAITING_LEO_LABELS` 裡的 `s/stage` 拿掉。 2. **成包只認強訊號**:互相指著、或 Gitea 原生相依(`ticket subtask` 建的母子票)。 第一版用單向引用成包,結果 **190 張裡 121 張黏成一包**——大家都會順手引用 hub 票, 一包 121 張等於沒有人領得動。代價是「同一條旅程但沒互指也沒建相依」的兩張不會成包, **寧可漏成包,不要成一包沒人領得動的**。 ## 測試 ``` bash scripts/test-debt-worklist.sh → 通過 40 條,失敗 0 條 ``` 全程離線(資料走 `ISEP_DEBT_FIXTURE`、時鐘走 `ISEP_DEBT_NOW`、狀態走 `ISEP_DEBT_STATE_DIR`) ——**不打 Gitea、不留測試票、不碰 `$HOME`**。四條驗收條件各一組,另含誤用、`--json`、 以及兩條紅線檢查(原始碼沒有排程/輪詢的形狀、SessionStart 那一段不打網路)。 真實資料另外唯讀實跑過(229 張),見上面四格。 ## 紅線 - **不是輪詢、不是 webhook fan-out**:這支腳本自己不會醒。`SessionStart` 那一段 **只看狀態檔的日期講一句話,不打網路**(測試裡有一條就在守這件事)。 - 沒推 main、沒部署任何東西。 ## 給總管的兩件事 - **版本號待總管定版**(本 PR 沒動 `.claude-plugin/plugin.json`)。 定版時該檔 description 的「28 支腳本」要 +2(本 PR 新增 `debt-worklist` 與 `test-debt-worklist.sh`)。 - **`docs/hooks-inventory.md` 不用改**:本 PR **沒有新增 hook**, 只在既有的 `session-start-recall.sh` 末尾加一段輸出,註冊數不變。 - 共用檔只碰兩個,且都是**尾端/單點追加**,好合: `docs/TESTING.md`(新增 A16 一節+狀態表一列)、`hooks/session-start-recall.sh`(末尾一段)。 A16 這個編號是我挑的——現行表上 A14/A15 各有兩個(平行線各自加的),本 PR 不動別人的編號。
claude-code added 1 commit 2026-08-28 00:38:52 +00:00
leo 2026-08-27:「現在每天都在追新的,所以要用 Routine 去消化舊的,可以有多個條件」

兩條線各用各的判準(他當場訂正的那件事):
  緊急線=掛 open milestone 的,用「距離目標的遠近」排
  還債線=沒掛的那 188 張,用多條件排(事故/擋人/承諾/票齡/估工)← 本次做的

新增 scripts/debt-worklist(list/claim/forget):
  · 撈全 org 15 個 repo 的 open issue + open PR,逐一列出當作「我查了哪些」的證明
  · 扣掉掛 open milestone 的(緊急線在管)、等 leo 的(Human/human-exec/s/stage,
    那些要催不是要領,催辦是 inkstone/ISEP#93)、已領走的
  · 每張票旁邊印出「為什麼排這裡」的分項,排錯可以指著某一項說它給太多
  · 成包只認強訊號:互相指著、或 Gitea 原生相依(母子票)。
    第一版用單向引用成包,190 張裡 121 張黏成一坨——一包沒有人領得動
  · 空清單會明講「查詢跑過了,結果是零」,不默默結束
  · claim 之後那些票不再出現在清單上,並在隔天的清單頂端交代它們關了沒

hooks/session-start-recall.sh 加一段(不打網路,只看狀態檔日期):
  今天還沒撈過就說一句,並給出要跑的那一行。開 session 自動去撈=輪詢,紅線擋著。

測試 scripts/test-debt-worklist.sh:40 條全離線,票上四條驗收條件各一組。
真實資料唯讀實跑過:229 張 → 可領 188 張/185 包,領走兩張後隔天清單少掉它們。
claude-code added 1 commit 2026-08-28 00:53:51 +00:00
衝突只有 docs/TESTING.md 一處,兩邊都留:
  main 的 A16(gate-ok)/A17(未推警察)/A18(信標)原樣保留,
  我那節改編號成 A19——main 上 A16、A17 已經被 #90#99 各佔一次,不動別人的。

接上 inkstone/ISEP#82 帶進來的 hooks/lib/mainline.py(不自己養第二套判斷):
  · 有標主線 ⇒ 只排除「屬於主線那一條」的票;掛在**別條** milestone 的仍算債
    (那條線現在沒有人在推,正是它躺著的原因)
  · 沒標主線 ⇒ 退回保守做法:掛 open milestone 的一律不領,並在清單上照實說沒標
  · 別條 milestone 已逾期 ⇒ +15「答應過人家的日期已經過了」

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

盤點數字在合併後的樹上重數:
  hooks/*.sh = 54、hooks.json "command": = 71(本 PR 沒新增 hook,兩個都沒變)
  scripts 一層檔案 = 39(本 PR +2)⇒ plugin.json description 37→39
  版本號沒動(0.12.0,總管統一定版)
claude-code added 1 commit 2026-08-28 00:55:34 +00:00
版本號取 main 的 0.13.0(我不定版)。description 的腳本數在合併後的樹上重數:
  main 那個「40」= `ls scripts | wc -l`(37 個檔+3 個子目錄)
  合併後同一個算法 = 42(多的兩個是本 PR 的 debt-worklist 與 test-debt-worklist.sh)
  ⇒ 40 → 42。閘的兩個數字沒變(hooks/*.sh = 54、hooks.json "command": = 71,本 PR 沒新增 hook)
claude-code added 1 commit 2026-08-28 00:58:53 +00:00
衝突只有 docs/TESTING.md 一列:#92 也用了 A19 ⇒ 我改成 A20,並把整節搬到 A19 後面。
(今天 main 上 A16、A17 各被佔兩次、A19 被佔兩次——編號撞是這條線的常態,
  讓號的成本比要求別人改小,所以一律我讓。)

plugin.json 的腳本數在合併後的樹上重數 40 → 43:
  main v0.13.0 那個「40」= `ls scripts | wc -l`(37 檔+3 目錄),
  合併後同一算法 = 43:+2 是本 PR,+1 是 #98 帶進來的 test-ticket-handoff-writeback.sh
  (#98 併進 main 時沒有回頭改這個數字)。版本號沒動(0.13.0)。
Author
Member

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

已併 main 到 5d6c4b5(#96/#100/#99/v0.13.0 #102/#98),現在 mergeable=True。

衝突只有兩處,兩邊內容都留:

  • docs/TESTING.md:兩次都是撞號(今天 A16/A17/A19 都被佔兩次)⇒ 我讓號,A16 → A19 → A20,整節搬到 A19 後面
  • .claude-plugin/plugin.json:取 main 的 0.13.0(我不定版),只重數腳本數

盤點數字在合併後的樹上重數hooks/*.sh54hooks.json"command":71(兩個都沒變,本 PR 沒新增 hook);ls scripts | wc -l 40 → 43+2 是本 PR,+1#98 帶進來的 test-ticket-handoff-writeback.sh#98 併進 main 時沒回頭改)。docs/hooks-inventory.md 不用改。

接上 #82 的「主線唯一答案」(不自己養第二套判斷)

原本「掛 open milestone 就排除」是 #82 之前沒有唯一答案時的權宜。現在改呼叫 hooks/lib/mainline.py

  • 有標主線 ⇒ 只排除屬於主線那一條的票(ML.belongs());掛在別條 milestone 的仍算債——那條線現在沒人推,正是它躺著的原因
  • 沒標主線 ⇒ 退回保守(掛 open milestone 的一律不領),且清單上照實說「現在沒有標主線」,不編一條出來
  • 多一條排序條件:別條 milestone 已逾期 ⇒ +15「答應過人家的日期已經過了」

測試 40 → 47 條;並把 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/test-* 全綠: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
版本一致性 (0.13.0=最新 tag)。唯一沒跑:ask-user-question-guard.live.test.sh(會叫 haiku、花錢)——這一格我沒驗。

⚠️ 撞到一個不是本 PR 造成的假紅

hooks/tests/dispatch-format-guard.test.sh固定路徑 /tmp/.dispatch-ok-S-TEST 當豁免戳記,兩份同時跑會互相把戳記刪掉。實際重現:並行兩份 → 一份 33/33、另一份 32/33(❌ ⑧ 明示豁免戳記在 → 放行一次)。今天四條線並行,這個假紅還會再出現,而它長得跟「閘壞了」一樣。修法是路徑帶 PID(一行)——不在本票範圍,我沒動它


(原始說明見本 PR 第一則。另外補記一件值得留著的:本 PR 的紅線檢查我第一版寫成 grep webhook|cron關鍵字黑名單,結果命中的是我自己註解裡在談紅線那幾行——那正是 leo 2026-08-17 證偽過的形狀,已改成只認真正的動作(time.sleepcrontab/裝 hook 的呼叫)。)

【身份】subagent/inkstone/ISEP/feat/debt-worklist **已併 main 到 `5d6c4b5`(#96/#100/#99/v0.13.0 #102/#98),現在 mergeable=True。** 衝突只有兩處,兩邊內容都留: - `docs/TESTING.md`:兩次都是**撞號**(今天 A16/A17/A19 都被佔兩次)⇒ **我讓號**,A16 → A19 → **A20**,整節搬到 A19 後面 - `.claude-plugin/plugin.json`:取 main 的 **0.13.0**(我不定版),只重數腳本數 **盤點數字在合併後的樹上重數**:`hooks/*.sh`=**54**、`hooks.json` 的 `"command":`=**71**(兩個都沒變,本 PR 沒新增 hook);`ls scripts | wc -l` **40 → 43**(`+2` 是本 PR,**`+1` 是 `#98` 帶進來的 `test-ticket-handoff-writeback.sh`,`#98` 併進 main 時沒回頭改**)。`docs/hooks-inventory.md` 不用改。 ## 接上 `#82` 的「主線唯一答案」(不自己養第二套判斷) 原本「掛 open milestone 就排除」是 `#82` 之前沒有唯一答案時的權宜。現在改呼叫 `hooks/lib/mainline.py`: - **有標主線** ⇒ 只排除屬於主線那一條的票(`ML.belongs()`);掛在**別條** milestone 的**仍算債**——那條線現在沒人推,正是它躺著的原因 - **沒標主線** ⇒ 退回保守(掛 open milestone 的一律不領),且清單上照實說「現在沒有標主線」,**不編一條出來** - 多一條排序條件:**別條 milestone 已逾期 ⇒ `+15`「答應過人家的日期已經過了」** 測試 **40 → 47 條**;並把 `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/test-*` 全綠: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 版本一致性 ✅(0.13.0=最新 tag)。**唯一沒跑:`ask-user-question-guard.live.test.sh`(會叫 haiku、花錢)——這一格我沒驗。** ## ⚠️ 撞到一個不是本 PR 造成的假紅 `hooks/tests/dispatch-format-guard.test.sh` 用**固定路徑** `/tmp/.dispatch-ok-S-TEST` 當豁免戳記,**兩份同時跑會互相把戳記刪掉**。實際重現:並行兩份 → 一份 33/33、另一份 32/33(`❌ ⑧ 明示豁免戳記在 → 放行一次`)。今天四條線並行,這個假紅還會再出現,而它長得跟「閘壞了」一樣。修法是路徑帶 PID(一行)——**不在本票範圍,我沒動它**。 --- (原始說明見本 PR 第一則。另外補記一件值得留著的:本 PR 的紅線檢查我第一版寫成 grep `webhook|cron` 的**關鍵字黑名單**,結果命中的是我自己註解裡在談紅線那幾行——那正是 leo 2026-08-17 證偽過的形狀,已改成只認真正的動作(`time.sleep`/`crontab`/裝 hook 的呼叫)。)
claude-code merged commit 90ed988d84 into main 2026-08-28 01:01:54 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: inkstone/ISEP#101