一個 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
This commit is contained in:
isep-hand
2026-09-07 07:13:21 +00:00
parent 13b97027d1
commit 7cacfdcf11
13 changed files with 1039 additions and 27 deletions
+30
View File
@@ -411,3 +411,33 @@ leo 當場:「**這些為什麼不寫到票裡?**」
📌 沒在本票修的同形狀:`not-my-branch-guard.sh``NOT_MY_BRANCH_OK=1 git commit …` 同樣只讀環境變數
(第 28 行),沒實測、沒動——它認的動作是 commit,不是 push_target_dir 那條線的事,另報。
## ⚠️ MISTAKE: 閘教了「開」,「收」只寫在訊息裡——每條線留一份,leo 在 Finder 看到一排分身
票: `inkstone/ISEP#147`
日期: 2026-09-07
症狀: leo 打開 `tech_projects/`,一個 repo 旁邊躺著 `ISEP-wt-122ship``ISEP-wt-117``ISEP-wt115`
`InkStoneCo-wt-112``course_gen-ticket-3-notes``ax-courses-ticket1`…。他原話:
「你會產生大量的同一個頭不同尾巴的 repo,全部拆開就更亂了」「禁止這樣產出一大堆資料夾」。
實查: 那些不是 repo,是 `line-needs-own-worktree.sh`ISEP#10908-29)教工人開的 git worktree。
那支閘比較過「旁邊 vs /tmp」——/tmp 會被系統清掉、登記說謊;旁邊一份都沒掉。
**一份都沒掉,也一份都沒收**:「收工時 `worktree remove`」只寫在閘訊息裡,
沒有任何事件、任何 hook 在線收工那一刻去驗。
原因: 規則在文字裡,不在機器上(同日 ISEP#109 comment 6629 是同一種病的另一面:出路寫在訊息裡,機器讀不到)。
一道閘只管「開」不管「收」,等於把清理交給每一條線的記性——而線收工就消失了,記性跟著消失。
正確做法:
- 分身住 repo **裡面**`<repo>/.worktrees/<票 repo>-<票號>`,走 `.git/info/exclude`):Finder 看不到、
`git status` 看不到、`git worktree list` 找得到。判準是「leo 在 Finder 只看得到一個資料夾」。
- **同一支閘**多掛 PostToolUse `Agent|Task`:從派工單的【工單】認出分身,推了且乾淨就收;
沒推就點名分支與路徑(exit 2),不 force、不刪。教你開的和替你收的是同一件事的兩半,不拆成兩支。
- 「推了沒」只有一份實作(`scripts/worktree`,三態:有/沒有/問不到——問不到不當成沒推,也不收)。
- 現場整理是同一支工具的 `sweep`:預設只列不動,`--apply` 只收已推乾淨的;`--skip` 是操作者點名,不是判準。
- 規約:`docs/governance/worktree-placement.md`
📌 推廣:**一道閘若教人做一件「之後要還」的事(開 worktree、蓋戳記、借共用目錄),
「還」那一步也要長在某個事件上**,不然它必然被留下。收工的事件是 PostToolUse(Agent|Task)
票號就在那裡(`baton-handback-guard.sh``issue-status-autoflip.sh` 都站在同一個位置)。
+1
View File
@@ -5,3 +5,4 @@
- 本 repo 不放 `.env`/任何金鑰真身(D36「金鑰只有一個家」);也不放 `_archive/`
- ISEP 的 wiki 只記 ISEP 自己的事,不複製 InkStoneCo 的 wiki 內容(複製即 forkfork 即漂移)。
- 環境(hookscommandsskillsscripts)與知識(wikidocs)雖然裝在同一個 repo,改動理由不同——環境變更要同步本機+雲端兩份,知識變更只影響這個 repo 自己被讀到什麼。
- 一個 repo 在檔案系統上只有一個資料夾:一條線的分身(git worktree)住 `<repo>/.worktrees/`,禁止在專案目錄旁邊產出 `<repo>-wt-…``<repo>-ticket…` 這類同頭不同尾的資料夾;開用 `scripts/worktree open`、收工 `scripts/worktree close`,忘了收的由 `line-needs-own-worktree.sh`PostToolUse)替你收(規約 `docs/governance/worktree-placement.md`inkstone/ISEP#147)。