Commit Graph

17 Commits

Author SHA1 Message Date
Leo 03d9782f22 查了官方文件才發現:setup script 根本讀不到環境變數,而 exit 1 會鎖死 session
leo 問「寫以前為什麼不查」——沒有藉口,我假設了兩件事都沒查,兩件都是錯的。

① setup script 讀不到 Environment variables
   官方原文:Each session copies the environment's values once, at startup,
   into ordinary environment variables
   而 setup script 是 before Claude Code launches 跑的 ⇒ 注入在它之後。
   ⇒ 把 token 放進 Environment variables 再要 setup script 讀,永遠讀不到。
   證據吻合:leo 的變數設對了、值也跟本機同一把(長度 40、頭尾一致),
   而腳本回報找不到。

② exit 非零會讓整個 session 開不起來
   官方原文:Exit zero: if the script exits non-zero, the session fails to start.
   前一版為了大聲失敗用 exit 1 ⇒ 直接造成 Session initialization failed。
   ⇒ 現在一律 exit 0,失敗寫進 /tmp/.isep-setup-report。

本機三向實測:
  無變數(雲端真實情況)→ exit 0,印出說明,不擋 session
  有變數(未來平台若改行為)→ 設 git 認證並驗證
  ls-remote 加 timeout 45(本機曾掛住近 4 分鐘)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:39:48 +08:00
Leo 36d8e05a32 認證驗證加 timeout:掛住比失敗更糟
2026-08-21 本機隔離測試:git ls-remote 掛住近 4 分鐘不回。
setup 卡在那裡看起來像還在跑,不會有人知道它壞了。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:34:34 +08:00
Leo 135637291c B4 的探針我自己沒撞過,實撞後發現它根本不會擋
v0.3.1 我把 B4 從 git tag 換成「寫 __GITEA_TOKEN__ 進 /tmp/x.md」,
說它會被 credential-only-guard 擋下。今天實撞:exit 0,閘完全沒反應。

原因:那支閘刻意豁免 .md/docs//wiki/(文件本來就要能談論這些字串)。
它只管會被執行的產物:*workflow*/.yaml/.yml/installer/worker.js/wrangler。

改成 /tmp/wf.yaml 後三向實測:
  違規 workflow.yaml 帶佔位符       → exit 2 credential 鐵律攔截
  同檔用 {{credential.gitea_token}} → exit 0(正確放行)
  .md 談論同一個字串                 → exit 0(正確豁免)
薄殼指標端同樣實測:真身在+違規 → exit 2。

這是同一個病的第四次:修假綠的那一刀,自己又是沒撞過就寫。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 00:33:44 +08:00
Leo 291787eaaa TESTING.md B 段整段換掉——舊版在閘全滅時會回綠
2026-08-20 雲端實證:B2/B3/B4 三步在 plugin 完全缺席時**全部通過**。
一個在閘死掉時也會給出正確答案的測試,不是測試。

三處各自為什麼假:
- B2「跑 claude plugin list」→ 要它自己報自己,沒有獨立證據
- B3「Skills (9) / Hooks (5)」→ 那組數字剛好是薄殼自己的 .claude/ 產生的
- B4「git tag -a v9.9.9」→ git tag 在三支閘的白名單裡

新版三步都改成有鑑別力的:
- B2 找 v0.3.0 新增的載入信標(那支腳本住在 plugin 裡,沒載入就不可能發聲)
- B3 看 setup script 的自我驗證輸出(v0.3.0 新增)
- B4 改用金鑰佔位符觸發 credential-only-guard(不在任何白名單上)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 23:02:47 +08:00
Leo daa1674a20 雲端零閘的兩個真因:setup 從不驗證自己+沒有任何 release 撐版本號
2026-08-20 雲端 session 的閘全滅,而三個驗證步驟全部回綠。
今晚在隔離 HOME(GIT_CONFIG_NOSYSTEM=1)重現,把兩件事分開了:

① setup script 的寫法是對的
   裸環境失敗、加了 url.insteadOf 就成功 —— x-access-token 這個使用者名稱
   Gitea 也接受。所以先前我對 leo 說「URL 重寫沒作用到 marketplace 這條路徑」
   是錯的,這裡更正。
   (前兩次測試之所以誤導,是因為 /etc/gitconfig 的 macOS keychain helper
   還在幫忙 —— 「隔離 HOME」並沒有隔離系統層設定。同一個病第三次。)

② 真正的缺陷是這支腳本從不驗證自己
   設完就結束。token 沒生效也不出聲 ⇒ setup log 一片綠、
   session 開起來才發現 marketplace 拉不下來,而那時已經沒有任何線索。
   本次加兩道自我驗證:git 認證通不通、marketplace 有沒有就位,
   任一不通就 exit 1 並印出該查什麼。

