Skip to content

feat: global config 層 + repo 地圖、residual clause - #314

Merged
kiki830621 merged 1 commit into
mainfrom
idd/repo-map-302-301
Aug 13, 2026
Merged

feat: global config 層 + repo 地圖、residual clause#314
kiki830621 merged 1 commit into
mainfrom
idd/repo-map-302-301

Conversation

@kiki830621

Copy link
Copy Markdown
Member

Refs #302
Refs #301

#302 —— 既有六個機制全是單點解析,看不到 repo 之間的關係。規則說「屬 project 層」時,沒有東西能回答前一個問題:那一層存不存在(「地方政府在不在」)。

地圖自動推導、永不手寫 —— 手寫 registry 會 stale,而 stale 正是病因本身(#301 的案例就是 project 被 extract 成獨立 repo 而沒有任何地方被更新)。掃描器認兩種 config 格式:漏認一種不是「少一筆」,而是「該層不存在」→ 錯誤上收。

#301 —— residual clause 取憲法第 111 條均權制度的形式。執行順序不可調換:先查地圖(判準決定該歸哪一層,地圖決定那一層在不在 —— 這正是本張被 #302 擋住的原因)。上收停在當前 git repo 邊界,跨越要顯式 --repo;仍無法判定則問,不猜。

46/46 suites 綠(新增 idd-repo-map 10 條)。

…ause (#302, #301)

#302 既有的六個機制全是單點解析:解出一個 repo,看不到 repo 之間的關係。所以規則說
「這件事屬 project 層」時,沒有東西能回答前一個問題 —— 那一層存不存在(「地方政府
在不在」)。不存在時就會落到 cwd 碰巧是什麼。

  - ~/.claude/.idd/global.json 作為 global 層(該路徑本來就在 walk-up 路線上;檔名
    必須是 global.json,叫 local.json 會讓 /Users/che 被讀成「一個 repo」)
  - scripts/idd-repo-map.sh 每次從檔案系統重算,永不存成 source of truth ——
    手寫 registry 會 stale,而 stale 正是病因本身(#301 的案例就是 project 被 extract
    成獨立 repo 而沒有任何地方被更新)
  - 掃描器認兩種 config 格式:漏認一種不是「少一筆」,而是「該層不存在」→ 錯誤上收

#301 residual clause 取憲法第 111 條均權制度的形式:只對這個 repo 有意義的歸該 repo、
對整套工具鏈有意義的歸該工具、對整台機器有意義的歸 global。執行順序不可調換 ——
先查地圖確認該層存在(判準決定該歸哪一層,地圖決定那一層在不在,這正是本張被 #302
擋住的原因)。該層不存在則上收,但停在當前 git repo 邊界;跨越要顯式 --repo。
仍無法判定則 AskUserQuestion,不猜 —— 歸錯 repo 的 issue 沒有人會發現。

46/46 suites 綠(新增 idd-repo-map 10 條)。
@kiki830621
kiki830621 merged commit 737dbe0 into main Aug 13, 2026
1 check passed
@kiki830621
kiki830621 deleted the idd/repo-map-302-301 branch August 13, 2026 21:51
kiki830621 added a commit that referenced this pull request Aug 15, 2026
8d0ec33..737dbe0 跑 ensemble 稽核(#295 的 R7 從未被審過,#306#314 的 21 張
issue 完全沒有 ensemble)。4 CRITICAL + 17 HIGH。未被審的那半有一個一致的模式:
**我把文件當成了實作**,而三個「已修好」的東西根本不會執行 —— 它們都通過了我的測試,
因為那些測試驗的是我寫的那塊,從沒驗它與 gh/檔案系統/讀者相接的那道縫。

CRITICAL
- migrate-idd-config.sh 會搬走掃描範圍外的檔案並回報 ✓ migrated(find -print 配
  read -r,含換行的路徑被拆成兩筆,第二筆是相對路徑、對呼叫端 CWD 解析)。改 -print0
  + 拒絕掃描根外的路徑 + prune archive/worktrees + breadcrumb 不覆蓋既有檔。
- 取得層的修法從來沒有運作:gh api --paginate --jq 每頁各吐一個 array,--argjson
  收到非法 JSON → 整個稽核在任何含長 issue 的 repo 上靜默停擺。改 jq -s add,另加
  「補回來變少就拒絕」與 .number 的整數驗型。
- 同一個修法從未落到 /idd-list --audit-closes —— 那才是實際印出 --retroactive 邀請的
  介面。已補上。
- bare_re 的尾錨把帶尾綴的強調標題送進 missing;新增 emph_re,錨點保留(它是散文
  提及不會誤救的原因)。

修法無效者
- #286:gh release upload FILE#TEXT 的 # 是 display label 不是檔名,且更早之前
  upload_name 就是 dead code —— 命名慣例從未被套用。改為 stage 成目標 basename 再上傳,
  並還原 --clobber(拿掉它會讓合法重傳失敗)。
- #293/#305:七個呼叫點的 .[0] 一行沒改,只加了散文警告。精篩與時序檢查已進 code。
- #302:global 層沒有任何 reader,而我寫的理由(「已在 walk-up 路線上,只需多認一個
  檔名」)描述的是一個沒做的改動。reader 已補,其餘 consumer 誠實記為 residue。

不會失敗的測試
- prose-drift 掃描大小寫敏感,而 marker 是大寫;且 positive control 種小寫 —— 控制項
  通過而檢查是瞎的。已改為大小寫不敏感 + canary 用 canonical 大寫。
- 新增 acquisition-truncation suite:用 PATH 上的 gh stub 讓 live-gh 分支真的被執行
  (既有 suite 全被 --json-file 短路,所以整段 19 行刪掉仍 46/46 綠)。acid 5/5 各自
  轉紅;達到這個狀態改了三次斷言,三次都記在檔案裡。

其餘:idd-repo-map 補 sanitiser(它從零重造了隔壁腳本花七輪關掉的 row-forging)、
兩處 callout 被插進 bash fence 內部、marketplace.json 落後五個版本。

47/47 suites 綠(新增 acquisition-truncation 12 條)。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant