@qijenchen/design-system 0.1.0-beta.109 → 0.1.0-beta.110

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.
@@ -3,8 +3,8 @@
3
3
  "schemaVersion": 1,
4
4
  "role": "template-consumer",
5
5
  "release": {
6
- "designSystem": "0.1.0-beta.109",
7
- "storybookConfig": "0.1.0-beta.109"
6
+ "designSystem": "0.1.0-beta.110",
7
+ "storybookConfig": "0.1.0-beta.110"
8
8
  },
9
9
  "upgradeTrust": {
10
10
  "schemaVersion": 1,
@@ -42,10 +42,10 @@
42
42
  "implementationSha256": "98b74118fb5b410b77ad2994aa9105fa7609c7353822f8c5213cce54d94f0af4"
43
43
  },
44
44
  "payload": {
45
- "forkCorpusLockSha256": "b6403cfdaa29b7d8ac37b53cb12bbcd3b23e1f8adf841074281a1b2fefa97f46",
45
+ "forkCorpusLockSha256": "aedc7698f22b0762f672bcc7abd005e7ae3e7fa5b74ea659317743504597a634",
46
46
  "discoveryPolicySha256": "fba289aeeb5a3f11139b9589f7ab08b5e8c8799c7bdf8f0ea57ebfeb8e7c9da6",
47
47
  "providerMaterializersSha256": "732e85b01a12e7dd19469e26e4427f0e0cfe5117a78fc9f69c2f0f89702f463a",
48
- "providerLifecycleSha256": "e60509c54023d8afc0a877b0a4a63a870fc1681a83e6743141e3c032a13e13b0",
48
+ "providerLifecycleSha256": "12d735f89b49b79afdb9580d8dc5e79296aa7d3ca27db9f0639805492c8b94b6",
49
49
  "providerInventorySha256": "00adf1c4f6b3367055a9cc3fdfe658660771b4c9931f696e12761a95076ad92c",
50
50
  "executionRuntimeSha256": "d9377cc45308731f287d7b1711b7c38fc4e02ff8f84729bcbbf01bb52d136904",
51
51
  "commonInstructionSha256": "6b9aa8747d9ddc9bd9a78de88a0c3d65f5b100ea917c4dd69be4d889b8299438",
@@ -919,7 +919,7 @@
919
919
  {
920
920
  "schemaVersion": 1,
921
921
  "file": "manifest.json",
922
- "sha256": "2e8df762e5de2edab1b1fd0bf2203d6a8a0935ebb82bc37b2d81543c59b493c7",
922
+ "sha256": "ead54445e3f603b23077854a2cc030c75cf64d23393a47f7275f1e63613df8e8",
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.109",
107
+ "releaseVersion": "0.1.0-beta.110",
108
108
  "immutableHead": {
109
109
  "providerInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
110
- "releaseVersion": "0.1.0-beta.108",
111
- "snapshotSha256": "f00be4d7d86479e34e595d5e6e224b6fa34176303b92fa083eeada9d6ac87a26"
110
+ "releaseVersion": "0.1.0-beta.109",
111
+ "snapshotSha256": "172fb0f27392b68d6399c5f658cde49e51446f1a9e0094fb359fcf306c3ef161"
112
112
  },
113
- "ledgerSha256": "8a52efbe2f78c04b32fbd7e90ca1a164499bf4e143467ac3a051b0f0cc869e7e",
114
- "previousSnapshotSha256": "f00be4d7d86479e34e595d5e6e224b6fa34176303b92fa083eeada9d6ac87a26",
115
- "currentSnapshotSha256": "172fb0f27392b68d6399c5f658cde49e51446f1a9e0094fb359fcf306c3ef161",
113
+ "ledgerSha256": "b99b6c6424f880a417446b8e1f08324b60e806fcb05104791d253d115afbb9da",
114
+ "previousSnapshotSha256": "172fb0f27392b68d6399c5f658cde49e51446f1a9e0094fb359fcf306c3ef161",
115
+ "currentSnapshotSha256": "b11dad6b99dbfcdf0963a136768bb3d6dda9a746b5500bccdf35d3dacb7b0667",
116
116
  "currentProviderInventorySha256": "86e9d0668cb54ad1bf05c36e78b4aa80417d5f468c929dd3ddcf69c1afbf32e4",
117
117
  "retiredProviders": [],
118
118
  "currentSnapshot": {
119
- "releaseVersion": "0.1.0-beta.109",
120
- "previousSnapshotSha256": "f00be4d7d86479e34e595d5e6e224b6fa34176303b92fa083eeada9d6ac87a26",
119
+ "releaseVersion": "0.1.0-beta.110",
120
+ "previousSnapshotSha256": "172fb0f27392b68d6399c5f658cde49e51446f1a9e0094fb359fcf306c3ef161",
121
121
  "providers": [
122
122
  {
123
123
  "id": "claude",
@@ -193,8 +193,8 @@
193
193
  "retiredProviders": []
194
194
  },
195
195
  "immutableHeadSnapshot": {
196
- "releaseVersion": "0.1.0-beta.108",
197
- "previousSnapshotSha256": "0129f3ce7565b388be2c1b02740786bb76afe7a436c6b4d4db641f44db98d0c6",
196
+ "releaseVersion": "0.1.0-beta.109",
197
+ "previousSnapshotSha256": "f00be4d7d86479e34e595d5e6e224b6fa34176303b92fa083eeada9d6ac87a26",
198
198
  "providers": [
199
199
  {
200
200
  "id": "claude",
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
  # PreToolUse feedback gate: never use protected main/master as an editing workbench.
3
3
  # Remote GitHub rulesets are the hard authority; this local hook catches the mistake earlier.
4
- # SSOT: AGENTS.md # Git solo-work canonical + governance/memory/feedback_solo_dev_workflow.md
4
+ # SSOT: AGENTS.md # Git / release canonical + governance/memory/feedback_solo_dev_workflow.md
5
5
 
6
6
  source "$(dirname "$0")/_log-fire.sh" 2>/dev/null && log_hook_fire
7
7
  set -uo pipefail
@@ -1,7 +1,7 @@
1
1
  #!/bin/bash
2
2
  set -uo pipefail
3
3
  # PreToolUse hook: enforce protected-main solo-work canonical (M28)
4
- # SSOT: governance/memory/feedback_solo_dev_workflow.md + AGENTS.md # Git solo-work canonical
4
+ # SSOT: governance/memory/feedback_solo_dev_workflow.md + AGENTS.md # Git / release canonical
5
5
  #
6
6
  # Blocks 2 violations:
7
7
  # R1. A second working branch in the same session(checkout -b or switch -c).
@@ -2,8 +2,8 @@
2
2
  # check_substantive_edit_approval_preflight.sh — Pre-action gate for substantive design edits.
3
3
  #
4
4
  # Purpose: PRE-flight 偵測 packages/design-system/src/**.{tsx,ts,css} edit;工程 remediation
5
- # 依 Standing Authorization 執行,產品/UI/UX 真取捨則須有 current-scope exact
6
- # target + exact operation-digest 決策證據,否則 P0 BLOCKER(stderr + exit 2)。
5
+ # 依 Standing Authorization 執行,產品/UI/UX 真取捨則須有 user exact target + choice 的
6
+ # 明確核准(operation digest 為可選佐證,不得強制;835b519e 先例),否則 P0 BLOCKER(stderr + exit 2)。
7
7
  #
8
8
  # 對比 stop_self_audit.sh post-action BLOCKER:本 hook 是 PRE-action gate,
9
9
  # 在 edit 落地前就攔(propose-only OR exact target-bound decision evidence),
@@ -217,8 +217,8 @@ elif [ -d "$HOOKS_DIR" ]; then
217
217
  2>/dev/null | wc -l | tr -d ' ')
218
218
  HOOK_COUNT=${HOOK_COUNT:-0}
219
219
  fi
220
- # 2026-07-31 canonical inventory:同一個 find predicate 算得現值 60,已抵 hard cap、
221
- # headroom=0。60 維持為邊界,不是新基準的自動調升理由;下一支 first-class hook 必先由
220
+ # 2026-08-05 canonical inventory:同一個 find predicate 算得現值 59(2026-08-04 退役潮
221
+ # 收回 1 支,headroom=1)。60 維持為邊界,不是新基準的自動調升理由;下一支 first-class hook 必先由
222
222
  # /knowledge-prune retire / consolidate 既有 hook。降 cap 仍屬治理 substantive
223
223
  # (soft 26 已在 27+ 提供 advisory),留 /knowledge-prune 評估。
224
224
  if [ "$HOOK_COUNT" -gt 60 ]; then
@@ -66,7 +66,7 @@
66
66
  | **M26** | **Behavior / visual canonical decision 前必跑 WebFetch + WebSearch 取 ≥ 3 source,不可憑印象 propose**。M22 升級版 — M22 管「寫 spec / tsx 含 claim 必附 cite」(實作後),M26 管「propose / 決策前必先 fetch」(實作前)。Pipeline:(1) WebFetch 3 家世界級 source(Atlassian / Material / Polaris / Ant / Carbon / Apple HIG / shadcn / Radix);(2) 全 403 → WebSearch fallback 用 snippet,**明示「search-only confidence」**;(3) WebFetch + WebSearch 都失敗 → STOP propose,告知 user「無法 verify,要看 screenshot/實機」。Hook `check_propose_without_benchmark.sh`(2026-05-26 backfill — 前期 doc claim 但 file missing;UserPromptSubmit 偵測 user prompt 含 propose / visual / behavior decision keyword + 近 20 turn WebFetch/WebSearch < 2 → soft inject 提醒)。 | 2026-05-05:user 反覆糾「為什麼每次都沒 webfetch 只憑印象」— Jira drag handle / cell display 兩題我憑印象 propose 多輪;升級成硬規範 |
67
67
  <!-- M27 retired 2026-05-15(per /knowledge-prune D3 audit):self-flagged「M23 子規則」 → collapsed into M23 sub-bullet (c) "framework prop name namespace conflict"。Original case (TanStack size vs DS density) + hook `check_datatable_invariants.sh(r2 folded,2026-06-11)` retained 在 M23 children。 -->
68
68
 
69
- | **M28** | **Git ops 必先 grep canonical**(mindset #2 AI-ops 子規則)。AI 執行 branch/PR/merge/release ops 前必讀 `governance/memory/feedback_solo_dev_workflow.md` + `AGENTS.md # Git solo-work canonical`。鐵律:1 task = 1 working branch + 1 PR;protected main 禁 direct push;PR 建立是正常路徑;standard release 只走 `infra/governance/release-workflow.json` 的 `pr-checks → merge → publish → readback → consumer`,由 `release:auto` 依 Standing Authorization自主續跑。Hook `check_solo_workflow.sh` 只機械攔 R1 第二 branch / R2 direct-main push;retired tag-preflight、preview/canary、attestation、soak、fleet ceremony 不得回到 blocking graph。Break-glass override audit-logged,仍不能繞 GitHub ruleset。 | 2026-05-08 的 branch/PR sprawl促成機械化;2026-07-20 保留一任務一分支與 protected PR;2026-07-26 淘汰 chat-keyword gate,2026-08-02 再移除 retired local tag-preflight branch。 |
69
+ | **M28** | **Git ops 必先 grep canonical**(mindset #2 AI-ops 子規則)。AI 執行 branch/PR/merge/release ops 前必讀 `governance/memory/feedback_solo_dev_workflow.md` + `AGENTS.md # Git / release canonical`。鐵律:1 task = 1 working branch + 1 PR;protected main 禁 direct push;PR 建立是正常路徑;standard release 只走 `infra/governance/release-workflow.json` 的 `pr-checks → merge → publish → readback → consumer`,由 `release:auto` 依 Standing Authorization自主續跑。Hook `check_solo_workflow.sh` 只機械攔 R1 第二 branch / R2 direct-main push;retired tag-preflight、preview/canary、attestation、soak、fleet ceremony 不得回到 blocking graph。Break-glass override audit-logged,仍不能繞 GitHub ruleset。 | 2026-05-08 的 branch/PR sprawl促成機械化;2026-07-20 保留一任務一分支與 protected PR;2026-07-26 淘汰 chat-keyword gate,2026-08-02 再移除 retired local tag-preflight branch。 |
70
70
  | **M29** | **DS Anchor Preflight invariant — 視覺 / 結構 propose 前必 grep `*.spec.md` 找 owner SSOT**。動 component / pattern / token 視覺結構前,**必先**:(a) `rg <touched component> + <behavior keyword>` in `packages/design-system/src/**/*.spec.md` (b) 出 **3-column owner table**(`candidate owner spec` / `canonical sentence/table row` / `conflicting code/comment if any`)(c) 若 spec ≠ code → STOP 寫 RFC 不直接 propose implementation。沒 3-column = anti-pattern,提案不被接受。SSOT index `packages/design-system/ds-canonical/references/ssot-index.md`(high-risk interface owner mapping)Step 0.1 先查再 grep verify。Hook `check_ds_anchor_preflight.sh` P0 BLOCKER(exit 2,2026-07-07 升級;bypass CLAUDE_BYPASS_DS_ANCHOR=1 audit-logged)。codex-collab/SKILL.md Step 0.1 mandatory pre-grep。對齊 Carbon「design spec is source of truth」+ Atlassian「system-wide coordination first」。 | 2026-05-08:Claude+Codex 連 5 round 跳過 spec anchor pre-grep,直覺加 primitive(D path / Path A);user 抓「為何沒研讀設計原則」 |
71
71
  | **M30** | **Wrapper-vs-primitive schema unify invariant — wrapper API option / config schema 必 `extends` primitive SSOT,且 wrapper 內部轉換 mapping 必 forward 全 primitive surface field**。Primitive(`SelectMenuOption` / `MenuItemProps` / `ItemAnatomyProps` 等)宣告 SSOT 後,所有 wrapper(`Select.SelectOption` / `Combobox.SelectOption` / `PeoplePicker` 等)若有同類 schema,(a) 用 TypeScript `extends primitive` 機械繼承,**不可平行 declare** weak schema(同名 / 部分欄位)(b) wrapper 內部 `xxxToYyy()` mapping 必 forward 全 primitive surface field(不可只 forward `value` + `label`,silently drop avatar / description / disabled 等)(c) wrapper-only field 加在 `extends body`(不污染 primitive)。Hook `check_wrapper_primitive_schema_drift.sh` 機械強制(P0 BLOCKER):grep `export interface .*Option \{` cross components/,同名 ≥ 2 處且未 `extends` primitive → BLOCK。對齊 Polaris ChoiceList / Material Autocomplete / Carbon Dropdown wrapper-vs-primitive schema-extension idiom。 | 2026-05-10 PeoplePicker multi-mode 漏 avatar:`Combobox.SelectOption = { value, label }` weak schema(跟 `Select.SelectOption` 同名不同 fields)+ `Combobox.menuOptions` mapping 只 forward 2 fields → dropdown rows 永遠純文字。user 抓「為什麼之前會把 people picker 改壞 + 還有沒有其他東西也改壞」。Round 1 commit `561945b` 修(Combobox extends + forward 全 field)+ Round 2 codify。 |
72
72
  | **M32** | **Audit script 必 pixel-quantified verify ≠ attribute existence**(2026-05-12)。Audit 必驗 `rect.top / .left / .height` numeric pixel,**不**可只驗 `getAttribute('data-state')` / `class.includes(...)` = false-positive trap(DOM-pass ≠ visual-pass)。對齊 Material X-DataGrid / AG Grid playwright pixel snapshot / Polaris visual diff canonical。Hook `check_pixel_quantified_audit.sh` 機械強制(scans `getAttribute(` without paired `getBoundingClientRect(`)。**+ Sub-invariant(2026-05-30,doc-claim layer)**:story/anatomy/a11y/spec 的**文字宣稱 ≠ code 真實**——audit 必 adversarial **讀元件 .tsx +(其 wrap 的 Radix/cmdk/react-day-picker 等 lib)source**,逐句驗 keyboard map/ARIA role/focus 行為/prop 存在性/native-vs-custom;prose-skim「looks fine」= false-pass(prose-pass ≠ source-verified)。**「無 code 改動」≠ 可跳過**。`/deep-audit-cross-codex` A.1b + CP-A1b + report-validator F 機械強制。Anchor:2026-05-30 獨立 adversarial 抓 403 findings/64 單元/202 FALSE_CLAIM(前期 prose-skim story dim 全漏);prop-existence deterministic detector 因 passthrough over-flag 證實此類本質需 LLM 讀 source → 用 mandatory-dim + report-validator 保證真跑。**Split note**:原 mega 8 sub-invariants 拆 4 home — (b) fix-time root-invariant → M12 extension / (c)(d)(h) batch + parallel + claim-verify → `/bug-fix-rhythm` skill / (e) tool preflight(CLI binary 必跑 4-test discovery:which / npx / package.json / auth.json,禁短路「not installed」假警報)— 原 memory `feedback_tool_binary_preflight_sweep.md` 已 retire,invariant 一行收容於此 / (f) ship gate → AGENTS.md `# 稽核 canonical` / (g) Layer marker → M31 + hook。git blame 2026-05-12 commit 留 audit trail。 | 2026-05-12 4 audit-vs-visual gap absorbed:cell-align / divider 2px / breadcrumb tooltip / row-alignment 全 audit「Δ=0 ALL PASS」但 user 抓視覺壞(詳 historical-bugs.md)。|
@@ -151,7 +151,7 @@ traits:
151
151
 
152
152
  ### Phase 6 — Self quality-gate(exit check)
153
153
 
154
- **Mandatory**。chain `/component-quality-gate` 走 35 項 checklist + Phase 4.5 visual audit(Layer A + B)+ **Dim 27 code quality audit**(2026-04-24 新:`node scripts/code-quality-audit.mjs --scope=component:{Name} --check`,P0 violation 必 block)。對齊 CLAUDE.md 稽核 canonical Tier 1 stakeholder-gate:元件要 merge 前 code + visual + clean-code 三層過關。
154
+ **Mandatory**。chain `/component-quality-gate` 走 35 項 checklist + Phase 4.5 visual audit(Layer A + B)+ **Dim 27 code quality audit**(2026-04-24 新:`node scripts/code-quality-audit.mjs --scope=component:{Name} --check`,P0 violation 必 block)。對齊 AGENTS.md `# 稽核 canonical` Tier 1 stakeholder-gate:元件要 merge 前 code + visual + clean-code 三層過關。
155
155
 
156
156
  **如何 chain**:
157
157
  1. Invoke `/component-quality-gate` skill,以本元件為 scope
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.109",
7
+ "version": "0.1.0-beta.110",
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",
@@ -1,15 +0,0 @@
1
- # Known Broken Tests(2026-05-17 移出 CI scope)
2
-
3
- 以下 test 因 hook 演化 / dispatcher merge / wording change 出現 mismatch,
4
- 暫時 rename `.broken` 從 CI run-all.sh 排除。**hook 本身工作正常**(production
5
- behavior 驗證 OK),只是 test assertion 過時。Future 修各別。
6
-
7
- | Test | Symptom | Suspected cause | Priority |
8
- |---|---|---|---|
9
- | test_check_story_anatomy.sh | Test 3 dismiss via label Button blocked | hook 行為改但 assertion stale | P2 |
10
- | test_check_story_category.sh | Test 4 fail | rationale escape parsing 變 | P2 |
11
- | test_check_story_name_jargon.sh | Test 2/3 ('L2 Selection' / 'canonical' 不再被 flag) | check_story_invariants.sh dispatcher merge 後 regex 變 | P1 |
12
- | test_stop_governance_drift_check.sh | Test 1/2 fail | hook 改 + (test 已修 set -u 但 fixture 還有 issue) | P2 |
13
-
14
- 修法 reference:每個 test rerun 看 actual output 是什麼,update assertion grep pattern 對齊。
15
- 完成後 `mv X.broken X` 移回 CI scope。