feat(sprint): T-loop1d 今晚任務——雲端做 Arcrun#3 控制台頁(第二次壓測,跨多repo)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
uncle6me-web
2026-07-02 16:46:52 +08:00
parent 2a51d67da0
commit 31d4a9c47b
4 changed files with 90 additions and 2 deletions
+32
View File
@@ -445,6 +445,36 @@ array-of-tables`[[x]]`)不用 inline array。改 toml 後用 `wrangler --dr
---
## 22. 零件退役只改一處 → 殘留誤導下個 CC;硬塞 canonical_id 是假綠(2026-06-28issue #13
**背景**issue #13 收尾零件降級遺留。降級/退役某零件(telegram/gmail/sheets/line 等
從「內建零件」改成「走 recipe」、ai_transform_compile/run 直接刪)時,**AI 搜尋零件的來源不只一個**,
只改一處 → 別處殘留會讓下個 CC(或 Haiku 操盤手)誤判「這零件還在/還能用」。
**錯誤模式 A(殘留誤導)**:以為「示例 yaml 改完就退役乾淨了」。實際 AI 找零件有**三個源**,
退役要三個一起清,否則殘留=錯誤環境信號(同 [[死代碼是錯誤環境信號]] 精神):
1. **示例 yaml**`component: telegram` 之類)— 步驟1 已改成 recipe canonical_id`telegram_send`)。
2. **`cli/src/commands/parts.ts` 硬編碼清單** — 步驟2 已清(telegram/gmail/sheets/line 改 recipe canonical_id、
移除已刪的 ai_transform_compile/run)。**parts.ts 是手寫常駐清單,必然 stale** → 退役 SOP 要把它列進「必清的源」。
3. **offline validate**(第三個污染源)— **這個是設計不是殘留**offline validate 刻意跳過遠端查零件
(不連網就能驗),所以它「不檢查零件存不存在」是 by design,留 issue 不當 bug 修。
**錯誤模式 B(硬塞 canonical_id =假綠)**gmail **讀取**`fetch_unread` / `action: list`
**沒有對應 recipe**,把它硬指成 `gmail_send`(寄信 recipe)=張冠李戴的假綠(mindset §7)。
正解:**留 TODO 待 seed 補 `gmail_list` recipe**,不硬塞一個語意不符的 canonical_id 充數。
「有個 canonical_id 可填」≠「這個 canonical_id 對」。
**正確做法**
- 退役零件 → **同步清三源**(示例 / parts.ts / 任何硬編碼清單),別只改一處宣布完成。
- 沒對應 recipe 時 → 誠實留 TODO + 發 issue 補 seed**不硬塞語意不符的 id**。
- 退役 SOP([[死代碼是錯誤環境信號]] 的姊妹)寫進流程:清殘留 = 清「AI 搜尋零件的所有源」,不只宣告。
**通用教訓**:「改完一處=退役完成」是錯覺;常駐硬編碼清單(parts.ts)必 stale,是退役必查項。
連帶:這跟 #19「死端點假綠」、#15「假設 v3 route 還在」同類——**陳述「退役/遷移完成」前問「所有引用源都掃過了嗎」**。
日期:2026-06-28。
---
## 快速檢查清單(做新功能前)
- [ ] 這是工作流還是零件?問「有必要嗎?」
@@ -461,3 +491,5 @@ array-of-tables`[[x]]`)不用 inline array。改 toml 後用 `wrangler --dr
- [ ] 新增/改薄殼工具?grep 確認它打的 server route 真的存在,別假綠(#19);宣稱對齊前跑 thin-shell-smoke.sh
- [ ] 想用 git log 查某檔歷史?先 git check-ignore——gitignored 檔無 git 史,時間靠檔內註記(#20
- [ ] 改 wrangler.toml service binding?用 [[services]] 不用 inline services=[...][vars] 後會被吸走);改完 wrangler --dry-run 驗 binding 真在(#21
- [ ] 退役/降級某零件?同步清「AI 搜尋零件的三個源」=示例 yaml + parts.ts 硬編碼清單 + validate 跳過是設計);別只改一處宣布完成(#22
- [ ] 沒對應 recipe?誠實留 TODO + 發 issue 補 seed,別硬塞語意不符的 canonical_id 充數(假綠,#22