@qijenchen/design-system 0.1.0-beta.10 → 0.1.0-beta.13

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 (307) hide show
  1. package/CLAUDE.md +201 -0
  2. package/README.md +7 -15
  3. package/cli-init.mjs +90 -0
  4. package/ds-canonical/commands/README.md +26 -0
  5. package/ds-canonical/commands/gov-status.md +79 -0
  6. package/ds-canonical/hooks/README.md +145 -0
  7. package/ds-canonical/hooks/_log-fire.sh +44 -0
  8. package/ds-canonical/hooks/block_prototype_imports.py +111 -0
  9. package/ds-canonical/hooks/check_app_shell_primary_header_consistency.sh +68 -0
  10. package/ds-canonical/hooks/check_audit_post_report_validator.sh +88 -0
  11. package/ds-canonical/hooks/check_audit_sample_escape.sh +73 -0
  12. package/ds-canonical/hooks/check_benchmark_citation.sh +106 -0
  13. package/ds-canonical/hooks/check_canonical_propagation.sh +189 -0
  14. package/ds-canonical/hooks/check_chrome_header_handcraft.sh +70 -0
  15. package/ds-canonical/hooks/check_codex_brief_invariants.sh +83 -0
  16. package/ds-canonical/hooks/check_codex_collab_5step.sh +108 -0
  17. package/ds-canonical/hooks/check_datatable_invariants.sh +117 -0
  18. package/ds-canonical/hooks/check_dim_count_drift.sh +72 -0
  19. package/ds-canonical/hooks/check_field_controls_contracts.sh +110 -0
  20. package/ds-canonical/hooks/check_field_family_invariants.sh +205 -0
  21. package/ds-canonical/hooks/check_file_size_budget.sh +60 -0
  22. package/ds-canonical/hooks/check_header_with_tabs_border.sh +87 -0
  23. package/ds-canonical/hooks/check_main_branch_workbench.sh +93 -0
  24. package/ds-canonical/hooks/check_naming_and_abstraction.sh +165 -0
  25. package/ds-canonical/hooks/check_opacity_token_usage.sh +149 -0
  26. package/ds-canonical/hooks/check_pattern_invariants.sh +194 -0
  27. package/ds-canonical/hooks/check_peoplepicker_ssot_drift.sh +56 -0
  28. package/ds-canonical/hooks/check_pixel_quantified_audit.sh +53 -0
  29. package/ds-canonical/hooks/check_propose_plain_chinese.sh +74 -0
  30. package/ds-canonical/hooks/check_propose_pre_grep_verify.sh +70 -0
  31. package/ds-canonical/hooks/check_select_all_canonical.sh +58 -0
  32. package/ds-canonical/hooks/check_solo_workflow.sh +258 -0
  33. package/ds-canonical/hooks/check_spec_class_drift.sh +88 -0
  34. package/ds-canonical/hooks/check_story_invariants.sh +612 -0
  35. package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +105 -0
  36. package/ds-canonical/hooks/check_tab_lg_chrome_header_equal.sh +66 -0
  37. package/ds-canonical/hooks/check_wrapper_primitive_schema_drift.sh +104 -0
  38. package/ds-canonical/hooks/enforce_home_charter.sh +44 -0
  39. package/ds-canonical/hooks/inject_pending_self_audit.sh +204 -0
  40. package/ds-canonical/hooks/lib/_approval_re.sh +33 -0
  41. package/ds-canonical/hooks/lib/_code_quality.sh +73 -0
  42. package/ds-canonical/hooks/lib/_cva_default_sync.sh +69 -0
  43. package/ds-canonical/hooks/lib/_governance_coverage_check.sh +49 -0
  44. package/ds-canonical/hooks/lib/_hardcoded_strings.sh +163 -0
  45. package/ds-canonical/hooks/lib/_layout_space_canonical.sh +56 -0
  46. package/ds-canonical/hooks/lib/_overlay_handcraft.sh +141 -0
  47. package/ds-canonical/hooks/lib/_person_data_richness.sh +42 -0
  48. package/ds-canonical/hooks/lib/_story_compile_drift.sh +48 -0
  49. package/ds-canonical/hooks/lib/_token_hygiene.sh +95 -0
  50. package/ds-canonical/hooks/log_governance_fires.sh +50 -0
  51. package/ds-canonical/hooks/log_skill_invokes.sh +41 -0
  52. package/ds-canonical/hooks/post_edit_dispatcher.sh +62 -0
  53. package/ds-canonical/hooks/retired/check_anatomy_section_numbering.sh +106 -0
  54. package/ds-canonical/hooks/retired/check_avatar_hovercard.sh +90 -0
  55. package/ds-canonical/hooks/retired/check_button_icon_literal.sh.retired-2026-04-28 +38 -0
  56. package/ds-canonical/hooks/retired/check_container_breathing.sh +142 -0
  57. package/ds-canonical/hooks/retired/check_governance_compliance.sh +61 -0
  58. package/ds-canonical/hooks/retired/check_icon_only_padding_formula.sh +104 -0
  59. package/ds-canonical/hooks/retired/check_item_content_primitive.sh +150 -0
  60. package/ds-canonical/hooks/retired/check_item_list_gap.sh +153 -0
  61. package/ds-canonical/hooks/retired/check_sideoffset_canonical.sh +65 -0
  62. package/ds-canonical/hooks/retired/check_spec_iteration_tag.sh +87 -0
  63. package/ds-canonical/hooks/retired/check_ssot_consultation.sh +88 -0
  64. package/ds-canonical/hooks/retired/check_sync_update.sh +20 -0
  65. package/ds-canonical/hooks/retired/check_third_party_dom_verified.sh +95 -0
  66. package/ds-canonical/hooks/retired/enforce_home_charter.sh +125 -0
  67. package/ds-canonical/hooks/retired/post_edit_canonical_interrogate.sh +109 -0
  68. package/ds-canonical/hooks/retired/pre_edit_spec_check.sh +68 -0
  69. package/ds-canonical/hooks/retired/pre_new_component_spec.sh +39 -0
  70. package/ds-canonical/hooks/retired/pre_write_subsumption_check.sh +112 -0
  71. package/ds-canonical/hooks/retired/stop_meta_self_audit.sh.retired-2026-05-13 +76 -0
  72. package/ds-canonical/hooks/retired/tests/test_check_anatomy_section_numbering.sh +14 -0
  73. package/ds-canonical/hooks/retired/tests/test_check_avatar_hovercard.sh +15 -0
  74. package/ds-canonical/hooks/retired/tests/test_check_container_breathing.sh +15 -0
  75. package/ds-canonical/hooks/retired/tests/test_check_governance_compliance.sh +15 -0
  76. package/ds-canonical/hooks/retired/tests/test_check_icon_only_padding_formula.sh +79 -0
  77. package/ds-canonical/hooks/retired/tests/test_check_item_content_primitive.sh +15 -0
  78. package/ds-canonical/hooks/retired/tests/test_check_item_list_gap.sh +163 -0
  79. package/ds-canonical/hooks/retired/tests/test_check_sideoffset_canonical.sh +15 -0
  80. package/ds-canonical/hooks/retired/tests/test_check_spec_iteration_tag.sh +15 -0
  81. package/ds-canonical/hooks/retired/tests/test_check_ssot_consultation.sh +15 -0
  82. package/ds-canonical/hooks/retired/tests/test_check_sync_update.sh +14 -0
  83. package/ds-canonical/hooks/retired/tests/test_check_third_party_dom_verified.sh +15 -0
  84. package/ds-canonical/hooks/retired/tests/test_enforce_home_charter.sh +15 -0
  85. package/ds-canonical/hooks/retired/tests/test_pre_edit_spec_check.sh +15 -0
  86. package/ds-canonical/hooks/retired/tests/test_pre_new_component_spec.sh +15 -0
  87. package/ds-canonical/hooks/retired/tests/test_pre_write_subsumption_check.sh +63 -0
  88. package/ds-canonical/hooks/session_start_governance_check.sh +263 -0
  89. package/ds-canonical/hooks/stop_passive_logging.sh +322 -0
  90. package/ds-canonical/hooks/stop_self_audit.sh +450 -0
  91. package/ds-canonical/hooks/tests/KNOWN-BROKEN.md +15 -0
  92. package/ds-canonical/hooks/tests/run-all.sh +76 -0
  93. package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +143 -0
  94. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +140 -0
  95. package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +115 -0
  96. package/ds-canonical/hooks/tests/test_check_audit_sample_escape.sh +93 -0
  97. package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +115 -0
  98. package/ds-canonical/hooks/tests/test_check_canonical_propagation.sh +133 -0
  99. package/ds-canonical/hooks/tests/test_check_chrome_header_handcraft.sh +123 -0
  100. package/ds-canonical/hooks/tests/test_check_code_quality.sh +15 -0
  101. package/ds-canonical/hooks/tests/test_check_codex_collab_5step.sh +96 -0
  102. package/ds-canonical/hooks/tests/test_check_cva_default_sync.sh +15 -0
  103. package/ds-canonical/hooks/tests/test_check_datatable_invariants.sh +122 -0
  104. package/ds-canonical/hooks/tests/test_check_dim_count_drift.sh +98 -0
  105. package/ds-canonical/hooks/tests/test_check_field_controls_contracts.sh +126 -0
  106. package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +194 -0
  107. package/ds-canonical/hooks/tests/test_check_file_size_budget.sh +32 -0
  108. package/ds-canonical/hooks/tests/test_check_hardcoded_strings.sh +14 -0
  109. package/ds-canonical/hooks/tests/test_check_header_with_tabs_border.sh +110 -0
  110. package/ds-canonical/hooks/tests/test_check_layout_space_canonical.sh +73 -0
  111. package/ds-canonical/hooks/tests/test_check_main_branch_workbench.sh +147 -0
  112. package/ds-canonical/hooks/tests/test_check_naming_and_abstraction.sh +136 -0
  113. package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +110 -0
  114. package/ds-canonical/hooks/tests/test_check_overlay_handcraft.sh +126 -0
  115. package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +148 -0
  116. package/ds-canonical/hooks/tests/test_check_peoplepicker_ssot_drift.sh +108 -0
  117. package/ds-canonical/hooks/tests/test_check_person_data_richness.sh +58 -0
  118. package/ds-canonical/hooks/tests/test_check_pixel_quantified_audit.sh +142 -0
  119. package/ds-canonical/hooks/tests/test_check_propose_plain_chinese.sh +126 -0
  120. package/ds-canonical/hooks/tests/test_check_propose_pre_grep_verify.sh +117 -0
  121. package/ds-canonical/hooks/tests/test_check_select_all_canonical.sh +125 -0
  122. package/ds-canonical/hooks/tests/test_check_solo_workflow.sh +201 -0
  123. package/ds-canonical/hooks/tests/test_check_spec_class_drift.sh +135 -0
  124. package/ds-canonical/hooks/tests/test_check_story_anatomy.sh.broken +197 -0
  125. package/ds-canonical/hooks/tests/test_check_story_category.sh.broken +187 -0
  126. package/ds-canonical/hooks/tests/test_check_story_compile_drift.sh +15 -0
  127. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +209 -0
  128. package/ds-canonical/hooks/tests/test_check_story_name_jargon.sh.broken +53 -0
  129. package/ds-canonical/hooks/tests/test_check_story_slot_split.sh +156 -0
  130. package/ds-canonical/hooks/tests/test_check_substantive_edit_approval_preflight.sh +176 -0
  131. package/ds-canonical/hooks/tests/test_check_tab_lg_chrome_header_equal.sh +138 -0
  132. package/ds-canonical/hooks/tests/test_check_token_hygiene.sh +21 -0
  133. package/ds-canonical/hooks/tests/test_check_wrapper_primitive_schema_drift.sh +169 -0
  134. package/ds-canonical/hooks/tests/test_enforce_home_charter.sh +77 -0
  135. package/ds-canonical/hooks/tests/test_inject_pending_self_audit.sh +125 -0
  136. package/ds-canonical/hooks/tests/test_log_governance_fires.sh +10 -0
  137. package/ds-canonical/hooks/tests/test_log_skill_invokes.sh +7 -0
  138. package/ds-canonical/hooks/tests/test_post_edit_dispatcher.sh +108 -0
  139. package/ds-canonical/hooks/tests/test_session_start_governance_check.sh +143 -0
  140. package/ds-canonical/hooks/tests/test_stop_capture_metrics.sh +95 -0
  141. package/ds-canonical/hooks/tests/test_stop_governance_drift_check.sh.broken +125 -0
  142. package/ds-canonical/hooks/tests/test_stop_harvest_corrections.sh +10 -0
  143. package/ds-canonical/hooks/tests/test_stop_passive_logging.sh +100 -0
  144. package/ds-canonical/hooks/tests/test_stop_self_audit.sh +76 -0
  145. package/ds-canonical/hooks/tests/test_stop_tsc_sanity.sh +10 -0
  146. package/ds-canonical/references/README.md +43 -0
  147. package/ds-canonical/references/audit-coverage-vs-24-checklist.md +74 -0
  148. package/ds-canonical/references/build-ui-canonicals.md +69 -0
  149. package/ds-canonical/references/cva-patterns.md +41 -0
  150. package/ds-canonical/references/drag-canonical.md +331 -0
  151. package/ds-canonical/references/item-anatomy-recipe.md +225 -0
  152. package/ds-canonical/references/naming-conventions.md +56 -0
  153. package/ds-canonical/references/principle-dim-map.json +515 -0
  154. package/ds-canonical/references/props-naming.md +45 -0
  155. package/ds-canonical/references/spec-rules.md +58 -0
  156. package/ds-canonical/references/ssot-consultation.md +63 -0
  157. package/ds-canonical/references/ssot-index.md +40 -0
  158. package/ds-canonical/references/story-baseline-registry.json +79 -0
  159. package/ds-canonical/references/structural-token-retention.md +42 -0
  160. package/ds-canonical/references/tailwind-gotchas.md +87 -0
  161. package/ds-canonical/references/ui-dev-rules.md +60 -0
  162. package/ds-canonical/rules/README.md +34 -0
  163. package/ds-canonical/rules/meta-patterns.md +87 -0
  164. package/ds-canonical/rules/self-verify.md +53 -0
  165. package/ds-canonical/rules/spec-rules.md +25 -0
  166. package/ds-canonical/rules/story-rules.md +56 -0
  167. package/ds-canonical/rules/ui-development.md +87 -0
  168. package/ds-canonical/skills/README.md +88 -0
  169. package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +181 -0
  170. package/ds-canonical/skills/code-quality-audit/SKILL.md +63 -0
  171. package/ds-canonical/skills/codex-collab/SKILL.md +249 -0
  172. package/ds-canonical/skills/codex-collab/references/brief-template.md +48 -0
  173. package/ds-canonical/skills/codex-collab/references/transport.md +58 -0
  174. package/ds-canonical/skills/codify-corrections/SKILL.md +184 -0
  175. package/ds-canonical/skills/codify-principle/SKILL.md +151 -0
  176. package/ds-canonical/skills/component-quality-gate/SKILL.md +102 -0
  177. package/ds-canonical/skills/component-quality-gate/references/checklist.md +79 -0
  178. package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +247 -0
  179. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +123 -0
  180. package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +165 -0
  181. package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +91 -0
  182. package/ds-canonical/skills/delivery-handoff/SKILL.md +229 -0
  183. package/ds-canonical/skills/delivery-handoff/references/flow-diagram.md +180 -0
  184. package/ds-canonical/skills/delivery-handoff/references/handoff-template.md +177 -0
  185. package/ds-canonical/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  186. package/ds-canonical/skills/design-system-audit/SKILL.md +343 -0
  187. package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1260 -0
  188. package/ds-canonical/skills/design-system-audit/references/checkpoints.md +240 -0
  189. package/ds-canonical/skills/design-system-audit/references/historical-bugs.md +240 -0
  190. package/ds-canonical/skills/design-system-audit/references/principle-audit-protocol.md +364 -0
  191. package/ds-canonical/skills/design-system-audit/references/rule-placement.md +175 -0
  192. package/ds-canonical/skills/design-system-audit/references/spec-template.md +66 -0
  193. package/ds-canonical/skills/ensure-canonical/SKILL.md +196 -0
  194. package/ds-canonical/skills/governance-health/SKILL.md +146 -0
  195. package/ds-canonical/skills/knowledge-prune/SKILL.md +303 -0
  196. package/ds-canonical/skills/new-component/SKILL.md +170 -0
  197. package/ds-canonical/skills/new-component/references/new-component-checklist.md +85 -0
  198. package/ds-canonical/skills/performance-audit/SKILL.md +107 -0
  199. package/ds-canonical/skills/product-ui-audit/SKILL.md +230 -0
  200. package/ds-canonical/skills/product-ui-audit/references/audit-checks.md +246 -0
  201. package/ds-canonical/skills/product-ui-audit/references/common-misuses.md +329 -0
  202. package/ds-canonical/skills/product-ui-audit/references/report-template.md +159 -0
  203. package/ds-canonical/skills/propose-options/SKILL.md +177 -0
  204. package/ds-canonical/skills/prototype/SKILL.md +244 -0
  205. package/ds-canonical/skills/prototype/references/audit-checks.md +37 -0
  206. package/ds-canonical/skills/prototype/references/benchmark-sources.md +94 -0
  207. package/ds-canonical/skills/prototype/references/checkpoints.md +191 -0
  208. package/ds-canonical/skills/prototype/references/evaluation-matrix.md +141 -0
  209. package/ds-canonical/skills/prototype/references/ooux-template.md +198 -0
  210. package/ds-canonical/skills/prototype/references/proposal-template.md +229 -0
  211. package/ds-canonical/skills/scan-similar-bugs/SKILL.md +198 -0
  212. package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +159 -0
  213. package/ds-canonical/skills/story-writing/SKILL.md +122 -0
  214. package/ds-canonical/skills/story-writing/references/anatomy-standard.md +217 -0
  215. package/ds-canonical/skills/story-writing/references/category-templates.md +174 -0
  216. package/ds-canonical/skills/story-writing/references/example-selection.md +70 -0
  217. package/ds-canonical/skills/story-writing/references/self-check.md +20 -0
  218. package/ds-canonical/skills/ux-audit/SKILL.md +130 -0
  219. package/ds-canonical/skills/visual-audit/SKILL.md +245 -0
  220. package/ds-canonical/skills/visual-audit/output/.gitkeep +0 -0
  221. package/ds-canonical/skills/visual-audit/references/audit-architecture.md +100 -0
  222. package/ds-canonical/skills/visual-audit/references/visual-checklist.md +297 -0
  223. package/ds-canonical/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  224. package/package.json +9 -5
  225. package/src/components/Accordion/accordion.spec.md +114 -0
  226. package/src/components/Alert/alert.spec.md +197 -0
  227. package/src/components/AppShell/app-shell.spec.md +331 -0
  228. package/src/components/AspectRatio/aspect-ratio.spec.md +134 -0
  229. package/src/components/Avatar/avatar.spec.md +329 -0
  230. package/src/components/Badge/badge.spec.md +380 -0
  231. package/src/components/Breadcrumb/breadcrumb.spec.md +257 -0
  232. package/src/components/BulkActionBar/bulk-action-bar.spec.md +210 -0
  233. package/src/components/Button/button.spec.md +460 -0
  234. package/src/components/Calendar/calendar.spec.md +242 -0
  235. package/src/components/Carousel/carousel.spec.md +253 -0
  236. package/src/components/Chart/chart.spec.md +155 -0
  237. package/src/components/Checkbox/checkbox.spec.md +344 -0
  238. package/src/components/Chip/chip.spec.md +237 -0
  239. package/src/components/CircularProgress/circular-progress.spec.md +268 -0
  240. package/src/components/Coachmark/coachmark.spec.md +230 -0
  241. package/src/components/Combobox/combobox.spec.md +180 -0
  242. package/src/components/Command/command.spec.md +171 -0
  243. package/src/components/DataTable/data-table.spec.md +525 -0
  244. package/src/components/DateGrid/date-grid.spec.md +215 -0
  245. package/src/components/DatePicker/date-picker.spec.md +334 -0
  246. package/src/components/DescriptionList/description-list.spec.md +214 -0
  247. package/src/components/Dialog/dialog.spec.md +202 -0
  248. package/src/components/DropdownMenu/dropdown-menu.spec.md +250 -0
  249. package/src/components/Empty/empty.spec.md +214 -0
  250. package/src/components/Field/field-controls.spec.md +338 -0
  251. package/src/components/Field/field.spec.md +438 -0
  252. package/src/components/Field/form-validation.spec.md +152 -0
  253. package/src/components/FieldControlGroup/field-control-group.spec.md +176 -0
  254. package/src/components/FileItem/file-item.spec.md +467 -0
  255. package/src/components/FileUpload/file-upload.spec.md +123 -0
  256. package/src/components/FileViewer/file-viewer.spec.md +373 -0
  257. package/src/components/HoverCard/hover-card.spec.md +157 -0
  258. package/src/components/Input/input.spec.md +193 -0
  259. package/src/components/LinkInput/link-input.spec.md +130 -0
  260. package/src/components/Menu/menu-item.spec.md +290 -0
  261. package/src/components/NameCard/name-card.spec.md +171 -0
  262. package/src/components/Notice/notice.spec.md +149 -0
  263. package/src/components/NumberInput/number-input.spec.md +126 -0
  264. package/src/components/OverflowIndicator/overflow-indicator.spec.md +120 -0
  265. package/src/components/PeoplePicker/people-picker.spec.md +263 -0
  266. package/src/components/Popover/popover.spec.md +198 -0
  267. package/src/components/ProgressBar/progress-bar.spec.md +232 -0
  268. package/src/components/RadioGroup/radio-group.spec.md +141 -0
  269. package/src/components/Rating/rating.spec.md +208 -0
  270. package/src/components/ScrollArea/scroll-area.spec.md +145 -0
  271. package/src/components/SegmentedControl/segmented-control.spec.md +295 -0
  272. package/src/components/Select/select.spec.md +299 -0
  273. package/src/components/SelectMenu/select-menu.spec.md +220 -0
  274. package/src/components/SelectionControl/selection-item.spec.md +128 -0
  275. package/src/components/Separator/separator.spec.md +109 -0
  276. package/src/components/Sheet/sheet.spec.md +148 -0
  277. package/src/components/Sidebar/sidebar.spec.md +713 -0
  278. package/src/components/Skeleton/skeleton.spec.md +104 -0
  279. package/src/components/Slider/slider.spec.md +353 -0
  280. package/src/components/Steps/steps.spec.md +465 -0
  281. package/src/components/Switch/switch.spec.md +215 -0
  282. package/src/components/Tabs/tabs.spec.md +314 -0
  283. package/src/components/Tag/tag.spec.md +282 -0
  284. package/src/components/Textarea/textarea.spec.md +151 -0
  285. package/src/components/TimePicker/time-picker.spec.md +279 -0
  286. package/src/components/Toast/toast.spec.md +177 -0
  287. package/src/components/Tooltip/tooltip.spec.md +139 -0
  288. package/src/components/TreeView/tree-view.spec.md +374 -0
  289. package/src/patterns/action-bar/action-bar.spec.md +458 -0
  290. package/src/patterns/element-anatomy/element-anatomy.spec.md +215 -0
  291. package/src/patterns/element-anatomy/inline-action.spec.md +315 -0
  292. package/src/patterns/element-anatomy/item-anatomy.spec.md +1042 -0
  293. package/src/patterns/header-canonical/header-canonical.spec.md +285 -0
  294. package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +191 -0
  295. package/src/patterns/overlay-surface/overlay-surface.spec.md +428 -0
  296. package/src/patterns/resize-handle/resize-handle.spec.md +109 -0
  297. package/src/tokens/color/color.spec.md +804 -0
  298. package/src/tokens/density/density.spec.md +127 -0
  299. package/src/tokens/elevation/elevation.spec.md +81 -0
  300. package/src/tokens/layoutSpace/layoutSpace.spec.md +314 -0
  301. package/src/tokens/motion/motion.spec.md +97 -0
  302. package/src/tokens/opacity/opacity.spec.md +78 -0
  303. package/src/tokens/orphan-tokens.spec.md +117 -0
  304. package/src/tokens/radius/radius.spec.md +123 -0
  305. package/src/tokens/typography/typography.spec.md +202 -0
  306. package/src/tokens/uiSize/uiSize.spec.md +438 -0
  307. package/src/styles/preset.css +0 -31
