把 main(v0.14.0,五批)併進來,解 5 處衝突,盤點數字在合併後的樹上重數

衝突全部**兩邊都留**,沒有丟掉任何一側:

- hooks.json      main 的 `scripts/mainline refresh` + 我的兩支,同一個
                  SessionStart 陣列裡並存
- plugin.json     版本吃 main 的 0.14.0(**沒有自己決定版本**),描述欄的
                  三個數字在合併後的樹上重數
- README.md       main 那格被貼成兩列(54 支/69 條 與 54 支/71 條,互相矛盾),
                  收成一列並填上實數
- hooks-inventory main 的 `mainline refresh` 那列 + 我的兩列;標頭與
                  「一句話結論」的數字重數
- TESTING.md      兩邊各自新增的格子都留。**我的兩格改號成 A21/A22**——
                  併之前兩邊都叫 A16/A17,撞號(這一頁本來就已經有
                  三組重複的 A14–A18,這次至少沒有再加一組)

盤點(`ls hooks/*.sh | wc -l`、`grep -c '"command":' hooks/hooks.json`、
`ls -p scripts | grep -v / | wc -l`,都在**合併後**的樹上跑):

    55 → 57 支 .sh
    72 → 75 條註冊
         47 支腳本

📌 順手抓到一個漂移:main 的 plugin.json 描述欄寫「48 支腳本」,
   而用 hooks-inventory 自己寫死的那道指令實數是 44(main)/47(合併後)。
   已記在 hooks-inventory 的版本註記裡——**同一個病,第 N 次,只是換一欄。**

📌 TESTING.md 的「已知斷點」那段補上總管用 MCP 查到的更廣範圍:
   不只 notify_leo 不見了,那台實例的工作流定義是**整批失效**;
   而且修它要寫 leo 的個人帳號 ⇒ `leo21c-write-guard.sh` 明文禁止
   ⇒ **那是真人閘,總管也不能解**。

