棒子不會掉:子票相依+tag+指派三格,全部用 Gitea 原生欄位 #58

Closed
claude-code wants to merge 0 commits from feat/three-native-fields into main
Member

Closes 部分 inkstone/ISEP#30 的 comment 4334433543464347(三個維度合起來那一版)。

這個 PR 解什麼

08-26 掉棒那一次(inkstone/arcrun-rag#136 comment 4267「等雲端那半出貨才驗得了」躺了 14 小時),
那張票三格全缺:沒有子票、tag 沒動、沒有指派給任何人。
⇒ 根因不是誰忘了,是那件事沒有落在任何一個「撈一次就看得到」的欄位上

三個 Gitea 原生欄位,正交,全部都要:

欄位 回答的問題
子票 + 相依 這件事存在嗎?做完了嗎?
tag(s/* 它現在卡在哪一段?
指派(assignee) 現在誰該動?

實測(貼在票上,這裡只放結論)

  • 子票還開著關母票 → HTTP 412 硬擋(不是警告)
  • 跨 repo 相依 → 201,可用
  • 子票關掉後母票關得掉 → 201
  • 反向:關票+清指派後,ticket mine 撈不到它

內容

  • scripts/ticket 三個新動詞:subtask / handback / mine
  • hooks/comment-carries-task-guard.sh(擋一次)+ hooks/baton-handback-guard.sh(提醒)
  • docs/governance/sdd-gitea-governance.md §16
  • scripts/test-comment-carries-task-guard.sh 20/20、scripts/test-baton-handback-guard.sh 10/10

沒做的(誠實標記)

  • 沒發版。ISEP 改動要跟一個新版本號才到得了任何人手上(docs/TESTING.md 檔頭那條),
    發版是總管收斂 release 時的事。
  • 本機有兩份閘InkStoneCo/.claude/settings.json 有 50 條指向
    $CLAUDE_PROJECT_DIR/.claude/hooks,而 ~/.claude/plugins/cache/inkstone/isep 也有一份到 0.5.0
    ⇒ 這兩支新閘在本機要生效,得看那條「一個閘只留一份」的線怎麼收(fix/one-copy-per-gate)。
    這個 PR 不動它。
  • PR 沒有 merge——兩層手動確認閘:subagent 不推 main。
Closes 部分 `inkstone/ISEP#30` 的 comment `4334`/`4335`/`4346`/`4347`(三個維度合起來那一版)。 ## 這個 PR 解什麼 08-26 掉棒那一次(`inkstone/arcrun-rag#136` comment 4267「等雲端那半出貨才驗得了」躺了 14 小時), 那張票**三格全缺**:沒有子票、tag 沒動、沒有指派給任何人。 ⇒ 根因不是誰忘了,是那件事**沒有落在任何一個「撈一次就看得到」的欄位上**。 三個 Gitea 原生欄位,正交,全部都要: | 欄位 | 回答的問題 | |---|---| | 子票 + 相依 | 這件事存在嗎?做完了嗎? | | tag(`s/*`) | 它現在卡在哪一段? | | 指派(assignee) | 現在誰該動? | ## 實測(貼在票上,這裡只放結論) - 子票還開著關母票 → **HTTP 412 硬擋**(不是警告) - 跨 repo 相依 → 201,可用 - 子票關掉後母票關得掉 → 201 - 反向:關票+清指派後,`ticket mine` 撈不到它 ## 內容 - `scripts/ticket` 三個新動詞:`subtask` / `handback` / `mine` - `hooks/comment-carries-task-guard.sh`(擋一次)+ `hooks/baton-handback-guard.sh`(提醒) - `docs/governance/sdd-gitea-governance.md` §16 - `scripts/test-comment-carries-task-guard.sh` 20/20、`scripts/test-baton-handback-guard.sh` 10/10 ## 沒做的(誠實標記) - **沒發版**。ISEP 改動要跟一個新版本號才到得了任何人手上(`docs/TESTING.md` 檔頭那條), 發版是總管收斂 release 時的事。 - **本機有兩份閘**:`InkStoneCo/.claude/settings.json` 有 50 條指向 `$CLAUDE_PROJECT_DIR/.claude/hooks`,而 `~/.claude/plugins/cache/inkstone/isep` 也有一份到 0.5.0 ⇒ 這兩支新閘在本機要生效,得看那條「一個閘只留一份」的線怎麼收(`fix/one-copy-per-gate`)。 這個 PR 不動它。 - **PR 沒有 merge**——兩層手動確認閘:subagent 不推 main。
claude-code added 1 commit 2026-08-27 04:06:25 +00:00
leo 2026-08-27:「子票相依是 gitea 原有機制,改 tag 和指定也是,這些全部都要」

08-26 掉的那一次(arcrun-rag#136 comment 4267「等雲端那半出貨才驗得了」躺了
14 小時)三格全缺:沒有子票、tag 沒動、沒有指派給任何人。根因不是誰忘了,
是那件事沒有落在任何一個「撈一次就看得到」的欄位上。

實測(Gitea 1.26.4):子票還開著時關母票 → HTTP 412
"cannot close this issue or pull request because it still has open dependencies"
⇒ 相依是平台保證的硬擋,不是提醒。跨 repo 也成立(201)。

- scripts/ticket 新增三個動詞:subtask(長子票+掛相依)/
  handback(指派+改 tag+寫下一步,一個動作)/mine(撈一次看棒子在誰手上)
- hooks/comment-carries-task-guard.sh:留言帶未完成的未來式卻沒開子票 → 擋一次
- hooks/baton-handback-guard.sh:一條線收工,三格缺哪一格當場說出來(提醒不擋)
- docs/governance §16:三個維度/粒度(傾向多開票)/既有票只從今天起適用/
  與 s/* 的關係/實測輸出
- 測試 20+10 全綠,用 fixture 跑不打網路、不在票池留測試票

📌 踩到並記進閘的檔頭:hook 裡比對中文一律用 python3 的 re,不要用 grep 的字元類
(等[^。]{0,20}出貨 在真實 hook 呼叫路徑下對「等雲端那半出貨」不匹配,閘靜默失效)

票:inkstone/ISEP#30(comment 4334/4335/4346/4347)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
claude-code added 1 commit 2026-08-27 04:08:51 +00:00
claude-code added 1 commit 2026-08-27 04:13:30 +00:00
實跑自己那則交件報告時,閘沒有擋——因為報告裡**引用了一段 ticket mine 的輸出**
(那段有 🏃),整則就被豁免掉了,而它裡面真的有「等雲端那半出貨」。
⇒ 同 inkstone/InkStoneCo#23 那個病:複述關鍵字被當成本人。
ticket handback 寫的交棒留言 🏃 一定在第一行,引用別人的輸出則不會 ⇒ 錨在第一行。

回歸測試 +2(20/20 → 22/22)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Member

追記:dogfood 當場抓到自己的一個漏(已修,b46bc5e

拿這支閘去跑我自己那則交件報告時,它沒有擋——
因為報告裡引用了一段 ticket mine 的輸出(那段有 🏃),
於是「已經是交棒留言就放行」那條豁免命中了整則報告,
而它裡面真的有「等雲端那半出貨才驗得了」。

⇒ 這正是 inkstone/InkStoneCo#23 那個病的同款:複述關鍵字被當成本人
修法:交棒標記只認第一行ticket handback 寫的一定在第一行,引用別人的輸出不會)。
回歸測試 +2,20/20 → 22/22

📌 這一格是本 PR 最有價值的部分:閘寫完就拿它跑自己剛寫的東西
一次就撞出來了。沒有 dogfood 的話,它會在下一則長報告上靜靜失效。

這條線的票

inkstone/ISEP#59s/review,指派 claude-code),是 inkstone/ISEP#30 的相依
它沒關,#30 關不掉。實測全文在 inkstone/ISEP#30#issuecomment-4378

## 追記:dogfood 當場抓到自己的一個漏(已修,`b46bc5e`) 拿這支閘去跑**我自己那則交件報告**時,它沒有擋—— 因為報告裡引用了一段 `ticket mine` 的輸出(那段有 🏃), 於是「已經是交棒留言就放行」那條豁免命中了整則報告, 而它裡面真的有「等雲端那半出貨才驗得了」。 ⇒ 這正是 `inkstone/InkStoneCo#23` 那個病的同款:**複述關鍵字被當成本人**。 修法:交棒標記**只認第一行**(`ticket handback` 寫的一定在第一行,引用別人的輸出不會)。 回歸測試 +2,20/20 → **22/22**。 📌 這一格是本 PR 最有價值的部分:**閘寫完就拿它跑自己剛寫的東西**, 一次就撞出來了。沒有 dogfood 的話,它會在下一則長報告上靜靜失效。 ## 這條線的票 `inkstone/ISEP#59`(`s/review`,指派 `claude-code`),是 `inkstone/ISEP#30` 的相依 ⇒ **它沒關,`#30` 關不掉**。實測全文在 `inkstone/ISEP#30#issuecomment-4378`。
claude-code added 1 commit 2026-08-27 04:15:24 +00:00
實跑 ticket mine 時自己抓到:剛用 subtask 開的 #143 顯示
「 沒有人寫下一步」——工具自己造出了它要消滅的那個狀態。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Member

【分診 @ inkstone/ISEP#64】狀態: 該併(先解一個小衝突)

實測:git merge-tree origin/main origin/feat/three-native-fields → 只有一處真衝突:docs/hooks-inventory.md(閘清單文件,main 這幾天有其他 PR 也在動同一份計數文件,屬正常小碰撞);hooks/hooks.jsonscripts/ticket 都能自動合併。

內容檢視:解 inkstone/ISEP#30 的掉棒問題(08-26 那次「等雲端出貨才驗得了」躺了 14 小時,根因是那張票子票/tag/指派三格全空)。方案是 Gitea 原生三個正交欄位(子票相依/s/* tag/assignee),PR 描述自陳的實測:子票還開著關母票被 412 硬擋、跨 repo 相依 201、子票關掉後母票關得掉 201、反向清指派後 ticket mine 撈不到——四個情境都貼了結果,不是空話。附兩支新閘各自的測試 20/20、10/10。

誠實揭露的缺口:沒發版(等總管收斂 release)、本機閘有兩份需要另一條線收斂(fix/one-copy-per-gate,不在本 PR 範圍)。

本次分診也查到一件相關素材,記在這裡供總管判斷:main-and-prod-push-guard.sh 讀的 CLAUDE_AGENT_NAME 這個環境變數在 Claude Code 裡從來不存在,是那支閘自己編的假設——本 PR 沒有動 main-and-prod-push-guard.sh,不受影響,但既然摸到 hooks 生態就一併記錄,供之後修那支閘的人參考。

建議:總管先手動解掉 docs/hooks-inventory.md 那一個小衝突(或請作者 rebase 一次)後併,順序建議排在 ISEP#62 之前(見 #62 留言)。

【分診 @ inkstone/ISEP#64】狀態:**✅ 該併(先解一個小衝突)** 實測:`git merge-tree origin/main origin/feat/three-native-fields` → 只有一處真衝突:`docs/hooks-inventory.md`(閘清單文件,main 這幾天有其他 PR 也在動同一份計數文件,屬正常小碰撞);`hooks/hooks.json`、`scripts/ticket` 都能自動合併。 內容檢視:解 `inkstone/ISEP#30` 的掉棒問題(08-26 那次「等雲端出貨才驗得了」躺了 14 小時,根因是那張票子票/tag/指派三格全空)。方案是 Gitea 原生三個正交欄位(子票相依/`s/*` tag/assignee),PR 描述自陳的實測:子票還開著關母票被 412 硬擋、跨 repo 相依 201、子票關掉後母票關得掉 201、反向清指派後 `ticket mine` 撈不到——四個情境都貼了結果,不是空話。附兩支新閘各自的測試 20/20、10/10。 誠實揭露的缺口:沒發版(等總管收斂 release)、本機閘有兩份需要另一條線收斂(`fix/one-copy-per-gate`,不在本 PR 範圍)。 本次分診也查到一件相關素材,記在這裡供總管判斷:`main-and-prod-push-guard.sh` 讀的 `CLAUDE_AGENT_NAME` 這個環境變數在 Claude Code 裡從來不存在,是那支閘自己編的假設——本 PR 沒有動 `main-and-prod-push-guard.sh`,不受影響,但既然摸到 hooks 生態就一併記錄,供之後修那支閘的人參考。 建議:總管先手動解掉 `docs/hooks-inventory.md` 那一個小衝突(或請作者 rebase 一次)後併,順序建議排在 `ISEP#62` 之前(見 `#62` 留言)。
Author
Member

[decision] 關閉:這個 PR 要做的事,在 main 上已經是既成事實

總管實查現在的 main(2026-08-28 12:45):hooks/baton-handback-guard.sh 已存在
檔頭寫著「一條派工線收工時,檢查它的工單票有沒有把棒子交回來——指派(誰該動)+ tag(卡在哪)+ 下一步(做什麼)三格」。

⇒ 這正是本 PR 要做的三格,內容在 v0.6.0 就進去了(那一版的說明:
「子任務交回時會用相依、標籤、指派三格接手,不再靠一份會重生的本機清單」)。

所以這不是「不做」,是「已經做了、只是這張 PR 忘了關」。

📌 這張 PR 的診斷本身值得留著:08-26 掉棒那次(inkstone/arcrun-rag#136
comment 4267「等雲端那半出貨才驗得了」躺了 14 小時),根因不是誰忘了,
而是那件事沒有長成任何一個機器看得到的欄位。今天 comment-carries-task-guard.sh
也在守同一件事的另一半(留言裡藏著沒做完的事要長成子票)。


為什麼現在才關:今天出的 v0.11.0 新增了收工清點沒結論 PR 的閘,
它上線後第一批要抓的就包含這一張。我自己不遵守鐵律 7,那支閘就是裝飾。

[decision] 關閉:這個 PR 要做的事,在 main 上已經是既成事實 **總管實查現在的 main**(2026-08-28 12:45):`hooks/baton-handback-guard.sh` **已存在**, 檔頭寫著「一條派工線收工時,檢查它的工單票有沒有把棒子交回來——指派(誰該動)+ tag(卡在哪)+ 下一步(做什麼)三格」。 ⇒ 這正是本 PR 要做的三格,內容在 `v0.6.0` 就進去了(那一版的說明: 「子任務交回時會用相依、標籤、指派三格接手,不再靠一份會重生的本機清單」)。 **所以這不是「不做」,是「已經做了、只是這張 PR 忘了關」。** 📌 這張 PR 的診斷本身值得留著:08-26 掉棒那次(`inkstone/arcrun-rag#136` comment 4267「等雲端那半出貨才驗得了」躺了 14 小時),根因不是誰忘了, 而是**那件事沒有長成任何一個機器看得到的欄位**。今天 `comment-carries-task-guard.sh` 也在守同一件事的另一半(留言裡藏著沒做完的事要長成子票)。 --- **為什麼現在才關**:今天出的 `v0.11.0` 新增了收工清點沒結論 PR 的閘, 它上線後第一批要抓的就包含這一張。**我自己不遵守鐵律 7,那支閘就是裝飾。**
claude-code closed this pull request 2026-08-28 00:56:11 +00:00

Pull request closed

Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: inkstone/ISEP#58