@qijenchen/design-system 0.1.0-beta.142 → 0.1.0-beta.144
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/patterns/element-anatomy/item-anatomy.js +1 -1
- package/ds-canonical/fork/consumer/lock.json +4 -4
- package/ds-canonical/fork/governance.lock +1 -1
- package/ds-canonical/fork/manifest.json +9 -9
- package/ds-canonical/rules/meta-patterns.md +1 -1
- package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +26 -20
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { cva } from "class-variance-authority";
|
|
4
|
-
import {
|
|
4
|
+
import { lineClampClass, cn } from "../../lib/utils.js";
|
|
5
5
|
import { Avatar } from "../../components/Avatar/avatar.js";
|
|
6
6
|
import { Tooltip, TooltipTrigger, TooltipContent } from "../../components/Tooltip/tooltip.js";
|
|
7
7
|
import { useTruncated } from "../../hooks/use-truncated.js";
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"schemaVersion": 1,
|
|
4
4
|
"role": "template-consumer",
|
|
5
5
|
"release": {
|
|
6
|
-
"designSystem": "0.1.0-beta.
|
|
7
|
-
"storybookConfig": "0.1.0-beta.
|
|
6
|
+
"designSystem": "0.1.0-beta.144",
|
|
7
|
+
"storybookConfig": "0.1.0-beta.144"
|
|
8
8
|
},
|
|
9
9
|
"upgradeTrust": {
|
|
10
10
|
"schemaVersion": 1,
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
"implementationSha256": "98b74118fb5b410b77ad2994aa9105fa7609c7353822f8c5213cce54d94f0af4"
|
|
43
43
|
},
|
|
44
44
|
"payload": {
|
|
45
|
-
"forkCorpusLockSha256": "
|
|
45
|
+
"forkCorpusLockSha256": "2e22fb249ca4cfa900fb24980c3a20cb1c2dd6b7634ec42ed0377ab3e70f833f",
|
|
46
46
|
"discoveryPolicySha256": "fba289aeeb5a3f11139b9589f7ab08b5e8c8799c7bdf8f0ea57ebfeb8e7c9da6",
|
|
47
47
|
"providerMaterializersSha256": "732e85b01a12e7dd19469e26e4427f0e0cfe5117a78fc9f69c2f0f89702f463a",
|
|
48
|
-
"providerLifecycleSha256": "
|
|
48
|
+
"providerLifecycleSha256": "f5a23ab9661904222635b2ab9f1c73e66b273ac571a83d771a4821b4cb6673b1",
|
|
49
49
|
"providerInventorySha256": "00adf1c4f6b3367055a9cc3fdfe658660771b4c9931f696e12761a95076ad92c",
|
|
50
50
|
"executionRuntimeSha256": "d9377cc45308731f287d7b1711b7c38fc4e02ff8f84729bcbbf01bb52d136904",
|
|
51
51
|
"commonInstructionSha256": "e730127bff1820a035b11c3b3119e7354975d7e9c8c69d7e8b1adfe307c53ecc",
|
|
@@ -919,7 +919,7 @@
|
|
|
919
919
|
{
|
|
920
920
|
"schemaVersion": 1,
|
|
921
921
|
"file": "manifest.json",
|
|
922
|
-
"sha256": "
|
|
922
|
+
"sha256": "1e1928d33a7ef48ae625d1414da7e51ff2c0f8fa70bc0f87d69b053c2a26c4b0",
|
|
923
923
|
"source": null,
|
|
924
924
|
"classification": null,
|
|
925
925
|
"destination": null
|
|
@@ -104,20 +104,20 @@
|
|
|
104
104
|
},
|
|
105
105
|
"providerLifecycle": {
|
|
106
106
|
"schemaVersion": 4,
|
|
107
|
-
"releaseVersion": "0.1.0-beta.
|
|
107
|
+
"releaseVersion": "0.1.0-beta.144",
|
|
108
108
|
"immutableHead": {
|
|
109
109
|
"providerInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
|
|
110
|
-
"releaseVersion": "0.1.0-beta.
|
|
111
|
-
"snapshotSha256": "
|
|
110
|
+
"releaseVersion": "0.1.0-beta.143",
|
|
111
|
+
"snapshotSha256": "308a306e6c2914e54b750cd5c63f3e8bfd647e5655aaebb8446b8ce4ad6c257e"
|
|
112
112
|
},
|
|
113
|
-
"ledgerSha256": "
|
|
114
|
-
"previousSnapshotSha256": "
|
|
115
|
-
"currentSnapshotSha256": "
|
|
113
|
+
"ledgerSha256": "c3a4e53a50b91d9d0ebcd6a7bed1314b86925057466e8254a9c154455950184d",
|
|
114
|
+
"previousSnapshotSha256": "308a306e6c2914e54b750cd5c63f3e8bfd647e5655aaebb8446b8ce4ad6c257e",
|
|
115
|
+
"currentSnapshotSha256": "073ca2de0f49bb62353b6549fe5e3a8d3450505fae46cfe8d328c2ff9315726b",
|
|
116
116
|
"currentProviderInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
|
|
117
117
|
"retiredProviders": [],
|
|
118
118
|
"currentSnapshot": {
|
|
119
|
-
"releaseVersion": "0.1.0-beta.
|
|
120
|
-
"previousSnapshotSha256": "
|
|
119
|
+
"releaseVersion": "0.1.0-beta.144",
|
|
120
|
+
"previousSnapshotSha256": "308a306e6c2914e54b750cd5c63f3e8bfd647e5655aaebb8446b8ce4ad6c257e",
|
|
121
121
|
"providers": [
|
|
122
122
|
{
|
|
123
123
|
"id": "claude",
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
"retiredProviders": []
|
|
194
194
|
},
|
|
195
195
|
"immutableHeadSnapshot": {
|
|
196
|
-
"releaseVersion": "0.1.0-beta.
|
|
196
|
+
"releaseVersion": "0.1.0-beta.143",
|
|
197
197
|
"previousSnapshotSha256": "63e26cddf08fa7fa1b8cca9047288d8a348605518c22b55e1734f7dd3962fff9",
|
|
198
198
|
"providers": [
|
|
199
199
|
{
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
|
|
78
78
|
<!-- M35 retired 2026-05-22(per /knowledge-prune deep audit Lens 1+2):folded into M23(d) as sub-rule「Nearest same-purpose canonical wins」。Original verdict(codex 2026-05-20「Cite 存在 ≠ consume 落實」)+ Triple test + registry SSOT + hook R8 retained at M23(d)。Single-bug rule + same-class「優先消費既有」與 M23 合併。 -->
|
|
79
79
|
|
|
80
|
-
| **M37** | **禁以「當下剛好成立的觀察量」代替要保證的性質(identity substitution)**(2026-09-20 立,一天內同根因發作 7 次)。任何旗標/欄位/名稱/時間,若它**不是**那個性質本身、只是當時剛好跟它一起成立,就是代理;代理會在**寫的當下看起來完全正確**,然後在條件變了以後靜默失效 —— 而且通常**零報錯**。**三問**(寫任何判斷式、閘、契約前):(1) 我要保證的性質**逐字**是什麼?(2) 我實際拿來判斷的是**哪個值**?(3) 兩者何時會分開?想得出任何一種情境,就是代理,換成直接量那個性質。**第八個形狀(2026-09-20,main 因此紅一次):「沒觀察到」被當成「沒發生」**——量測拿到 `NaN`/空集合/零筆,代表的是「這次沒看到」,不是「那件事沒發生」。錨例:列 hover 閘把 `lost = 樣本數 − 量到的樣本數`,於是截圖串流停送幀 1461ms(門檻 1500ms)那三次被當成「產品沒變色」而指控產品 —— 同一份內容在分支上剛跑綠、前 11 次 CI 全綠。程式其實**已經算出** hover 之後到達的幀數,只拿去印 debug、沒參與判定;而閘的檔頭還寫著「lost 與串流間隔無關」——**那是註解裡的斷言,程式沒有任何地方在執行它**。判準:任何「沒量到」的樣本,判定前先問「這段時間儀器**有沒有能力看到**」;看得到卻沒發生 → 真訊號;看不到 → 不得指控被測物,但也**不准默默放行**,可用樣本不足時要以**儀器失效**的名義紅(`scripts/lib/hover-latency-policy.mjs`,判定表用真實 CI 數字 + 「拿掉全盲資訊就重現誤紅」的對照組)。**七個同日錨例**:①「user 同意發這份工作」寫成綁 commit SHA → 發版必然產生新 commit,user 被迫為同一份工作講六次「發版」;②「必過 check」綁 check 名字;③「出處可信」綁 job 名;④「這道閘存在」= 檔案存在(沒有任何執行面呼叫它);⑤ 自家 helper 回 `{ok,…}` 卻讀 `.status`(`undefined !== 0` 恆真);⑥「畫面已渲染」= 過了 900 毫秒(慢的 runner 上假紅,還指控一個不存在的問題);⑦「已派工」被當成「已處理完」—— 而派工的目的正是讓分支**稍後**出現,於是正確路徑被自己鎖死,空轉到逾時。**⑦ 的特徵值得單獨記**:兩件事的**時間順序相反**時,共用旗標必然鎖死後發生的那件。**驗法**:判斷式抽成純函式 + 判定表,但**必須連「那個值是誰算的」一起測**(M32 的參數邊界盲點),而且測**序列**不只測靜態幾格 —— ⑦ 只在「派工之後分支才出現」這個順序上發作。呼叫端必須真的消費那支純函式,否則是兩份平行實作。**第九個形狀(2026-09-21):把「今天幾號」當成被驗的性質 —— 測試的顏色取決於日曆**。`test-verify-deep-audit-coverage.mjs` 的 fixture 寫死一張 2026-07-20 簽發、**2026-08-20 到期**的能力憑證,而 16 個呼叫裡有 15 個沒傳 `now`,用的是真實時間。8/20 一過 → 憑證過期 → 選不出 peer → 「peer runtime surface must be explicit」那道閘**結構上不可能觸發** → 測試紅。它紅在 8/20,而治理 harness runner 從 **8/11** 起就被另一件事擋住(一支測試自己用 `new Function`+`--eval` 違反來源政策,整個 runner 因此 blocked),夜間 lane 連續 **41 晚**全紅 —— 沒有人看見。**這條鏈是本 M-rule 的完整標本**:代理(憑證有效 ↔ 今天幾號)造出定時紅燈,另一個代理(閘存在 ↔ 有人跑)讓紅燈沒有觀眾。判準:**任何 fixture 的時間窗必須相對於「現在」推導**(`certifiedAt = now − 1d` / `expiresAt = now + 30d`),寫死日期即是定時炸彈;而且窗與時鐘的關係要有一行 assert 守著,免得反向腐爛。**第十種形狀(2026-09-21
|
|
80
|
+
| **M37** | **禁以「當下剛好成立的觀察量」代替要保證的性質(identity substitution)**(2026-09-20 立,一天內同根因發作 7 次)。任何旗標/欄位/名稱/時間,若它**不是**那個性質本身、只是當時剛好跟它一起成立,就是代理;代理會在**寫的當下看起來完全正確**,然後在條件變了以後靜默失效 —— 而且通常**零報錯**。**三問**(寫任何判斷式、閘、契約前):(1) 我要保證的性質**逐字**是什麼?(2) 我實際拿來判斷的是**哪個值**?(3) 兩者何時會分開?想得出任何一種情境,就是代理,換成直接量那個性質。**第八個形狀(2026-09-20,main 因此紅一次):「沒觀察到」被當成「沒發生」**——量測拿到 `NaN`/空集合/零筆,代表的是「這次沒看到」,不是「那件事沒發生」。錨例:列 hover 閘把 `lost = 樣本數 − 量到的樣本數`,於是截圖串流停送幀 1461ms(門檻 1500ms)那三次被當成「產品沒變色」而指控產品 —— 同一份內容在分支上剛跑綠、前 11 次 CI 全綠。程式其實**已經算出** hover 之後到達的幀數,只拿去印 debug、沒參與判定;而閘的檔頭還寫著「lost 與串流間隔無關」——**那是註解裡的斷言,程式沒有任何地方在執行它**。判準:任何「沒量到」的樣本,判定前先問「這段時間儀器**有沒有能力看到**」;看得到卻沒發生 → 真訊號;看不到 → 不得指控被測物,但也**不准默默放行**,可用樣本不足時要以**儀器失效**的名義紅(`scripts/lib/hover-latency-policy.mjs`,判定表用真實 CI 數字 + 「拿掉全盲資訊就重現誤紅」的對照組)。**七個同日錨例**:①「user 同意發這份工作」寫成綁 commit SHA → 發版必然產生新 commit,user 被迫為同一份工作講六次「發版」;②「必過 check」綁 check 名字;③「出處可信」綁 job 名;④「這道閘存在」= 檔案存在(沒有任何執行面呼叫它);⑤ 自家 helper 回 `{ok,…}` 卻讀 `.status`(`undefined !== 0` 恆真);⑥「畫面已渲染」= 過了 900 毫秒(慢的 runner 上假紅,還指控一個不存在的問題);⑦「已派工」被當成「已處理完」—— 而派工的目的正是讓分支**稍後**出現,於是正確路徑被自己鎖死,空轉到逾時。**⑦ 的特徵值得單獨記**:兩件事的**時間順序相反**時,共用旗標必然鎖死後發生的那件。**驗法**:判斷式抽成純函式 + 判定表,但**必須連「那個值是誰算的」一起測**(M32 的參數邊界盲點),而且測**序列**不只測靜態幾格 —— ⑦ 只在「派工之後分支才出現」這個順序上發作。呼叫端必須真的消費那支純函式,否則是兩份平行實作。**第九個形狀(2026-09-21):把「今天幾號」當成被驗的性質 —— 測試的顏色取決於日曆**。`test-verify-deep-audit-coverage.mjs` 的 fixture 寫死一張 2026-07-20 簽發、**2026-08-20 到期**的能力憑證,而 16 個呼叫裡有 15 個沒傳 `now`,用的是真實時間。8/20 一過 → 憑證過期 → 選不出 peer → 「peer runtime surface must be explicit」那道閘**結構上不可能觸發** → 測試紅。它紅在 8/20,而治理 harness runner 從 **8/11** 起就被另一件事擋住(一支測試自己用 `new Function`+`--eval` 違反來源政策,整個 runner 因此 blocked),夜間 lane 連續 **41 晚**全紅 —— 沒有人看見。**這條鏈是本 M-rule 的完整標本**:代理(憑證有效 ↔ 今天幾號)造出定時紅燈,另一個代理(閘存在 ↔ 有人跑)讓紅燈沒有觀眾。判準:**任何 fixture 的時間窗必須相對於「現在」推導**(`certifiedAt = now − 1d` / `expiresAt = now + 30d`),寫死日期即是定時炸彈;而且窗與時鐘的關係要有一行 assert 守著,免得反向腐爛。**第十種形狀(2026-09-21 → 22,一次「發版」裡 11 個位置)**:**發布鏈上「這個名字/這筆記錄存在」被當成「那件事真的發生了」** —— 版號字串有 release ↔ 內容已發布 / 有 MERGED 的 PR ↔ 這個 head 在 main 上 / tag 名 ↔ commit 裡的版號 / 所有 check-run ↔ 守護 main 的 CI / 帳本有一行 ↔ 授權消耗 / 最新 tag ↔ 線上那一份 / 必過項沒紅 ↔ CI 會有結果(PR 衝突時永不觸發)/ 沒失敗 ↔ 過了(逾時是 `cancelled`)/ 帳本最後一筆 ↔ 上一個已發布版(鏈斷,consumer 裝不上)/ incident 授權只接 publish ↔ 也能 merge / **線上最新已發布版 ↔ consumer 手上那一版(為防前一條而加的閘自己犯同一條,擋掉正確修復)**。**第 2 個以後幾乎都是在修前一個的那次跑裡才現形**(M10),代價是兩個報廢版號、零位元組產品變動。11 格對照表 + 量具上同根的四次(含視覺回歸週跑連紅六週沒人看、紅的是 runner 字型不是產品) + 四個遞移教訓(修同族要當場列完同族;fixture 缺欄位 = 判定表測不到要測的事;同一個 unknown 在不同用途走相反方向;**閘寫完立刻問「我用的值在它要防的那種事故裡還成立嗎」**)→ `skills/design-system-audit/references/historical-bugs.md`「M37 第十種形狀」。同日一併抓到的同族:87 支 checker gate 有 **41 支沒有 meta-test**(沒人證明過它們會紅),而唯一會講出這件事的 `audit-gate-meta-test-coverage.mjs` **自己也沒有任何執行面呼叫它**;`check:bundle-size`(2026-07-14 起)與 `check:naming-structure`(2026-08-05 起)同病 —— 前者讓兩個月的體積成長全沒被擋,後者因一個空的編輯器暫存目錄假紅一個多月。 | 2026-09-20 一日七犯:consent↔commit / required check↔名字 / provenance↔job 名 / 閘存在↔檔案存在 / 回傳形狀假設 / 已渲染↔900ms / 已派工↔已處理(全部有 commit + 兩面對照組 receipt) |
|
|
81
81
|
|
|
82
82
|
## 判斷 meta-principle 是否漏寫的 test
|
|
83
83
|
|
|
@@ -307,11 +307,11 @@ repo 根的治理 bootstrap 檔,其 root→cwd 合併鏈超過預設 32KiB 上
|
|
|
307
307
|
|
|
308
308
|
| `file://` 開 storybook = story 整個不渲染而且不報錯 | CORS 擋掉模組載入,`#storybook-root` 子節點 0、畫面空白,探針卻拿得到 Storybook 自己的 UI(「Set string」按鈕)而誤以為有渲染。瀏覽器閘一律起本機靜態站。同場:CSSOM 對含 `var()` 的簡寫回**空字串**,用 `r.style.outline` 掃規則會全空,要用 `r.cssText`(2026-09-08)|
|
|
309
309
|
|
|
310
|
+
## M37 第十種形狀:發布鏈上「這個名字/這筆記錄存在」被當成「那件事真的發生了」(2026-09-21 → 22,一次「發版」裡 **11 個位置**)
|
|
310
311
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
六個位置的共同形狀:拿一個**名字或一筆記錄**當成它所指的那件事。
|
|
312
|
+
使用者說一次「發版」,我以為是一步。實際上同一條規則在發布鏈上連續發作 11 次,
|
|
313
|
+
每一次長得都不一樣,而且**第 2 個以後幾乎都是在修前一個的那次跑裡才現形**(M10:修同族要當場列完同族)。
|
|
314
|
+
共同形狀:拿一個**名字、一筆記錄、或一個當下剛好成立的觀察量**,當成它所指的那件事。
|
|
315
315
|
|
|
316
316
|
| # | 要保證的性質 | 實際量到的值 | 何時分開 | 後果 |
|
|
317
317
|
|---|---|---|---|---|
|
|
@@ -321,19 +321,25 @@ repo 根的治理 bootstrap 檔,其 root→cwd 合併鏈超過預設 32KiB 上
|
|
|
321
321
|
| 4 | 守護 main 的 CI 通過了 | 那個 commit 上**所有** check-run | 發布流程自己失敗過一次 | main 看起來永久紅 → 自鎖;且指控「main CI 紅了」而 main CI 其實是 success |
|
|
322
322
|
| 5 | 這份發版授權被消耗掉了 | 帳本裡有一行 | 發布被中斷/失敗 | 一次失敗的嘗試燒掉授權,使用者被迫再說一次「發版」 |
|
|
323
323
|
| 6 | 要比的基準是線上目前那一份 | 最新的 tag | 建了 tag 但沒發成 | 拿從來沒出貨的東西當基準,印出與事實相反的「會不會改變畫面」 |
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
(
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
1
|
|
332
|
-
|
|
333
|
-
2.
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
3.
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
324
|
+
| 7 | 這個 head 的 CI 會有結果 | 必過項清單裡還沒有紅的 | PR 與 main 衝突(squash 分岔)→ GitHub 建不出合併 ref,**CI 一次都不觸發** | runner 每兩秒重試,結構上永不收斂,空轉十幾分鐘 |
|
|
325
|
+
| 8 | 那一輪 CI 過了 | 那一輪沒有失敗 | job 撞到 timeout-minutes → GitHub 回 `cancelled` | 「沒有裁決」被講成「main 壞了,先修 main」;報告端另寫一份較窄的紅燈條件,連名稱都篩不出來 |
|
|
326
|
+
| 9 | 這一版的鏈接得上前一版 | provider lifecycle 帳本最後一筆 | bump 了卻沒發成(beta.141) | beta.142 宣告前一版是從沒發布的 141 → WM 升級交易 GOV-UPGRADE-007,**發出去卻沒人裝得上** |
|
|
327
|
+
| 10 | incident release 可以發 | 授權只接在 publish | 要救火時 merge 先擋 | 「這份同意已經用在 beta.142 上了」→ 救火反而得再要一次同意 |
|
|
328
|
+
| 11 | 這一版的鏈接得上 consumer 手上那一版 | 線上**最新已發布**的版本 | 發布了卻沒人裝得上(正是 #9) | **為了防 #9 而加的閘,自己用同一種方式犯錯,擋掉正確的修復** |
|
|
329
|
+
|
|
330
|
+
同一天、同一條規則,還在**量具**上發作四次(它們不在發布鏈上,但同根):
|
|
331
|
+
- `data-table-scroll-cost` 的 1px 段用「過了 2 個 rAF」當「已達穩態」、「窗口總數」當「捲動成本」,慢的 runner 上假紅 154.1(**9/18 出現過同一個數字**);而 9/18 加的「超標再跑一次開追蹤」診斷從沒產出過線索 —— 暫態等到再跑一次時早就過去了。改成等每幀增量連續 3 幀相同 + 捲動窗口減不捲動窗口,三面對照組(掛載暫態 / 捲動引發的真回歸 / 與捲動無關的背景噪音)。
|
|
332
|
+
- `release-workflow.test.mjs` 把「最新兩個 tag」當「9/20 量過的那一對」,多了一個 tag 就在零改動下變紅;本機沒 fetch 到新 tag 所以綠、CI 抓 tag 所以紅。改成指名那一對,找不到以儀器失效的名義紅。
|
|
333
|
+
- **視覺回歸週跑連紅六週沒人看見,而紅的不是產品**(2026-09-22):curated baseline 是 7/28 在 runner 映像 20260720.247.2 拍的;8/5 最後一次綠,8/12 起 runner 映像每週更新(20260810.271.1 → 20260907.300.1),Playwright 鎖定 1.59.1 兩邊相同,25 張「超標」的差異圖**全是字緣、零區塊變動** —— 「截圖等於 baseline」被當成「產品沒變」,渲染器一浮動兩者就分開。而且它只排程、不進 PR,所以六週紅燈沒有觀眾。本機更不可比(macOS 字型 vs Linux;沙箱又擋 picsum / pravatar,圖片型場景直接 68%)。修:視覺 job 釘到 `mcr.microsoft.com/playwright:v<lock 版本>-noble` 容器(scope test 斷言 tag 等於 lock),`release:status` / `release:auto` 印出最新週跑結論(只講不擋),重拍 baseline 走 `workflow_dispatch` 的 `update_baseline` 輸入 → artifact → PR(接受新圖是產品語意決策,要拍板)。判準:**任何 pixel 比對閘,先問渲染器是誰、有沒有釘死**;跨主機/跨映像的比對無效(M32(h) 同族)。
|
|
334
|
+
- 我自己掛的監看:`release:status --json` 的 stdout 被一行人話診斷汙染成不可解析,python 失敗被 `|| true` 吞掉,30 分鐘零事件 —— 而零事件看起來跟「沒有變化」一模一樣。診斷改走 stderr;監看解析不出來時明講「監看壞了,不是沒有變化」。
|
|
335
|
+
|
|
336
|
+
**不可逆的代價**:#3 建出來的 `v0.1.0-beta.141` tag 受 GitHub ruleset 保護(`DELETE` 回 422),
|
|
337
|
+
不能刪也**不該繞**,永久指向錯的 commit,該版號報廢。#9 讓 `v0.1.0-beta.142` 發出去卻只有一半的
|
|
338
|
+
consumer 裝得上,由 beta.143 以 incident release 取代(帳本尾端改成 `139 → 140 → 143`,
|
|
339
|
+
丟掉的兩筆描述的是**沒有任何 consumer 到達過**的狀態)。**兩個版號,零位元組產品變動。**
|
|
340
|
+
|
|
341
|
+
**四個遞移教訓**:
|
|
342
|
+
1. **修同族缺陷要當場列完同族**(M10)。第 1 個修完就去發版,第 2–6 個當場現形;第 7–11 個是修 2–6 的過程中再現形。它們本來就在同一條鏈上,只是沒去看。
|
|
343
|
+
2. **fixture 缺欄位 = 判定表測不到要測的事**。四支測試失敗全是 fixture 沒給 `headSha` / `tagCommitSha` / `protectedMainSha` / `versionAtReleaseCommit` —— 缺欄位讓 fixture 同時也代表假綠狀態,那一格於是永遠綠。
|
|
344
|
+
3. **同一個 unknown 在不同用途要走相反方向**。同一支三值判定 `classifyReleaseLookup`,在「授權消耗掉了嗎」要把 `null` 算成**已消耗**(不讓一份授權發兩次),在「基準是哪一版」只有 `true` 能用(讀不到不得充當已發布)。兩邊都要寫下來,各有對照組。
|
|
345
|
+
4. **為了防某條而加的閘,自己會用同一條犯錯**(#11)。閘寫完立刻用它自己的三問再問一次:「我拿來判斷的這個值,在**它要防的那種事故裡**還成立嗎?」#11 用「線上最新已發布版」當基準,而它要防的事故正是「發布了卻沒人裝得上」——基準本身就是壞的。
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"type": "git",
|
|
5
5
|
"url": "git+https://github.com/ajenchen/design-system.git"
|
|
6
6
|
},
|
|
7
|
-
"version": "0.1.0-beta.
|
|
7
|
+
"version": "0.1.0-beta.144",
|
|
8
8
|
"private": false,
|
|
9
9
|
"description": "World-class design system — components, patterns, tokens, hooks (single source of truth for team distribution).",
|
|
10
10
|
"type": "module",
|