diff --git a/docs/TESTING.md b/docs/TESTING.md index 8a34708..8feb7ed 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -208,6 +208,67 @@ bash hooks/tests/prod-write-guard.test.sh hooks/prod-write-guard.sh - 「卡點二」2 條任一紅 ⇒ 「談論它」又被當成「執行它」(同款第八次), 或是剝了內文之後連真的部署都放行了 +### A16 — 一次交貨 = 一份清單(跨 repo 版本組合):21 條 +``` +bash scripts/test-release-manifest.sh +``` +**該看到**:`通過 21 條,失敗 0 條`。全程離線(`RELEASE_MANIFEST_FIXTURE`), +**不打 Gitea、不建任何真的 release**;清單寫在 `mktemp` 的目錄,不碰 repo 裡的 `releases/`。 + +**它在守什麼**(`inkstone/ISEP#84`):一次交貨常常同時動到好幾個 repo, +而「這一版 = 哪幾個 repo 的哪幾版」**沒有任何地方記著** ⇒ 退版只退了其中一個, +剩下的還停在新版 ⇒ **變成一組從來沒測過的組合**。 + +**失敗**: +- ⑨⑩ 紅 ⇒ 驗收 1 沒過:**版本號寫上去就算數**,沒有真的去 Gitea 抓過 + (「寫上去」跟「存在」是兩件事,而清單的用處完全建立在後者) +- ⑱ 紅 ⇒ 驗收 3 沒過:**只退其中一個 repo 沒有被擋下來**,那正是票上那個病 +- ⑯⑰⑲ 任一紅 ⇒ 驗收 2 沒過:退版沒有吐出整份清單的每一格 + (包含「已經在目標版本、不必動」那幾格——列出來才證明沒有一格被漏掉) +- ⑫ 紅 ⇒ 凍結過的清單還能再加東西,「凍結」兩個字就沒有意義了 +- ⑳㉑ 紅 ⇒ 驗收 4 沒過:leo 打開 `INDEX.md` 看不出「我現在手上是哪一版」 + +### A17 — 每次結案都留下估多久/花多久/差多少:23 條 +``` +bash scripts/test-milestone-account.sh +``` +**該看到**:`通過 23 條,失敗 0 條`。全程離線(`MILESTONE_ACCOUNT_FIXTURE` =一份假的 +Gitea 回應表),時鐘用 `MILESTONE_ACCOUNT_NOW` 定住,帳本寫在 `mktemp` 目錄, +**不打 Gitea、不關任何真的 milestone**。 + +**它在守什麼**(`inkstone/ISEP#85`,leo 2026-08-27 說那天「**拖時間**」): +拖了多久、比預計多拖多少、為什麼拖——**沒有任何數字**。偵測器早就有了 +(`mainline-idle-guard.sh`/`factory-idle-guard.sh`),**但沒有人把它算成帳**。 + +**失敗**: +- ①②③④ 任一紅 ⇒ 驗收 1 沒過:三個數字不是自己算出來的 +- ⑤⑥ 紅 ⇒ 驗收 2 沒過:差超過 ±25% 卻能不挑代號就結案 +- ⑧ 紅 ⇒ 代號不再是封閉集合。**能統計的前提是分類有限**,這一格垮了統計就垮了 +- ⑨ 紅 ⇒ **挑一個時間軸撐不住的代號也能過**,等於「採信我自己說的」, + 而票上寫死證據一律從 Gitea 的時間軸取 +- ⑦ 紅 ⇒ **誤攔**:只差 -6% 也逼人挑代號。這比漏擋嚴重——每次結案都被念, + 人就學會繞過去 +- ⑭⑮⑯⑰ 任一紅 ⇒ 驗收 3 沒過:累積之後看不出哪一種原因最常發生 +- ⑱⑲ 紅 ⇒ 驗收 4 沒過:拿已經逾期的里程碑進去算不出數字 + +### A18 — 結案要記帳的那道閘:22 條 +``` +bash hooks/tests/milestone-account-guard.test.sh +``` +**該看到**:`通過 22 條,失敗 0 條`。離線(帳本走 `MILESTONE_ACCOUNT_LEDGER`), +純結構判斷、沒有語意判官,所以每次結果都一樣。 + +**失敗**: +- **A 群任何一條紅 ⇒ 誤攔,這比漏擋嚴重。** ⑥⑦⑧⑪ 特別重要: + `echo` 一段指令、`cat` 這支閘自己、commit 訊息裡提到、把指令寫進文件的 heredoc 內文 + ——**四種都只是「談論它」,不是「執行它」**。這四格是本 repo 撞過很多次的同一個病 + (`strip_heredoc.py` 的檔頭記著兩次真跡) +- ⑨⑩ 紅 ⇒ 走正門 `scripts/milestone-account close` 反而被自己的閘擋下, + 那道閘就等於封死了唯一的出路 +- ⑭⑮⑯⑰⑱ 任一紅 ⇒ 漏擋:換個寫法(`python urllib`、前面串一個無害指令、 + `--request` 長寫法、換一個 repo)就繞過去了 +- ⑲ 紅 ⇒ 訊息沒有點名目標,人看完不知道要對哪一個里程碑動手 +- ⑳㉑ 紅 ⇒ 「記過帳就放行」這個出路是假的,或者一記帳就把所有里程碑全開了 ### A16 — 「總管可以放行」那道門真的打得開:17 條 ``` bash hooks/tests/gate-ok.test.sh @@ -544,6 +605,9 @@ B2(信標那行)/B3(setup 輸出)/B4(閘的訊息)三個畫面 | **A15 pr-verdict --dry-run** | 總管 | ✅(2026-08-28) | | **A14 回覆自己說出拖了多久** | 總管 | ✅ 20/20(2026-08-28,inkstone/ISEP#63) | | **A15 發通知不等於部署** | 總管 | ✅ 37/37(2026-08-28,inkstone/ISEP#63) | +| **A16 跨 repo 版本清單** | 總管 | ✅ 21/21(2026-08-28,inkstone/ISEP#84) | +| **A17 估多久/花多久/差多少** | 總管 | ✅ 23/23(2026-08-28,inkstone/ISEP#85) | +| **A18 結案要記帳的閘** | 總管 | ✅ 22/22(2026-08-28,inkstone/ISEP#85) | | A5 搜尋跨 repo | 總管 | ✅ | | A6 標籤對齊+冪等 | 總管 | ✅ 14 repo,第二次 0/0 | | **A9 人閘警察管路** | 總管 | ✅ 14/14(2026-08-26) |