@qijenchen/design-system 0.1.0-beta.96 → 0.1.0-beta.99

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.
Files changed (294) hide show
  1. package/README.md +1 -0
  2. package/dist/components/AccountMenu/account-menu.d.ts +86 -0
  3. package/dist/components/AccountMenu/account-menu.d.ts.map +1 -0
  4. package/dist/components/AccountMenu/account-menu.js +64 -0
  5. package/dist/components/AccountMenu/account-menu.js.map +1 -0
  6. package/dist/components/AccountMenu/index.d.ts +2 -0
  7. package/dist/components/AccountMenu/index.d.ts.map +1 -0
  8. package/dist/components/AccountMenu/index.js +6 -0
  9. package/dist/components/AccountMenu/index.js.map +1 -0
  10. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
  11. package/dist/components/AppShell/app-shell.d.ts.map +1 -1
  12. package/dist/components/AppShell/app-shell.js +2 -2
  13. package/dist/components/AppShell/app-shell.js.map +1 -1
  14. package/dist/components/Badge/badge.d.ts +1 -1
  15. package/dist/components/Button/button.d.ts +3 -3
  16. package/dist/components/Button/button.d.ts.map +1 -1
  17. package/dist/components/Button/button.js +3 -2
  18. package/dist/components/Button/button.js.map +1 -1
  19. package/dist/components/Calendar/calendar.d.ts +10 -21
  20. package/dist/components/Calendar/calendar.d.ts.map +1 -1
  21. package/dist/components/Calendar/calendar.js +5 -36
  22. package/dist/components/Calendar/calendar.js.map +1 -1
  23. package/dist/components/Combobox/combobox.d.ts.map +1 -1
  24. package/dist/components/Combobox/combobox.js +1 -0
  25. package/dist/components/Combobox/combobox.js.map +1 -1
  26. package/dist/components/Command/command.d.ts.map +1 -1
  27. package/dist/components/Command/command.js +3 -1
  28. package/dist/components/Command/command.js.map +1 -1
  29. package/dist/components/DataTable/data-table-filter-group.d.ts +6 -2
  30. package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -1
  31. package/dist/components/DataTable/data-table-filter-group.js +32 -27
  32. package/dist/components/DataTable/data-table-filter-group.js.map +1 -1
  33. package/dist/components/DataTable/data-table-filter-labels.d.ts +44 -0
  34. package/dist/components/DataTable/data-table-filter-labels.d.ts.map +1 -0
  35. package/dist/components/DataTable/data-table-filter-labels.js +55 -0
  36. package/dist/components/DataTable/data-table-filter-labels.js.map +1 -0
  37. package/dist/components/DataTable/data-table-filter-panel.d.ts +11 -0
  38. package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
  39. package/dist/components/DataTable/data-table-filter-panel.js +33 -10
  40. package/dist/components/DataTable/data-table-filter-panel.js.map +1 -1
  41. package/dist/components/DataTable/data-table-filter-value-picker.d.ts +4 -1
  42. package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -1
  43. package/dist/components/DataTable/data-table-filter-value-picker.js +22 -8
  44. package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -1
  45. package/dist/components/DataTable/data-table.js +2 -2
  46. package/dist/components/DataTable/data-table.js.map +1 -1
  47. package/dist/components/DataTable/index.js +2 -0
  48. package/dist/components/DataTable/index.js.map +1 -1
  49. package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
  50. package/dist/components/DatePicker/date-picker.js +5 -1
  51. package/dist/components/DatePicker/date-picker.js.map +1 -1
  52. package/dist/components/Dialog/dialog.d.ts +1 -1
  53. package/dist/components/DropdownMenu/dropdown-menu.d.ts +4 -1
  54. package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
  55. package/dist/components/DropdownMenu/dropdown-menu.js +46 -14
  56. package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
  57. package/dist/components/Field/field.d.ts.map +1 -1
  58. package/dist/components/Field/field.js.map +1 -1
  59. package/dist/components/FieldControlGroup/field-control-group.d.ts +2 -5
  60. package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
  61. package/dist/components/FieldControlGroup/field-control-group.js +2 -2
  62. package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
  63. package/dist/components/FileUpload/file-upload.js +1 -1
  64. package/dist/components/FileUpload/file-upload.js.map +1 -1
  65. package/dist/components/FileViewer/file-viewer.d.ts +1 -1
  66. package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
  67. package/dist/components/FileViewer/file-viewer.js +20 -3
  68. package/dist/components/FileViewer/file-viewer.js.map +1 -1
  69. package/dist/components/Menu/menu-item.d.ts.map +1 -1
  70. package/dist/components/Menu/menu-item.js +4 -2
  71. package/dist/components/Menu/menu-item.js.map +1 -1
  72. package/dist/components/PeoplePicker/people-picker.d.ts +2 -0
  73. package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
  74. package/dist/components/PeoplePicker/people-picker.js +4 -0
  75. package/dist/components/PeoplePicker/people-picker.js.map +1 -1
  76. package/dist/components/ScrollArea/scroll-area.d.ts +4 -3
  77. package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
  78. package/dist/components/ScrollArea/scroll-area.js +1 -1
  79. package/dist/components/ScrollArea/scroll-area.js.map +1 -1
  80. package/dist/components/SelectMenu/select-menu.d.ts +2 -0
  81. package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
  82. package/dist/components/SelectMenu/select-menu.js +3 -1
  83. package/dist/components/SelectMenu/select-menu.js.map +1 -1
  84. package/dist/components/Sheet/sheet.d.ts +1 -1
  85. package/dist/components/Sidebar/sidebar.js +2 -2
  86. package/dist/components/Sidebar/sidebar.js.map +1 -1
  87. package/dist/components/Tabs/tabs.d.ts.map +1 -1
  88. package/dist/components/Tabs/tabs.js +3 -0
  89. package/dist/components/Tabs/tabs.js.map +1 -1
  90. package/dist/components/Tag/tag.d.ts +1 -1
  91. package/dist/components/Tag/tag.d.ts.map +1 -1
  92. package/dist/components/Tag/tag.js +4 -3
  93. package/dist/components/Tag/tag.js.map +1 -1
  94. package/dist/components/Tooltip/tooltip.d.ts +1 -1
  95. package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
  96. package/dist/components/Tooltip/tooltip.js +26 -1
  97. package/dist/components/Tooltip/tooltip.js.map +1 -1
  98. package/dist/components/TreeView/tree-view.d.ts +2 -0
  99. package/dist/components/TreeView/tree-view.d.ts.map +1 -1
  100. package/dist/components/TreeView/tree-view.js +3 -2
  101. package/dist/components/TreeView/tree-view.js.map +1 -1
  102. package/dist/index.d.ts +5 -3
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +4 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/patterns/element-anatomy/item-anatomy.d.ts +1 -1
  107. package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
  108. package/dist/patterns/element-anatomy/item-anatomy.js +6 -2
  109. package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
  110. package/dist/patterns/header-canonical/chrome-header.d.ts +11 -4
  111. package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
  112. package/dist/patterns/header-canonical/chrome-header.js +1 -1
  113. package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
  114. package/dist/patterns/overlay-surface/overlay-surface.d.ts +4 -3
  115. package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
  116. package/dist/patterns/overlay-surface/overlay-surface.js +1 -0
  117. package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
  118. package/dist/patterns/resize-handle/resize-handle.d.ts +9 -11
  119. package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -1
  120. package/dist/patterns/resize-handle/resize-handle.js +3 -6
  121. package/dist/patterns/resize-handle/resize-handle.js.map +1 -1
  122. package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +1 -1
  123. package/ds-canonical/adapters/claude-root-instructions.md +1 -1
  124. package/ds-canonical/adapters/claude-settings-base.json +2 -5
  125. package/ds-canonical/fork/AGENTS.md +21 -10
  126. package/ds-canonical/fork/codex/hooks.json +1 -1
  127. package/ds-canonical/fork/common/instruction.md +21 -10
  128. package/ds-canonical/fork/consumer/governance-check.mjs +101 -13
  129. package/ds-canonical/fork/consumer/lock.json +14 -15
  130. package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +26 -3
  131. package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +61 -5
  132. package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +3 -10
  133. package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +3 -2
  134. package/ds-canonical/fork/governance.lock +17 -33
  135. package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +33 -0
  136. package/ds-canonical/fork/hooks/check_pattern_invariants.sh +39 -0
  137. package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +6 -4
  138. package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +5 -11
  139. package/ds-canonical/fork/launchers/settings-hooks.json +2 -2
  140. package/ds-canonical/fork/manifest.json +11 -13
  141. package/ds-canonical/fork/providers/claude/hook-config.json +1 -7
  142. package/ds-canonical/fork/providers/codex/hook-config.json +1 -1
  143. package/ds-canonical/fork/references/story-baseline-registry.json +7 -1
  144. package/ds-canonical/hooks/check_consumer_code_quality.sh +33 -0
  145. package/ds-canonical/hooks/check_pattern_invariants.sh +39 -0
  146. package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +6 -4
  147. package/ds-canonical/hooks/session_start_governance_check.sh +5 -6
  148. package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +23 -1
  149. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +36 -2
  150. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +1 -1
  151. package/ds-canonical/references/failure-class-registry.json +151 -144
  152. package/ds-canonical/references/preflight-gate-baseline.json +16 -12
  153. package/ds-canonical/references/story-baseline-registry.json +7 -1
  154. package/ds-canonical/rules/meta-patterns.md +3 -3
  155. package/ds-canonical/skills/design-system-audit/SKILL.md +1 -1
  156. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1 -1
  157. package/ds-canonical/templates/dashboard-app.tsx +31 -8
  158. package/llms-full.txt +6 -1
  159. package/llms.txt +2 -1
  160. package/package.json +1 -1
  161. package/src/components/AccountMenu/account-menu.anatomy.stories.tsx +115 -0
  162. package/src/components/AccountMenu/account-menu.principles.stories.tsx +99 -0
  163. package/src/components/AccountMenu/account-menu.spec.md +101 -0
  164. package/src/components/AccountMenu/account-menu.stories.tsx +61 -0
  165. package/src/components/AccountMenu/account-menu.tsx +170 -0
  166. package/src/components/AccountMenu/index.ts +5 -0
  167. package/src/components/AppShell/_demo-helpers.tsx +53 -53
  168. package/src/components/AppShell/app-shell.spec.md +5 -1
  169. package/src/components/AppShell/app-shell.tsx +14 -12
  170. package/src/components/Avatar/avatar.principles.stories.tsx +4 -4
  171. package/src/components/Avatar/avatar.stories.tsx +20 -5
  172. package/src/components/Breadcrumb/breadcrumb.spec.md +1 -1
  173. package/src/components/Button/button.spec.md +1 -1
  174. package/src/components/Button/button.stories.tsx +21 -9
  175. package/src/components/Button/button.tsx +5 -4
  176. package/src/components/Calendar/calendar.anatomy.stories.tsx +19 -17
  177. package/src/components/Calendar/calendar.principles.stories.tsx +5 -6
  178. package/src/components/Calendar/calendar.spec.md +24 -28
  179. package/src/components/Calendar/calendar.stories.tsx +5 -7
  180. package/src/components/Calendar/calendar.tsx +16 -62
  181. package/src/components/Carousel/carousel.principles.stories.tsx +5 -1
  182. package/src/components/Chart/chart.spec.md +1 -1
  183. package/src/components/Checkbox/checkbox.anatomy.stories.tsx +14 -5
  184. package/src/components/Chip/chip.spec.md +1 -1
  185. package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +7 -6
  186. package/src/components/CircularProgress/circular-progress.principles.stories.tsx +8 -6
  187. package/src/components/CircularProgress/circular-progress.stories.tsx +3 -3
  188. package/src/components/Combobox/combobox.tsx +1 -0
  189. package/src/components/Command/command.spec.md +1 -0
  190. package/src/components/Command/command.tsx +4 -1
  191. package/src/components/DataTable/data-table-filter-group.tsx +44 -27
  192. package/src/components/DataTable/data-table-filter-labels.ts +100 -0
  193. package/src/components/DataTable/data-table-filter-panel.tsx +48 -8
  194. package/src/components/DataTable/data-table-filter-value-picker.tsx +25 -8
  195. package/src/components/DataTable/data-table.spec.md +17 -1
  196. package/src/components/DataTable/data-table.stories.tsx +346 -33
  197. package/src/components/DataTable/data-table.tsx +2 -2
  198. package/src/components/DataTable/filter-operators.spec.md +2 -2
  199. package/src/components/DateGrid/date-grid.anatomy.stories.tsx +24 -20
  200. package/src/components/DateGrid/date-grid.principles.stories.tsx +27 -21
  201. package/src/components/DateGrid/date-grid.stories.tsx +22 -13
  202. package/src/components/DatePicker/date-picker.anatomy.stories.tsx +3 -3
  203. package/src/components/DatePicker/date-picker.spec.md +3 -3
  204. package/src/components/DatePicker/date-picker.stories.tsx +33 -9
  205. package/src/components/DatePicker/date-picker.tsx +8 -1
  206. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
  207. package/src/components/DropdownMenu/dropdown-menu.spec.md +5 -0
  208. package/src/components/DropdownMenu/dropdown-menu.stories.tsx +3 -17
  209. package/src/components/DropdownMenu/dropdown-menu.tsx +58 -16
  210. package/src/components/Field/field.spec.md +1 -1
  211. package/src/components/Field/field.tsx +1 -0
  212. package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +3 -3
  213. package/src/components/FieldControlGroup/field-control-group.spec.md +2 -3
  214. package/src/components/FieldControlGroup/field-control-group.stories.tsx +2 -1
  215. package/src/components/FieldControlGroup/field-control-group.tsx +6 -9
  216. package/src/components/FileItem/file-item.spec.md +1 -1
  217. package/src/components/FileItem/file-item.stories.tsx +1 -1
  218. package/src/components/FileUpload/file-upload.stories.tsx +32 -0
  219. package/src/components/FileUpload/file-upload.tsx +1 -1
  220. package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1 -1
  221. package/src/components/FileViewer/file-viewer.spec.md +1 -1
  222. package/src/components/FileViewer/file-viewer.stories.tsx +7 -0
  223. package/src/components/FileViewer/file-viewer.tsx +23 -5
  224. package/src/components/InlineEdit/inline-edit.stories.tsx +2 -2
  225. package/src/components/Input/input.anatomy.stories.tsx +28 -12
  226. package/src/components/Input/input.principles.stories.tsx +23 -18
  227. package/src/components/Input/input.stories.tsx +9 -1
  228. package/src/components/LinkInput/link-input.principles.stories.tsx +7 -7
  229. package/src/components/Menu/menu-item.anatomy.stories.tsx +1 -1
  230. package/src/components/Menu/menu-item.tsx +9 -2
  231. package/src/components/NumberInput/number-input.anatomy.stories.tsx +44 -10
  232. package/src/components/NumberInput/number-input.principles.stories.tsx +20 -14
  233. package/src/components/NumberInput/number-input.spec.md +1 -1
  234. package/src/components/NumberInput/number-input.stories.tsx +12 -5
  235. package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +7 -0
  236. package/src/components/PeoplePicker/people-picker.spec.md +3 -1
  237. package/src/components/PeoplePicker/people-picker.tsx +5 -0
  238. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +14 -12
  239. package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +5 -1
  240. package/src/components/RadioGroup/radio-group.spec.md +1 -1
  241. package/src/components/Rating/rating.principles.stories.tsx +2 -2
  242. package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +1 -1
  243. package/src/components/ScrollArea/scroll-area.spec.md +3 -3
  244. package/src/components/ScrollArea/scroll-area.tsx +5 -4
  245. package/src/components/SelectMenu/select-menu.spec.md +1 -1
  246. package/src/components/SelectMenu/select-menu.tsx +4 -1
  247. package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +19 -8
  248. package/src/components/SelectionControl/selection-item.stories.tsx +7 -7
  249. package/src/components/Sheet/sheet.spec.md +1 -1
  250. package/src/components/Sidebar/sidebar.spec.md +3 -2
  251. package/src/components/Sidebar/sidebar.stories.tsx +67 -37
  252. package/src/components/Sidebar/sidebar.tsx +3 -3
  253. package/src/components/Slider/slider.principles.stories.tsx +9 -9
  254. package/src/components/Steps/steps.spec.md +1 -0
  255. package/src/components/Steps/steps.stories.tsx +18 -1
  256. package/src/components/Switch/switch.anatomy.stories.tsx +11 -11
  257. package/src/components/Switch/switch.principles.stories.tsx +11 -8
  258. package/src/components/Tabs/tabs.principles.stories.tsx +24 -0
  259. package/src/components/Tabs/tabs.spec.md +6 -4
  260. package/src/components/Tabs/tabs.tsx +11 -0
  261. package/src/components/Tag/tag.anatomy.stories.tsx +5 -2
  262. package/src/components/Tag/tag.spec.md +4 -3
  263. package/src/components/Tag/tag.stories.tsx +19 -0
  264. package/src/components/Tag/tag.tsx +14 -5
  265. package/src/components/Textarea/textarea.anatomy.stories.tsx +15 -9
  266. package/src/components/Textarea/textarea.principles.stories.tsx +21 -5
  267. package/src/components/Tooltip/tooltip.spec.md +4 -0
  268. package/src/components/Tooltip/tooltip.tsx +34 -3
  269. package/src/components/TreeView/tree-view.spec.md +3 -3
  270. package/src/components/TreeView/tree-view.stories.tsx +68 -9
  271. package/src/components/TreeView/tree-view.tsx +7 -2
  272. package/src/index.ts +9 -1
  273. package/src/patterns/element-anatomy/inline-action.spec.md +12 -8
  274. package/src/patterns/element-anatomy/item-anatomy.stories.tsx +24 -5
  275. package/src/patterns/element-anatomy/item-anatomy.tsx +9 -5
  276. package/src/patterns/header-canonical/chrome-header.tsx +14 -5
  277. package/src/patterns/header-canonical/header-canonical.spec.md +10 -7
  278. package/src/patterns/header-canonical/header-canonical.stories.tsx +77 -0
  279. package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +2 -0
  280. package/src/patterns/overlay-surface/overlay-surface.spec.md +1 -0
  281. package/src/patterns/overlay-surface/overlay-surface.stories.tsx +17 -1
  282. package/src/patterns/overlay-surface/overlay-surface.tsx +8 -4
  283. package/src/patterns/resize-handle/resize-handle.spec.md +11 -13
  284. package/src/patterns/resize-handle/resize-handle.stories.tsx +1 -3
  285. package/src/patterns/resize-handle/resize-handle.tsx +13 -18
  286. package/src/tokens/color/semantic.css +3 -1
  287. package/src/tokens/layoutSpace/layoutSpace.stories.tsx +1 -1
  288. package/src/tokens/opacity/opacity.stories.tsx +1 -1
  289. package/src/tokens/radius/radius.stories.tsx +3 -3
  290. package/ds-canonical/commands/gov-status.md +0 -9
  291. package/ds-canonical/fork/consumer/managed-files/77e06f62670dfee01e9b5e8b0f8dad085ce711d75538c1fb0679d9818acaca82.blob +0 -424
  292. package/ds-canonical/fork/preamble.md +0 -500
  293. package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +0 -8
  294. package/ds-canonical/hooks/tests/test_check_post_main_ssot_propagate.sh +0 -37
