Leo
01dafb01b5
Merge '交棒警察不再對剛出發的背景工人說收工了'(inkstone/ISEP#153)
...
總管複驗(09-13):scripts/test-baton-handback-guard.sh 24/24 通過;樹上當場數 hooks 62、註冊 88、腳本 65 與 plugin.json 描述一致。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 17:41:07 +08:00
Leo
436e30b9d1
交棒警察不再對剛出發的背景工人說「收工了」(inkstone/ISEP#153)
...
- PostToolUse:Agent 看到 launch ack(isAsync/async_launched/"Async agent launched")就不查票
- 多掛一條 Stop:主 transcript 出現 <task-notification> completed 時,用 tool-use-id
對回原本那則 Agent tool_use、取【工單】再查三格;同一條線只點名一次(狀態檔)
- 出路改印絕對路徑:InkStoneCo/scripts/ticket 是舊複本,grep -c handback → 0
- 測試 10 → 24 條;新 14 條拿 main 的舊 hook 跑是 7 條紅
- 盤點:62 支、88 條(+1)、65 支腳本,當場數的
待總管定版(plugin.json version 未動)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 17:30:45 +08:00
Leo
916a6890ff
定版 v0.30.2(isep-doctor 講得出每個 Claude Code 實際有沒有載入 ISEP)
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
v0.30.2
2026-09-13 16:45:50 +08:00
Leo
ba1f2a50f8
Merge 'isep-doctor 判準改成每個 Claude Code 自己回報有沒有載入'(inkstone/ISEP#150)
...
總管複驗(09-13):test-isep-doctor.sh pass=11 fail=0;test-isep-doctor-live.sh pass=3 fail=0 skip=0;本機實跑 CLI 2.1.220/Desktop 2.1.266 皆 ✅ exit 0。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 16:36:54 +08:00
Leo
fbc56b9e59
isep-doctor 判準改成「每一個 Claude Code 自己回報有沒有載入」,不再看設定長相(inkstone/ISEP#150 → c6995)
...
同一台 Mac 有 CLI 與 Desktop 內建兩個 Claude Code,讀同一份 ~/.claude 卻不一定同結論:
settings 多了 path 時 Desktop 2.1.266 忽略 inkstone marketplace、CLI 2.1.220 照常載入(c6991)。
第一版看到 path 就對整台判 ❌ ,在 CLI 上是假陽性。
- 逐一找 CLI(PATH)與 Desktop(最新版本,數字排序),各跑 plugin list --json,依 errors 各判各的
- 設定比對只在某一個真的報錯時當解釋+修法,永遠不單獨判 ❌
- 查不了 ⇒ ◐、離開碼 2,不講成 ✅ 或 ❌
- test-isep-doctor.sh 離線 11 條(假 claude 可執行檔);舊版跑這份 pass=1 fail=10
- test-isep-doctor-live.sh 實機 3 條:真的 CLI 2.1.220/Desktop 2.1.266,隔離 HOME 重現有/無 path,不動 ~/.claude
- 盤點表與 plugin.json 描述的腳本數 62→65(這棵樹上實數)
版本號待總管定。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 16:23:40 +08:00
Leo
8eb4c58d2d
isep-doctor:講出這台的 ISEP plugin 有沒有真的載入(inkstone/ISEP#150)
...
根因不是「Desktop 不跑 hook」:Desktop 1.52386.0/CC 2.1.266 內實測專案
PreToolUse hook 照擋。真正斷的是 ~/.claude/settings.json
extraKnownMarketplaces.inkstone.source 多了 path,CC 把它當 git 抓取欄位,
marketplace 被忽略 ⇒ isep@inkstone「Marketplace inkstone not found」,
59 支閘在 CLI 與 Desktop 一起失效,而且沒有任何閘講得出來。
本支從 plugin 外面查(claude plugin list --json + settings 對 known_marketplaces),
點名多出的欄位並印出一行修法。迴歸測試 scripts/test-isep-doctor.sh 5/5。
假設:修 ~/.claude/settings.json 是 leo 的個人設定,由 leo 親手執行,本 commit 不動它。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 14:55:26 +08:00
Leo
c1df3c7a08
定版 v0.30.1(主線成員讀不到就講出來,不再讓雲端工人以為抓盡)
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
v0.30.1
2026-09-13 14:07:25 +08:00
Leo
544beefc5e
Merge '主線成員讀不到任何一條 /dependencies 時不准印出完整名單'(inkstone/ISEP#130)
...
總管複驗:members-by-dependency 70/71(唯一紅項 ㊽ 與 main 上相同)、gitea-fallback 31/31、repo-mirror 17/17、ticket-pick 58/58
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 14:07:02 +08:00
Leo
c0eec76b52
主線成員讀不到任何一條 /dependencies 時不准印出完整名單:set 不印 ✅ 並離開碼 3、refresh/adopt 保留舊快取並講出來(inkstone/ISEP#130 → c6973)
...
總管 09-13 實撞:Gitea 握手逾時,hub 票 InkStoneCo#132 本身讀得到、它的 /dependencies 讀不到,
`mainline set` 仍印「✅ 成員 6 張」,底下三張前置全漏;`refresh --members` 零輸出、名單沒變。
雲端工人靠這份名單抓票,漏收=以為抓盡=收工,等於 v0.30.0 換個入口又停。
- collect_members:清單讀取拿不到就重讀(ISEP_MEMBER_RETRIES 預設 2、退避 2s×n);
仍讀不到的票記進 info["unread"],info["complete"]=沒有 unread 且沒被上限截斷
- set:不完整時印 ⚠️ (🔴 成員不完整)+點名讀不到的票,主線檔寫 members_complete/members_unread,
同一條線保留舊快取成員,離開碼 3(主線本身照樣標定)
- refresh --members:完整才蓋快取並印成員張數;不完整保留舊快取並講出來;讀不到里程碑也講
- adopt:不完整時與舊快取取聯集
重現(改之前跑新測試):F1–F5、F9–F11、F13–F14 共 11 條紅——set 印 ✅ 、arcrun-rag#104 漏收、
refresh --members 零輸出且把快取蓋成少兩張的名單。
修後:mainline-members-by-dependency 70/71(唯一紅的 ㊽ 在 main 上同樣紅)、repo-mirror 17/17、
gitea-fallback 31/31、focus-guard 24/24、ticket-pick 58/58、debt-worklist 47/47。
真 Gitea 唯讀跑(不寫主線檔):InkStoneCo#65 成員 9 張、complete=True、hub #132 底下三張都收到。
沒動 InkStoneCo 的 system-dev/mainline.json。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 13:57:44 +08:00
Leo
0d49c0dcd7
Merge '雲端工人做完一張就接下一張'(inkstone/ISEP#33)+定版 v0.30.0
...
總管複驗:queue-drain-guard 26/26、ticket-pick 58/58、逐行審閘(ISEP#33 c6965)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
v0.30.0
2026-09-13 13:34:04 +08:00
Leo
b2d9141a7d
定版 v0.30.0(雲端工人做完一張就接下一張)
...
inkstone/ISEP#33(→ c6963):queue-drain-guard(佇列沒抓盡不准收工)、pickable 認得自己帳號的 s/todo、api() GET 連線失敗重試。
數字在這棵樹上實數:62 支閘/87 條註冊/7 位工人/7 支命令/2 支 skill/62 支腳本。
tag 由總管併 main 後打(check-version-consistency 在打 tag 前必然紅,照 v0.29.0 慣例)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 13:21:23 +08:00
Leo
26aee6dffb
queue-drain-guard:pick 自己 150s 收手,逾時當成讀不到(inkstone/ISEP#33)
...
09-13 本機實量 Gitea 同一分鐘 curl 60s 逾時、整趟 pick --all 約 15 分鐘;
hooks.json 給本閘 180s,被砍掉=非阻擋錯誤=放行收工。實跑真 Gitea:150s 逾時 → exit 2、log 寫入。
測試 26/26。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 12:41:43 +08:00
Leo
ec9f28d9e8
雲端工人做完一張就接下一張:佇列沒抓盡不准收工;自己帳號的票不再當成別人的(inkstone/ISEP#33 → 6924)
...
leo 09-13 判定 ISEP 失敗:「不會在一條任務完成後啓動另一個 loop」。實查三個機械根因:
1. 沒有任何 Stop 閘看佇列。Routine 一次觸發=一個 session,模型一停就結束;
12 支 Stop 閘量的是 tool call 數/宣告句/乾回合/自寫清單,
「做完一件、pick 還有票、寫完回報就停」全部放行。
⇒ 新增 hooks/queue-drain-guard.sh:跑過 ticket pick|claim|handback(或 ISEP_DRAIN=1)
的 session,pick 有票就 exit 2 交回票號;抓盡放行;同張 3 次/讀不到 3 次/40 次上限放行並留痕。
log 寫 TMPDIR,不靠雲端沒有的 CLAUDE_PROJECT_DIR。
2. pickable() 把指派給 claude-code 的 s/todo 當成「別人的」,而雲端工人就是 claude-code。
09-13 實查主線 Arcrun#176=s/todo+指派 claude-code;09-11 run(Arcrun#86 c6917)
就是以此判定「主線沒票」收工。⇒ 只指派給自己的 s/todo 算可抓;s/doing/Human 照擋。
3. api() 一次 TLS 握手逾時就讓 pick 離開碼 2(09-13 本機實撞,curl 同時 200)。
⇒ 只有 GET 對連線層失敗重試(預設 3 次,退避 2s×n);寫入不重試。
測試:queue-drain-guard 24/24、ticket-pick 58/58(+5)、ticket-repo-arg 7/7、
handoff-writeback 49/49;members-by-dependency 56/57,唯一紅的 ㊽ 在 main 上同樣紅(macOS 暫存路徑形狀)。
數字在這棵樹上實數:62 支閘(ls hooks/*.sh)/87 條註冊(grep -c '"command":')。
假設:工人與總管共用 claude-code 帳號維持現狀(改帳號是跨專案結構,交總管)。
版本號留 0.29.0,由總管併 main 後定版。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-13 12:37:49 +08:00
claude-code
4d27132413
Merge pull request '定版 v0.29.0(主線成員改由相依邊收集,不再靠同名里程碑)' ( #152 ) from chore/v0.29.0 into main
v0.29.0
2026-09-07 10:59:41 +00:00
claude-code
7f726bb99a
定版 v0.29.0(主線成員改由相依邊收集,不再靠同名里程碑)
...
總管定版:inkstone/ISEP#133(PR #151)——leo 09-07 原話「早就定了只有一個 milestone,不同 repo 用指針」。
collect_members()=hub 里程碑裡的票+hub 票,沿 Gitea /dependencies 跨 repo 收;mainline adopt 改成加相依邊,
不再在別的 repo 建同名里程碑;add_dependency 冪等改成先讀 /dependencies(真 Gitea 對重複邊回 500 不是 409)。
總管在「分支 ⊕ main」重跑:members-by-dependency 57/57、ticket-pick 53/53、mainline-repo-mirror 17/17、
focus-guard 24/24、gitea-fallback 31/31、countdown 20/20、milestone-account 23/23、debt-worklist 47/47;
全套紅的與 main 基線同 8 支(多出的 ask-user-question-guard.live 兩棵樹重跑都 9/9,是叫 haiku 的浮動)。
數字在這棵樹上實數:61 支閘/86 條註冊/7 位工人/7 支命令/2 支 skill/62 支腳本。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 10:59:16 +00:00
claude-code
f6791408ab
Merge pull request '主線成員由相依邊決定,不靠同名里程碑;adopt 別 repo 的票=加相依到 hub 票;帳本落在 InkStoneCo/system-dev(inkstone/ISEP#133)' ( #151 ) from feat/133-members-by-dependency into main
2026-09-07 10:58:57 +00:00
isep-hand
19face1c41
adopt 的冪等改靠「先讀 /dependencies」:真 Gitea 對重複相依回 500 不是 409(inkstone/ISEP#133)
...
真 Gitea 實跑(hub=InkStoneCo#44、子票=ISEP#133):第一次 POST 成功、/blocks 回 #44、
清空快取後 has 靠 /blocks 判「在」;第二次 POST 回 500——假伺服器原本猜 409,adopt 第二次會炸。
add_dependency() 改成先讀 parent 的 /dependencies,邊在就不 POST(判準是 Gitea 的事實,不是回應碼);
假伺服器改照真的回 500;A41 56→57 條。測完 DELETE 復原(201,/blocks 空)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 10:46:43 +00:00
isep-hand
d4bf172990
主線成員改由相依邊決定,不靠同名里程碑;adopt 別 repo 的票=加相依到 hub 票;帳本落在 InkStoneCo/system-dev(inkstone/ISEP#133 → 6743)
...
leo 2026-09-07:「拆,誰說『同名跨 repo 是 mainline 機制的一部分』,早就定了只有一個
milestone,不同 repo 用指針」。上一版 scripts/mainline 檔頭把現場的樣子(5 個同名)寫成
「既有做法」,成員也照標題跨 repo 收;總管照它做、抄進 ops-facts、還在 arcrun-rag 補建了一個同名的。
改了什麼(判準全部是 Gitea 欄位,沒有標題比對):
- hooks/lib/mainline.py:collect_members()=hub 里程碑裡的票+hub 票,沿 /dependencies 邊
(跨 repo)收下去;belongs() 要同時拿到「掛哪個 milestone」+「誰把它當相依」才准說「不屬於」,
只知一半回 None(閘放行);project_roots() 給主線檔與帳本共用
- scripts/mainline:set --hub <票>、adopt 別 repo ⇒ POST 相依到 hub 票(--via 可指定成員),
沒 hub 票時擋下並給兩條走得通的路,不建同名里程碑;has 查 /blocks;
refresh --members 才重收(真 Gitea 25 張要 19 秒,SessionStart 成本不變)
- scripts/ticket:add_dependency() 一份(subtask 與 adopt 共用,409 冪等);pick 主線組走成員清單,
逾期組一個里程碑物件一組;claim 的主線判定改看相依;pickable(None) 給靠邊進來的票
- hooks/mainline-focus-guard.sh:新鮮查詢問 milestone+/blocks,補收出路明講不要開同名里程碑
- scripts/milestone-account:帳本找家用同一把尺,退回原始碼目錄只在它有 .git(plugin 快取沒有)
測試:新 hooks/tests/mainline-members-by-dependency.test.sh 56 條(假 Gitea 照真的回 201/409);
scripts/test-ticket-pick.sh 48→53 條(池子改用相依邊,補「同名沒邊 ⇒ 不抓」);
既有 mainline-focus-guard/repo-mirror/gitea-fallback/idle/milestone-account/debt-worklist/
handoff-writeback 全綠。真 Gitea 唯讀實跑:set --hub inkstone/InkStoneCo#44 收到 25 張、5 個 repo,
mira#6/ISEP#130/ISEP#140/arcrun-rag#104 都在,不必新增任何邊。
版本:待總管定版(改了會被載入的 hook/scripts)。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 10:40:55 +00:00
claude-code
7a9e30589c
Merge pull request '定版 v0.28.0(一個 repo 只有一個資料夾:分身住 .worktrees/,收工機器收)' ( #149 ) from chore/v0.28.0 into main
v0.28.0
2026-09-07 07:20:05 +00:00
claude-code
3785fc66cc
定版 v0.28.0(一個 repo 只有一個資料夾:分身住 .worktrees/,收工機器收)
...
總管定版:inkstone/ISEP#147(PR #148)——leo 09-07 兩句原話立的禁令。scripts/worktree(open/close/list/sweep)、
line-needs-own-worktree.sh 多掛 PostToolUse 收工那一半、docs/governance/worktree-placement.md 規約。
總管在「分支 ⊕ main」重跑:test-worktree 42/42、line-needs-own-worktree 110/110、github-contact-guard 26/26、
版本一致 ✅ 、plugin validate ✅ 。sweep 對 leo 的 Mac 那一格只在 fixture 上驗過,交棒給 leo 親跑。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 07:19:39 +00:00
claude-code
7750299b18
Merge pull request '一個 repo 只有一個資料夾:分身住 repo 裡面的 .worktrees/,收工由同一支閘收掉;scripts/worktree sweep 整理現場(inkstone/ISEP#147)' ( #148 ) from feat/147-one-folder-per-repo into main
2026-09-07 07:19:19 +00:00
isep-hand
7cacfdcf11
一個 repo 只有一個資料夾:分身住 repo 裡面的 .worktrees/,收工由同一支閘收掉(inkstone/ISEP#147)
...
leo 2026-09-07:「一個 repo 只看得到一個資料夾」「禁止這樣產出一大堆資料夾」。
根因:line-needs-own-worktree.sh 教工人開在 repo 旁邊,「收工 remove」只寫在閘訊息裡、沒機制驗,
每條線留一份 ⇒ tech_projects/ 長出 ISEP-wt-117/InkStoneCo-wt-112…一排。規則在文字裡不在機器上。
- scripts/worktree(新):open/close/list/sweep 四個動詞。分身住 <repo>/.worktrees/<票 repo>-<N>
(走 .git/info/exclude,不動被追蹤的檔);「推了沒」只有這一份判準(三態:有/沒有/問不到,
問不到不當成沒推也不收);sweep 預設只列不動,--apply 只收「推了且乾淨」,--skip 是操作者點名。
- hooks/line-needs-own-worktree.sh:擋下時印 `scripts/worktree open`(絕對路徑,貼了就跑);
同一支多掛 PostToolUse Agent|Task——從【工單】認出分身,推了收、沒推點名分支+路徑(exit 2),
不 force、不刪。+0 支、+1 條(61 支/86 條,當場數的)。
- docs/governance/worktree-placement.md(新)+ principles 一行:禁令與閘互指。
- 測試:line-needs-own-worktree.test.sh 77→110(G 群:閘印的 open 那行原樣跑、旁邊不多任何東西;
H 群:PostToolUse 推了收/沒推點名/安靜的方向);scripts/test-worktree.sh 42 條(七個分身的 fixture,
名字照 leo 看到的那排)。舊閘跑新測試 90/110,紅的 20 條正是這次改到的行為。
- permissions-allow.json 加 worktree 四種形狀(出路在雲端被分類器擋就走不通)。
- README/plugin.json/hooks-inventory 的數字在這棵樹上實數:61 支、86 條、62 支腳本。
待總管定版(改了會被載入的東西)。沒碰 hooks/lib/mainline.py。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 07:13:21 +00:00
claude-code
13b97027d1
Merge pull request '定版 v0.27.0(兩支閘看的是指令要動的那個 repo,不是 hook 自己的環境)' ( #146 ) from chore/v0.27.0 into main
v0.27.0
2026-09-07 06:41:21 +00:00
claude-code
3d18b6c8e5
定版 v0.27.0(兩支閘看的是指令要動的那個 repo,不是 hook 自己的環境)
...
總管定版:inkstone/ISEP#109(PR #145)——line-needs-own-worktree.sh 的出路認指令字串裡的 WORKTREE_OK=1 前綴、
先剝 heredoc 再解析;github-contact-guard.sh 在這條指令實際會推的那個 repo 裡解 remote(cd 鏈/-C),
解不出才退回 cwd,判準仍是 URL 主機。來由:09-07 總管與 arcrun-hand 各撞一次(ISEP#109 comment 6629)。
總管在「分支 ⊕ main」重跑:line-needs-own-worktree 77/77、github-contact-guard 26/26、
push-guard 13/13、cross-repo 19/19、版本一致 ✅ 、plugin validate ✅ ;
把當天被誤擋的兩條指令原樣餵 hook:放行;該擋的兩條:擋。
數字在這棵樹上實數:61 支閘/85 條註冊/7 位工人/7 支命令/2 支 skill/60 支腳本。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 06:40:54 +00:00
claude-code
f13eed7ca2
Merge pull request '兩支閘改看「指令要動的那個 repo」,不看 hook 自己的環境/cwd:worktree 出路走得通、D20 看 push 實際目標(inkstone/ISEP#109→6629、#125)' ( #145 ) from feat/109-gate-sees-target-repo into main
2026-09-07 06:40:07 +00:00
isep-hand
95c6fee199
worktree 閘:heredoc 的 body 是資料不是指令,並把 inkstone/ISEP#125 的驗收表 A–F 寫成測試
...
#125 缺陷 D/E(09-02 兩次實地命中):用 heredoc 寫一份內含 `cd <目錄> && git checkout X` 示範的
說明文件,整條指令沒有 git 操作卻被擋。沿用 lib/strip_heredoc.py(D20 閘同一支)先剝 body 再解析。
A–F 六條照票上期望值進 hooks/tests/(A–E 0、F 2)。
(76) 把 tokenize 層「換行被當空白吞掉」寫成已知邊界測試(舊閘同樣 exit=0,漏擋不是誤攔,與 (53) 同層,另報)。
A24:69→77。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 06:35:28 +00:00
isep-hand
49a7145e70
兩支閘改看「指令要動的那個 repo」,不看 hook 自己的環境/cwd(inkstone/ISEP#109 → comment 6629)
...
① line-needs-own-worktree.sh:出路 `WORKTREE_OK=1 git -C … checkout …` 改認指令字串裡的字面前綴
(舊版讀 hook 自己的環境變數,PreToolUse hook 跟指令不是同一個行程,那行永遠走不通)。
判準是位置不是字:前綴必須掛在會移動 HEAD 的那條 git 指令上。
lib/checkout_target_dir.py 加 `--escape NAME=1`;push_target_dir._classify 在 strip_env 時
把前綴留在 verb 事件裡(find_push_target 行為不變,主線閘 10+19 條照綠)。
② github-contact-guard.sh:remote 名在「這條指令實際會推的那個 repo」裡解(沿用 lib/push_target_dir.py
解 cd 鏈/-C/子殼),解不出來才退回 cwd。判準仍是 remote URL 主機,不是「有 -C 就放行」。
測試:A24 59→69(E 群把閘印的那一行原樣餵回去;舊閘 3 條紅)、
A39 14→26(payload 帶 cwd、cwd≠目標 repo;舊閘 7 條紅=4 誤攔+3 漏擋)。
盤點表:61 支/85 條,改判準不加閘,當場數的。
版本:待總管定版。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 06:31:45 +00:00
claude-code
bcf7c05a7b
Merge pull request '定版 v0.26.0(雲端第一則 prompt 的主線是現在這條:兩份主線檔都不在時去 Gitea 讀)' ( #144 ) from chore/v0.26.0 into main
v0.26.0
2026-09-07 06:24:01 +00:00
claude-code
e9492e5d7c
定版 v0.26.0(雲端第一則 prompt 的主線是現在這條:兩份主線檔都不在時去 Gitea 讀)
...
總管定版:inkstone/ISEP#140(PR #143)——hooks/lib/mainline.py 第三個來源 fetch_gitea(),
優先序 家目錄 > repo 那份 > Gitea main 那份;匿名優先、被拒才帶 Gitea token;問不到就退回現行行為。
來由:雲端薄殼 SessionStart 跑的時候 InkStoneCo/ 還沒 clone,倒數退到兩週前的舊里程碑(ISEP#140)。
總管在「分支 ⊕ main」重跑:mainline-gitea-fallback 31/31、mainline-repo-mirror 17/17、countdown-guard 20/20、
mainline-focus-guard 24/24、test-ticket-pick 48/48;真形狀(空 state dir、空專案目錄)帶 token 第一行即主線、拔 token rc 0 零檔案。
數字在這棵樹上實數:61 支閘/85 條註冊/7 位工人/7 支命令/2 支 skill/60 支腳本。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 06:23:34 +00:00
claude-code
5b0267112f
Merge pull request '雲端第一則 prompt 的主線是現在這條:兩份主線檔都不在時 refresh 去 Gitea 讀 InkStoneCo main 那份一次(inkstone/ISEP#140)' ( #143 ) from feat/140-mainline-gitea-fallback into main
2026-09-07 06:23:03 +00:00
Leo
48befe8906
雲端第一則 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
2026-09-07 06:19:39 +00:00
claude-code
1c0012107f
Merge pull request '定版 v0.25.0(出貨鏈三站上 main:tag → release → 開場覆核)' ( #142 ) from chore/v0.25.0 into main
v0.25.0
2026-09-07 06:01:14 +00:00
claude-code
56ae38d8d4
定版 v0.25.0(出貨鏈三站上 main:tag → release → 開場覆核)
...
總管定版:inkstone/ISEP#67(PR #141)——release-ship/release-check/hooks/lib/release_chain.py 進 main,
SessionStart 信標第④段開場報「打了 tag 沒 release」;release-ship 前置①改看要送的那個 tag 的樹。
來由:v0.23.0/v0.24.0 只有 tag 沒 release,交給 leo 的測試連結是空頁(ISEP#67 comment 6574)。
總管在「分支 ⊕ main」重跑:test-release-ship 14/14、test-release-check 14/14、信標 33/33、
全套 scripts/test-*.sh 紅的與 main 基線同兩支(make-cloud-env、ticket-api-bypass-guard)、
check-version-consistency ✅ 、claude plugin validate ✅ 。
數字在這棵樹上實數:61 支閘/85 條註冊/7 位工人/7 支命令/2 支 skill/60 支腳本。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 06:00:44 +00:00
claude-code
b4d47e94c9
Merge pull request '出貨鏈三站上 main:tag → release → 開場覆核,release-ship 前置①改看 tag 的樹(inkstone/ISEP#67)' ( #141 ) from feat/67-release-chain-on-main into main
2026-09-07 05:59:40 +00:00
claude-code
fef35ed03a
出貨鏈三站上 main:release-ship 前置①改看 tag 的樹、release-check 可指定版本、信標開場報「打了 tag 沒 release」(inkstone/ISEP#67)
...
- hooks/lib/release_chain.py:問 Gitea 的判準一份三處用(匿名讀,D20)
- scripts/release-ship:前置①比「要建的那個 tag 的樹」裡的 plugin.json,不比工作樹/最新 tag
(總管 09-07 在 v0.23.0 被擋的情境現在放行);note 從 Gitea compare 生,從 plugin 快取跑也行;
覆核改跑 release-check <那個 tag>
- scripts/release-check [vX.Y.Z]:指定版本;v0.19/0.20/0.21 依裁決標「不補」不再黃字;補法印正本絕對路徑
- hooks/lib/beacon_report.py ④:最新 tag 沒 release/main 定版沒打 tag ⇒ 一行缺站+補法;都在安靜;
只快取「都在」6 小時
- 測試:test-release-ship 14、test-release-check 14、信標 26→33;docs:TESTING A37/A38、盤點表、README 60 支腳本、
白名單加 release-ship/release-check 形狀、mistakes 一條
- 沒改 plugin.json 版本號(待總管定版)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_0178ef1fGw3XeZtpN7LaZrm4
2026-09-07 05:52:41 +00:00
Claude
1fa45cd539
Merge remote-tracking branch 'origin/feat/release-ship-the-chain' into feat/67-release-chain-on-main
2026-09-07 05:40:59 +00:00
claude-code
f2ebeb441e
Merge pull request '定版 v0.24.0(雲端對 stage 的寫入有正門)' ( #139 ) from chore/v0.24.0 into main
v0.24.0
2026-09-07 02:36:32 +00:00
claude-code
5bf7d1c729
定版 v0.24.0(雲端對 stage 的寫入有正門)
...
總管定版:inkstone/ISEP#137(PR #138)——`scripts/stage`(secret/api 兩個子命令)
只寫 youlin stage 帳號、值只從環境變數名讀、非 stage 一律拒絕;白名單多五條固定形狀
(含 Arcrun 的 scripts/stage-deploy-artifacts.py,它自己寫死只打 youlin)。
來由:09-07 三條主線工人對 stage 的三種寫入全被雲端 auto mode 分類器擋,
leo:「為什麼會擋你,這就是要修復的問題」。
總管在「分支 ⊕ main」上重跑:test-stage 45/45、test-settings-allow-sync 19/19、版本一致 ✅ 。
數字在這棵樹上實數:61 支閘/85 條註冊/7 位工人/7 支命令/2 支 skill/56 支腳本。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01DTZ9QtvjY7MNxjfQbexAm7
2026-09-07 02:36:12 +00:00
claude-code
06a4dd5b7b
Merge pull request '雲端對 stage 的寫入有正門:scripts/stage(secret/api)只寫 youlin,白名單放固定形狀(inkstone/ISEP#137)' ( #138 ) from feat/137-stage-secret-put into main
2026-09-07 02:35:42 +00:00
Leo
d19bf88503
雲端對 stage 的寫入有正門:scripts/stage(secret/api)只寫 youlin,白名單放固定形狀(inkstone/ISEP#137)
...
09-07 三種寫入在雲端全被 auto mode 分類器擋:npx wrangler secret put、
stage-deploy-artifacts.py --confirm、curl POST 到 arcrun-yuga3bse——
白名單是逐條比前綴,複合指令與任意 curl 永遠對不上;放整類又是紅線。
- scripts/stage secret put|list|delete:直接打 CF API(不經 npx);先 GET /accounts
看這把 token 打得到誰,stage 的 ID 不在裡面就拒絕並印出它打得到誰;URL 永遠只帶
1129efd7…;值只從 --from-env 讀,--value 拒收。
- scripts/stage api <METHOD> <worker>/<path>:curl 打實例,主機只會是
*.arcrun-yuga3bse.workers.dev,別的主機拒絕;標頭與 body 走 stdin 設定檔+管線,
不走 argv;--bearer-env/--header-env/--data-env 從環境變數讀。
- docs/permissions-allow.json:stage 四種形狀+Arcrun 自己那支 stage-deploy-artifacts.py
的相對形狀(它已寫死只認 youlin 帳號 ID、不收 --account/--token,不重造)。
- scripts/test-stage.sh 45 條(假 CF 對 PUT 回 201——第一次實跑 CF 回 201 被講成失敗,
就是這格抓的);test-settings-allow-sync 仍 19/19。
- 真跑:探針種進 youlin arcrun-cypher-executor、CF API 獨立列到、刪掉恢復原狀;
api GET health 200、無 Bearer POST 401、leo21c 主機拒絕零請求。
「帶 Bearer 真寫 KBDB」缺 KBDB_INTERNAL_TOKEN 沒跑(TESTING A36 標明)。
盤點在本樹實數:hooks 61、註冊 85(都沒動)、scripts 56(+stage、+test-stage.sh)。
版本待總管定版。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01DTZ9QtvjY7MNxjfQbexAm7
2026-09-07 02:31:18 +00:00
claude-code
11cef0bec4
Merge pull request '定版 v0.23.0(雲端拿得到票與主線、抓票規則機械可判)' ( #136 ) from chore/v0.23.0 into main
v0.23.0
2026-09-07 01:36:10 +00:00
claude-code
fed7258a30
定版 v0.23.0(雲端拿得到票與主線、抓票規則機械可判)
...
總管定版:主線 inkstone/Arcrun#48 這一輪的 ISEP 交付,兩張票一起進:
• inkstone/ISEP#131(PR #134):ticket pick/claim——雲端工人抓票規則做成純函式,
「s/* 恰好是 {s/todo}」、排除 hub 與 Human,不再靠 prompt 叮嚀
• inkstone/ISEP#130(PR #135):主線檔隨 repo 走(家目錄沒有就讀 system-dev/mainline.json)、
白名單住 ISEP(settings-allow-sync)、isep-notify 走 Bot API、
leo21c-write-guard 讀放寫擋、prod/main 閘認得 youlin 新子網域 arcrun-yuga3bse
兩張 PR 都在「分支 ⊕ main」上由總管重跑:#134 48/48;#135 帶參數的五支閘測試
與 ask-user-question live 全綠,dispatch-format-guard 40/52 是 main 既有現況。
順手同步 marketplace.json 的描述數字(84→85 條註冊、49→54 支腳本),
六個數字在這棵樹上實數:61 支閘/85 條註冊/7 位工人/7 支命令/2 支 skill/54 支腳本。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01DTZ9QtvjY7MNxjfQbexAm7
2026-09-07 01:35:32 +00:00
claude-code
4ba51b7b04
Merge pull request '雲端要拿得到票、主線與通知:白名單住 ISEP、主線檔隨 repo 走、leo21c 讀放寫擋(inkstone/ISEP#130)' ( #135 ) from feat/130-cloud-full-power into main
2026-09-07 01:34:30 +00:00
isep-hand
57219f3321
併 origin/main(#134 ticket pick/claim)解衝突:盤點數字在合併後的樹重數——61 支、85 條、54 支腳本(inkstone/ISEP#130)
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01DTZ9QtvjY7MNxjfQbexAm7
2026-09-07 01:22:33 +00:00
isep-hand
65120a1c65
雲端要拿得到票、主線與通知:白名單住 ISEP、主線檔隨 repo 走、leo21c 讀放寫擋(inkstone/ISEP#130)
...
- docs/permissions-allow.json + scripts/settings-allow-sync:四個 Gitea 正門工具的權限白名單一份,
setup script 裝完 plugin 寫一次、SessionStart 每次再對一次(只加不減、冪等)
- hooks/lib/mainline.py/scripts/mainline:家目錄沒主線就讀 InkStoneCo/system-dev/mainline.json;
set/adopt/clear 兩份一起寫,refresh 只寫家目錄
- hooks/leo21c-write-guard.sh:唯讀 -d(tr/cut/sort…)先剪掉再判、notify_leo trigger 放行
(與 prod-write-guard 同一份白名單)、改法段改印 09-02 起的 youlin 子網域;補第一支測試(26 條)
- prod-write-guard/main-and-prod-push-guard/kbdb-live-exam:認得 youlin 新子網域 arcrun-yuga3bse
- scripts/ticket:收件 repo 寫 inkstone/ISEP 不再 404(org 寫錯當場講)
- scripts/isep-notify:有 TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_ID 先走 Bot API 直送(雲端唯一通的路)
- 測試:A31–A35 共 79 條;README/plugin.json/hooks-inventory 數字實數(61 支、85 條、53 支腳本)
假設(記在這裡等 review):權限規則的形狀沿用 leo 09-07 親手加、實測有效的那四條;
「分類器真的不擋」要雲端一趟 run 的 permission_denials 才驗得到,本 PR 驗不了。
版本:待總管定版(plugin.json 仍 0.22.0)。
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01DTZ9QtvjY7MNxjfQbexAm7
2026-09-07 01:17:15 +00:00
claude-code
b5d501e9b8
Merge pull request 'ticket pick/claim:雲端工人抓票規則機械可判(inkstone/ISEP#131)' ( #134 ) from feat/131-ticket-pick into main
2026-09-07 01:09:16 +00:00
Claude
354480901a
雲端工人抓票規則做成 ticket pick/claim,規則本體是一支純函式(inkstone/ISEP#131)
...
- scripts/ticket 多兩個動詞:pick(給定主線檔回一張可抓的票,主線抓盡才抓逾期里程碑,
不抓 backlog/沒里程碑)與 claim(指派+s/doing+【身份】留言,一個動作;規則在寫入前再驗一次)
- 規則全是 Gitea 欄位:s/* 恰好是 {s/todo}+沒 assignee+沒 Human/human/*+不是 hub+里程碑=主線
· 「恰好」而非「有 s/todo」:09-07 實查 mira#6 同時掛 s/doing+s/todo
· hub 排除:09-07 實查 ISEP#31–35 五張 hub 掛在逾期里程碑、s/todo、沒人,但容器不是任務
- 離開碼分三種:0 有票/1 真的沒有/2 讀不到或沒主線(讀不到 ≠ 沒有)
- scripts/test-ticket-pick.sh 48 條全離線;README/plugin.json 腳本數 49→50 在本樹實數
- 版本號待總管定版(scripts/ticket 會被 plugin 載入)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01DTZ9QtvjY7MNxjfQbexAm7
2026-09-07 01:05:30 +00:00
Claude
49dedbbb15
補上運送鏈缺的兩站:建 release + 回頭覆核(inkstone/ISEP#67)
...
工單的斷點是「沒有任何東西會建 release」——v0.22.0 tag 早推了,
Gitea Releases 頁卻停在 v0.18.0,對 leo 等於這一版不存在。
新增兩支獨立的站(不改任何既有閘,只補送貨鏈缺的那兩段):
- scripts/release-ship(= arcrun-rag 的 release-record 站)
把「已推的 tag」變成「leo 看得到的 release」。三個前置條件「必須在場」才放行:
①版本一致(重用 check-version-consistency.sh,不另立判準)②tag 真的在 Gitea
③release note 有內容(沒給就從 git log 自動生事實清單)。冪等;建完回頭跑
release-check 拿收貨端覆核——送的人說成功不算。
- scripts/release-check(= release-check 站)
回頭問每一段「到了嗎」,而且**問的是收貨端**(Gitea tags/releases、這個 session
載到的 plugin.json),不聽送的人說。現行版本缺 tag 或缺 release ⇒ exit 2 並指名
缺哪一站+怎麼補(工單驗收 4)。判準是結構(定版 commit / tag / release 在不在),
不是關鍵字黑名單。
- 兩支離線測試(RELEASE_*_FIXTURE,不打 Gitea):release-check 9 項、release-ship 7 項全過。
實跑證據:release-ship v0.22.0 已在 Gitea 建起
https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.22.0
release-check 覆核 v0.22.0 tag+release 都在(收貨端事實)。
版本:新增的是 scripts/(非自動載入),本身不需升版;待總管定版隨下一版一起送出。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_012656SLtw96aCxTgScH5bbK
2026-09-05 21:01:29 +00:00
claude-code
605f1fe5a6
Merge PR #127:ship-check 送達 + 版本 0.22.0
...
總管複驗並定版 0.22.0。ship-check 在 plugin 那份逐位元組等同真相源(md5 f565e4df)。
票:inkstone/ISEP#122
v0.22.0
2026-09-02 04:02:23 +00:00
Leo
f1b2ed909f
測試沙盒傳錯參數時,會把整個 tech_projects 複製進暫存區(inkstone/ISEP#122)
...
本輪跑迴歸測試時實撞兩次,兩次都把這台機器的磁碟寫滿:
$ bash hooks/tests/main-and-prod-push-guard.test.sh "$PWD"
REAL="$1" 要的是「那支 hook 的檔案路徑」,我傳了 repo 根目錄
⇒ hook_sandbox 不驗參數,直接 cp -R "$(dirname "$1")"
⇒ dirname 變成 ~/Documents/tech_projects(上一層)
⇒ 整個 tech_projects(所有 repo、所有 worktree)被搬進 mktemp
實測:第一次 13 GB + 10 GB,第二次 23 GB。
磁碟可用 25 GB → 462 MB,cp 一路吐 "No space left on device"。
兩次都是我手動 rm -rf 才回來的(27 GB)。
🔴 而它印出來的只有一句「❌ 沙盒建不起來」——
沒說是參數傳錯,也沒說它已經把磁碟寫滿了。
⇒ 這跟本票在講的是同一句話:**閘/工具給的下一步,沒有人照著打過一次**,
差別只在這次壞的不是逃生門,是「它壞掉時說的話」。
改法(判準是「要求某個東西在場」,不是關鍵字比對):
① $1 要指到一個真的檔案(空字串、目錄、不存在的路徑都不算)
② 它的上一層目錄名要叫 hooks(沙盒的前提就是複製一整個 hooks/)
任一不成立 ⇒ 在 mktemp 之前 return 1,並印出走得通的那一行。
順手補上 docs/TESTING.md 之前沒寫過的一件事:**有五支測試要傳參數**,
而不傳的後果不是報錯是假綠——prod-write-guard.test.sh 的 HOOK="$1" 空掉時
每一條都執行空指令回 0 ⇒「該擋」全變成「實得 pass」,19 條假紅
(傳對參數:通過 37 / 失敗 0)。
測試:hooks/tests/hook-sandbox.test.sh 10 條(A30),通過 10 失敗 0
①③⑤⑥ 驗的是「收手在複製之前」,不是「訊息好不好看」
⑧⑨⑩ 驗正常用法沒被弄壞、複本裡沒混進 hooks/ 以外的東西
既有兩支沙盒測試複驗:
scripts/test-main-and-prod-push-guard.sh 13/13
hooks/tests/main-and-prod-push-guard.test.sh 通過 10 / 失敗 0
hooks/tests/main-and-prod-push-guard-cross-repo.test.sh 通過 19 / 失敗 0
📌 這顆跟 0.22.0 的三件事無關,是本輪路上撞到的。要拆票或丟掉這顆都行,
它獨立於前面兩顆,而且只動 hooks/tests/(沒有任何 hook 的執行行為改變)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-09-02 11:54:50 +08:00