測試(合併後全部重跑,帶對參數):
  我的兩套          overdue-nag 36/36、wiki-compress 25/25
  hooks/tests/*     ask-user-question 14、countdown 20、dispatch-format 33、
                    factory-idle 33、gate-ok 17、presence-beacon 14、
                    mainline-focus 24、mainline-idle 61、milestone-account 22、
                    pr-verdict 52、reply-identity 11、sdd 8、
                    search-is-not-proof 31、unpushed-police 10、
                    prod-write 37、stage-before-prod 16、
                    main-and-prod-push 10、cross-repo 19、gitea-arm-check 16
  scripts/test-*    13 支全綠(含 release-manifest 21、milestone-account 23、
                    debt-worklist 47、ticket-handoff-writeback 49)
  claude plugin validate . 通過;check-version-consistency 通過(0.14.0 = v0.14.0)
This commit is contained in:
Claude Code
2026-08-28 01:15:54 +00:00
36 changed files with 5362 additions and 54 deletions
+270 -6
View File
@@ -154,6 +154,49 @@ bash hooks/tests/countdown-guard.test.sh
subagent 的回覆不是給 leo 看的),所以在一條 subagent 裡跑,B 群會**全綠而且是假綠**。
測試檔自己會把它清掉——2026-08-28 第一次跑就撞到這個,才補上去的。
### A16 — 現在的主線是哪一個:24 條
```
bash hooks/tests/mainline-focus-guard.test.sh
```
**該看到**`通過 24 條,失敗 0 條`。**全程離線**:狀態走 `ISEP_COUNTDOWN_STATE_DIR`
時鐘走 `ISEP_COUNTDOWN_NOW`、「那張票掛在哪」走 `ISEP_MAINLINE_FIXTURE`
並把 `TICKET_HOST` 指到一個連不上的位址——**任何一條真的走到網路,會在那裡當場失敗,
不會靜靜地變成假綠**。
**它在守什麼**`inkstone/ISEP#82`leo 2026-08-27):
「**14 個里程碑同時亮著卻不知道該看哪個**」。當天實查 14 個 open milestone
其中「Mira 現代化」這個名字同時活在 5 個 repo,5 個已經逾期
⇒ SOP 說的「只做**該** milestone 的事」**沒有指涉對象,等於不存在**。
**判準**:問「現在的主線是哪一個」,`scripts/mainline` 回一個答案,而且只有一個。
**失敗**
- A 群任一條紅 ⇒ 答案不唯一,或標了新的舊的還在——那就回到 14 個一起亮的狀態
- ⑧ 紅 ⇒ **目標宣告沒有自己出現**(票上驗收第 2 條),leo 又要自己去翻
- ⑨ 紅 ⇒ 主線的名字沒掛在被查核的 ⏱ 那一行上 ⇒ 它到不了 leo 眼前
(本票刻意不另立第二道會擋人的閘,就是靠這一格成立)
- ⑩ 紅 ⇒ 用「期限最近的那個」蓋過了被指定的主線。**猜的不准蓋過指定的**
- ⑬⑭ 紅 ⇒ 派了不在主線上的票沒被問一次,或問了卻沒給補收/跳線兩條路
- ⑯ 紅 ⇒ **鬼打牆**:同一張票被擋第二次。至多擋一次是硬要求
- **⑲–㉔(不該擋)任一條紅 ⇒ 誤攔,這比漏擋嚴重**。特別是 ⑲(沒有主線就一律放行,
票上驗收第 4 條)與 ㉒(問不到那張票掛在哪 ⇒ 放行)——
**「讀不到」不等於「不屬於」,把這兩件事講成同一句是最貴的錯**
📌 這一條線的另一半是**指令**,不是閘:`scripts/mainline``show``list``set`
`clear``refresh``adopt``has`)。要打網路的那幾個(list/set/adopt)不在測試裡跑,
因為它們**只有真的 Gitea 才驗得了**——驗法見 A17。
### A17 — 主線那支指令真的問得到 Gitea(要網路)
```
python3 scripts/mainline list
```
**該看到**:一份 open milestone 清單,**跨多個 repo**`ISEP` / `Arcrun` / `arcrun-rag` / `mira`…),
每一行左邊是可以直接貼給 `set``owner/repo#<milestone id>`
**失敗**
- `一個 open milestone 都沒讀到` ⇒ 這台機器拿不到 Gitea。**那是讀不到,不是沒有**
——不要因此標一個猜的主線
- 只有單一 repo ⇒ 沒有跨 repo,等於沒看到全局
### A15 — 發通知不等於部署:37 條
```
bash hooks/tests/prod-write-guard.test.sh hooks/prod-write-guard.sh
@@ -165,7 +208,207 @@ bash hooks/tests/prod-write-guard.test.sh hooks/prod-write-guard.sh
- 「卡點二」2 條任一紅 ⇒ 「談論它」又被當成「執行它」(同款第八次),
或是剝了內文之後連真的部署都放行了
### A16 — 沒人會叫的事會自己叫:36
### A16 — 一次交貨 = 一份清單(跨 repo 版本組合):21
```
bash scripts/test-release-manifest.sh
```
**該看到**`通過 21 條,失敗 0 條`。全程離線(`RELEASE_MANIFEST_FIXTURE`),
**不打 Gitea、不建任何真的 release**;清單寫在 `mktemp` 的目錄,不碰 repo 裡的 `releases/`
**它在守什麼**`inkstone/ISEP#84`):一次交貨常常同時動到好幾個 repo,
而「這一版 = 哪幾個 repo 的哪幾版」**沒有任何地方記著** ⇒ 退版只退了其中一個,
剩下的還停在新版 ⇒ **變成一組從來沒測過的組合**
**失敗**
- ⑨⑩ 紅 ⇒ 驗收 1 沒過:**版本號寫上去就算數**,沒有真的去 Gitea 抓過
(「寫上去」跟「存在」是兩件事,而清單的用處完全建立在後者)
- ⑱ 紅 ⇒ 驗收 3 沒過:**只退其中一個 repo 沒有被擋下來**,那正是票上那個病
- ⑯⑰⑲ 任一紅 ⇒ 驗收 2 沒過:退版沒有吐出整份清單的每一格
(包含「已經在目標版本、不必動」那幾格——列出來才證明沒有一格被漏掉)
- ⑫ 紅 ⇒ 凍結過的清單還能再加東西,「凍結」兩個字就沒有意義了
- ⑳㉑ 紅 ⇒ 驗收 4 沒過:leo 打開 `INDEX.md` 看不出「我現在手上是哪一版」
### A17 — 每次結案都留下估多久/花多久/差多少:23 條
```
bash scripts/test-milestone-account.sh
```
**該看到**`通過 23 條,失敗 0 條`。全程離線(`MILESTONE_ACCOUNT_FIXTURE` =一份假的
Gitea 回應表),時鐘用 `MILESTONE_ACCOUNT_NOW` 定住,帳本寫在 `mktemp` 目錄,
**不打 Gitea、不關任何真的 milestone**
**它在守什麼**`inkstone/ISEP#85`leo 2026-08-27 說那天「**拖時間**」):
拖了多久、比預計多拖多少、為什麼拖——**沒有任何數字**。偵測器早就有了
`mainline-idle-guard.sh``factory-idle-guard.sh`),**但沒有人把它算成帳**。
**失敗**
- ①②③④ 任一紅 ⇒ 驗收 1 沒過:三個數字不是自己算出來的
- ⑤⑥ 紅 ⇒ 驗收 2 沒過:差超過 ±25% 卻能不挑代號就結案
- ⑧ 紅 ⇒ 代號不再是封閉集合。**能統計的前提是分類有限**,這一格垮了統計就垮了
- ⑨ 紅 ⇒ **挑一個時間軸撐不住的代號也能過**,等於「採信我自己說的」,
而票上寫死證據一律從 Gitea 的時間軸取
- ⑦ 紅 ⇒ **誤攔**:只差 -6% 也逼人挑代號。這比漏擋嚴重——每次結案都被念,
人就學會繞過去
- ⑭⑮⑯⑰ 任一紅 ⇒ 驗收 3 沒過:累積之後看不出哪一種原因最常發生
- ⑱⑲ 紅 ⇒ 驗收 4 沒過:拿已經逾期的里程碑進去算不出數字
### A18 — 結案要記帳的那道閘:22 條
```
bash hooks/tests/milestone-account-guard.test.sh
```
**該看到**`通過 22 條,失敗 0 條`。離線(帳本走 `MILESTONE_ACCOUNT_LEDGER`),
純結構判斷、沒有語意判官,所以每次結果都一樣。
**失敗**
- **A 群任何一條紅 ⇒ 誤攔,這比漏擋嚴重。** ⑥⑦⑧⑪ 特別重要:
`echo` 一段指令、`cat` 這支閘自己、commit 訊息裡提到、把指令寫進文件的 heredoc 內文
——**四種都只是「談論它」,不是「執行它」**。這四格是本 repo 撞過很多次的同一個病
`strip_heredoc.py` 的檔頭記著兩次真跡)
- ⑨⑩ 紅 ⇒ 走正門 `scripts/milestone-account close` 反而被自己的閘擋下,
那道閘就等於封死了唯一的出路
- ⑭⑮⑯⑰⑱ 任一紅 ⇒ 漏擋:換個寫法(`python urllib`、前面串一個無害指令、
`--request` 長寫法、換一個 repo)就繞過去了
- ⑲ 紅 ⇒ 訊息沒有點名目標,人看完不知道要對哪一個里程碑動手
- ⑳㉑ 紅 ⇒ 「記過帳就放行」這個出路是假的,或者一記帳就把所有里程碑全開了
### A16 — 「總管可以放行」那道門真的打得開:17 條
```
bash hooks/tests/gate-ok.test.sh
```
**該看到**`通過 17 條,失敗 0 條`
**它在守什麼**inkstone/ISEP#90 ④,2026-08-28 實查):三支閘
`prod-write-guard``main-and-prod-push-guard``stage-before-prod-guard`
都是「擋下來、但**總管看過就能放行**」的設計,而**既有測試只驗了擋得住,
一條都沒驗過放得開**。於是這個 bug 活了很久:`stat -f %m` 在 GNU coreutils 上
是「檔案系統資訊」,它一邊回非零一邊吐一整段文字 ⇒ 秒數被污染 ⇒
**在 Linux(=每一個雲端 session)上戳記永遠不被接受** ⇒ 那三支閘在雲端等於純擋,
而閘不會告訴你門是壞的。
**失敗**
- ②⑤(門打得開)紅 ⇒ 逃生口又焊死了,那三支閘在雲端變回純擋
- ⑥⑦⑧(門沒變寬)任一紅 ⇒ **更嚴重**:綁 repo/有效期/空戳記那三條性質是
08-11、08-12 兩次真的被穿透之後才補上的,不准為了「好放行」而鬆掉
- ⑫ 紅 ⇒ `gate-ok` 在解不出 repo 時留下了一枚註定打不開的空戳記,
那會讓人以為門開了(而空戳記本身就是 08-12 那把萬用鑰匙的形狀)
- ⑰ 紅 ⇒ 判準又變回「行為取決於 cwd 裡有沒有一個叫 `%m` 的檔」。
這條是這個 bug 的最後一層:**GNU 的 `-f` 是布林旗標,`%m` 被當成另一個檔名運算元**
⇒ 有那個檔就 `exit 0``||` 連跑都不跑。所以修法不能只是「把順序反過來」,
**每一步都要驗它是不是純數字**
⚠️ 這支會真的寫 `/tmp` 的戳記檔(那是閘寫死的路徑)。**不要在「已經蓋好戳記正要推東西」
的當下跑它**——它會把那枚戳記洗掉。
### A17 — 未推警察不會對雲端的工作分支亂叫:10 條
```
bash hooks/tests/unpushed-police.test.sh
```
**該看到**`通過 10 條,失敗 0 條`。全離線(用本機 bare repo 當「遠端」)。
**它在守什麼**inkstone/ISEP#90 ①):雲端 session 開出來的工作分支天生沒有 upstream,
內容卻等於遠端 main ⇒ 舊判準「沒 upstream=從沒推過」讓**每個雲端 session、每次收工
都被攔一次**08-27 一個 session 五次全是誤報)。
**失敗**
- A 群(①—⑥,不該報)任一紅 ⇒ **誤攔**,比漏擋嚴重:永遠在響的警報=訓練人忽略它,
下一條真的失蹤的分支會混在雜訊裡
- B 群(⑦—⑩,該報)任一紅 ⇒ 為了不吵而改成放行了,那是把閘關掉不是修好
- 特別看 ④:問不到遠端(離線)**不准當成「你沒推」**
### A18 — 信標會講出雲端會壞掉的那三件事:14 條
```
bash hooks/tests/isep-presence-beacon.test.sh
```
**該看到**`通過 14 條,失敗 0 條`。全離線。
**它在守什麼**inkstone/ISEP#90 ②③):信標原本只證明「有一份 plugin 載入了」,
不證明「載入的是哪一份」——08-27 雲端載 0.3.9、main 0.9.0,差 7 個 release
而它照樣是綠的。
**失敗**
- ⑫⑬⑭(信標永遠在)任一紅 ⇒ **最嚴重**:那一行消失=leo 會判定這個 session 零閘
- ③ 紅 ⇒ 版本落差報不出來,`ISEP#67` 那個病又變回看不見
- ⑤⑦ 紅 ⇒ 舊複本遮蔽正門抓不到(`InkStoneCo/scripts/ticket` 那件)
- ⑥ 紅 ⇒ **誤攔**:同步過的複本被念,人就學會忽略它
- ⑪ 紅 ⇒ 內層迴圈變數撞名的回歸(同一個 `.claude` 下第二個殘骸會被靜靜跳過)
### A19 — 下游做完時頂層跟著關:49 條
```
bash scripts/test-ticket-handoff-writeback.sh
```
**該看到**`通過 49 條,失敗 0 條`。**全程離線**——`TICKET_HOST` 指到連不上的位址,
會打 API 的兩段(`_writeback``cmd_subtask`)把 `api()` 換成錄音機跑,
**不打真實 Gitea、不開票、不關票、不留任何測試票**
**它在守什麼**`inkstone/ISEP#92`):
「開在頂層的票,下游做完了卻沒人回來關⋯⋯頂層票會永遠掛著,**而 leo 是看頂層的**。」
四格對應票上的四條驗收條件:
- ①②③ 純函式(`is_loose``writeback_plan``journey_label`)——**判準本身**
不必開真票就驗得動
- ④⑤ `subtask``handoff` 的參數閘:該擋的擋、齊全的放得過
-**完工回寫的接線**(驗收第 2 條):關掉一張下游票之後,它到底對頂層票做了什麼
-**雙向連結的接線**(驗收第 1 條):兩張票互相看得到對方,不是靠人記得補
**失敗**
- ①「open + 從來沒有下游 → 不撈」紅 ⇒ **誤攔**`ticket loose` 會把每一張普通票
都列出來,那張表就變成雜訊,人學會忽略它(本 repo 心法第 2 條)
- ②「還有別的下游沒關 → 只記一筆」紅 ⇒ 母票會在下游還沒做完時被指派回總管,
假綠
- ⑦「沒有去關母票」變綠 ⇒ 回寫從「處理」滑成「自動關掉」。
**默默關掉跟默默留著是同一個病的兩面**——關票要有交付物、要有人看過
- ⑦「留言第一行有身份欄」紅 ⇒ 機器貼的留言看起來像某個人寫的,
下一個讀票的人會去找那個人(`reply-identity-guard` 管的是同一件事)
- ⑧「母子兩端都被貼」剩 1 ⇒ journey 只貼了一端,**聚類時撈得到一半**,
比完全沒貼更危險
- ⑤ 任何一條紅 ⇒ 誤攔,合規的交辦被擋掉等於這條路不能走
🔴 **這支測不到的那一格(要 leo 或總管接手)**`labels.yaml``j/`
**刻意是空的**——旅程怎麼切、叫什麼名字是方向題,不由工具代決。
在有人往那裡加第一條旅程之前,`--journey` 只會擋、不會貼。
機制驗過了,**資料還沒有**。
### A20 — 舊票每天有固定管道被撈出來:47 條
```
bash scripts/test-debt-worklist.sh
```
**該看到**`通過 47 條,失敗 0 條`。**全程離線**:資料走 `ISEP_DEBT_FIXTURE`
時鐘走 `ISEP_DEBT_NOW`、狀態走 `ISEP_DEBT_STATE_DIR`、主線走 `ISEP_COUNTDOWN_STATE_DIR`
——**不打 Gitea、不留測試票、不碰 `$HOME`**。
**它在守什麼**`inkstone/ISEP#83`leo 2026-08-27):
「現在每天都在追新的,所以**要用 Routine 去消化舊的**,可以有多個條件」。
全 org 229 張 open 票,每天在動的只有掛在 open milestone 上的那 56 張;
其餘的不是不重要,是**沒有任何機制會去拿它們**。
🔴 **兩條線各用各的判準,不是二選一**leo 當場訂正總管的誤解):
掛 milestone =緊急線,用「距離目標的遠近」排;沒掛的=還債線,用多條件排
(事故/擋人/承諾/票齡/估工)——後者就是 `scripts/debt-worklist`
**失敗**
- 「驗收 1」那組紅 ⇒ 清單沒有附「我查了哪些 repo」的證明。
**沒有證明的清單分不出「今天真的沒有」與「查詢壞了」**,而後者會靜靜地零產出
- 「驗收 2」紅 ⇒ 空清單默默結束。這是這支工具最貴的失效方式:
它看起來跑完了,於是沒有人再去看那 180 張
- 「驗收 3」紅 ⇒ 領走的票明天又冒出來,這份清單就會變成每天一樣的一坨,人就不看了
- 「成包」兩條紅 ⇒ 互相指著/母子票被拆開領,做到一半才發現卡在另一張
- **「單向引用不成包」紅 ⇒ 這是誤攔的那一面**:第一版用單向引用成包,
結果 190 張裡 121 張黏成一包(大家都會順手引用 hub 票)=**一包沒有人領得動**
- 「接上主線」那組紅 ⇒ 還債線又自己養了一套「哪個是 active」的判斷。
唯一答案在 `hooks/lib/mainline.py``inkstone/ISEP#82`),**兩份必然漂移**。
特別看「沒標主線」那兩條:**沒有答案時要退回保守**(掛 open milestone 的一律不領),
不准猜一條出來
- 最後一組(SessionStart)紅 ⇒ 要嘛沒有人會被提醒去撈,
要嘛那一段偷偷去打網路——**開 session 自動撈就是輪詢**,紅線擋著
**手動驗真實資料**(會打 Gitea,唯讀 GET):
```
python3 scripts/debt-worklist list --top 5
```
**該看到**15 個 repo 逐一列出 issue/PR 數,講得出**現在的主線是哪一條**
(或誠實說沒標),扣除數字講得出來(掛 open milestone 的幾張、等 leo 的幾張、已領走的幾張),
前幾名旁邊看得到「為什麼排這裡」的分項。
**失敗**:前幾名一眼看不出為什麼在那裡 ⇒ 那些權重就是錯的,去改 `score()`
**不要改成「總管覺得」**——這份清單的價值就在於它不靠記憶。
### A21 — 沒人會叫的事會自己叫:36 條
```
bash hooks/tests/overdue-nag.test.sh
```
@@ -193,7 +436,7 @@ bash hooks/tests/overdue-nag.test.sh
> 🔴 **跑測試前先確認 `CLAUDE_CODE_CHILD_SESSION` 沒有殘留**:這支閘刻意放行子 session,
> 在一條 subagent 裡跑,F 群會全綠而且是**假綠**。測試檔自己會把它清掉。
### A17 — 壓 wiki 不准弄丟東西:25 條
### A22 — 壓 wiki 不准弄丟東西:25 條
```
bash hooks/tests/wiki-compress.test.sh
```
@@ -226,6 +469,7 @@ python3 scripts/wiki-compress verify /tmp/w/mistakes.md.before-compress /tmp/w/m
python3 scripts/wiki-compress bench /tmp/w/mistakes.md.before-compress /tmp/w/mistakes.md /tmp/w/mistakes-archive-*.md
```
### A5 — 開票前的搜尋是跨 repo 的
```
python3 scripts/ticket where 標籤 模組化
@@ -423,15 +667,23 @@ B2(信標那行)/B3(setup 輸出)/B4(閘的訊息)三個畫面
| **A15 pr-verdict --dry-run** | 總管 | ✅(2026-08-28 |
| **A14 回覆自己說出拖了多久** | 總管 | ✅ 20/202026-08-28inkstone/ISEP#63 |
| **A15 發通知不等於部署** | 總管 | ✅ 37/372026-08-28inkstone/ISEP#63 |
| **A16 沒人會叫的事會自己叫** | 總管 | ✅ 36/362026-08-28inkstone/ISEP#93 |
| **A16b Telegram 真的送達** | **leo** | ⛔ **驗不了——通道本身斷了**(見下 |
| **A17 壓 wiki 不准弄丟東西** | 總管 | ✅ 25/25+真跡實壓2026-08-28inkstone/ISEP#89 |
| **A16 跨 repo 版本清單** | 總管 | ✅ 21/212026-08-28inkstone/ISEP#84 |
| **A17 估多久/花多久/差多少** | 總管 | ✅ 23/232026-08-28inkstone/ISEP#85 |
| **A18 結案要記帳的閘** | 總管 | ✅ 22/222026-08-28inkstone/ISEP#85 |
| **A21 沒人會叫的事會自己叫** | 總管 | ✅ 36/362026-08-28inkstone/ISEP#93 |
| **A21b Telegram 真的送達** | **leo** | ⛔ **驗不了——通道本身斷了,而且修它是真人閘**(見下) |
| **A22 壓 wiki 不准弄丟東西** | 總管 | ✅ 25/25+真跡實壓(2026-08-28inkstone/ISEP#89 |
| A5 搜尋跨 repo | 總管 | ✅ |
| A6 標籤對齊+冪等 | 總管 | ✅ 14 repo,第二次 0/0 |
| **A9 人閘警察管路** | 總管 | ✅ 14/142026-08-26 |
| **A10 人閘警察準度** | 總管 | ✅ 9/9,連跑三次(2026-08-26),A 群誤攔 0 |
| **A11 派工單只剩票號** | 總管 | ✅ 19/192026-08-27 |
| **A12 留言身份欄(兩道門)** | 總管 | ✅ 11/112026-08-27 |
| **A16 放行的門真的打得開** | 總管 | ✅ 17/172026-08-28inkstone/ISEP#90 |
| **A17 未推警察不誤攔雲端分支** | 總管 | ✅ 10/102026-08-28inkstone/ISEP#90 |
| **A18 信標會報雲端接線缺陷** | 總管 | ✅ 14/142026-08-28inkstone/ISEP#90 |
| **A19 下游做完頂層跟著關** | 總管 | ✅ 49/492026-08-28inkstone/ISEP#92 |
| **A20 舊票有固定管道被撈** | 總管 | ✅ 47/472026-08-28inkstone/ISEP#83)+真實 229 張唯讀實跑 |
| A7 plugin 裝得起來 | 總管 | ✅ |
| **A8 新 session 閘會觸發** | 總管 | 見本版 release note |
| **B1B5 雲端** | **leo** | 還沒跑(機器碰不到 Cloud environment |
@@ -456,8 +708,20 @@ POST …/webhooks/named/leo/notify_leo/trigger
(這條路本來就不需要金鑰)。頂層 wiki `agent-memory.md` 記過同一件事發生過一次
2026-08-10,KV 整批換新時定義消失,後來補推回去)——**看起來又斷了一次**。
🔴 **總管 2026-08-28 用 MCP 直接問那台實例,範圍比這裡查到的更廣**
```
arcrun_get_workflow(notify_leo) → not_found
arcrun_search_workflows(通知 leo Telegram) → 只回 ship_refresh_cdn 一支
而且它的執行紀錄寫著「圖定義已失效」
```
**不只 `notify_leo` 不見了,那台實例上的工作流定義是整批失效的。**
修法要有人把 `mira` repo 的 `workflows/notify-leo.yaml` 重新 push 上那台實例。
**那是動線上實例,subagent 不能做**`prod-write-guard`),要總管或 leo。
**這不是「總管可以解的閘」——它比那更嚴格**:那台是 leo 的個人帳號,
`leo21c-write-guard.sh`leo 2026-08-20 立)明文禁止寫它
**這是真人閘,總管也不能解,只有 leo 自己動得了。**
📌 **這條斷了不代表 `#93` 沒交付**:本次的設計前提就是「**不假設發得出去**」——
實測那兩次的退路都走通了,訊息貼回了 `inkstone/ISEP#93`