③ 新增 isep-presence-beacon.sh(信標,不是閘)
   SessionStart 報「ISEP v幾 已載入、幾支閘」。
   它的全部意義是鑑別力:這行住在 plugin 裡,所以看得到就一定載入了,
   看不到就是零閘。不像 git tag(在三支閘的白名單裡,閘死了照樣過)。

④ plugin.json 0.0.0 → 0.3.0
   查清楚了:0.0.0 不是漂移,是誠實 —— ISEP 一個 tag 都沒有,從沒發過 release。
   而這正是「雲端拿不到更新」的另一半:claude plugin update 比對版本號,
   沒有 release 就永遠沒有新號碼可比。所以這一刀的收工是真的打 tag 發版。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 22:59:21 +08:00
Leo f855d82573 產生雲端 env 設定,不要 leo 自己拼湊(InkStoneCo#14)
leo 2026-08-20:「應該是你會幫我產生正確的 env 我去貼⋯⋯不然就是我要自己拼湊」
「這些值你都有,你可以只寫名字然後 build 一個檔案給我」

總管原本的說法是「你複製設定給我、值遮掉」——那是錯的,兩個理由:
① 把拼湊的工作丟回給 leo ② 讓值經過對話本身就是洩漏面。

scripts/make-cloud-env.sh:
- 腳本裡只寫**變數名字**(NEEDED 陣列,要加變數就加在那裡)
- 值在執行當下才從既有 .env 讀(credentials-map 記的六個位置都找)
- 產物寫到 ~/.claude/cloud-env/<時間>.txt,權限 600,**刻意不在任何 repo 底下**
- 只印路徑不印值;找不到值的變數會標出來而不是靜默留空
- 產物最後一行就是刪除指令

docs/TESTING.md 補 B0 段:先跑產生器,再貼。

實跑過:1 個變數、0 個找不到、產物 45 行、權限 600、不在任何 repo。
2026-08-20 20:45:02 +08:00
Leo 0946f702d7 v0.10.0:補 M4.0(里程碑怎麼組成)、M4.3 改寫成「不准自己打折」
leo 2026-08-20 訂正總管寫錯的規則:
「我跟你說要達成的目標,你從 issues 池遍歷找出要完成哪些可以達成,如果沒有才增加 issues,
定下後就不改,而不是要做 5 件事,做不到就改成 2 件,自己打折」

原本 M4.3 寫成「增減都是 leo 的裁決,不是總管的操作」——把重點放錯在「誰有權」,
而 leo 說的是**組成方式**與**不准打折**。

- 新增 M4.0:leo 給目標 → 總管遍歷票池找出達成它需要哪些票 → 池裡沒有才補開 → 定下不改
- M4.3 改寫:定下就不改,尤其不准因為做不完而縮減;做不完就是還沒完成,
  里程碑開著、百分比顯示真實完成度。把分母改小只是讓它說謊。
  唯一例外是目標本身變了 ⇒ 重走 M4.0,不是打折。
- §15.2 補記:六群的組成就是照 M4.0 走出來的(44 張既有票,沒補開任何新任務票)
2026-08-20 17:58:08 +08:00
Leo e16d21435f v0.9.0:全面 PR-only(leo 裁定)+跨 repo 群票載體入規範
leo 2026-08-20:「所有 subagent 都是 PR only,在雲端地端總管所做的都是 PR-only。」
⇒ 推翻總管原提案(只有 ISEP 走 PR-only,其他 repo 總管自裁)。
   DIVERGENCE §E1 已加註被推翻,原文保留作歷史。
⇒ main-and-prod-push-guard.sh 現行判準只擋 subagent、放行總管,與本條不符,
   要改成不分角色一律擋;/tmp/.main-push-ok 戳記隨之作廢(PR review 就是那道確認)。排群 4。

另 §15.5:六個群在 ISEP 各有一張 hub 票(#30-#35),別的 repo 的舊票用 Gitea 原生
dependency 指過去(跨 repo dependency 已實測 201 可用)——milestone 管不到跨 repo,這是載體。
2026-08-20 17:55:35 +08:00
Leo 410771e883 E5 對齊 M4.3:到期只通知,不移票 2026-08-20 17:50:15 +08:00
Leo 64dae34efa v0.8.0 修訂:刪 M4.7、M4.3 改寫(里程碑內容不增不減)、§15 精簡成方向性規劃
leo 2026-08-20 兩則指正:
① 「milestone 確定後怎麼可以再把東西移除?定下工作自己刪掉是什麼意思?根本就沒有什麼降」
  ⇒ M4.7(降 scope 留痕)整段刪除——它把一個不該存在的操作合法化了。
  M4.3 改成:到期只通知 leo;內容增減都是 leo 的裁決,不是總管的操作。
② 「規劃書要大的規劃,方向性,不是寫廢話」
  ⇒ §15 從逐領域十行大表精簡成:四句方向+六里程碑順序表+三矛盾定案+三件待裁。
2026-08-20 17:42:51 +08:00
Leo 6d61c10cb8 治理規範 v0.8.0:三源整合定案(§15,leo 核准)
leo:「把 claude.ai 的規劃、舊有票的需求、現在已經有的機制全部整合,
修正出最終版規劃,核准再動工。」

- §15.1 逐領域十欄對照(A–J),每格標定案
- §15.2 三處矛盾的解法:#40 只減不增 vs E 清單要新閘(→伺服器端優先);
  warn-first vs 全 block(→四層定位,#48 是前提);E5 自動打 tag(維持否決)
- §15.3 已成立清單;§15.4 動工順序;§15.5 三件待裁(不擋群 0)
- 最大發現:claude.ai 兩份規劃都沒有「觀測」這一章,而舊票最痛的就是它
2026-08-20 17:40:52 +08:00
Leo 6244baef25 治理規範 v0.7.0:全局遍歷與 mapping 併入本檔(不另立文件)
leo 2026-08-20:「我要你修正 sdd-gitea-governance.md 變成新版,不是要你重寫一版」——
總管原本把遍歷結果寫成獨立的 PLAN.md,那正是 §13.3 記的病「同一件事有兩份」,
當場刪除,內容併進本檔。

- §0 公理補第 8 條:票就是問題,衡量進度的是舊問題關掉幾張,不是出了幾個版本
- §13 現況遍歷:14 repo/156 open/45 張管理票分六群,排序按「什麼擋住什麼」,
  每條標來源票號與現況;含 #40 憲法七項對帳(總管自己違反兩項,如實記)
- §14 mapping:17 張新票只有 1 張真的推進舊問題(且僅半張);結論是不新增任何票
- §13.9 warn 可行性查證:hookify 的 warn 走 systemMessage 不進 AI,
  additionalContext 才進得去——#40 §3 可行,但要用對欄位
2026-08-20 17:32:29 +08:00
Leo 1dfc4e373a v0.2.1:43 支閘的白話盤點、測試手冊、補上兩個被抓到的洞
leo 2026-08-20 問「InkStoneCo#40 加入了嗎?如果是這樣我應該可以白話文看到 hooks 的內容?」
答案是不行——43 支閘沒有任何白話清單。這一版補上。

docs/hooks-inventory.md   43 支逐支一行,按「你會在什麼時候撞到它」分 9 組
                          抽驗 5 支逐行核對源碼;順帶抓到 3 支有檔案沒註冊
docs/TESTING.md           A1-A8 + B1-B5,每格都有「怎麼跑/該看到什麼/什麼算失敗」
scripts/test-*.sh         兩支閘的測試,共 21 條,全過

兩個實撞的洞:
- release-tag-guard 的排除清單是前綴比對,x 整條放行
  (A8 那個新 session 抓到的,總管複驗屬實)。改用 #23 驗證過的判準:
  關鍵字要在指令位置才算執行。補 3 條複合指令測試,8/8。
  ⇒ 這是 InkStoneCo#36「包一層就繞過去」的同一個病,發生在同一天新寫的閘上。
- scripts/ticket 寫死只認名叫 gitea 的 remote,在 ISEP(remote 叫 origin)整個跑不起來
  ⇒「開票前先搜」那道閘在新 repo 等於不存在。改成掃所有指向本站的 remote + 環境變數 fallback。

A8 已通過:新 session 裡 plugin 的閘真的觸發(exit 2、tag 未建立、訊息來自 plugin 路徑)。

文件漂移訂正:plugin.json 與 README 寫 42 支/52 條,實際 43 支/53 條。

兩支新閘補上 #40 §1 要求的三行中文檔頭。
🔴 但仍違反 #40 §3「新規則一律先 warn」——兩支都是 block。理由記在 #40 留言,等 leo 裁。
2026-08-20 17:08:00 +08:00
Leo aec7f3a980 治理 M4.7:把票移出里程碑必須寫進里程碑描述(closes #24 的規範面)
leo 2026-08-20 抓到:v0.2.0 顯示 100%,但那是把 #5 移出去之後的 100%,
畫面上看不出降 scope 發生過。

與 §3.4(審核完沒關票 ⇒ 數字偏低)是同一個病的兩面——
畫面上的數字不等於實際狀態,而 leo 只看得到畫面。

禁的不是降 scope(卡人閘時降 scope 是 M4.3 要的),禁的是降得無聲無息。
痕跡要留在他會經過的地方=里程碑描述,不是票裡、不是對話裡。
2026-08-20 16:33:08 +08:00
Leo 627f924342 docs(cloud): 雲端 session 用 claude plugin marketplace 裝真身 ISEP,不再複製薄殼
inkstone/ISEP#5 —— 用 code-on-web 的 Setup script(session 啟動前跑)+
claude plugin marketplace add/install 把 ISEP 裝成 user-scope plugin,
內容 100% 來自 ISEP repo HEAD,滿足 docs/governance §11.3 三條硬規則。

本機隔離 $HOME 實測兩輪(token-in-URL、git url.insteadOf 重寫兩種認證寫法皆可行),
skills/commands/hooks 逐條數字對上 ISEP 當時的 main HEAD(含途中 main 前進,
下次 marketplace update 立刻拿到新內容,證明非快照複製)。

明確未驗:真實 code-on-web session、hook runtime 攔截、7 天 environment 快照
新鮮度窗口——皆記在 docs/cloud-session-bootstrap.md「沒驗到的」段。

不動 youlinhsieh/inkstoneco(新機制不需要它)、不 push GitHub、不 push main。
2026-08-20 13:41:35 +08:00
Leo 09979b2357 自我審核修訂:ISEP 的人閘放在 release 不放在每個 PR
原本寫『ISEP 自身的修改 PR 必經人閘』——照字面走每個 PR 都要 leo 點頭,
他就變成瓶頸(違北極星 §1)。但完全拿掉,代理就能悄悄放寬管自己的規則。

改成:總管可 merge(loop 不停),但每個 release note 必須逐條列出這一版
改了哪些治理規則與哪些閘,release 就是那道人閘。
=把同步的逐 PR 審批改成非同步的逐版本審批。
2026-08-20 13:04:29 +08:00
Leo 50876ffa4f 治理規範進 docs/:claude.ai 原稿存檔+總管修訂版 v0.6.0+逐條分歧書
leo 交辦:把 claude.ai 寫的治理規範整理進 ISEP,並且「查看是否合理,提出意見⋯⋯
改一版你的版本」。原稿作者看不到 codebase,標籤名/hook 名/既有鐵律有實錯。

三份文件:
- _draft-claude-ai-v0.5.0.md  原稿,一字未改,加存檔標頭
- sdd-gitea-governance.md     v0.6.0 現行版
- DIVERGENCE-v0.5.0-to-v0.6.0.md  我改了哪 14 處、為什麼

修訂重點(實查 2026-08-20 的現場,不是推測):
- 標籤名幾乎全是憑空的:gate/human・s/review・close/*・hub・type/* 現場一個都不存在。
  Human 不改名(leo 08-17 才改過,改名會廢掉他的看板習慣),另加 human/exec 當第二維度。
- 狀態機三態擴成七態:原稿會擠掉 s/triage・s/backlog・s/pending・s/stage,
  而那四個態上掛著 179 張 open 票。s/review 與 s/stage 是兩件事,不可互相取代。
- E1–E16 的 hook 全是憑空命名,改成標註「已有 <實際檔名> / 待建」——
  E14 其實已經有了(subagent-claim-worksheet.sh),重造就是第 42 支互相打架的閘。
- 刪掉「薄殼只裝 shell-safe 子集」:那是舊薄殼模型的殘留,正是 InkStoneCo#57 的成因,
  而且與原稿自己的 P11.2.1/P11.2.4 自相矛盾。
- 排程 job 第一版一律不依賴 Gitea Actions runner(有沒有 runner 未經查證,
  依賴不確定存在的東西,壞掉的形式是「以為有人在跑」)。
- 補上原稿整份沒有的「載入契約」一節——那正是 leo 需求 3 的核心,也是 InkStoneCo#14 的根因。
- 補上 M4.6:release note 寫在 release 裡不寫 README(leo 2026-08-20 當場指正)。
- 補上 §3.4 總管收工義務:審核通過的當下就關票(leo 2026-08-20 指出上次 milestone 0% 的病)。

兩個裁決題已按判斷先做、理由寫在 DIVERGENCE §E,leo 可打回:
PR-only 只套 ISEP 不套全部 repo;舊的 duplicate 標籤封存不刪。
2026-08-20 13:02:28 +08:00