@@ -1,424 +0,0 @@
1
- name: Propose Design System Upgrade
2
-
3
- # Immutable consumer promotion has three trust domains. The certifier emits evidence
4
- # without credentials; a fresh read-only job independently reconstructs it; only then
5
- # may an environment-gated writer mint the dedicated Governance Writer App token. The App
6
- # is writer-only(Contents/Pull requests), is not a check authority, and its automatic
7
- # candidate runs are non-authoritative. The explicit protected-default repository_dispatch
8
- # remains the required Check App validation path(no direct main write).
9
- on:
10
- repository_dispatch:
11
- # repository_dispatch always loads this workflow from the protected default
12
- # branch. manual-governance-upgrade-request is the API-driven manual path;
13
- # branch-selectable workflow_dispatch is intentionally forbidden here.
14
- types: [governance-release, manual-governance-upgrade-request]
15
-
16
- concurrency:
17
- group: governance-upgrade-${{ github.event.client_payload.version || github.run_id }}
18
- cancel-in-progress: false
19
-
20
- permissions:
21
- contents: read
22
-
23
- defaults:
24
- run:
25
- shell: bash -eo pipefail {0}
26
-
27
- jobs:
28
- certify-upgrade:
29
- name: Certify exact upgrade without credentials
30
- runs-on: ubuntu-24.04
31
- timeout-minutes: 35
32
- outputs:
33
- ready: ${{ steps.upgrade.outputs.ready }}
34
- version: ${{ steps.upgrade.outputs.version }}
35
- base_sha: ${{ steps.source.outputs.sha }}
36
- patch_sha256: ${{ steps.evidence.outputs.patch_sha256 }}
37
- tree_sha256: ${{ steps.evidence.outputs.tree_sha256 }}
38
- authority_sha256: ${{ steps.evidence.outputs.authority_sha256 }}
39
- artifact_digest: ${{ steps.upload.outputs.artifact-digest }}
40
- env:
41
- REQUESTED_VERSION: ${{ github.event.client_payload.version }}
42
- steps:
43
- - name: Checkout exact protected-base source
44
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
45
- with:
46
- fetch-depth: 0
47
- persist-credentials: false
48
-
49
- - name: Prove current protected-main source
50
- id: source
51
- run: |
52
- BASE_SHA=$(git rev-parse HEAD)
53
- MAIN_SHA=$(git rev-parse refs/remotes/origin/main)
54
- test "$BASE_SHA" = "$MAIN_SHA" || {
55
- echo "GOV-UPGRADE-SOURCE-001: stale source $BASE_SHA; current main is $MAIN_SHA"
56
- exit 1
57
- }
58
- echo "sha=$BASE_SHA" >> "$GITHUB_OUTPUT"
59
-
60
- - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
61
- with:
62
- node-version: '24.14.0'
63
- cache: npm
64
-
65
- - name: Validate and normalize exact version
66
- run: |
67
- VERSION="${REQUESTED_VERSION#v}"
68
- node scripts/workflow-static-validation.mjs assert-exact-semver --value "$VERSION"
69
- echo "VERSION=$VERSION" >> "$GITHUB_ENV"
70
-
71
- - name: Install current immutable snapshot
72
- run: |
73
- npm run setup:governance
74
- PREVIOUS_ROOT="$RUNNER_TEMP/previous-corpus"
75
- mkdir -p "$PREVIOUS_ROOT/node_modules/@qijenchen"
76
- cp -R node_modules/@qijenchen/design-system "$PREVIOUS_ROOT/node_modules/@qijenchen/design-system"
77
- echo "PREVIOUS_ROOT=$PREVIOUS_ROOT" >> "$GITHUB_ENV"
78
-
79
- - name: Apply exact transactional upgrade
80
- id: upgrade
81
- run: |
82
- git checkout -b "governance/certify-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
83
- node scripts/sync-all.mjs --apply --to "$VERSION" --json > "$RUNNER_TEMP/sync-all-report.json"
84
- git add -A
85
- echo "version=$VERSION" >> "$GITHUB_OUTPUT"
86
- if git diff --cached --quiet; then
87
- echo "ready=false" >> "$GITHUB_OUTPUT"
88
- echo "Already on exact immutable snapshot $VERSION"
89
- else
90
- echo "ready=true" >> "$GITHUB_OUTPUT"
91
- fi
92
-
93
- - name: Freeze transition-authenticated upgrade evidence
94
- if: steps.upgrade.outputs.ready == 'true'
95
- id: evidence
96
- env:
97
- BASE_SHA: ${{ steps.source.outputs.sha }}
98
- run: |
99
- node scripts/verify-upgrade-evidence.mjs \
100
- --certify-staged \
101
- --repo . \
102
- --evidence "$RUNNER_TEMP/upgrade-evidence" \
103
- --previous-root "$PREVIOUS_ROOT" \
104
- --sync-report "$RUNNER_TEMP/sync-all-report.json" \
105
- --base-sha "$BASE_SHA" \
106
- --version "$VERSION"
107
-
108
- - name: Re-verify upgraded registry and provider-neutral product
109
- if: steps.upgrade.outputs.ready == 'true'
110
- run: |
111
- npm run setup:governance
112
- npm run typecheck
113
- npm run lint:imports
114
- npm run build
115
- npx --no-install playwright install --with-deps chromium
116
- npm run audit:a11y
117
-
118
- - name: Reject post-certification mutation
119
- if: steps.upgrade.outputs.ready == 'true'
120
- env:
121
- EXPECTED_TREE_SHA: ${{ steps.evidence.outputs.tree_sha256 }}
122
- run: |
123
- git add -A
124
- ACTUAL_TREE_SHA=$(git write-tree)
125
- test "$ACTUAL_TREE_SHA" = "$EXPECTED_TREE_SHA" || {
126
- echo "GOV-UPGRADE-TREE-001: checks changed the certified tree"
127
- exit 1
128
- }
129
-
130
- - name: Upload exact upgrade evidence
131
- if: steps.upgrade.outputs.ready == 'true'
132
- id: upload
133
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
134
- with:
135
- name: governance-upgrade-${{ github.run_id }}-${{ github.run_attempt }}
136
- path: ${{ runner.temp }}/upgrade-evidence/
137
- if-no-files-found: error
138
- retention-days: 14
139
- compression-level: 0
140
-
141
- verify-upgrade:
142
- name: Independently reconstruct evidence without write authority
143
- needs: certify-upgrade
144
- if: needs.certify-upgrade.outputs.ready == 'true'
145
- runs-on: ubuntu-24.04
146
- timeout-minutes: 40
147
- permissions:
148
- contents: read
149
- outputs:
150
- base_sha: ${{ steps.verified.outputs.base_sha }}
151
- version: ${{ steps.verified.outputs.version }}
152
- patch_sha256: ${{ steps.verified.outputs.patch_sha256 }}
153
- tree_sha256: ${{ steps.verified.outputs.tree_sha256 }}
154
- authority_sha256: ${{ steps.verified.outputs.authority_sha256 }}
155
- verification_sha256: ${{ steps.verified.outputs.verification_sha256 }}
156
- steps:
157
- - name: Checkout exact certified base
158
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
159
- with:
160
- fetch-depth: 0
161
- persist-credentials: false
162
- # repository_dispatch is loaded from the protected default branch. Do
163
- # not trust an unprivileged job output to select writer source bytes.
164
- ref: ${{ github.sha }}
165
-
166
- - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
167
- with:
168
- node-version: '24.14.0'
169
- cache: npm
170
-
171
- - name: Authenticate current protected-base materialization authority
172
- run: |
173
- test "$(git rev-parse HEAD)" = "${{ github.sha }}"
174
- test "$(git rev-parse refs/remotes/origin/main)" = "${{ github.sha }}" || {
175
- echo 'GOV-UPGRADE-SOURCE-002: main moved after dispatch; rerun against the new base'
176
- exit 1
177
- }
178
- npm run setup:governance
179
-
180
- - name: Download certified upgrade evidence
181
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
182
- with:
183
- name: governance-upgrade-${{ github.run_id }}-${{ github.run_attempt }}
184
- path: ${{ runner.temp }}/upgrade-evidence
185
-
186
- - name: Independently reconstruct exact incoming tree without write authority
187
- id: verified
188
- env:
189
- REQUESTED_VERSION: ${{ github.event.client_payload.version }}
190
- run: |
191
- test "${{ needs.certify-upgrade.outputs.base_sha }}" = "${{ github.sha }}"
192
- test "${{ needs.certify-upgrade.outputs.version }}" = "${REQUESTED_VERSION#v}"
193
- node scripts/verify-upgrade-evidence.mjs \
194
- --verify-only \
195
- --repo . \
196
- --evidence "$RUNNER_TEMP/upgrade-evidence" \
197
- --base-sha "${{ needs.certify-upgrade.outputs.base_sha }}" \
198
- --version "${{ needs.certify-upgrade.outputs.version }}" \
199
- --expected-patch-sha256 "${{ needs.certify-upgrade.outputs.patch_sha256 }}" \
200
- --expected-tree-sha "${{ needs.certify-upgrade.outputs.tree_sha256 }}" \
201
- --expected-authority-sha256 "${{ needs.certify-upgrade.outputs.authority_sha256 }}" \
202
- --live-main-remote origin
203
-
204
- write-upgrade-pr:
205
- name: Apply preverified evidence + open Writer App reviewed PR
206
- needs: [certify-upgrade, verify-upgrade]
207
- if: needs.certify-upgrade.outputs.ready == 'true' && needs.verify-upgrade.result == 'success'
208
- runs-on: ubuntu-24.04
209
- timeout-minutes: 20
210
- environment:
211
- name: governance-upgrade
212
- permissions:
213
- contents: read
214
- steps:
215
- - name: Checkout exact verified base
216
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
217
- with:
218
- fetch-depth: 0
219
- persist-credentials: false
220
- ref: ${{ needs.verify-upgrade.outputs.base_sha }}
221
-
222
- - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
223
- with:
224
- node-version: '24.14.0'
225
- cache: npm
226
-
227
- - name: Install authenticated protected-base verifier only
228
- run: |
229
- test "$(git rev-parse HEAD)" = "${{ needs.verify-upgrade.outputs.base_sha }}"
230
- npm run setup:governance
231
-
232
- - name: Download exact certifier evidence
233
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
234
- with:
235
- name: governance-upgrade-${{ github.run_id }}-${{ github.run_attempt }}
236
- path: ${{ runner.temp }}/upgrade-evidence
237
-
238
- - name: Rebind trusted verification and apply verified candidate bytes
239
- id: applied
240
- run: |
241
- test "${{ needs.verify-upgrade.outputs.base_sha }}" = "${{ needs.certify-upgrade.outputs.base_sha }}"
242
- test "${{ needs.verify-upgrade.outputs.version }}" = "${{ needs.certify-upgrade.outputs.version }}"
243
- test "${{ needs.verify-upgrade.outputs.patch_sha256 }}" = "${{ needs.certify-upgrade.outputs.patch_sha256 }}"
244
- test "${{ needs.verify-upgrade.outputs.tree_sha256 }}" = "${{ needs.certify-upgrade.outputs.tree_sha256 }}"
245
- test "${{ needs.verify-upgrade.outputs.authority_sha256 }}" = "${{ needs.certify-upgrade.outputs.authority_sha256 }}"
246
- node scripts/verify-upgrade-evidence.mjs \
247
- --apply-preverified \
248
- --repo . \
249
- --evidence "$RUNNER_TEMP/upgrade-evidence" \
250
- --base-sha "${{ needs.verify-upgrade.outputs.base_sha }}" \
251
- --version "${{ needs.verify-upgrade.outputs.version }}" \
252
- --expected-patch-sha256 "${{ needs.verify-upgrade.outputs.patch_sha256 }}" \
253
- --expected-tree-sha "${{ needs.verify-upgrade.outputs.tree_sha256 }}" \
254
- --expected-authority-sha256 "${{ needs.verify-upgrade.outputs.authority_sha256 }}" \
255
- --expected-verification-sha256 "${{ needs.verify-upgrade.outputs.verification_sha256 }}" \
256
- --live-main-remote origin
257
-
258
- - name: Mint least-privilege short-lived Governance Writer App token
259
- id: app-token
260
- uses: actions/create-github-app-token@fee1f7d63c2ff003460e3d139729b119787bc349 # v2
261
- with:
262
- app-id: ${{ secrets.GOVERNANCE_WRITER_APP_ID }}
263
- private-key: ${{ secrets.GOVERNANCE_WRITER_APP_PRIVATE_KEY }}
264
- owner: ${{ github.repository_owner }}
265
- repositories: ${{ github.event.repository.name }}
266
- permission-contents: write
267
- permission-pull-requests: write
268
- permission-workflows: write
269
-
270
- - name: Open or reuse one Writer App-authored deterministic upgrade PR, then dispatch trusted validation
271
- env:
272
- GH_TOKEN: ${{ steps.app-token.outputs.token }}
273
- GH_PROMPT_DISABLED: '1'
274
- PATH: /usr/bin:/bin
275
- HOME: ${{ runner.temp }}/upgrade-writer-home
276
- XDG_CONFIG_HOME: ${{ runner.temp }}/upgrade-writer-home/xdg
277
- GH_CONFIG_DIR: ${{ runner.temp }}/upgrade-writer-home/gh
278
- GIT_CONFIG_NOSYSTEM: '1'
279
- GIT_CONFIG_GLOBAL: /dev/null
280
- GIT_TERMINAL_PROMPT: '0'
281
- GIT_ASKPASS: /bin/false
282
- SSH_ASKPASS: /bin/false
283
- GIT_PAGER: /bin/cat
284
- PAGER: /bin/cat
285
- HTTP_PROXY: ''
286
- HTTPS_PROXY: ''
287
- ALL_PROXY: ''
288
- NO_PROXY: ''
289
- GIT_CONFIG_COUNT: '4'
290
- GIT_CONFIG_KEY_0: credential.helper
291
- GIT_CONFIG_VALUE_0: ''
292
- GIT_CONFIG_KEY_1: credential.helper
293
- GIT_CONFIG_VALUE_1: '!/usr/bin/gh auth git-credential'
294
- GIT_CONFIG_KEY_2: core.hooksPath
295
- GIT_CONFIG_VALUE_2: /dev/null
296
- GIT_CONFIG_KEY_3: protocol.file.allow
297
- GIT_CONFIG_VALUE_3: never
298
- GIT_AUTHOR_NAME: Qijenchen Governance Writer App
299
- GIT_AUTHOR_EMAIL: qijenchen-governance-writer[bot]@users.noreply.github.com
300
- GIT_COMMITTER_NAME: Qijenchen Governance Writer App
301
- GIT_COMMITTER_EMAIL: qijenchen-governance-writer[bot]@users.noreply.github.com
302
- BASE_SHA: ${{ needs.verify-upgrade.outputs.base_sha }}
303
- VERSION: ${{ needs.verify-upgrade.outputs.version }}
304
- TREE_SHA: ${{ needs.verify-upgrade.outputs.tree_sha256 }}
305
- PATCH_SHA: ${{ needs.verify-upgrade.outputs.patch_sha256 }}
306
- WRITER_LOGIN: qijenchen-governance-writer[bot]
307
- run: |
308
- set -euo pipefail
309
- test -n "$GH_TOKEN" || { echo 'GOV-UPGRADE-TOKEN-001: Governance Writer App token missing'; exit 1; }
310
- WRITER_TOKEN="$GH_TOKEN"
311
- unset GH_TOKEN
312
- gh() {
313
- /usr/bin/env -i \
314
- PATH=/usr/bin:/bin \
315
- HOME="$HOME" \
316
- XDG_CONFIG_HOME="$XDG_CONFIG_HOME" \
317
- GH_CONFIG_DIR="$GH_CONFIG_DIR" \
318
- GH_TOKEN="$WRITER_TOKEN" \
319
- GH_PROMPT_DISABLED=1 \
320
- /usr/bin/gh "$@"
321
- }
322
- git() {
323
- local token_environment=()
324
- case "${1:-}" in
325
- fetch|ls-remote|push)
326
- token_environment=(GH_TOKEN="$WRITER_TOKEN" GH_PROMPT_DISABLED=1)
327
- ;;
328
- esac
329
- /usr/bin/env -i \
330
- PATH=/usr/bin:/bin \
331
- HOME="$HOME" \
332
- LANG=C.UTF-8 \
333
- LC_ALL=C.UTF-8 \
334
- TZ=UTC \
335
- GIT_CONFIG_NOSYSTEM=1 \
336
- GIT_CONFIG_GLOBAL=/dev/null \
337
- GIT_TERMINAL_PROMPT=0 \
338
- GIT_ASKPASS=/bin/false \
339
- SSH_ASKPASS=/bin/false \
340
- GIT_PAGER=/bin/cat \
341
- PAGER=/bin/cat \
342
- GIT_CONFIG_COUNT=4 \
343
- GIT_CONFIG_KEY_0=credential.helper \
344
- GIT_CONFIG_VALUE_0= \
345
- GIT_CONFIG_KEY_1=credential.helper \
346
- GIT_CONFIG_VALUE_1='!/usr/bin/gh auth git-credential' \
347
- GIT_CONFIG_KEY_2=core.hooksPath \
348
- GIT_CONFIG_VALUE_2=/dev/null \
349
- GIT_CONFIG_KEY_3=protocol.file.allow \
350
- GIT_CONFIG_VALUE_3=never \
351
- GIT_AUTHOR_NAME='Qijenchen Governance Writer App' \
352
- GIT_AUTHOR_EMAIL='qijenchen-governance-writer[bot]@users.noreply.github.com' \
353
- GIT_COMMITTER_NAME='Qijenchen Governance Writer App' \
354
- GIT_COMMITTER_EMAIL='qijenchen-governance-writer[bot]@users.noreply.github.com' \
355
- "${token_environment[@]}" \
356
- /usr/bin/git "$@"
357
- }
358
- mkdir -m 700 "$HOME" "$XDG_CONFIG_HOME" "$GH_CONFIG_DIR"
359
- BRANCH="governance/upgrade-${VERSION//./-}-${BASE_SHA:0:12}"
360
- DESIRED_TREE=$(git write-tree)
361
- LIVE_MAIN_SHA=$(git ls-remote --exit-code origin refs/heads/main | awk 'NR == 1 { print $1 }')
362
- test "$LIVE_MAIN_SHA" = "$BASE_SHA" || {
363
- echo 'GOV-UPGRADE-SOURCE-007: main moved before remote mutation'
364
- exit 1
365
- }
366
- if ! git ls-remote --exit-code --heads origin "$BRANCH" >/dev/null 2>&1; then
367
- git checkout -b "$BRANCH"
368
- git commit --no-gpg-sign -m "chore(governance): upgrade immutable snapshot to $VERSION"
369
- LIVE_MAIN_SHA=$(git ls-remote --exit-code origin refs/heads/main | awk 'NR == 1 { print $1 }')
370
- test "$LIVE_MAIN_SHA" = "$BASE_SHA" || { echo 'GOV-UPGRADE-SOURCE-007: main moved before branch push'; exit 1; }
371
- git push origin "$BRANCH"
372
- fi
373
-
374
- git fetch --force --no-tags origin "refs/heads/$BRANCH:refs/remotes/origin/$BRANCH"
375
- REMOTE_COMMIT=$(git rev-parse "refs/remotes/origin/$BRANCH^{commit}")
376
- REMOTE_TREE=$(git rev-parse "$REMOTE_COMMIT^{tree}")
377
- REMOTE_LINE=$(git rev-list --parents -n 1 "$REMOTE_COMMIT")
378
- test "$(wc -w <<<"$REMOTE_LINE" | tr -d ' ')" = 2
379
- REMOTE_PARENT=$(cut -d' ' -f2 <<<"$REMOTE_LINE")
380
- test "$REMOTE_TREE" = "$DESIRED_TREE" && test "$REMOTE_PARENT" = "$BASE_SHA" || {
381
- echo 'GOV-UPGRADE-BRANCH-001: deterministic branch exists with different evidence'
382
- exit 1
383
- }
384
-
385
- PR_JSON=$(gh pr list --repo "$GITHUB_REPOSITORY" --state open --head "$BRANCH" --limit 2 \
386
- --json number,url,author,baseRefName,headRefName,headRefOid,isCrossRepository)
387
- PR_COUNT=$(jq 'length' <<<"$PR_JSON")
388
- test "$PR_COUNT" -le 1 || { echo 'GOV-UPGRADE-PR-001: multiple deterministic PRs exist'; exit 1; }
389
- if [ "$PR_COUNT" = 0 ]; then
390
- LIVE_MAIN_SHA=$(git ls-remote --exit-code origin refs/heads/main | awk 'NR == 1 { print $1 }')
391
- test "$LIVE_MAIN_SHA" = "$BASE_SHA" || { echo 'GOV-UPGRADE-SOURCE-007: main moved before PR creation'; exit 1; }
392
- gh pr create \
393
- --repo "$GITHUB_REPOSITORY" \
394
- --base main \
395
- --head "$BRANCH" \
396
- --title "chore(governance): upgrade immutable snapshot to $VERSION" \
397
- --body "Automated exact-version upgrade from base \`$BASE_SHA\`. Certified tree: \`$TREE_SHA\`; patch: \`sha256:$PATCH_SHA\`. The dedicated Writer App is not a check authority; automatic candidate runs are non-authoritative. The protected-default validation dispatch publishes the required Check App verdict."
398
- PR_JSON=$(gh pr list --repo "$GITHUB_REPOSITORY" --state open --head "$BRANCH" --limit 2 \
399
- --json number,url,author,baseRefName,headRefName,headRefOid,isCrossRepository)
400
- fi
401
-
402
- test "$(jq 'length' <<<"$PR_JSON")" = 1 || { echo 'GOV-UPGRADE-PR-001: deterministic PR is missing or ambiguous'; exit 1; }
403
- test "$(jq -r '.[0].baseRefName' <<<"$PR_JSON")" = main || { echo 'GOV-UPGRADE-PR-002: existing PR targets the wrong base'; exit 1; }
404
- test "$(jq -r '.[0].author.login' <<<"$PR_JSON")" = "$WRITER_LOGIN" || { echo 'GOV-UPGRADE-PR-002: PR author is not the Governance Writer App'; exit 1; }
405
- test "$(jq -r '.[0].headRefName' <<<"$PR_JSON")" = "$BRANCH" || { echo 'GOV-UPGRADE-PR-003: existing PR uses the wrong head ref'; exit 1; }
406
- test "$(jq -r '.[0].isCrossRepository' <<<"$PR_JSON")" = false || { echo 'GOV-UPGRADE-PR-003: existing PR uses a fork head'; exit 1; }
407
- test "$(jq -r '.[0].headRefOid' <<<"$PR_JSON")" = "$REMOTE_COMMIT" || { echo 'GOV-UPGRADE-PR-004: existing PR head differs from the verified remote commit'; exit 1; }
408
- PR_NUMBER=$(jq -r '.[0].number' <<<"$PR_JSON")
409
-
410
- LIVE_MAIN_SHA=$(git ls-remote --exit-code origin refs/heads/main | awk 'NR == 1 { print $1 }')
411
- LIVE_BRANCH_SHA=$(git ls-remote --exit-code origin "refs/heads/$BRANCH" | awk 'NR == 1 { print $1 }')
412
- test "$LIVE_MAIN_SHA" = "$BASE_SHA" && test "$LIVE_BRANCH_SHA" = "$REMOTE_COMMIT" || {
413
- echo 'GOV-UPGRADE-SOURCE-008: base or candidate moved before trusted validation dispatch'
414
- exit 1
415
- }
416
- jq -n \
417
- --arg source 'governance-upgrade-writer-v1' \
418
- --argjson pull_number "$PR_NUMBER" \
419
- --arg head_sha "$REMOTE_COMMIT" \
420
- --arg base_sha "$BASE_SHA" \
421
- '{event_type:"governance-upgrade-candidate-validation",client_payload:{source:$source,pull_number:$pull_number,head_sha:$head_sha,base_sha:$base_sha}}' \
422
- | gh api --method POST "repos/$GITHUB_REPOSITORY/dispatches" --input -
423
- WRITER_TOKEN=''
424
- unset WRITER_TOKEN