@@ -0,0 +1,364 @@
1
+ # D6 設計原則稽核 Protocol(SSOT)
2
+
3
+ **此檔是 D6「設計原則自檢」的唯一執行 SSOT**。所有 audit skill(design-system-audit / component-quality-gate / prototype / product-ui-audit)的 D6 phase 都 chain 本檔,不重複寫邏輯。
4
+
5
+ 對齊 CLAUDE.md `# 稽核 canonical`(內含「Audit-vs-execute 分權」inline rule)。
6
+
7
+ ---
8
+
9
+ ## 為什麼有這個檔
10
+
11
+ 2026-04-21 user 發現 D6 過去只做 triage 不真 scan → 漏掉 Inline Action icon SSOT 矛盾(item-anatomy 說「統一 fg-muted」vs Tag spec 說「繼承 Tag 文字色」),跨 spec 矛盾自 2026 年初累積到被 user 透過 BTW 發現才修。
12
+
13
+ **原因**:D6 散在各 skill 裡描述為「提議討論 triage」,無統一掃描方法 → 每次 audit 的 sub-agent 沒有強制 scan 動作 → 矛盾無人發現。
14
+
15
+ **解**:本檔定義 D6 的 4 子維 + auto-vs-STOP 判斷公式 + scan 方法。一處 SSOT,所有 skill chain。
16
+
17
+ ---
18
+
19
+ ## D6 5 子維(含 scan mode 分類)
20
+
21
+ **關鍵**:5 子維依「單 item 檢」vs「跨 item 比對」vs「predicate 自測」分三類。跨 item 比對的**必走 Phase 0 全掃再判**(對齊 CLAUDE.md `# 稽核 canonical`「一致性類稽核必先全掃再判」),否則無法檢出矛盾 / 不一致。
22
+
23
+ | # | 子維 | Scan mode | 掃什麼 | 怎麼掃 |
24
+ |---|------|-----------|-------|-------|
25
+ | **D6a** | **合理性** | **per-item**(單 spec 可判)| 每條 canonical 是否世界級對照支持?有明文 rationale? | 讀 spec 找「為什麼」prose + 對照 Polaris / Material / Atlassian / Ant / Apple HIG;孤立 rule 無對照 = flag |
26
+ | **D6b** | **一致性** | **cross-inventory**(必全掃)| 同概念跨 spec / 跨元件表達 / 術語是否一致? | 必先全掃建 inventory(見下 Phase 0)→ 比對 |
27
+ | **D6c** | **無矛盾** | **cross-inventory**(必全掃)| spec↔spec / CLAUDE.md↔spec / canonical 聲明衝突 | 必先全掃 canonical concept index(見下 Phase 0)→ 比對 |
28
+ | **D6d** | **完整性** | **per-item + reference**(per spec 但要比 scope default canonical)| 原則有無覆蓋 applicable state / scope / edge case? | 單 spec 檢 + 對照 Rule B scope defaults(CLAUDE.md)|
29
+ | **D6e** | **Predicate 自測**(**new 2026-04-22**) | **predicate-internal**(對含 decision tree + example 表的 spec)| Membership drift / cap 違反 / example × world-class / empty category | 對齊 CLAUDE.md Meta-Pattern M9;4 題 coherence check(見下 D6e scan) |
30
+
31
+ ## Phase 0 — 全掃再判(cross-inventory 子維硬規則)
32
+
33
+ **D6b / D6c 跑前必先**:
34
+
35
+ ### Phase 0a — 建 token / 術語 inventory(for D6b)
36
+ ```
37
+ 1. grep 所有 spec 中的 token 名(fg-muted / foreground / neutral-hover / primary-subtle 等)
38
+ 建 {token_name: [{spec_path, line, context}]} 表
39
+ 2. grep 所有 .tsx 的 cva variants / prop literals
40
+ 建 {literal: [{component, prop_key, context}]} 表
41
+ 3. grep 所有 spec 的 prop value 宣稱
42
+ 建 {component.prop.value: {spec_line, literal, semantic}} 表
43
+ ```
44
+
45
+ ### Phase 0b — 建 canonical concept inventory(for D6c)
46
+ ```
47
+ 1. 列 CLAUDE.md + patterns/*/spec.md 所有「canonical」宣告的 concept
48
+ (dismiss canonical / overlay padding canonical / icon size canonical 等)
49
+ 2. 對每個 concept,grep 所有 spec 宣告該 concept 的段落
50
+ 建 {concept: [{spec_path, line, prose, rule}]}
51
+ 3. 這是 baseline 的 concept matrix,**沒建完不能進 Phase 1 判決**
52
+ ```
53
+
54
+ ### Phase 0 自建 inventory(scan-only)
55
+
56
+ D6b / D6c 跑前 inline grep 建 concept matrix(本檔上方 Phase 0 已展開步驟),scan-only,不判決。
57
+
58
+ **為什麼 Phase 0 非走不可**:沒 inventory 就判 consistency = 盲人摸象。典型漏抓 case:
59
+ - 只看 Tag spec 不看 item-anatomy.spec → 漏 Inline Action icon SSOT 矛盾(2026-04-21 實例)
60
+ - 只看 Dialog spec 不看 Sheet / Popover → 漏 overlay padding 跨元件不一致
61
+ - 只看一個 spec 判 token 用法 → 漏跨 spec 用錯層級
62
+
63
+ ## Phase 1 — 逐點判(per-item 子維 + cross-inventory 比對)
64
+
65
+ 基於 Phase 0 inventory,才進行:
66
+ - D6a per-item:逐 spec 檢 rationale + 世界級對照
67
+ - D6b 比對 inventory:找 token 用法不一致 / 同字 prop value 跨元件語義撞
68
+ - D6c 比對 inventory:找 concept 兩聲明**不同規定** / canonical 有 drift
69
+ - D6d per-item + 對照 scope default:單 spec 驗 coverage
70
+
71
+ ---
72
+
73
+ ## Auto-fix vs 提議(STOP)判斷公式
74
+
75
+ ### 核心判斷:**動 canonical 的 substantive meaning 與否**
76
+
77
+ | Finding 類型 | 動作 | 判斷依據 |
78
+ |--------------|------|---------|
79
+ | spec 跟 tsx / cva 不同步(tsx 是 source of truth) | **AUTO** 修 spec 對齊 tsx | tsx 是 code canonical,spec 該反映實作 |
80
+ | spec 跟 spec 用詞不一致 **但 substantive meaning 同** | **AUTO** 對齊 wording | 純表達統一,不改 meaning |
81
+ | SSOT pointer 缺 / reciprocal 缺 / dead link | **AUTO** 補 | 架構已定,機械補齊 |
82
+ | 編號 / 格式 / 排序問題(anatomy numbering / heading 順序) | **AUTO** 修 | 無 substantive 改變 |
83
+ | 命名對齊 **既有** canonical(術語 drift 修) | **AUTO** 統一 | canonical 已定 |
84
+ | 某 spec hardcoded class / px 漂移 → 用 token 名或 pointer 取代 | **AUTO** 修 | 表達層,不動 canonical |
85
+ | Rule A spec prose 移除 class name(遷到 anatomy) | **AUTO** 遷移 | 職責分離 |
86
+ | Scope default pointer 缺(該指 field-controls.spec.md 沒指) | **AUTO** 補 | SSOT 已存在 |
87
+
88
+ ---
89
+
90
+ | Finding 類型 | 動作 | 為何 STOP |
91
+ |--------------|------|----------|
92
+ | spec 聲明的原則世界級對照有疑 | **STOP 提議** | 改 substantive 需 user 拍板 |
93
+ | 跨 spec 矛盾 **兩邊都有 rationale** | **STOP 提議(擇一當 canonical)** | 哪個對?需仲裁 |
94
+ | 新增 canonical rule / 刪現有 canonical rule | **STOP 提議** | canonical scope 動 |
95
+ | 命名決策(新 prop value / 新術語)| **STOP 提議** | 命名三 test 後仍需拍板 |
96
+ | 原則 scope 擴充 / 收緊 | **STOP 提議** | governance 動 |
97
+ | 擴 SSOT 納入新 branch(例:Inline Action「colored host」新分支) | **STOP 提議** | canonical 擴張 — 2026-04-21 Inline Action icon 案例屬此 |
98
+ | Rationale 存在但疑似過時(實作已改但 rationale 沒跟) | **STOP 提議** | 是該撤 rationale 還是 revert 實作?需判斷 |
99
+
100
+ ### 核心公式
101
+
102
+ ```
103
+ 動 canonical 的 substantive meaning → STOP(提議,等 user sign-off)
104
+ 對齊 canonical / 表達統一 / 補 pointer → AUTO(直接修)
105
+ ```
106
+
107
+ **判斷 substantive 的 keyword**:
108
+ - 「canonical」「聲明」「必須」「統一規則」「SSOT」「rationale」「為什麼」「不允許」「禁止」
109
+ - 出現在 spec prose 且動到的 edit 觸及這些關鍵字 → 觸發 STOP
110
+
111
+ ---
112
+
113
+ ## Scan 方法
114
+
115
+ ### D6a 合理性 scan
116
+
117
+ ```
118
+ 對每個 .spec.md:
119
+ 1. grep 「為什麼」/「rationale」/「世界級對照」章節
120
+ 2. 找不到 = P1 flag(spec 缺 rationale)
121
+ 3. 找到但無外部對照(自立論)= P2 flag(需補世界級對照)
122
+ ```
123
+
124
+ ### D6b 一致性 scan(grep-heavy)
125
+
126
+ ```
127
+ 1. Token 用法一致性
128
+ - grep `fg-muted` / `fg-secondary` / `fg-tertiary` 在所有 spec
129
+ - 檢查是否用在對的 role(color.spec.md 定義)
130
+ - 誤用 → AUTO 修
131
+
132
+ 2. Prop value literal 跨元件
133
+ - grep 所有 `variant:` / `size:` / `mode:` 在 .tsx
134
+ - 建立 {literal: [components]} 表
135
+ - 同字跨元件 → 驗語義一致(命名三 test #3)
136
+ - 語義不一致 → STOP 提議(命名決策)
137
+
138
+ 3. 術語一致性
139
+ - 常見 drift:dismiss vs close vs dismiss vs onDismiss / onClose
140
+ - fg-muted vs fg-secondary 用對層級
141
+ ```
142
+
143
+ ### D6c 無矛盾 scan(AI 讀 spec pairs)
144
+
145
+ ```
146
+ 1. 建「canonical concept index」(從 CLAUDE.md + patterns/*/spec.md)
147
+ 2. 對每個 canonical concept,grep 所有 spec 聲明該 concept 的段落
148
+ 3. 比對:
149
+ - 同 concept 兩 spec 聲明**不同**規定 → P0 矛盾(修其一或擴 SSOT)
150
+ - 同 concept 某 spec 靜默違反 CLAUDE.md rule → P0 矛盾
151
+ - 某 spec rationale 跟 tsx 實作不符 → P1 矛盾(spec 過時或 tsx 錯)
152
+ 4. 每個 P0 矛盾 flag 前驗是否為 documented deviation(rationale 存在 → deviation ✓)
153
+ ```
154
+
155
+ ### D6d 完整性 scan
156
+
157
+ ```
158
+ 1. 對每個 .spec.md,checkpoint 是否覆蓋(applicable):
159
+ - disabled state
160
+ - loading state(async 元件)
161
+ - empty state(容器類)
162
+ - dark mode(non-scope-default 元件)
163
+ - density(non-scope-default)
164
+ - icon-only rule(interactive 元件)
165
+ - a11y 預設
166
+
167
+ 2. 缺且無 scope default pointer → flag(可能 AUTO 補 pointer or STOP 補 prose)
168
+ ```
169
+
170
+ ### D6e Predicate coherence scan(對齊 CLAUDE.md Meta-Pattern M9)
171
+
172
+ 針對含 **decision tree + example 表 / real case 表 / category 分類** 的 spec
173
+ (item-anatomy.spec.md 的 Predicate、button.spec.md 的 variant 選擇、field-controls.spec.md
174
+ 的 mode 選擇等),跑 4 題 coherence check。任一題失敗 → P0 violation(絕對不可忽略)。
175
+
176
+ ```
177
+ 1. Example → decision tree 回跑驗證:
178
+ - Parse spec 的決策樹 Q1/Q2/Q3 條件
179
+ - Parse real case 表的每個 entry 的 claim(category / primitive / size 等)
180
+ - 對每個 entry:把 context 屬性(位置 / row size / interaction 類型)丟回 decision tree
181
+ - 結果 vs claim 不一致 → P0 membership drift violation
182
+ - 典型 FP 避免:tree 條件有模糊詞(「大」/「小」),對照表內 value 明確(24 / 28)
183
+ 時,以明確值為準判斷
184
+
185
+ 2. Cap / constraint cross-check:
186
+ - grep spec 內「絕對值 X」/「≤ Y」/「必 size Z」類 constraint 句
187
+ - 對 real case 表 grep 相同欄位的所有 value
188
+ - 有 value 超出 cap → P0 violation
189
+
190
+ 3. Example × world-class benchmark(per example,非整體):
191
+ - 對 real case 表每個 entry 各取 ≥3 家世界級 DS 對照
192
+ - 我方選擇跟世界級 3 家中過半不同 → flag(可能對或可能錯)
193
+ → 查 spec 有無 rationale 解釋為何不同
194
+ → 有 rationale = deviation ✓
195
+ → 無 rationale = P1 應補 rationale(AUTO 加 pointer),或提議 revise(STOP)
196
+
197
+ 4. Empty category check:
198
+ - Decision tree 所有 category 都要有 ≥1 example
199
+ - 空 category = 概念未收斂 / predicate 未完成 → P1 flag
200
+ ```
201
+
202
+ **Phase 0 要求**:D6e 必先 grep 專案所有 `.spec.md` 找 decision tree / real case 表 /
203
+ category 分類,建 inventory 再逐個跑 4 題。不是隨機挑。
204
+
205
+ **世界級 benchmark source**(從 memory 或 CLAUDE.md M8 列表):Polaris / Material / Atlassian /
206
+ Ant Design / Carbon / Apple HIG / VS Code / Figma。對每個 example,至少查 3 家的對應
207
+ 實作名 / API / spec 段落。
208
+
209
+ **常見 FP 記憶**(2026-04-22 新增):
210
+ - decorative indicator 被誤列入 action predicate:DatePicker Calendar icon 放 Cat 1
211
+ Inline Action(實際 pointer-events-none 不可點)→ D6e 應抓出,flag 為「點了不做事
212
+ 的 icon 不屬 action predicate」
213
+ - cap 違反自 session 訂立的 cap:FileItem rich 用 Button sm(28),同 spec 說 ≤ 24 cap
214
+ → cap cross-check 應抓出
215
+ - **Cap scope 必明示 context**(2026-04-22 D6e scan 自測發現)— 預估 cap 違反前先確認 example 屬該 cap 的 context
216
+ - 例:「Row dedicated action ≤ 24 cap」只適用 Row context,Chrome corner 不受此 cap 束縛
217
+ - flag 前先 grep cap 句的 scope prefix(「Row」/「Chrome」/「Field」)再判斷
218
+ - **Benchmark 粒度匹配 predicate 粒度**(2026-04-22 D6e scan 自測發現)— per-variant / per-category predicate 需 per-variant benchmark,不是整體兜底一句
219
+ - 例:Button 5 variant 選擇 predicate 需 per-variant world-class mapping(不只 L74 整體「Material / Polaris 共識」兜底)
220
+ - flag 時區分「predicate 粒度 vs benchmark 粒度」不匹配 = P1 補 pointer
221
+ - **Overlay autoFocus canonical**(2026-04-22 新增)— Portal overlay 元件需檢 autoFocus 行為是否對齊 DS-wide canonical(body first interactive,不是 chrome close X)。詳見下方「Overlay autoFocus canonical」section。
222
+ - **Binary strict rule 震盪 FP**(2026-04-22 新增,CLAUDE.md M12):visual preference 類 rule 被寫成「必 X」或「禁 Y」時,**先驗 ≥3 世界級 DS 一致**再 flag;找得到 counter-example = variance 不是 canonical,這是 AI 最常陷的 FP。
223
+ - 例:「hover bg 必 flush 容器內邊」— Material / Polaris / Linear list row 多 flush 但非 must,Material Bottom Sheet / Polaris card-in-modal 允許 inset → 不該寫成 strict rule
224
+ - 例:「chrome close X 必 size=sm」— Dialog / Sheet sm,但 Popover 因輕量浮層用 xs 合法 → 必 per-component context 判
225
+ - **判斷公式**:strict rule 寫完前自問「我能想出一個 legal 的反例嗎?」→ 能 → relax 成「canonical 偏好 + variance 允許」,不寫 strict
226
+ - **震盪症狀**:同一概念的 rule 被 A → not A → A 糾正 = meta invariant 沒抓到,停下找 root invariant
227
+ - **Layer 確認 question**:rule 寫錯 layer(在 variance layer 糾結)是震盪主因。問「真實 invariant 在哪 layer?」通常深一層:
228
+ - Surface:「bg flush 還是 inset」(bg-edge layer,是 variance)
229
+ - Root invariant:「content 必在 bg 內有 padding」(content-vs-bg relationship,是 invariant)
230
+ - 這兩 layer 的規則彼此 orthogonal:bg 邊可以 flush 也可以 inset,**content-inside-bg padding 跟 bg 邊位置無關**,但都必要
231
+ - **AI 必自己跑此 check,不該靠 user 提醒**:rule 寫「必 / 禁」的瞬間就要觸發 M12 self-check。user 提醒第 3 次還沒 trigger = meta-loop 完全 bypass,違反「自我升級機制」
232
+ - **Markdown 表格 row 計數 FP**(2026-04-22 audit session 發現)— sub-agent 跑 CLAUDE.md 一致性 audit(Dim 15 count drift)時,若表格中間有**空行分隔**(`| **M11** | ... |` 後接空行再接 `| **M12** | ... |`),agent 可能只算到第一段 rows。實際上 markdown table 中的 blank line 是 **visual spacing**(渲染後仍是同一 table)或**table 終止**(根據 parser)— 兩種都可能被誤判。Mitigation:agent 計數前 prefer `grep -c "^| \*\*M[0-9]"` 機械式計數,不靠 visual scan。本 FP 只影響 count 報告準度,不影響 fix 結果(因 user / 主 AI 會 double-check)
233
+ - **Dim 2 SSOT dead link 只檢 heading anchor 不檢 bare file path**(2026-04-22 audit session 漏掉)— element-anatomy.spec.md dead pointer `packages/design-system/src/ELEMENT-ANATOMY.md` 從未存在,但 agent 未 flag 因為 Dim 2 regex `\.spec\.md「」` 只抓 heading-anchor pointers。裸 file-path reference 落在檢測外。**已擴 Dim 2 prompt**(見 audit-prompts.md)增加 Part B(file path existence)+ Part C(spec self-placement drift)。本 FP 類別:**doc-structural drift**(doc 寫在 impl 前,impl 換方向後 doc 未更新),audit 應對 `README.md` home governance claim vs 實際 spec 位置交叉驗證
234
+
235
+ ---
236
+
237
+ ## Report 格式
238
+
239
+ ```markdown
240
+ # D6 Principle Audit — {Scope} — {YYYY-MM-DD}
241
+
242
+ ## 執行 scope
243
+ - 子維:D6a / D6b / D6c / D6d
244
+ - 元件 scope:{all / changed / component:X}
245
+
246
+ ## AUTO-fixable findings(直接修)
247
+ ### D6a 合理性(AUTO)
248
+ - {file:line} {desc}
249
+
250
+ ### D6b 一致性(AUTO)
251
+ - ...
252
+
253
+ ### D6c 無矛盾(AUTO)
254
+ - ...
255
+
256
+ ### D6d 完整性(AUTO)
257
+ - ...
258
+
259
+ ## 提議討論(STOP,等 user sign-off)
260
+ ### 跨 canonical 矛盾需仲裁
261
+ 1. **{Concept}**:spec A 說 {X}(line),spec B 說 {Y}(line)
262
+ - 選項 A:修 A 對齊 B,因為 {reason}
263
+ - 選項 B:修 B 對齊 A,因為 {reason}
264
+ - 選項 C:擴 SSOT 納入新 branch(例如兩 host 分類)
265
+ - **我的建議**:{choice}
266
+
267
+ ### 原則本身有疑
268
+ 1. **{spec:line}** 聲稱 {claim} 但世界級對照 {evidence}
269
+ - 是否修?
270
+
271
+ ### 命名決策
272
+ 1. **{prop value collision}** → 建議改名 {X → Y}
273
+
274
+ ## Self-improvement capture(每次 audit 結束寫)
275
+ - 新發現的 FP pattern:{描述},回填到 audit-prompts.md
276
+ - 新確立的 meta-pattern:{描述},回填到 CLAUDE.md Meta-Pattern 預警
277
+ - 修完的矛盾:{list},回填到 memory `project_audit_progress`
278
+ ```
279
+
280
+ ---
281
+
282
+ ## 常見 false positive 記憶(活文件,每次 audit 回填)
283
+
284
+ **sub-agent 跑 D6 前必讀此節,避免重複過去 FP**。
285
+
286
+ ### 2026-04-21 Session 已收錄 FP
287
+
288
+ - **SSOT reciprocal 以 `##` heading 為唯一格式** → FALSE。inline prose pointer「詳見 `X.spec.md`「Y」」也是合法 reciprocal。flag 前要完整 grep target spec 找 anchor 再判。
289
+ - **「缺 dark mode section」** → FALSE,若 spec 用 semantic token(`--primary` / `--fg` 等)= 自動豁免;若有 pointer 到 color.spec.md = 豁免。
290
+ - **「缺 empty state」** → FALSE,若 spec 寫「empty 由 consumer 用 <Empty>」= 豁免。
291
+ - **「anatomy 缺 Inspector」** → 2026-04-21 revert applicable-where-meaningful → 改回 strict-by-default。但確實 props < 2 的(Separator / Skeleton / CircularProgress)有 hard rationale 豁免。
292
+ - **「ARIA / tabIndex 不對」** → FALSE,若 wrap Radix primitive(Radix 處理)= 豁免。grep import 確認。
293
+ - **「7-dim 覆蓋不足」** → 多數是 scope default 豁免(Field family pointer / Internal / wrapper),flag 前驗 scope default。
294
+
295
+ ### Meta-lesson(AI 自我提醒)
296
+
297
+ - **寫新 protocol / skill / rule 時,必反向自檢:**
298
+ - CLAUDE.md 既有 Meta-Principle(M1-M6)/ Mindset / Scope 預設 / 分權 canonical 有哪條適用?
299
+ - 若新 protocol 是 consistency-class audit → **必走 Phase 0 全掃再判**(CLAUDE.md「一致性類稽核必先全掃再判」)
300
+ - 若新 protocol 是 audit skill → **必加 Self-improvement capture** Phase F step
301
+ - **歷史**:2026-04-21 第一版 principle-audit-protocol.md 寫完未套「Phase 0 全掃」到 D6b/D6c,被 user 抓到「這也是跟一致性有關」才補。Meta-pattern:**新規則寫完,先跟既有原則 cross-check 再送出**。
302
+
303
+ ### 回填格式
304
+
305
+ 每次 audit 結束,若 sub-agent 回報「某 finding 經驗證為 FP」→ main agent 在此節追加一行:
306
+ `- **{FP pattern}** → FALSE,{豁免條件}`
307
+
308
+ ---
309
+
310
+ ## Overlay autoFocus canonical(2026-04-22)
311
+
312
+ **所有 Portal overlay**(Dialog / Sheet / Popover / Coachmark / DropdownMenu)開啟時:
313
+ - **必 avoid** focus 到 chrome close X(否則 tooltip leak bug — user-hostile,opening overlay 就彈 tooltip)
314
+ - **必 focus** body 第一個有意義互動元素(primary input / primary button),若無 → content root(overlay container)
315
+
316
+ **違反 → tooltip leak bug**(user-hostile):chrome close X 多半帶 aria-label tooltip,開 overlay 就顯示 tooltip 搶焦點,語意錯位(user 是來跟 overlay body 互動,不是關掉它)。
317
+
318
+ **D6e scan memory**:跑 D6e predicate coherence check 時,對所有 overlay 元件 spec 額外檢:
319
+ - 有無聲明 autoFocus 行為?
320
+ - 聲明是否對齊此 canonical(body first interactive,不是 chrome X)?
321
+ - Storybook 實作是否對齊 spec?
322
+
323
+ **世界級對照**:
324
+ - Radix `onOpenAutoFocus` 預設 focus 到 content root 第一個 interactive,不是 close trigger
325
+ - Material Dialog 有 `disableAutoFocus` 但預設走 first tab stop inside content
326
+ - Polaris Modal focus 到 title + tab 到 primary action,不預設 close X
327
+ - iOS sheet 開啟不 focus 到 dismiss handle
328
+
329
+ **實例**(2026-04-22 Coachmark):Coachmark 原預設 autoFocus 到 chrome close X → 開 coachmark 立即彈「關閉」tooltip,打擾 user。修法:改走 body first interactive。此類行為應 DS-wide 強制。
330
+
331
+ ---
332
+
333
+ ## Integration — 哪個 skill 在哪個 phase 跑 D6
334
+
335
+ | Skill | Phase | Scope |
336
+ |-------|-------|-------|
337
+ | `/design-system-audit` --deep | Phase 3.5d | D6 全 4 子維,全 DS scope(真 scan 而非 triage) |
338
+ | `/design-system-audit` --changed | Phase 3.5d | D6b(一致性)+ D6c(無矛盾)scope to changed files |
339
+ | `/component-quality-gate` | Phase 4.5(6 維內) | D6 scoped to 該元件 + 跨 spec pointer 涵及的 kin |
340
+ | `/prototype` | Phase 3.5d | D6 scoped to exploration code 是否牴觸 DS 原則 |
341
+ | `/product-ui-audit` | new dim(增) | D6 scoped to consumer code(檢查是否誤用 DS canonical) |
342
+
343
+ ### 使用公式(每個 skill 的 Phase 對應段落)
344
+
345
+ skill 只需寫:
346
+ ```
347
+ Phase X — D6 設計原則自檢:chain `principle-audit-protocol.md`
348
+ scope: {all / component:X / consumer_code_path}
349
+ ```
350
+
351
+ skill 不再重複 scan 方法 / 判斷表。
352
+
353
+ ---
354
+
355
+ ## 本 protocol 自己也是活文件
356
+
357
+ 每次 audit 結束,main agent 自動回填 4 類學習(對齊 CLAUDE.md `# 資訊治理 canonical` → Audit skill Phase F 節):
358
+
359
+ 1. 新 FP → 加到上方「常見 FP 記憶」
360
+ 2. 新 meta-pattern → 提議加到 CLAUDE.md `# Meta-Pattern 預警`
361
+ 3. 新 canonical SSOT 擴張 → 提議加到對應 pattern spec
362
+ 4. User 糾正 → memory `feedback_*.md`
363
+
364
+ 無新 learning 必寫 "無新 pattern"(不省略,確保 step 被執行)。
@@ -0,0 +1,175 @@
1
+ # 規則分層(8 個 home)— 完整參考
2
+
3
+ **CLAUDE.md 已留**:8 個 home 名稱清單 + decision flowchart + signal-to-noise 原則(high-level)。**本檔 own**:每個 home 的 scope 完整展開 + 現行 skill 生態 + 歷史放置案例 + 未採納的 Claude Code 能力評估。
4
+
5
+ 寫規則 / audit 規則分層時,走 CLAUDE.md 的 flowchart 先決定 home,然後查本檔對應 home 的完整 scope 描述。
6
+
7
+ ---
8
+
9
+ ## 8 個 home 的完整 scope
10
+
11
+ ### 設計規則層(DS 設計知識,按影響範圍分層)
12
+
13
+ ### Level 1 — `CLAUDE.md`(專案層跨元件設計規則 SSOT)
14
+
15
+ - 跨元件架構判斷框架(Props 命名、Family 分類、token 消費紀律)
16
+ - AI 反覆踩的**技術陷阱**(Tailwind v4 `var()`、tailwind-merge、Provider 放置、shadcn alias 回流)
17
+ - 系統級 meta 規則(命名三重 test、cva 適用範圍、Story 三層定位)
18
+ - **短指標**指向 spec 深度細節(一行連結不展開)
19
+ - **判斷法**:AI 每次執行都需要的提醒 → CLAUDE.md;查閱特定 spec 就找得到 → spec
20
+ - **不適合**:超過 5 行的對照表 / 場景列舉 / 公式推導
21
+
22
+ ### Level 2 — 元件 `spec.md`(單元件設計規則)
23
+
24
+ - 元件定位 + Layout Family 宣告(第一段必含)
25
+ - variant / size / state 的「何時用 / 不用」與理由
26
+ - 元件特有的設計決策 + do/don't 原則
27
+ - 對 cross-cutting 規則的**例外**(documented 理由)
28
+ - 指向 CLAUDE.md / pattern spec 的反向引用
29
+ - **不適合**:適用多個元件的規則(應升級到 pattern spec 或 CLAUDE.md)
30
+
31
+ ### Level 3 — Pattern `spec.md`(跨元件佈局 / 互動公式)
32
+
33
+ - 多元件共用的基礎設計規則
34
+ - pattern rationale + 公式 + token 結構
35
+ - **明列 pattern 的 consumers**
36
+ - 例:`item-anatomy.spec.md`(4-Family Model 頂層 taxonomy + Family 1+2 SSOT)
37
+ - **重要限制**:patterns/ 只收 runtime UI primitive,不收文件撰寫指南(那屬 Skill)。詳見 `packages/design-system/src/patterns/README.md` charter。
38
+
39
+ ### Level 4 — Code(`.tsx` / `.css`)
40
+
41
+ - 被強制執行的 variant type (cva)、TS 型別約束
42
+ - **不需人類判斷**的實作細節
43
+ - 行內註解解釋微妙實作決策(**不是**設計理由——那去 spec)
44
+
45
+ ### 執行與狀態層(DS 設計之外的知識)
46
+
47
+ ### Level 5 — Skill (`.claude/skills/*/SKILL.md` + `references/`)
48
+
49
+ - **Audit / 稽核協議**(如 `design-system-audit` 的 22 個 audits / `product-ui-audit` 的 6 維度檢核)
50
+ - **AI↔user 對話 protocol**(checkpoint 範本:「先不管」vs tech debt / 新 rule 提議 / 分類模糊等)
51
+ - **特定工作流 playbook**(only-when-invoked 的多步驟流程)
52
+ - **文件撰寫指南**(story-writing 等)
53
+ - **pre-merge quality gate**(component-quality-gate 等)
54
+ - **判斷法**:這條規則是否「只在某個 invoke 情境才需要」? 是 → Skill;否(每次都要)→ CLAUDE.md
55
+ - **不適合**:設計規則(放 CLAUDE.md / spec)、session 狀態(放 memory)、runtime primitive(放 patterns/)
56
+
57
+ ### Level 6 — Memory (`~/.claude/projects/.../memory/*.md`)
58
+
59
+ - **跨 session 狀態**(audit progress、tech debt 清單、決策紀錄)
60
+ - user 偏好 / 角色 / 專案 goal
61
+ - **每次 session 開啟時載入**
62
+ - **判斷法**:這是「會變化的狀態」還是「固定的規則」? state → memory;rule → CLAUDE.md/spec/skill
63
+ - **不適合**:固定規則、跑得出的資訊(git log / 現行 code 有就不用記)、user 明確「先不管」的事項
64
+
65
+ ### Level 7 — Hook (`.claude/hooks/*.sh` / `*.py`)
66
+
67
+ - **Pre/post-tool 自動化**(邊界守衛、sync check 提醒、token hygiene、import guard、charter gate)
68
+ - **判斷法**:這條規則能「機械化在 tool 執行前後自動跑」嗎? 是 → hook;否 → CLAUDE.md 或 spec
69
+ - **當前 hooks**(7 個):
70
+ - `pre_edit_spec_check.sh` — 編輯 tsx 前讀 spec
71
+ - `check_sync_update.sh` — 改 spec 後連動提醒
72
+ - `check_token_hygiene.sh` — 硬寫 shadow / shadcn alias / raw overflow 抓違規
73
+ - `block_prototype_imports.py` — 產品 code 禁 import explorations
74
+ - `enforce_home_charter.sh` — Write 到 classification-sensitive dir 時注入 charter(本 audit 設計時新增)
75
+
76
+ ### Level 8 — Slash Command (`.claude/commands/*.md`)
77
+
78
+ - **輕量 user-invokable shortcut**(單步 action,無 workflow / checkpoints)
79
+ - 跟 Skill 的差別:Skill 是多步驟 workflow + user 決策點;Command 是一次性 scaffold / 單步觸發
80
+ - **判斷法**:這是「一次性 scaffold 或單步 action」嗎? 是且**重複使用 ≥ 3 次** → Command;否 → 需要 workflow → Skill
81
+ - **當前狀態**:無 commands(評估後認為 scaffold 流程太僵化,改回用 CLAUDE.md 清單 + AI 判斷)
82
+
83
+ ---
84
+
85
+ ## 當前 skill 生態(5 skills)
86
+
87
+ | Skill | Invoke 時機 | Scope |
88
+ |-------|------------|-------|
89
+ | `design-system-audit` | 稽核 DS 本身(spec/cva/SSOT 漂移 18 audits) | design-system/ 內部 |
90
+ | `product-ui-audit` | 「audit X feature」「DS 用對了嗎」/ prototype Phase 3.5 自動 | consumer UI code 6 維檢核 |
91
+ | `prototype` | user 明言「做 prototype / MVP / 原型」 | 建 exploration candidates(Phase 3.5 強制 audit gate) |
92
+ | `delivery-handoff` | 產品 final 後「要交付 / handoff」 | 產 figma-like 交付包 |
93
+ | `component-quality-gate` | 元件即將合入 DS | 45 項 spec+code+story+ship checklist |
94
+ | `story-writing` | 寫 / 審 story | 範例選擇 + anatomy 5-story + 三方連動 |
95
+
96
+ **不走 skill 的情境**:user 日常對話「比幾個版本 / 世界級怎麼做」等模糊語,AI 先 clarify 再決定走 skill 還是直接口頭討論。
97
+
98
+ ---
99
+
100
+ ## 放哪裡 decision flowchart(CLAUDE.md 已留,這裡重述供查閱)
101
+
102
+ ```
103
+ Q1. 是設計規則嗎?(如何寫 spec / code / token / story / pattern)
104
+ → YES: 進 Level 1-4(按影響範圍 + 判斷法)
105
+ → NO: 繼續 Q2
106
+
107
+ Q2. 只在「特定 invoke 情境」才需要嗎?(audit / code review / setup 等)
108
+ → YES 且是**多步驟 workflow + user 決策點**: Skill(SKILL.md + references/)
109
+ → YES 且是**一次性單步 action**(scaffold / 單一 check): Slash Command
110
+ → NO: 繼續 Q3
111
+
112
+ Q3. 是「隨時間變化的狀態」嗎?(已完成 / 待辦 / 決策紀錄 / user 偏好)
113
+ → YES: Memory
114
+ → NO: 繼續 Q4
115
+
116
+ Q4. 能用 script「機械化自動執行」嗎?(pre/post tool)
117
+ → YES: Hook
118
+ → NO: 繼續 Q5
119
+
120
+ Q5. 是 CLAUDE.md / SKILL.md 已有項目的「深層細節」嗎?
121
+ → YES: Skill `references/*.md` 或 spec.md(視上層所在)
122
+ → NO: **不合任何 home——重新思考 scope 或 ask user**
123
+ ```
124
+
125
+ **硬輔助:README charter gate**(本 audit 新增)
126
+ 所有 classification-sensitive dir 在根層有 `README.md` 作為 charter + 「收什麼 / 不收什麼 / 新增 criteria」。`enforce_home_charter.sh` hook 在 Write 到新 subdir / flat file 時自動注入 charter,確保 AI 不憑 flowchart 記憶分類,有明確 per-dir 對照表。
127
+
128
+ ---
129
+
130
+ ## 搬動規則的雙向處理
131
+
132
+ 把規則從任一 home 搬到另一 home 時,**原位置必須留下一行指標**(「詳見 X」);反之亦然。**規則有家、也有路標**,不可只搬走不留索引。
133
+
134
+ ---
135
+
136
+ ## 歷史案例:正確 vs 錯誤放置(用於 audit / 回顧)
137
+
138
+ | 規則 | 原本想放 | 最終放 | 理由 |
139
+ |------|---------|--------|------|
140
+ | 命名三重 test | CLAUDE.md ✓ | CLAUDE.md | 每次新 variant/prop 都觸發,Level 1 |
141
+ | cva 適用範圍 | CLAUDE.md ✓ | CLAUDE.md | 寫元件 code 的 pattern 決策,Level 1 |
142
+ | 4-Family Model 頂層 taxonomy | CLAUDE.md + item-layout SSOT(舊) | `patterns/element-anatomy/element-anatomy.spec.md`(taxonomy overview)+ `patterns/element-anatomy/item-anatomy.spec.md`(F1/F2 deep)flat 並列 | 2026-04-20 refactor:folder `element-anatomy` = topic home,flat 多檔 topical pattern(overview + 具體 topic),對齊 Material / Polaris Foundations 組織法;不用 nested / 不用頂層飛地 |
143
+ | 「先不管」語意區分 | CLAUDE.md(❌ 錯放) | **`design-system-audit` Checkpoint 7** | AI↔user 對話 protocol,不是設計規則;只在 audit triage 情境需要 |
144
+ | 22 個 audits | CLAUDE.md(❌ 若放這會污染) | **`design-system-audit` skill** | 只在 `/design-system-audit` invoke 時需要 |
145
+ | Tech debt 清單 | CLAUDE.md(❌ 會過期變誤導) | **Memory** | 隨時間變化的 session 狀態 |
146
+ | Spec 寫作要交叉比對 | CLAUDE.md 或 spec 或 Hook | **Hook `check_sync_update.sh`** | 能機械化在 Edit 後自動提醒 |
147
+ | `ItemLayout` export(ghost) | 本來以為是 industry idiom | **移除,改用 `<MenuItem>` + slot components** | 實查 Material 用 `<ListItem>` / Polaris `<ResourceItem>` / Ant `<List.Item>`——都無 Layout 後綴。ItemLayout 違反「element-level 不用 layout 字」鐵律 + 不是 idiom。只是 doc 裡 ghost reference,真實 exports 是 `ItemIcon / ItemAvatar / ItemLabel / ItemSuffix / ItemInlineAction`(slot pattern)+ `MenuItem`(canonical F1) |
148
+ | Element anatomy 放哪 / item anatomy 結構 | 3 次 iteration:nested(X)→ 頂層飛地(F)→ 合併 merge(Y)→ flat topical(Z,final) | **`patterns/element-anatomy/` flat 多檔** | Z 比 X 少一層、比 Y 保 scope 純淨(taxonomy 和 deep SSOT 分檔);對齊 Material / Polaris 的 flat topical foundations 組織法 |
149
+ | Story 寫作完整指南 | CLAUDE.md(過度膨脹) / patterns/(類別錯) | **`story-writing` skill** | 文件撰寫 workflow,invoke-only 多步驟;不是 runtime primitive 所以不屬 patterns |
150
+ | 元件完成 checklist | CLAUDE.md(過度膨脹) / components/ 根目錄(破壞慣例) | **`component-quality-gate` skill** | pre-merge gate,invoke-only 多步驟;components/ 只收 PascalCase folder |
151
+ | 規則分層 scope 完整展開 | CLAUDE.md(佔 140 行) | **本檔(`design-system-audit/references/rule-placement.md`)** | governance reference,只在 audit 規則放置時查 |
152
+
153
+ ---
154
+
155
+ ## 已知但未採納的 Claude Code 能力(future-ready)
156
+
157
+ 僅供參考,**目前專案未使用**——寫新規則前先用上述 8 個 home,用盡才考慮這些。
158
+
159
+ | 能力 | 路徑 | 何時該採納 |
160
+ |------|------|-----------|
161
+ | Custom sub-agent | `.claude/agents/*.md` | 需要 persona 化的 specialized agent,且會重複使用(目前用 generic + 客製 prompt 就夠) |
162
+ | MCP server | 外部 server | 需要對接外部工具 / 資料(e.g., Figma token sync)——屬整合層,非規則放置 |
163
+ | Output style | `.claude/output-styles/*.md` | 特定場合需要自訂輸出格式(對 DS 工作無關) |
164
+ | Custom statusline | settings.json `statusLine` | 需要持續在狀態列顯示 session health(如 audit progress / 未解 tech debt 數) |
165
+ | ScheduleWakeup / CronCreate | 內建 tool | 需要 scheduled recurring task(目前無此需求) |
166
+
167
+ 採納新能力前先走:能力真的解決問題嗎? → 目前 8 個 home 是否已涵蓋?(若是 → 不加) → 採納成本 vs 收益?
168
+
169
+ ---
170
+
171
+ ## CLAUDE.md vs Skill 的 signal-to-noise 原則
172
+
173
+ - **CLAUDE.md 每次對話都載入**——每加一條規則都增加 AI 掃描成本。**只放每次都需要 signal 的 DS 規則**。
174
+ - **Skill 只在 invoke 時載入**——audit / workflow / interaction protocols 放這裡不污染每次對話。
175
+ - **不對家**:把 audit protocol 放 CLAUDE.md → 每次對話都讀 audit-only 內容 = 噪音;把 DS 規則放 Skill → audit 以外的 session 讀不到 = 遺失 signal。
@@ -0,0 +1,66 @@
1
+ # Spec.md 兩段式 chapter template(2026-05-17 codify,codex Q8 verdict (c) 兩段式)
2
+
3
+ **對齊**:Polaris 7-section component spec + Carbon Component Spec template + Material 3 component anatomy。比全寫死更適合複雜元件,比完全自由更能 audit。
4
+
5
+ ## 必填 7 維(順序固定,hook 攔缺失或嚴重漂移)
6
+
7
+ ```markdown
8
+ # <ComponentName> 設計原則
9
+
10
+ ## 1. Layout Family / scope
11
+ - Layout Family: 1 / 2 / 3 / 4(或明示「self-contained / composite」+ rationale)
12
+ - Implementation base: 基於 Radix X / 基於 cmdk / native / 自建 + 理由
13
+ - Token / pattern 消費清單(SSOT 消費 canonical)
14
+
15
+ ## 2. 何時用
16
+ - 真實業務情境(Jira / Stripe / Notion 可辨識)
17
+ - 預設使用案例(非邊緣 case)
18
+
19
+ ## 3. 何時不用
20
+ - 近親元件分界(vs SiblingX / SiblingY)
21
+ - 反向 trigger:這些情境改用 Z
22
+
23
+ ## 4. 近親分界(decision tree if multiple sibling)
24
+ - vs A:differentiate by axis-1
25
+ - vs B:differentiate by axis-2
26
+
27
+ ## 5. 尺寸 / variant / state canonical
28
+ - Size:xs / sm / md / lg(field-height / table-row 等 token 對應)
29
+ - Variant:列 cva 預設值 + 為什麼
30
+ - State:default / hover / focus / active / disabled / loading / error 各自視覺定義 + state machine 疊加組合(M5)
31
+
32
+ ## 6. 邊界案例 + a11y
33
+ - Empty / loading / error / dark mode / density / icon-only 各自處理
34
+ - ARIA roles + keyboard map(互動元件強制;純視覺 indicator 豁免明寫)
35
+ - Scope defaults 豁免清單(若適用,cite `spec-rules.md`)
36
+
37
+ ## 7. 相關 SSOT links / reciprocal pointers
38
+ - 上游 pattern / token / primitive 引用(`xxx.spec.md「HEADING」`)
39
+ - 下游 consumer 元件 list
40
+ - Reciprocal check:被本 spec link 的對方有沒回連?
41
+ ```
42
+
43
+ ## 自由 rationale(後段)— 不限格式
44
+
45
+ 每 component spec 可在 7 維後加任意「為什麼」/ historical anchor / world-class benchmark cite / RFC link / 邊界討論 — hook **不**攔此段。
46
+
47
+ 範例:
48
+ - Button.spec.md 加「Pill Layout 為什麼自建非 Family 3」rationale
49
+ - Field.spec.md 加「為什麼 block primitive 不自己變高」decision tree
50
+ - DataTable.spec.md 加 Phase 7 RFC archive
51
+
52
+ ## Hook 機械強制
53
+
54
+ **Hook**:`check_spec_chapter_canonical.sh`(待 ship)— PreToolUse Write/Edit `*.spec.md` 檢:
55
+ - 必填 7 維 heading 全在(`## 1. Layout Family` 等)
56
+ - 順序對(1 < 2 < 3 ... < 7)
57
+ - 缺任一 heading → P0 BLOCKER(可 escape:檔頭 `// @spec-template-exempt: <reason>` 例外,用 ≥ 3 家 world-class DS 對照證該 component 不適用標準 template)
58
+
59
+ **Soft warn**:7 維外的 chapter 結構不限。但若 audit Dim 15 偵測跨 spec 命名漂移(如「為什麼 block」vs「為什麼不變高」相同概念兩寫法)→ flag 統一。
60
+
61
+ ## 歷史錨點
62
+
63
+ - 2026-05-17 codex Q8 verdict:Button vs Field 章節 order 不一(Button 有「何時不用」/ Field 有「為什麼 block」rationale-heavy)→ 該兩段式
64
+ - Polaris template:https://github.com/Shopify/polaris/blob/main/polaris-react/.template/component.mdx
65
+ - Carbon Component Spec:https://carbondesignsystem.com/contributing/component-checklist/
66
+ - Material 3 anatomy:https://m3.material.io/components/<component>/specs