雲端第一則 prompt 的主線是現在這條:兩份主線檔都不在時 refresh 去 Gitea 讀 InkStoneCo main 那份一次(inkstone/ISEP#140)
薄殼 SessionStart 跑在 bootstrap.sh 之前,InkStoneCo/ 還沒 clone、家目錄空 ⇒ 兩份都不在 ⇒ countdown.py 退到「期限最近的 milestone」⇒ 第一則 prompt 印逾期 341 小時的舊線。機制沒壞,是順序。 - hooks/lib/mainline.py:第三個來源 fetch_gitea()(本檔唯一會打網路的函式,只有 SessionStart 的 `mainline refresh` 叫它;load()/line() 照舊零網路)。優先序寫進檔頭:家目錄 > repo 那份 > Gitea 那份。 匿名優先,匿名被拒(401/403/404)且拿得到 token 才帶 token 再問一次;讀不到回 None,逾時有上限。 - scripts/mainline refresh:兩份都不在 ⇒ fetch_gitea 一次、只寫家目錄(不 mirror);token 拿不到不炸、不抱怨。 - hooks/tests/mainline-gitea-fallback.test.sh:31 條,假 Gitea 有 public/private/500/garbage/notitle/hang 六種回法。 假設(票上紅線寫「一律匿名不帶 token」,其前提「Gitea 匿名讀得到」實測為假): inkstone/InkStoneCo 在 Gitea 是 private——匿名打 raw/contents/repo API 都 404,ISEP 同端點 200。 ⇒ 照字面做這張票在真環境永遠讀不到。改成匿名優先、被拒才帶 token(同一條 SessionStart 鏈上 countdown-milestone-refresh.sh 本來就帶 GITEA_TOKEN_CLAUDE_CODE 打 Gitea;D20 管的是 GitHub)。 真跑:帶 token 2.06s 讀到 inkstone/Arcrun#48;拔 token rc 0、零檔案、「現在沒有主線」。 版本:待總管定版。 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
This commit is contained in:
@@ -911,6 +911,39 @@ bash hooks/tests/isep-presence-beacon.test.sh # ㉗–㉝ 那七條
|
||||
**真實跑(2026-09-07)**:信標不帶 fixture 打真 Gitea(匿名)→ 安靜(v0.24.0 tag+release 都在),
|
||||
留下 `.isep-chain-ok-v0.24.0` 快取;`release-check` 在本分支 → `v0.24.0 ✅✅✅ ←`、三個裁定不補的版本標 ⏭、exit 0。
|
||||
|
||||
### A37 — 雲端第一則 prompt 的主線就是現在這條,不是兩週前的舊線:31 條
|
||||
```
|
||||
bash hooks/tests/mainline-gitea-fallback.test.sh
|
||||
```
|
||||
**該看到**:`通過 31 條,失敗 0 條`。全程離線:Gitea 是本機一個假伺服器(`TICKET_HOST` 指過去),
|
||||
它照真 Gitea 回——public 時 raw 端點匿名 200;**private 時匿名 404、帶 token 200**(真 `inkstone/InkStoneCo`
|
||||
就是 private,2026-09-07 實測匿名打 raw/contents/repo API 都 404)。狀態走 `ISEP_COUNTDOWN_STATE_DIR`、
|
||||
repo 那份走 TMP 底下的假薄殼。
|
||||
|
||||
**它在守什麼**(inkstone/ISEP#140;母票 #130):薄殼 `youlinhsieh/inkstoneco` 的 SessionStart 跑在 `bootstrap.sh`
|
||||
之前——`InkStoneCo/` 還沒 clone、家目錄又是空的 ⇒ 兩份主線檔都不在 ⇒ `countdown.py` 退到「期限最近的 milestone」
|
||||
⇒ 第一則 prompt 印 `🔴 主線 把管理這條線做對 已逾期 341 小時`+`🎯 現在沒有主線`。機制沒壞,是順序。
|
||||
⇒ `scripts/mainline refresh`(SessionStart)在兩份都不在時去 Gitea 讀 `inkstone/InkStoneCo` main 的
|
||||
`system-dev/mainline.json` **一次**、寫進家目錄;之後每一則 UserPromptSubmit 讀家目錄,路徑上照舊零網路。
|
||||
優先序寫死在 `hooks/lib/mainline.py` 檔頭:**家目錄 > repo 那份 > Gitea 那份**,不是第二套來源。
|
||||
|
||||
**失敗**:
|
||||
- ①② 紅 ⇒ 前置狀態測不到(票上撞到的那個畫面重現不了,後面全是假綠)
|
||||
- ⑥⑦⑧ 紅 ⇒ 第一則 prompt 仍是「沒有主線」或那條逾期的舊線——本票要解的就是這一格
|
||||
- ⑨⑲ 紅 ⇒ 一上來就實名(讀的形狀是匿名優先,被拒才帶 token)
|
||||
- ⑬ 紅 ⇒ **每一則訊息的路徑上打了網路**(`load()`/`line()` 從不打網路這條被弄壞)
|
||||
- ⑭⑳㉒ 紅 ⇒ 家目錄或 repo 那份在場還去問 Gitea,或讀 repo 那份時順手寫了家目錄(A32 ④)
|
||||
- ⑮⑯⑰㉓㉔㉕㉖㉗ 紅 ⇒ 讀不到時不是安靜退回:炸、掛住、或往 stderr 抱怨(SessionStart 每次都會看到)
|
||||
- ㉘㉙ 紅 ⇒ bootstrap 之後 repo 那份出現時,`set_at` 規則(A32 ⑤⑦)被本票弄壞
|
||||
|
||||
**真實跑(2026-09-07,雲端 session,isep-hand)**:薄殼形狀(空家目錄、`$CLAUDE_PROJECT_DIR` 是沒有 `InkStoneCo/`
|
||||
的空目錄)——環境有 `GITEA_TOKEN_CLAUDE_CODE`:`mainline refresh` 2.06 秒、rc 0,`mainline` 印
|
||||
`inkstone/Arcrun#48「AI 問一次就看得到全部…」`,UserPromptSubmit 餵 `countdown-guard.sh` 印
|
||||
`⏱ …|主線 AI 問一次就看得到全部… 剩 137 小時 41 分` 與 `🎯 主線:inkstone/Arcrun#48…`;
|
||||
拔掉 token:rc 0、家目錄零檔案、印「現在沒有主線」、薄殼目錄仍是空的。
|
||||
⚠️ **「新開一個雲端 session、不跑任何指令、第一眼就是它」**這格要下一版裝進雲端才驗得到——
|
||||
前提是 Cloud environment 有 `GITEA_TOKEN_CLAUDE_CODE`(本 session 有),沒有就跟 0.25.0 一樣退到舊線。
|
||||
|
||||
### A5 — 開票前的搜尋是跨 repo 的
|
||||
```
|
||||
python3 scripts/ticket where 標籤 模組化
|
||||
@@ -1194,6 +1227,7 @@ B2(信標那行)/B3(setup 輸出)/B4(閘的訊息)三個畫面
|
||||
| **A34 收件 repo 寫 owner/repo 不 404** | isep-hand | ✅ 7/7(2026-09-07,inkstone/ISEP#130) |
|
||||
| **A35 Bot API 直送** | isep-hand | ✅ 10/10(2026-09-07);**真的到 leo 手機**要 Cloud environment 先有 `TELEGRAM_BOT_TOKEN`/`TELEGRAM_CHAT_ID`(leo) |
|
||||
| **A36 雲端對 stage 的寫入有正門、只寫得進 stage** | isep-hand | ✅ 45/45(2026-09-07,inkstone/ISEP#137)+真實種進 youlin 一把探針再刪掉、真打 stage GET 200/無 Bearer POST 401;「帶 Bearer 真寫 KBDB」缺 `KBDB_INTERNAL_TOKEN` 沒跑 |
|
||||
| **A37 雲端第一則 prompt 的主線是現在這條** | isep-hand | ✅ 31/31(2026-09-07,inkstone/ISEP#140)+真 Gitea 薄殼形狀實跑(帶 token 讀到 Arcrun#48;匿名退回);「新 session 不跑指令第一眼就是它」要下一版裝進雲端 |
|
||||
| **A37 tag → release 那一站** | isep-hand | ✅ 14/14(2026-09-07,inkstone/ISEP#67→6574)+真 Gitea 唯讀 dry-run 兩次(v0.23.0 總管被擋的情境、v0.3.4 走到建那條路) |
|
||||
| **A38 回頭問收貨端+開場會問** | isep-hand | ✅ 14/14+信標 33/33(2026-09-07,inkstone/ISEP#67→6574)+信標真 Gitea 匿名實跑一次安靜 |
|
||||
| A7 plugin 裝得起來 | 總管 | ✅ |
|
||||
|
||||
@@ -167,7 +167,7 @@ leo 09-07:「雲端回覆的問題你首要解決⋯⋯僅有需要依賴 Mac
|
||||
|
||||
| 拿不到什麼 | 為什麼 | ISEP 這一半 | 還缺誰 |
|
||||
|---|---|---|---|
|
||||
| **主線是哪條** | 主線檔只在本機 `~/.claude` | `hooks/lib/mainline.py`:家目錄沒有就讀 repo 的 `InkStoneCo/system-dev/mainline.json`(雲端形狀:`$CLAUDE_PROJECT_DIR` 是薄殼根、真身在 `InkStoneCo/`);`mainline set`/`adopt`/`clear` 兩份一起寫 | 總管 `set` 之後要把 repo 那份 commit/併 main |
|
||||
| **主線是哪條** | 主線檔只在本機 `~/.claude` | `hooks/lib/mainline.py`:家目錄沒有就讀 repo 的 `InkStoneCo/system-dev/mainline.json`(雲端形狀:`$CLAUDE_PROJECT_DIR` 是薄殼根、真身在 `InkStoneCo/`);`mainline set`/`adopt`/`clear` 兩份一起寫。**兩份都不在**(SessionStart 跑在 `bootstrap.sh` 之前,`InkStoneCo/` 還沒 clone)⇒ `mainline refresh` 去 Gitea 讀 InkStoneCo main 那份一次寫進家目錄(`inkstone/ISEP#140`)——第一則 prompt 的 ⏱/🎯 就是現在這條,不再退到逾期的舊線 | 總管 `set` 之後要把 repo 那份 commit/併 main;Cloud environment 要有 `GITEA_TOKEN_CLAUDE_CODE`(InkStoneCo 是 private,匿名讀不到) |
|
||||
| **正門工具被分類器擋**(`permission_denials=6`) | leo 09-07 親手加的四條只在本機 settings | `docs/permissions-allow.json` 一份清單;`scripts/settings-allow-sync` 寫進那台的 `~/.claude/settings.json`(setup script 裝完 plugin 跑一次,SessionStart 每次再對一次) | 雲端一趟 run 看 `permission_denials`=0 才算驗到 |
|
||||
| **讀 leo21c 也被擋** | `leo21c-write-guard.sh` 把 `tr -d` 的 `-d` 當 body | 唯讀 `-d` 先剪掉再判;`notify_leo` trigger 放行(同 `prod-write-guard` 白名單);改法段改印現役 youlin 子網域 | — |
|
||||
| **收工摘要到不了手機** | 雲端沒 `TELEGRAM_*`;leo21c 的 `notify_leo` 404;youlin 被 egress proxy 擋 | `scripts/isep-notify` 有 `TELEGRAM_BOT_TOKEN`/`TELEGRAM_CHAT_ID` 就先走 Bot API 直送(`api.telegram.org` 從雲端是通的) | **leo**:在 Cloud environment 加那兩個變數 |
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
| `isep-presence-beacon.sh` | 對話一開始印一行 `🟢 ISEP vX.Y.Z 已載入(N 支閘|來源:…)`。**這行不是裝飾,是唯一能證明「這個 session 真的有閘」的東西**——它自己就住在 plugin 裡,看得到它就表示 plugin 載入了;某個 session 從頭到尾沒有這行,那個 session 是零閘狀態,先修 plugin 再做事。同一台機器可能同時有兩份 ISEP(marketplace 裝的、repo 裡 vendor 的),所以那行會講出這次是哪一份在說話。它另外會報四件「這一份是不是還有效」:①這一份落後 ISEP main 幾版 ②專案裡有沒有內容不同的同名**腳本**②b 專案裡有沒有內容不同的同名**skill/command/agent**——這些是**自動載入**的,載到舊的那份不會有任何症狀,只會安靜地教錯的東西(`docs/file-ownership.tsv` 說得出每一組的真相源是哪一份、往哪個方向修)②c 本身的內容跟那張歸屬表對不對得上(雲端沒有專案那一份可比時,這是唯一還作數的檢查)③工作區有沒有已退役機制留下的產物 ④**打了 tag 卻沒 release**(Gitea 最新 tag 沒有 release、或 main 定版了還沒打 tag)——一行說缺哪一站+可以直接貼著跑的補法(`scripts/release-ship`),都在時一個字都不說;判準跟 `release-ship`/`release-check` 同一份(`hooks/lib/release_chain.py`),匿名讀、問不到就閉嘴(`inkstone/ISEP#67`)。**全部只講不擋。** | 📝 記錄(context 注入) |
|
||||
| `session-start-recall.sh` | 對話一開始就自動把「全局現況」(Gitea 各 repo 的票、KBDB 的藏書地圖)推到 AI 眼前,不必等它自己想到要查。 | 📝 記錄(context 注入) |
|
||||
| `scripts/settings-allow-sync --quiet` | (不是閘,是腳本)對話一開始把 ISEP 的權限白名單(`docs/permissions-allow.json`:`ticket`/`mainline`/`gate-ok`/`gitea-pr-merge`/`stage`(inkstone/ISEP#137 起,雲端對 stage 寫入的正門)五個正門工具,外加 Arcrun 的 `stage-deploy-artifacts.py`)寫進**這台機器**的 `~/.claude/settings.json`。只加不減、冪等;目標檔壞掉就不碰它、講一聲。**為什麼**:leo 09-07 親手加的四條只在本機,雲端沒有 ⇒ 同樣的動作被分類器擋(09-04 run log `permission_denials=6`);薄殼 repo 要 D20 開閘才推得動,所以清單住 ISEP 一份、兩台各自寫進自己的家目錄(inkstone/ISEP#130)。 | 📝 記錄(寫 settings) |
|
||||
| `scripts/mainline refresh` | (不是閘,是腳本)對話一開始把**現在的主線**那條 milestone 的進度與期限更新一次,好讓每回合眼前那一行講的是今天的數字。拿不到 Gitea 就原封不動——**寧可資料舊,不要把主線弄丟**。跑一次就結束,不輪詢。 | 📝 記錄 |
|
||||
| `scripts/mainline refresh` | (不是閘,是腳本)對話一開始把**現在的主線**那條 milestone 的進度與期限更新一次,好讓每回合眼前那一行講的是今天的數字。拿不到 Gitea 就原封不動——**寧可資料舊,不要把主線弄丟**。跑一次就結束,不輪詢。**家目錄與 repo 那份都不在時**(雲端薄殼跑到這裡 `InkStoneCo/` 還沒 clone)先去 Gitea 讀 `inkstone/InkStoneCo` main 的 `system-dev/mainline.json` 一次寫進家目錄(`inkstone/ISEP#140`):匿名優先、被拒才帶 token;讀不到就退回,不報錯、逾時有上限。優先序寫在 `hooks/lib/mainline.py` 檔頭。 | 📝 記錄 |
|
||||
| `overdue-nag-guard.sh` | 對話一開始就去 Gitea 撈**沒有人會叫的事**:逾期的 milestone、掛著等你的票(標「等了幾天」)、標著「有人在做」卻好幾天沒動的票;撈完用白話講出來,**有事就發 Telegram 給你**。沒東西可報時它會說「查過了,沒有」——**安靜跟壞掉長得一模一樣**。發不出去時不會靜默:它會先問這個 session 的 `prod-write-guard` 會不會擋(舊版把「發通知」誤認成「部署」),擋就改貼回票上並把原文印在眼前。只在開 session 時跑一次,**不輪詢、不掛排程**。 | 📝 記錄(context 注入 + Telegram) |
|
||||
| `wiki-size-guard.sh` | 對話一開始講出「哪幾個 wiki 檔已經沒有人讀得完了」(預設超過 1200 行就點名)。**讀不完的必讀檔,跟沒有那個檔的差別只在於它讓人以為有。** 另一半掛在寫檔上,見 B 組。 | 📝 記錄(context 注入) |
|
||||
| `skill-deploy-drift-guard.sh` | 如果「全機真正在用的 skill」跟「repo 裡版控的正本」內容對不上,就在開場講出來——避免用著一份沒人知道已經跟正本分家的舊拷貝。 | 📝 記錄 |
|
||||
|
||||
Reference in New Issue
Block a user