@qijenchen/design-system 0.1.0-beta.82 → 0.1.0-beta.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +8 -8
- package/README.md +3 -2
- package/dist/components/Alert/alert.js.map +1 -1
- package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.d.ts +1 -1
- package/dist/components/AppShell/app-shell.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.js +22 -2
- package/dist/components/AppShell/app-shell.js.map +1 -1
- package/dist/components/Avatar/avatar.d.ts.map +1 -1
- package/dist/components/Avatar/avatar.js +4 -4
- package/dist/components/Avatar/avatar.js.map +1 -1
- package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/Breadcrumb/breadcrumb.js +1 -1
- package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/Button/button.d.ts +2 -2
- package/dist/components/Button/button.d.ts.map +1 -1
- package/dist/components/Button/button.js +12 -3
- package/dist/components/Button/button.js.map +1 -1
- package/dist/components/Calendar/calendar.d.ts +13 -5
- package/dist/components/Calendar/calendar.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.js +7 -1
- package/dist/components/Calendar/calendar.js.map +1 -1
- package/dist/components/Carousel/carousel.d.ts.map +1 -1
- package/dist/components/Carousel/carousel.js +8 -3
- package/dist/components/Carousel/carousel.js.map +1 -1
- package/dist/components/Chart/chart.d.ts.map +1 -1
- package/dist/components/Chart/chart.js +1 -0
- package/dist/components/Chart/chart.js.map +1 -1
- package/dist/components/Checkbox/checkbox.d.ts +1 -1
- package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/checkbox.js +8 -4
- package/dist/components/Checkbox/checkbox.js.map +1 -1
- package/dist/components/Chip/chip.d.ts +1 -1
- package/dist/components/Chip/chip.d.ts.map +1 -1
- package/dist/components/Chip/chip.js.map +1 -1
- package/dist/components/Coachmark/coachmark.d.ts +10 -3
- package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
- package/dist/components/Coachmark/coachmark.js.map +1 -1
- package/dist/components/Combobox/combobox.d.ts +5 -1
- package/dist/components/Combobox/combobox.d.ts.map +1 -1
- package/dist/components/Combobox/combobox.js +30 -13
- package/dist/components/Combobox/combobox.js.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +53 -62
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/column-types.d.ts +10 -4
- package/dist/components/DataTable/column-types.d.ts.map +1 -1
- package/dist/components/DataTable/column-types.js.map +1 -1
- package/dist/components/DataTable/data-table-column-visibility-panel.d.ts +1 -1
- package/dist/components/DataTable/data-table-column-visibility-panel.js +183 -0
- package/dist/components/DataTable/data-table-column-visibility-panel.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-filter-panel.js +607 -0
- package/dist/components/DataTable/data-table-filter-panel.js.map +1 -0
- package/dist/components/DataTable/data-table-interaction-layer.d.ts +11 -15
- package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-interaction-layer.js +1 -3
- package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
- package/dist/components/DataTable/data-table-sort-manager.js +140 -0
- package/dist/components/DataTable/data-table-sort-manager.js.map +1 -0
- package/dist/components/DataTable/data-table.d.ts +5 -6
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +36 -15
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/filter-operators.js +140 -0
- package/dist/components/DataTable/filter-operators.js.map +1 -0
- package/dist/components/DataTable/filter-tree.js +312 -0
- package/dist/components/DataTable/filter-tree.js.map +1 -0
- package/dist/components/DataTable/index.d.ts +3 -0
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +12 -1
- package/dist/components/DataTable/index.js.map +1 -1
- package/dist/components/DataTable/lib/column-meta.js +25 -0
- package/dist/components/DataTable/lib/column-meta.js.map +1 -0
- package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
- package/dist/components/DateGrid/date-grid.js +3 -1
- package/dist/components/DateGrid/date-grid.js.map +1 -1
- package/dist/components/DatePicker/date-picker.d.ts +7 -1
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +105 -74
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/Dialog/dialog.d.ts +20 -3
- package/dist/components/Dialog/dialog.d.ts.map +1 -1
- package/dist/components/Dialog/dialog.js +38 -20
- package/dist/components/Dialog/dialog.js.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.js +3 -1
- package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
- package/dist/components/Field/field-context.d.ts +45 -5
- package/dist/components/Field/field-context.d.ts.map +1 -1
- package/dist/components/Field/field-context.js +19 -0
- package/dist/components/Field/field-context.js.map +1 -1
- package/dist/components/Field/field-edit-keys.d.ts +21 -0
- package/dist/components/Field/field-edit-keys.d.ts.map +1 -0
- package/dist/components/Field/field-edit-keys.js +19 -0
- package/dist/components/Field/field-edit-keys.js.map +1 -0
- package/dist/components/Field/field-types.d.ts +20 -1
- package/dist/components/Field/field-types.d.ts.map +1 -1
- package/dist/components/Field/field-types.js.map +1 -1
- package/dist/components/Field/field-wrapper.d.ts +3 -2
- package/dist/components/Field/field-wrapper.d.ts.map +1 -1
- package/dist/components/Field/field-wrapper.js +38 -39
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/Field/field.d.ts +2 -1
- package/dist/components/Field/field.d.ts.map +1 -1
- package/dist/components/Field/field.js.map +1 -1
- package/dist/components/FieldControlGroup/field-control-group.d.ts +1 -1
- package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
- package/dist/components/FileItem/file-item.d.ts.map +1 -1
- package/dist/components/FileItem/file-item.js +1 -1
- package/dist/components/FileItem/file-item.js.map +1 -1
- package/dist/components/FileUpload/file-upload.d.ts +1 -1
- package/dist/components/FileUpload/file-upload.js.map +1 -1
- package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
- package/dist/components/FileViewer/file-viewer.js +7 -2
- package/dist/components/FileViewer/file-viewer.js.map +1 -1
- package/dist/components/FileViewer/image-renderer.d.ts.map +1 -1
- package/dist/components/FileViewer/image-renderer.js +22 -1
- package/dist/components/FileViewer/image-renderer.js.map +1 -1
- package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
- package/dist/components/HoverCard/hover-card.js +5 -3
- package/dist/components/HoverCard/hover-card.js.map +1 -1
- package/dist/components/InlineEdit/index.d.ts +2 -0
- package/dist/components/InlineEdit/index.d.ts.map +1 -0
- package/dist/components/InlineEdit/index.js +5 -0
- package/dist/components/InlineEdit/index.js.map +1 -0
- package/dist/components/InlineEdit/inline-edit.d.ts +59 -0
- package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -0
- package/dist/components/InlineEdit/inline-edit.js +164 -0
- package/dist/components/InlineEdit/inline-edit.js.map +1 -0
- package/dist/components/Input/input.d.ts +6 -11
- package/dist/components/Input/input.d.ts.map +1 -1
- package/dist/components/Input/input.js +43 -13
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/link-input.d.ts +2 -2
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js +6 -5
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Menu/menu-item.d.ts +14 -2
- package/dist/components/Menu/menu-item.d.ts.map +1 -1
- package/dist/components/Menu/menu-item.js +25 -3
- package/dist/components/Menu/menu-item.js.map +1 -1
- package/dist/components/NumberInput/number-input.d.ts +3 -3
- package/dist/components/NumberInput/number-input.d.ts.map +1 -1
- package/dist/components/NumberInput/number-input.js +6 -5
- package/dist/components/NumberInput/number-input.js.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.js +2 -6
- package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
- package/dist/components/Pagination/pagination.js +1 -1
- package/dist/components/Pagination/pagination.js.map +1 -1
- package/dist/components/PeoplePicker/index.js +7 -1
- package/dist/components/PeoplePicker/index.js.map +1 -1
- package/dist/components/PeoplePicker/people-picker.d.ts +9 -2
- package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
- package/dist/components/PeoplePicker/people-picker.js +23 -10
- package/dist/components/PeoplePicker/people-picker.js.map +1 -1
- package/dist/components/PeoplePicker/person-display.d.ts +6 -3
- package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
- package/dist/components/PeoplePicker/person-display.js +19 -14
- package/dist/components/PeoplePicker/person-display.js.map +1 -1
- package/dist/components/Popover/popover.d.ts.map +1 -1
- package/dist/components/Popover/popover.js +3 -1
- package/dist/components/Popover/popover.js.map +1 -1
- package/dist/components/ProfileCard/profile-card.d.ts +2 -2
- package/dist/components/ProfileCard/profile-card.js +3 -3
- package/dist/components/ProfileCard/profile-card.js.map +1 -1
- package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
- package/dist/components/RadioGroup/radio-group.js +15 -9
- package/dist/components/RadioGroup/radio-group.js.map +1 -1
- package/dist/components/ScrollArea/scroll-area.d.ts +11 -1
- package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
- package/dist/components/ScrollArea/scroll-area.js +6 -3
- package/dist/components/ScrollArea/scroll-area.js.map +1 -1
- package/dist/components/Select/select.d.ts +46 -5
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +109 -28
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/SelectMenu/select-menu.d.ts +3 -1
- package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
- package/dist/components/SelectMenu/select-menu.js +8 -1
- package/dist/components/SelectMenu/select-menu.js.map +1 -1
- package/dist/components/SelectionControl/boolean-value.d.ts +11 -0
- package/dist/components/SelectionControl/boolean-value.d.ts.map +1 -0
- package/dist/components/SelectionControl/boolean-value.js +23 -0
- package/dist/components/SelectionControl/boolean-value.js.map +1 -0
- package/dist/components/SelectionControl/index.d.ts +1 -0
- package/dist/components/SelectionControl/index.d.ts.map +1 -1
- package/dist/components/SelectionControl/index.js +2 -0
- package/dist/components/SelectionControl/index.js.map +1 -1
- package/dist/components/Sheet/index.js +2 -1
- package/dist/components/Sheet/sheet.d.ts +7 -1
- package/dist/components/Sheet/sheet.d.ts.map +1 -1
- package/dist/components/Sheet/sheet.js +5 -2
- package/dist/components/Sheet/sheet.js.map +1 -1
- package/dist/components/Sidebar/sidebar.d.ts +9 -4
- package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/Sidebar/sidebar.js +8 -10
- package/dist/components/Sidebar/sidebar.js.map +1 -1
- package/dist/components/Slider/slider.d.ts.map +1 -1
- package/dist/components/Slider/slider.js.map +1 -1
- package/dist/components/Switch/switch.d.ts +6 -6
- package/dist/components/Switch/switch.d.ts.map +1 -1
- package/dist/components/Switch/switch.js +3 -2
- package/dist/components/Switch/switch.js.map +1 -1
- package/dist/components/Tabs/tabs.d.ts.map +1 -1
- package/dist/components/Tabs/tabs.js +15 -1
- package/dist/components/Tabs/tabs.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts +2 -2
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +50 -42
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
- package/dist/components/TimePicker/time-columns.js +42 -38
- package/dist/components/TimePicker/time-columns.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +8 -6
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/tooltip.js +7 -5
- package/dist/components/Tooltip/tooltip.js.map +1 -1
- package/dist/components/TreeView/tree-view.d.ts +56 -1
- package/dist/components/TreeView/tree-view.d.ts.map +1 -1
- package/dist/components/TreeView/tree-view.js +211 -12
- package/dist/components/TreeView/tree-view.js.map +1 -1
- package/dist/index.d.ts +115 -58
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +93 -108
- package/dist/index.js.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +7 -6
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
- package/dist/tokens/categorical-color.js +15 -0
- package/dist/tokens/categorical-color.js.map +1 -1
- package/dist/tokens/motion/motion.d.ts +7 -6
- package/dist/tokens/motion/motion.d.ts.map +1 -1
- package/dist/tokens/motion/motion.js +6 -6
- package/dist/tokens/motion/motion.js.map +1 -1
- package/dist/tokens/motion/overlay-motion.d.ts +19 -0
- package/dist/tokens/motion/overlay-motion.d.ts.map +1 -0
- package/dist/tokens/motion/overlay-motion.js +9 -0
- package/dist/tokens/motion/overlay-motion.js.map +1 -0
- package/dist/tokens/uiSize/icon-size.js +5 -0
- package/dist/tokens/uiSize/icon-size.js.map +1 -0
- package/ds-canonical/fork/governance.lock +37 -19
- package/ds-canonical/fork/hooks/_log-fire.sh +46 -0
- package/ds-canonical/fork/hooks/block_prototype_imports.py +15 -4
- package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +145 -13
- package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +17 -5
- package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +47 -0
- package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +27 -0
- package/ds-canonical/fork/hooks/check_field_family_invariants.sh +61 -1
- package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +28 -4
- package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +36 -0
- package/ds-canonical/fork/hooks/check_story_determinism.sh +39 -0
- package/ds-canonical/fork/hooks/check_story_invariants.sh +119 -0
- package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +29 -0
- package/ds-canonical/fork/manifest.json +20 -0
- package/ds-canonical/fork/preamble.md +22 -18
- package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +9 -3
- package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +3 -3
- package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +7 -0
- package/ds-canonical/fork/skills/performance-audit/SKILL.md +4 -2
- package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +3 -3
- package/ds-canonical/fork/skills/propose-options/SKILL.md +3 -3
- package/ds-canonical/fork/skills/prototype/SKILL.md +1 -1
- package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +2 -2
- package/ds-canonical/fork/skills/visual-audit/SKILL.md +10 -2
- package/ds-canonical/hooks/README.md +1 -1
- package/ds-canonical/hooks/block_prototype_imports.py +15 -4
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +65 -7
- package/ds-canonical/hooks/check_benchmark_citation.sh +5 -3
- package/ds-canonical/hooks/check_codex_brief_invariants.sh +28 -1
- package/ds-canonical/hooks/check_consumer_app_invariants.sh +145 -13
- package/ds-canonical/hooks/check_ds_anchor_preflight.sh +17 -5
- package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +47 -0
- package/ds-canonical/hooks/check_escape_marker_abuse.sh +27 -0
- package/ds-canonical/hooks/check_field_family_invariants.sh +61 -1
- package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +28 -4
- package/ds-canonical/hooks/check_naming_and_abstraction.sh +1 -1
- package/ds-canonical/hooks/check_opacity_token_usage.sh +36 -0
- package/ds-canonical/hooks/check_pixel_quantified_audit.sh +3 -2
- package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +6 -1
- package/ds-canonical/hooks/check_propose_without_benchmark.sh +6 -2
- package/ds-canonical/hooks/check_ssot_header_declaration.sh +55 -0
- package/ds-canonical/hooks/check_story_determinism.sh +39 -0
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +8 -7
- package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +29 -0
- package/ds-canonical/hooks/lib/_story_compile_drift.sh +1 -1
- package/ds-canonical/hooks/lib/_token_hygiene.sh +10 -1
- package/ds-canonical/hooks/stop_self_audit.sh +31 -0
- package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +24 -0
- package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +44 -0
- package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +3 -3
- package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +43 -2
- package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +112 -0
- package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +9 -2
- package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +76 -0
- package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +24 -0
- package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +27 -2
- package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +3 -1
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +41 -2
- package/ds-canonical/hooks/tests/test_check_ssot_header_declaration.sh +72 -0
- package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +76 -0
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +1 -1
- package/ds-canonical/references/build-ui-canonicals.md +2 -1
- package/ds-canonical/references/failure-class-registry.json +145 -0
- package/ds-canonical/references/governance-audit-coverage.md +33 -0
- package/ds-canonical/references/item-anatomy-recipe.md +2 -2
- package/ds-canonical/references/scenario-definition.md +6 -9
- package/ds-canonical/references/ssot-consultation.md +2 -2
- package/ds-canonical/references/ssot-index.md +5 -4
- package/ds-canonical/references/story-baseline-registry.json +8 -2
- package/ds-canonical/references/structural-token-retention.md +6 -9
- package/ds-canonical/rules/meta-patterns.md +8 -8
- package/ds-canonical/rules/self-verify.md +4 -3
- package/ds-canonical/rules/spec-rules.md +1 -1
- package/ds-canonical/rules/story-rules.md +2 -2
- package/ds-canonical/rules/ui-development.md +4 -2
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +9 -3
- package/ds-canonical/skills/code-quality-audit/SKILL.md +3 -3
- package/ds-canonical/skills/codex-collab/SKILL.md +9 -7
- package/ds-canonical/skills/codex-collab/references/brief-template.md +1 -1
- package/ds-canonical/skills/codify-principle/SKILL.md +2 -2
- package/ds-canonical/skills/component-quality-gate/SKILL.md +1 -1
- package/ds-canonical/skills/component-quality-gate/references/checklist.md +2 -2
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +57 -68
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +29 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +29 -10
- package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +21 -0
- package/ds-canonical/skills/delivery-handoff/SKILL.md +5 -0
- package/ds-canonical/skills/design-system-audit/SKILL.md +27 -26
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +13 -1
- package/ds-canonical/skills/design-system-audit/references/rule-placement.md +1 -1
- package/ds-canonical/skills/governance-health/SKILL.md +2 -1
- package/ds-canonical/skills/knowledge-prune/SKILL.md +3 -0
- package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +1 -0
- package/ds-canonical/skills/new-component/SKILL.md +7 -5
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +1 -1
- package/ds-canonical/skills/performance-audit/SKILL.md +2 -2
- package/ds-canonical/skills/product-ui-audit/SKILL.md +3 -3
- package/ds-canonical/skills/propose-options/SKILL.md +3 -3
- package/ds-canonical/skills/prototype/SKILL.md +1 -1
- package/ds-canonical/skills/scan-similar-bugs/SKILL.md +2 -2
- package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +3 -3
- package/ds-canonical/skills/story-writing/SKILL.md +3 -3
- package/ds-canonical/skills/visual-audit/SKILL.md +10 -2
- package/ds-story-manifest.json +29 -20
- package/llms-full.txt +22 -1
- package/llms.txt +5 -4
- package/package.json +7 -3
- package/src/components/Accordion/accordion.principles.stories.tsx +1 -1
- package/src/components/Accordion/accordion.stories.tsx +16 -1
- package/src/components/Alert/alert.principles.stories.tsx +1 -1
- package/src/components/Alert/alert.spec.md +8 -10
- package/src/components/Alert/alert.stories.tsx +28 -28
- package/src/components/Alert/alert.tsx +1 -1
- package/src/components/AppShell/_demo-helpers.tsx +6 -3
- package/src/components/AppShell/app-shell.spec.md +4 -4
- package/src/components/AppShell/app-shell.tsx +28 -2
- package/src/components/AspectRatio/aspect-ratio.spec.md +1 -1
- package/src/components/AspectRatio/aspect-ratio.stories.tsx +7 -89
- package/src/components/Avatar/avatar.anatomy.stories.tsx +7 -3
- package/src/components/Avatar/avatar.principles.stories.tsx +19 -15
- package/src/components/Avatar/avatar.spec.md +2 -2
- package/src/components/Avatar/avatar.stories.tsx +8 -6
- package/src/components/Avatar/avatar.tsx +13 -5
- package/src/components/Badge/badge.principles.stories.tsx +1 -1
- package/src/components/Badge/badge.spec.md +2 -0
- package/src/components/Badge/badge.stories.tsx +4 -2
- package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +6 -4
- package/src/components/Breadcrumb/breadcrumb.stories.tsx +6 -5
- package/src/components/Breadcrumb/breadcrumb.tsx +3 -2
- package/src/components/BulkActionBar/bulk-action-bar.spec.md +4 -2
- package/src/components/Button/button.principles.stories.tsx +1 -1
- package/src/components/Button/button.spec.md +2 -2
- package/src/components/Button/button.tsx +18 -3
- package/src/components/Calendar/calendar.anatomy.stories.tsx +12 -10
- package/src/components/Calendar/calendar.principles.stories.tsx +14 -6
- package/src/components/Calendar/calendar.spec.md +5 -4
- package/src/components/Calendar/calendar.stories.tsx +7 -4
- package/src/components/Calendar/calendar.tsx +26 -7
- package/src/components/Carousel/carousel.anatomy.stories.tsx +5 -4
- package/src/components/Carousel/carousel.spec.md +2 -2
- package/src/components/Carousel/carousel.tsx +11 -3
- package/src/components/Chart/chart.anatomy.stories.tsx +7 -4
- package/src/components/Chart/chart.principles.stories.tsx +1 -1
- package/src/components/Chart/chart.stories.tsx +2 -8
- package/src/components/Chart/chart.tsx +3 -0
- package/src/components/Checkbox/checkbox.anatomy.stories.tsx +28 -49
- package/src/components/Checkbox/checkbox.principles.stories.tsx +1 -1
- package/src/components/Checkbox/checkbox.spec.md +11 -26
- package/src/components/Checkbox/checkbox.stories.tsx +11 -8
- package/src/components/Checkbox/checkbox.tsx +18 -13
- package/src/components/Chip/chip.anatomy.stories.tsx +44 -24
- package/src/components/Chip/chip.principles.stories.tsx +1 -1
- package/src/components/Chip/chip.spec.md +5 -4
- package/src/components/Chip/chip.tsx +5 -1
- package/src/components/CircularProgress/circular-progress.principles.stories.tsx +7 -4
- package/src/components/CircularProgress/circular-progress.spec.md +3 -3
- package/src/components/CircularProgress/circular-progress.stories.tsx +2 -2
- package/src/components/Coachmark/coachmark.anatomy.stories.tsx +2 -2
- package/src/components/Coachmark/coachmark.principles.stories.tsx +2 -1
- package/src/components/Coachmark/coachmark.spec.md +5 -5
- package/src/components/Coachmark/coachmark.stories.tsx +3 -1
- package/src/components/Coachmark/coachmark.tsx +10 -3
- package/src/components/Combobox/combobox.anatomy.stories.tsx +2 -2
- package/src/components/Combobox/combobox.tsx +53 -19
- package/src/components/Command/command.anatomy.stories.tsx +2 -2
- package/src/components/Command/command.principles.stories.tsx +1 -1
- package/src/components/Command/command.stories.tsx +42 -10
- package/src/components/DataTable/cell-registry.tsx +86 -63
- package/src/components/DataTable/column-types.ts +10 -1
- package/src/components/DataTable/data-table-column-visibility-panel.tsx +1 -1
- package/src/components/DataTable/data-table-filter-panel.tsx +4 -1
- package/src/components/DataTable/data-table-interaction-layer.tsx +15 -19
- package/src/components/DataTable/data-table.anatomy.stories.tsx +15 -13
- package/src/components/DataTable/data-table.principles.stories.tsx +9 -9
- package/src/components/DataTable/data-table.spec.md +32 -12
- package/src/components/DataTable/data-table.stories.tsx +16 -17
- package/src/components/DataTable/data-table.tsx +103 -60
- package/src/components/DataTable/index.ts +3 -0
- package/src/components/DateGrid/date-grid.anatomy.stories.tsx +4 -4
- package/src/components/DateGrid/date-grid.principles.stories.tsx +1 -1
- package/src/components/DateGrid/date-grid.spec.md +1 -1
- package/src/components/DateGrid/date-grid.tsx +3 -1
- package/src/components/DatePicker/date-picker.anatomy.stories.tsx +8 -8
- package/src/components/DatePicker/date-picker.principles.stories.tsx +3 -3
- package/src/components/DatePicker/date-picker.spec.md +3 -3
- package/src/components/DatePicker/date-picker.stories.tsx +4 -5
- package/src/components/DatePicker/date-picker.tsx +99 -45
- package/src/components/DescriptionList/description-list.anatomy.stories.tsx +12 -10
- package/src/components/DescriptionList/description-list.principles.stories.tsx +2 -2
- package/src/components/DescriptionList/description-list.spec.md +3 -3
- package/src/components/DescriptionList/description-list.stories.tsx +7 -6
- package/src/components/Dialog/dialog.anatomy.stories.tsx +1 -0
- package/src/components/Dialog/dialog.spec.md +9 -0
- package/src/components/Dialog/dialog.stories.tsx +66 -5
- package/src/components/Dialog/dialog.tsx +60 -25
- package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
- package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +8 -6
- package/src/components/DropdownMenu/dropdown-menu.spec.md +5 -5
- package/src/components/DropdownMenu/dropdown-menu.tsx +18 -9
- package/src/components/Empty/empty.anatomy.stories.tsx +1 -1
- package/src/components/Empty/empty.spec.md +2 -2
- package/src/components/Field/field-context.ts +69 -5
- package/src/components/Field/field-controls.spec.md +62 -8
- package/src/components/Field/field-edit-keys.ts +66 -0
- package/src/components/Field/field-types.ts +58 -9
- package/src/components/Field/field-wrapper.tsx +50 -42
- package/src/components/Field/field.anatomy.stories.tsx +9 -6
- package/src/components/Field/field.spec.md +1 -1
- package/src/components/Field/field.stories.tsx +1 -1
- package/src/components/Field/field.tsx +2 -1
- package/src/components/Field/form-validation.spec.md +3 -3
- package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +6 -6
- package/src/components/FieldControlGroup/field-control-group.spec.md +9 -4
- package/src/components/FieldControlGroup/field-control-group.tsx +1 -1
- package/src/components/FileItem/file-item.anatomy.stories.tsx +1 -1
- package/src/components/FileItem/file-item.spec.md +14 -8
- package/src/components/FileItem/file-item.stories.tsx +36 -25
- package/src/components/FileItem/file-item.tsx +8 -6
- package/src/components/FileUpload/file-upload.anatomy.stories.tsx +6 -6
- package/src/components/FileUpload/file-upload.principles.stories.tsx +5 -5
- package/src/components/FileUpload/file-upload.spec.md +1 -1
- package/src/components/FileUpload/file-upload.tsx +1 -1
- package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +4 -3
- package/src/components/FileViewer/file-viewer.principles.stories.tsx +3 -3
- package/src/components/FileViewer/file-viewer.spec.md +30 -12
- package/src/components/FileViewer/file-viewer.stories.tsx +1 -2
- package/src/components/FileViewer/file-viewer.tsx +12 -4
- package/src/components/FileViewer/image-renderer.tsx +35 -7
- package/src/components/HoverCard/hover-card.anatomy.stories.tsx +6 -2
- package/src/components/HoverCard/hover-card.principles.stories.tsx +6 -3
- package/src/components/HoverCard/hover-card.spec.md +5 -5
- package/src/components/HoverCard/hover-card.stories.tsx +16 -16
- package/src/components/HoverCard/hover-card.tsx +5 -3
- package/src/components/InlineEdit/index.ts +5 -0
- package/src/components/InlineEdit/inline-edit.spec.md +149 -0
- package/src/components/InlineEdit/inline-edit.stories.tsx +246 -0
- package/src/components/InlineEdit/inline-edit.tsx +287 -0
- package/src/components/Input/input.anatomy.stories.tsx +8 -7
- package/src/components/Input/input.principles.stories.tsx +2 -12
- package/src/components/Input/input.spec.md +13 -18
- package/src/components/Input/input.tsx +69 -22
- package/src/components/LinkInput/link-input.anatomy.stories.tsx +1 -1
- package/src/components/LinkInput/link-input.principles.stories.tsx +2 -2
- package/src/components/LinkInput/link-input.tsx +11 -10
- package/src/components/Menu/menu-item.anatomy.stories.tsx +3 -3
- package/src/components/Menu/menu-item.principles.stories.tsx +1 -1
- package/src/components/Menu/menu-item.spec.md +22 -15
- package/src/components/Menu/menu-item.stories.tsx +39 -11
- package/src/components/Menu/menu-item.tsx +38 -4
- package/src/components/Notice/notice.principles.stories.tsx +1 -1
- package/src/components/Notice/notice.spec.md +16 -3
- package/src/components/NumberInput/number-input.anatomy.stories.tsx +3 -3
- package/src/components/NumberInput/number-input.principles.stories.tsx +1 -1
- package/src/components/NumberInput/number-input.spec.md +4 -4
- package/src/components/NumberInput/number-input.tsx +19 -12
- package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +10 -8
- package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +3 -3
- package/src/components/OverflowIndicator/overflow-indicator.spec.md +4 -2
- package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +71 -63
- package/src/components/OverflowIndicator/overflow-indicator.tsx +9 -8
- package/src/components/Pagination/pagination.spec.md +1 -1
- package/src/components/Pagination/pagination.stories.tsx +2 -6
- package/src/components/Pagination/pagination.tsx +1 -1
- package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +4 -4
- package/src/components/PeoplePicker/people-picker.principles.stories.tsx +2 -2
- package/src/components/PeoplePicker/people-picker.spec.md +6 -6
- package/src/components/PeoplePicker/people-picker.tsx +56 -16
- package/src/components/PeoplePicker/person-display.tsx +32 -16
- package/src/components/Popover/popover.anatomy.stories.tsx +2 -2
- package/src/components/Popover/popover.tsx +3 -1
- package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +12 -23
- package/src/components/ProfileCard/profile-card.spec.md +3 -3
- package/src/components/ProfileCard/profile-card.tsx +6 -6
- package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +3 -1
- package/src/components/ProgressBar/progress-bar.principles.stories.tsx +1 -1
- package/src/components/ProgressBar/progress-bar.stories.tsx +50 -42
- package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +10 -28
- package/src/components/RadioGroup/radio-group.stories.tsx +29 -32
- package/src/components/RadioGroup/radio-group.tsx +41 -15
- package/src/components/Rating/rating.spec.md +11 -3
- package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.principles.stories.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.spec.md +7 -3
- package/src/components/ScrollArea/scroll-area.stories.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.tsx +17 -4
- package/src/components/Select/select.anatomy.stories.tsx +3 -3
- package/src/components/Select/select.spec.md +27 -17
- package/src/components/Select/select.stories.tsx +33 -0
- package/src/components/Select/select.tsx +190 -36
- package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +4 -4
- package/src/components/SelectMenu/select-menu.spec.md +15 -7
- package/src/components/SelectMenu/select-menu.tsx +16 -3
- package/src/components/SelectionControl/boolean-value.tsx +39 -0
- package/src/components/SelectionControl/index.ts +1 -0
- package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +2 -2
- package/src/components/SelectionControl/selection-item.principles.stories.tsx +2 -2
- package/src/components/SelectionControl/selection-item.spec.md +3 -3
- package/src/components/SelectionControl/selection-item.stories.tsx +3 -3
- package/src/components/Separator/separator.spec.md +2 -2
- package/src/components/Separator/separator.stories.tsx +6 -27
- package/src/components/Sheet/sheet.anatomy.stories.tsx +1 -1
- package/src/components/Sheet/sheet.principles.stories.tsx +1 -1
- package/src/components/Sheet/sheet.spec.md +2 -2
- package/src/components/Sheet/sheet.tsx +9 -5
- package/src/components/Sidebar/sidebar.anatomy.stories.tsx +16 -12
- package/src/components/Sidebar/sidebar.principles.stories.tsx +10 -8
- package/src/components/Sidebar/sidebar.spec.md +13 -15
- package/src/components/Sidebar/sidebar.stories.tsx +8 -7
- package/src/components/Sidebar/sidebar.tsx +37 -25
- package/src/components/Skeleton/skeleton.stories.tsx +4 -11
- package/src/components/Slider/slider.anatomy.stories.tsx +3 -3
- package/src/components/Slider/slider.principles.stories.tsx +2 -2
- package/src/components/Slider/slider.spec.md +5 -5
- package/src/components/Slider/slider.tsx +3 -1
- package/src/components/Steps/steps.anatomy.stories.tsx +4 -4
- package/src/components/Steps/steps.principles.stories.tsx +1 -1
- package/src/components/Steps/steps.spec.md +1 -1
- package/src/components/Switch/switch.anatomy.stories.tsx +7 -7
- package/src/components/Switch/switch.principles.stories.tsx +4 -4
- package/src/components/Switch/switch.spec.md +8 -8
- package/src/components/Switch/switch.stories.tsx +9 -24
- package/src/components/Switch/switch.tsx +17 -13
- package/src/components/Tabs/tabs.anatomy.stories.tsx +10 -7
- package/src/components/Tabs/tabs.spec.md +1 -1
- package/src/components/Tabs/tabs.tsx +21 -1
- package/src/components/Textarea/textarea.anatomy.stories.tsx +1 -1
- package/src/components/Textarea/textarea.principles.stories.tsx +1 -1
- package/src/components/Textarea/textarea.spec.md +4 -4
- package/src/components/Textarea/textarea.tsx +72 -46
- package/src/components/TimePicker/time-columns.tsx +6 -2
- package/src/components/TimePicker/time-picker.principles.stories.tsx +1 -1
- package/src/components/TimePicker/time-picker.spec.md +3 -3
- package/src/components/TimePicker/time-picker.tsx +16 -10
- package/src/components/Toast/toast.stories.tsx +7 -4
- package/src/components/Tooltip/tooltip.anatomy.stories.tsx +4 -4
- package/src/components/Tooltip/tooltip.principles.stories.tsx +3 -3
- package/src/components/Tooltip/tooltip.spec.md +1 -1
- package/src/components/Tooltip/tooltip.stories.tsx +4 -39
- package/src/components/Tooltip/tooltip.tsx +8 -6
- package/src/components/TreeView/tree-view.anatomy.stories.tsx +6 -3
- package/src/components/TreeView/tree-view.spec.md +42 -11
- package/src/components/TreeView/tree-view.stories.tsx +1 -0
- package/src/components/TreeView/tree-view.tsx +322 -17
- package/src/index.ts +584 -60
- package/src/patterns/action-bar/action-bar.spec.md +9 -0
- package/src/patterns/action-bar/action-bar.stories.tsx +6 -3
- package/src/patterns/element-anatomy/inline-action.spec.md +2 -0
- package/src/patterns/element-anatomy/item-anatomy.spec.md +14 -5
- package/src/patterns/element-anatomy/item-anatomy.stories.tsx +6 -4
- package/src/patterns/element-anatomy/item-anatomy.tsx +7 -6
- package/src/patterns/header-canonical/header-canonical.spec.md +5 -4
- package/src/patterns/overlay-surface/overlay-surface.spec.md +22 -1
- package/src/styles/tokens.css +3 -0
- package/src/tokens/README.md +1 -1
- package/src/tokens/color/color.spec.md +3 -3
- package/src/tokens/color/color.stories.tsx +3 -3
- package/src/tokens/density/density.stories.tsx +16 -3
- package/src/tokens/layoutSpace/layoutSpace.spec.md +3 -1
- package/src/tokens/motion/motion.css +33 -21
- package/src/tokens/motion/motion.spec.md +32 -15
- package/src/tokens/motion/motion.stories.tsx +58 -5
- package/src/tokens/motion/motion.ts +7 -6
- package/src/tokens/motion/overlay-motion.ts +26 -0
- package/src/tokens/orphan-tokens.spec.md +4 -4
- package/src/tokens/token-system.spec.md +1 -0
- package/src/tokens/uiSize/uiSize.spec.md +1 -1
- package/src/tokens/uiSize/uiSize.stories.tsx +4 -2
- package/src/tokens/utility-registry.json +160 -23
|
@@ -55,6 +55,12 @@ description: Batch-end-verify rhythm + parallel tool batch + user-listed N-rule
|
|
|
55
55
|
- 漏 N 條中第 K 條當「做完」report
|
|
56
56
|
- 改寫 user wording 為自己 paraphrase(verbatim 保留)
|
|
57
57
|
|
|
58
|
+
**Sweep-first, edit-second(2026-07-07 治理進化軌道 2 codify)**:任一 fix 屬「跨切面決策」
|
|
59
|
+
(改名 / 詞彙統一 / 規則性改動,可寫成 grep 謂詞者)→ **先跑謂詞產出「sweep manifest」**
|
|
60
|
+
(grep 指令 + 全庫命中清單,artifact 化),照清單做完、驗證清單歸零,才算該 fix 完成。
|
|
61
|
+
**禁**「先改直覺想到的檔、稽核抓漏再補」(anchor:2026-07-07 meta 詞彙統一三波 11→16→9 檔,
|
|
62
|
+
規則在散文裡 → 三輪才收斂;寫成謂詞後一個 grep 掃平)。
|
|
63
|
+
|
|
58
64
|
### Phase 1 — Parallel tool batch(原 M32(d))
|
|
59
65
|
|
|
60
66
|
Read / Grep / Glob 多檔需求 → **single message multi-tool-call**:
|
|
@@ -95,7 +101,7 @@ Read / Grep / Glob 多檔需求 → **single message multi-tool-call**:
|
|
|
95
101
|
```bash
|
|
96
102
|
npx tsc -b # type
|
|
97
103
|
npm run hooks:test # invariant
|
|
98
|
-
node scripts/visual-audit
|
|
104
|
+
node scripts/visual-audit.mjs --scope=changed # pixel-quantified per M32(a)(或 --scope=component:<X>)
|
|
99
105
|
```
|
|
100
106
|
|
|
101
107
|
**MUST-ALL re-check**(per Phase 0 checklist):
|
|
@@ -139,11 +145,11 @@ node scripts/visual-audit-<target>.mjs # pixel-quantified per M32(a)
|
|
|
139
145
|
| `/visual-audit` | 單次視覺對齊 | Phase 3 sub-step,本 skill 包它 |
|
|
140
146
|
| `/component-quality-gate` | stakeholder gate | 不重疊(stakeholder vs daily bug fix) |
|
|
141
147
|
| `stop_self_audit.sh`(hook) | claim-verify gap 攔 | 本 skill Phase 3 是 active side;hook 是 passive trip-wire |
|
|
142
|
-
| `check_pixel_quantified_audit.sh`(hook) | M32(a) audit script 必 pixel | 本 skill Phase 3 跑該 audit |
|
|
148
|
+
| `check_pixel_quantified_audit.sh`(hook) | M32(a) audit script(`scripts/visual-audit*.mjs`,canonical = `visual-audit.mjs`)必 pixel | 本 skill Phase 3 跑該 audit |
|
|
143
149
|
|
|
144
150
|
**3 層 防線**:
|
|
145
151
|
- **本 skill**(active workflow):MUST-ALL checklist + batch-end-verify rhythm
|
|
146
|
-
- **stop_self_audit.sh
|
|
152
|
+
- **stop_self_audit.sh**(passive hook,claim-verify gap,BLOCKER)+ **check_codex_collab_5step.sh**(passive hook,codex-collab commit 缺 cite+verify+verdict marker,P1 soft stderr 不 block)
|
|
147
153
|
- **M20 / M32(a)**(meta-rule):上游 invariant
|
|
148
154
|
|
|
149
155
|
---
|
|
@@ -16,7 +16,7 @@ Scope:**tsx / ts code hygiene**,跟 design canonical 正交。
|
|
|
16
16
|
| # | Check | Severity | 如何判定 |
|
|
17
17
|
|---|-------|---------|---------|
|
|
18
18
|
| 1 | `any` 使用 | P0 | grep `: any` / `as any` / `<any>` / `any[]` / `Record<X, any>`;支援 `// any-allow: {rationale}` 逃生口(同行或上一行) |
|
|
19
|
-
| 2 | File size(.tsx)| P0 > 800 / P1 > 500 | `wc -l`;budget 500 / transition cap 800
|
|
19
|
+
| 2 | File size(.tsx)| P0 > 800 / P1 > 500 | `wc -l`;budget 500 / transition cap 800(tsx SSOT = `scripts/code-quality-audit.mjs:36-37` + `lib/_code_quality.sh`;`check_file_size_budget.sh` 僅管治理 md,數字精神一致非同一 policy)|
|
|
20
20
|
| 3 | Long function | P1 > 80 行 | naive:`function`/`const` 宣告到 matching `}` indent 行距 |
|
|
21
21
|
| 4 | Dead export | P1 | `export` 名稱在其他 src/ 檔無出現;exempt `*Props/Options/Config/Args/Context/Variants/Value` 型別 API 慣例 |
|
|
22
22
|
| 5 | Circular dep | P0 | DFS import graph,找 cycle |
|
|
@@ -54,10 +54,10 @@ Scope:**tsx / ts code hygiene**,跟 design canonical 正交。
|
|
|
54
54
|
| `/design-system-audit` Dim 27 | `--deep` 必 chain 本 skill scope=all |
|
|
55
55
|
| `/component-quality-gate` Ship | chain 本 skill scope=component:{Name} |
|
|
56
56
|
| `/new-component` Phase 4.5 | 元件建完必跑 scope=component:{Name} |
|
|
57
|
-
| Hook `
|
|
57
|
+
| Hook `post_edit_dispatcher.sh` → `lib/_code_quality.sh` | PostToolUse Edit/Write on src/ — 只跑 any + file-size(quick);原 check_code_quality.sh folded(2026-05-13 dispatcher consolidation)|
|
|
58
58
|
|
|
59
59
|
## References
|
|
60
60
|
|
|
61
61
|
- `scripts/code-quality-audit.mjs` — 實作
|
|
62
|
-
- `.claude/hooks/
|
|
62
|
+
- `.claude/hooks/lib/_code_quality.sh`(經 `post_edit_dispatcher.sh` chain)— per-edit lite check
|
|
63
63
|
- 相關:token 防線 `lib/_token_hygiene.sh` + `check_opacity_token_usage.sh`(正交 — token 紀律 vs code 紀律)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: codex-collab
|
|
3
|
-
description: Codex dual-track collab for visual/SSOT/canonical decisions. Claude own → codex own → 比稿 synthesize(永遠 3-step,不 pass-through)。Local `codex exec` 為主 transport(地端);GitHub PR comment 為 fallback。Queue SSOT `.claude/memory/codex-brief-queue.jsonl`。Invoke when user asks「跟 codex 討論 / 比稿 /
|
|
3
|
+
description: Codex dual-track collab for visual/SSOT/canonical decisions. Claude own → codex own → 比稿 synthesize(永遠 3-step,不 pass-through)。Local `codex exec` 為主 transport(地端);GitHub PR comment 為 fallback。Queue SSOT `.claude/memory/codex-brief-queue.jsonl`。Invoke when user asks「跟 codex 討論 / 比稿 / 確認 / 2nd opinion / dual-track / 不打折 / 不省工」.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Codex Collaboration Workflow
|
|
@@ -16,7 +16,7 @@ description: Codex dual-track collab for visual/SSOT/canonical decisions. Claude
|
|
|
16
16
|
| 對 user 負責 | YES(最終結論由我 report) | NO(透過我轉述) |
|
|
17
17
|
| Benchmark cite | M22 mandate | 也須 cite source(我 enforce) |
|
|
18
18
|
|
|
19
|
-
**核心原則**:Codex 不直接 commit。所有結論由 Claude 收斂、跑完 M1-
|
|
19
|
+
**核心原則**:Codex 不直接 commit。所有結論由 Claude 收斂、跑完 M1-M32 自檢、user approve 後由我落地。
|
|
20
20
|
|
|
21
21
|
## ⚠️ Step 0 入口 gate(2026-05-10 加,fix auto-fire anti-pattern)
|
|
22
22
|
|
|
@@ -39,6 +39,8 @@ which codex 2>/dev/null && codex --version 2>/dev/null # 2 Globa
|
|
|
39
39
|
ls -la ~/.codex/auth.json # 3 Auth(sanity)
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
+
**Freshness gate(2026-07-10,補 deep-audit B.0 以外路徑)**:dispatch 前必跑 `node scripts/check-codex-freshness.mjs`(離線可 `--offline`)— CLI 落後自動升級、model pin 禁、effort = probe top。
|
|
43
|
+
|
|
42
44
|
**Decision**:1 ✅ → local CLI(canonical per `references/transport.md:36-40`)/ 1 ❌ + 2 ✅ → global / 1+2 ❌ + 3 ✅ → `npm install`(`@openai/codex` 已 npm dep)/ 全 ❌ → 報 user。**禁 fallback Explore agent 當 codex**(M31 違反:Explore 同模型,不滿足 dual-track 第 2 bias)。
|
|
43
45
|
|
|
44
46
|
**Anti-pattern**:`which codex` 失敗就斷言 unreachable → 嘗試 sudo install / 繞 M28 開 PR / Explore 替身。詳 `.claude/memory/feedback_codex_local_transport_node_modules.md`。
|
|
@@ -51,7 +53,7 @@ ls -la ~/.codex/auth.json # 3 Auth(
|
|
|
51
53
|
|
|
52
54
|
**User 原話 SSOT**(2026-05-15):「也要告訴他我的原話,讓他也能有機會解讀我的原話 ... 說不定codex在解讀別人的問題比你還有慧根 ... 請你在infra上避免你下次又在局限codex發現問題的能力」
|
|
53
55
|
|
|
54
|
-
**Why**:Paraphrase 過濾 user 細節 / 加 Claude 偏見 / frame 問題 → codex 只能在 Claude 框架答 surgical fix → root cause 沒抓到。錨例 2026-05-15:I1 placeholder ellipsis + I3 overflow 兩 bug user 提 2-3 次,每次送 paraphrase → 冰山修。Hook `check_codex_brief_verbatim.sh`(未實作;verbatim-relay `## User 原話` heading 檢查無 write-time hook — live `check_codex_brief_invariants.sh` 只 cover 全盤閱讀/triple-verify/禁抽樣/禁列檔 audit-flow invariants,不涵蓋此 verbatim-relay,改靠本 Step 0.05 mindset enforcement)。
|
|
56
|
+
**Why**:Paraphrase 過濾 user 細節 / 加 Claude 偏見 / frame 問題 → codex 只能在 Claude 框架答 surgical fix → root cause 沒抓到。錨例 2026-05-15:I1 placeholder ellipsis + I3 overflow 兩 bug user 提 2-3 次,每次送 paraphrase → 冰山修。Hook `check_codex_brief_verbatim.sh`(未實作;verbatim-relay `## User 原話` heading 檢查無 write-time hook — live `check_codex_brief_invariants.sh` 只 cover 全盤閱讀/triple-verify/禁抽樣/禁列檔 + 輸入對等(2026-07-10 加)audit-flow invariants,不涵蓋此 verbatim-relay,改靠本 Step 0.05 mindset enforcement)。
|
|
55
57
|
|
|
56
58
|
## ⚠️ M31 Universal 5-step canonical(2026-05-10 user directive)
|
|
57
59
|
|
|
@@ -87,7 +89,7 @@ ls -la ~/.codex/auth.json # 3 Auth(
|
|
|
87
89
|
明確 trigger(滿足任一才 invoke):
|
|
88
90
|
1. **User 明確要求**:「跟 codex 討論 X」/「與 codex 確認」/「let's get codex's take on X」
|
|
89
91
|
2. **Claude 自認 stuck**:investigate root cause 後仍不確定 / 多 hypothesis 沒 evidence 收斂 / 跨 framework 不熟悉(eg. Windows-specific bug 但本地是 Linux)
|
|
90
|
-
3. **Deep audit
|
|
92
|
+
3. **Deep audit**:走 `/deep-audit-cross-codex` Phase B(codex 同流程稽核 + 比稿;audit 是 explicit benchmark 場景)
|
|
91
93
|
4. **Cross-component canonical 訂立**(M8 benchmark 後)需獨立 reviewer
|
|
92
94
|
|
|
93
95
|
**禁止 invoke**:
|
|
@@ -139,8 +141,8 @@ target PR:當前 working branch 的 PR(`mcp__github__list_pull_requests` 找到
|
|
|
139
141
|
|
|
140
142
|
**Queue 跨 session 持久化(2026-05-08 user 拍板)**:
|
|
141
143
|
- SSOT:`.claude/memory/codex-brief-queue.jsonl`,JSONL 一行一 brief
|
|
142
|
-
- Schema:`{ id, url, topic, sentAt, status, followupCount, lastFollowupAt?, repliedAt?, deferredAt?, deferReason?, planRef?, queuedAfter? }` — status ∈ `pending` (active 等 reply 可 auto-followup) / `deferred` (user 明示「之後再/晚點/先放著」**不 auto-followup**,等 explicit re-invoke 轉 pending)/ `replied` / `exhausted`
|
|
143
|
-
-
|
|
144
|
+
- Schema:`{ id, url, topic, sentAt, status, followupCount, lastFollowupAt?, repliedAt?, deferredAt?, deferReason?, planRef?, queuedAfter? }` — status ∈ `pending` (active 等 reply 可 auto-followup) / `deferred` (user 明示「之後再/晚點/先放著」**不 auto-followup**,等 explicit re-invoke 轉 pending)/ `replied` / `exhausted` / `drafted`(草擬未送)/ `stale-superseded`(被後續 round 取代)
|
|
145
|
+
- **本 skill invoke 時必讀**(SKILL 載入掃 queue 找 pending resume tracking;`deferred` 不送 followup;無 session-start 機械接線)
|
|
144
146
|
- 事件:send brief = append;reply 來 = `replied` + repliedAt + unblock queued;followup auto = ++count + lastFollowupAt;3 round 無 reply = `exhausted` + handoff prompt;user defer trigger = `deferred` + deferredAt + deferReason + planRef
|
|
145
147
|
- TodoWrite 仍用(session-scoped 視覺呈現),但 ground truth 在此 file
|
|
146
148
|
|
|
@@ -246,4 +248,4 @@ PR comment:`@codex 結論已 land at <commit>. 感謝 review.`
|
|
|
246
248
|
|
|
247
249
|
## Deep Audit 整合 + Cross-session persistence
|
|
248
250
|
|
|
249
|
-
`/design-system-audit --deep` Phase 4.5
|
|
251
|
+
Deep audit 的 codex 二審走獨立 `/deep-audit-cross-codex` skill Phase B(codex 同流程稽核 + 比稿辯論;`/design-system-audit --deep` Phase 4.5 現為 governance sprawl check chain `/knowledge-prune`,不 invoke 本 skill)。新 session user 說「跟 codex 討論」→ 必查本 SKILL.md 按 Step 0-7 走;CLAUDE.md 任務導航表已 anchor;**禁憑記憶簡化流程**。
|
|
@@ -38,7 +38,7 @@ N. <SSOT 是否該抽到更上層 primitive?>
|
|
|
38
38
|
- 必產 3-column cite table(claim / path:line / reasoning)
|
|
39
39
|
|
|
40
40
|
## 🚨 三 invariant — 2026-05-23 user 永久 directive(缺一 = brief 不合格)
|
|
41
|
-
1. **全盤閱讀全部 source**(CLAUDE.md / 31 active M-rules / 5 rules/*.md /
|
|
41
|
+
1. **全盤閱讀全部 source**(CLAUDE.md / 31 active M-rules / 5 rules/*.md / 91 audit dims SKILL.md / 全部 spec.md / 全部 stories / 全部 components / tokens / patterns / hooks / 全部 memory files / planning),**禁憑記憶**(spec/story/component/memory 數量隨時變動,故不硬編數字 — 一律「全部」;M-rule / audit-dim 數由 sync-governance-counters 機械守住)
|
|
42
42
|
2. **Triple-verify per finding**:(a) grep DS-wide 確認 pattern 存在 (b) Read 對應 spec.md / tsx 確認 problem 真存在 (c) 對照既有 canonical 確認非 documented exception。任一 NO → 自動撤回,**禁無病呻吟**
|
|
43
43
|
3. **禁抽樣** — DS-wide ALL files 全掃,context 不夠拆 stage 全跑完;sub-agent admission「I sampled / spot-check / representative」= audit incomplete reject
|
|
44
44
|
```
|
|
@@ -95,7 +95,7 @@ Per layer 一個 commit:
|
|
|
95
95
|
- 跳過的 layer + rationale: {if any}
|
|
96
96
|
```
|
|
97
97
|
|
|
98
|
-
更新 `.claude/logs/codified-principles.jsonl` log:
|
|
98
|
+
更新 `.claude/logs/codified-principles.jsonl` log(lazy-create on first run — 檔案不存在時本步驟建立它;截至 2026-07-10 尚未有 run 建檔):
|
|
99
99
|
```json
|
|
100
100
|
{"date":"2026-04-26", "principle":"...", "scope":"...", "layers":["ssot","hook","audit","scaffold","memory"], "commits":[...]}
|
|
101
101
|
```
|
|
@@ -128,7 +128,7 @@ User 親自確認 scope / type / affected homes 是否正確,禁 AI 單方面決
|
|
|
128
128
|
## References
|
|
129
129
|
|
|
130
130
|
- `~/.../memory/MEMORY.md` — index of codified principles
|
|
131
|
-
- `.claude/logs/codified-principles.jsonl` — execution log
|
|
131
|
+
- `.claude/logs/codified-principles.jsonl` — execution log(lazy-create on first run,見 Phase 7)
|
|
132
132
|
- CLAUDE.md `# 治理 canonical` 8-home — home 識別 rules
|
|
133
133
|
- CLAUDE.md `# Meta-Pattern 預警` M14 / M19 — 上游 pipeline rules
|
|
134
134
|
|
|
@@ -68,7 +68,7 @@ cva `defaultVariants` 異動 → 強制 grep 該元件所有檔案確認三方
|
|
|
68
68
|
|
|
69
69
|
**執行步驟**:
|
|
70
70
|
|
|
71
|
-
1. `npm run visual-audit -- --scope=component:{Name}`(D5 Layer A:WCAG / 幾何 assertion / retina
|
|
71
|
+
1. `npm run visual-audit -- --scope=component:{Name}`(D5 Layer A:WCAG / 幾何 assertion / 1x snapshot,`--retina` opt-in debug)
|
|
72
72
|
2. Layer A exit code != 0 → 停下修到 0
|
|
73
73
|
3. Chain `/visual-audit`(D5 Layer B):讀 `snapshots/{Name}-*.png` 做 AI judgement
|
|
74
74
|
4. Chain `/performance-audit --scope=component:{Name}`(D3)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# 元件完成 Checklist(完整
|
|
1
|
+
# 元件完成 Checklist(完整 35 項)
|
|
2
2
|
|
|
3
3
|
每個元件在進入 design-system 前必須逐項對照。這是品質閘門,不可跳過。
|
|
4
4
|
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
## Phase 4 — Ship(上線前)
|
|
59
59
|
|
|
60
60
|
- [ ] `npm run storybook` 本地確認所有 stories 正常渲染
|
|
61
|
-
- [ ] `npx tsc
|
|
61
|
+
- [ ] `npx tsc -b` 無錯(**禁 `--noEmit`**,root tsconfig `files: []` silent pass;型別 surface 改動加跑 `npm run build:lib`,對齊 `.claude/rules/self-verify.md` Post-edit)
|
|
62
62
|
- [ ] Import 路徑正確(`@/design-system/...`)
|
|
63
63
|
- [ ] 若為 internal primitive 或 shadcn passthrough,分類標註正確
|
|
64
64
|
|
|
@@ -6,7 +6,7 @@ arguments: scope?=full|changed focus?=「ssot|visual|behavior|all」
|
|
|
6
6
|
|
|
7
7
|
# Deep Audit Cross-Codex — 雙 model adversarial 完整 DS 稽核
|
|
8
8
|
|
|
9
|
-
上游 context / 框架(SSOT integrity invariant + 生態位 + canonical 全繼承)+ user-verbatim directives(2026-05-18 + 2026-05-29)+
|
|
9
|
+
上游 context / 框架(SSOT integrity invariant + 生態位 + canonical 全繼承)+ user-verbatim directives(2026-05-18 + 2026-05-29)+ 機械強制對齊清單(實際涵蓋 R18-R22 / R24-R26 共 8 條;R23「確保 SSOT」未單列,由上游 M17/M23 + 檔頭 SSOT integrity invariant 涵蓋)詳 references/upstream-directives-r-mapping.md
|
|
10
10
|
|
|
11
11
|
## When to invoke
|
|
12
12
|
|
|
@@ -27,45 +27,28 @@ arguments: scope?=full|changed focus?=「ssot|visual|behavior|all」
|
|
|
27
27
|
|
|
28
28
|
## Phase 0 — Cwd context detection(2-mode branching,2026-05-29 加)
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
自動偵測 cwd 切 scope:`packages/design-system/src` 存在 → **ds-repo**(full DS canonical scope,含 template scaffold;A.1 全 dim + chain `/product-ui-audit` 對 `apps/template` dogfood);package.json 含 `@qijenchen/design-system` → **fork-user-repo**(A.0/A.1 限 fork-side:dim 83 runtime + 完整 consumer/fork enforcement dim 集 58/59/62-64/69-71/73-76/82;propose scope 限 `apps/**`,**禁** propose DS source 改動,hooks 信任 committed C-prime 治理鏈);其餘 → non-ds exit。
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
detect_mode() {
|
|
34
|
-
if [ -d "packages/design-system/src" ]; then echo "ds-repo"
|
|
35
|
-
elif grep -q '"@qijenchen/design-system"' package.json 2>/dev/null; then echo "fork-user-repo"
|
|
36
|
-
else echo "non-ds"; exit 0; fi
|
|
37
|
-
}
|
|
38
|
-
```
|
|
32
|
+
detect_mode snippet / 為何 2-mode 不是 3-mode(3-mode = dead code)/ mode×scope 完整表 / fork-mode safety invariants 全文 → `references/phase-a-workflow.md`「Phase 0」。
|
|
39
33
|
|
|
40
|
-
|
|
34
|
+
---
|
|
41
35
|
|
|
42
|
-
|
|
43
|
-
|---|---|---|---|
|
|
44
|
-
| **ds-repo**(DS owner workflow,含 template SSOT 編輯)| full DS canonical + spec + token + pattern + memory + `template/ds-product-template/` scaffold | 全 dim per `/design-system-audit --deep` SSOT(含 dim 83 cross-3-repo runtime audit)**+ chain `/product-ui-audit` 對 `apps/template`**(DS owner dogfood 自家消費端 surface,用 fork user 同等產品標準把關)| 全 dim parallel verify |
|
|
45
|
-
| **fork-user-repo**(published template repo / fork user product repo)| `node_modules/@qijenchen/design-system/CLAUDE.md` + `ds-canonical/rules/meta-patterns.md` + `apps/**` + 本 repo `CLAUDE.md` | dim 83 fork-side runtime checks(**C-prime committed 治理鏈 fire〔fork-governance-dispatcher.sh Pre/Post/UserPromptSubmit 讀 ds-canonical/fork/manifest.json + inject_fork_governance_preamble.sh SessionStart;免 plugin,2026-06-17 改版〕** / cross-load / setup-netlify smoke / **deploy URL hook 每次 push 吐 URL live** / **環境建置斷點清單通暢 + 無法自動的斷點有 plain-中文引導**)+ **完整 consumer/fork enforcement dim 集(2026-05-30 補,原僅 62-67 漏掉 bootstrap 等)**:58(plugin install + bootstrap chicken-egg gate)/ 59(approval-preflight `apps/**`)/ 62(Netlify onboarding + 斷點清單 + ≥6 條中文引導話術)/ 63(deploy URL auto-reply 每次必吐)/ 64(post-main-push SSOT propagation)/ 69-71(consumer no-catalog / @story-baseline / DS primitive misuse)/ 73-74(full-story sweep / overlay probe)/ 75(plugin freshness)/ 76(escape marker abuse)/ 82(consumer app story title)| 同 dim,fork-side verify;**禁** propose DS source change |
|
|
36
|
+
## Phase A — Claude solo full audit(必先 NO-SAMPLE 跑完才進 Phase B)
|
|
46
37
|
|
|
47
|
-
###
|
|
38
|
+
### 🔒 全掃優先 + 決策 batch-at-end 鐵律(2026-07-11 user directive,Claude + codex 雙方永遠遵守)
|
|
48
39
|
|
|
49
|
-
|
|
50
|
-
- A.2 propose scope 限 fork user's product code(`apps/**`,可選 `packages/<consumer-utils>/**`)
|
|
51
|
-
- **禁** propose DS source 改動(`node_modules/@qijenchen/design-system/**` read-only;要改 file PR 回 DS repo)
|
|
52
|
-
- A.3 autonomous batch fix scope 同上
|
|
53
|
-
- Commit / push 仍走 M28 working branch + user push trigger
|
|
54
|
-
- Hooks fire 信任 plugin 機制(skill 不重複實作 hook logic)
|
|
40
|
+
**deep audit = 先把全 DS 掃完,最後才一次給 user 決策清單 —— 禁一個元件一個元件問。**
|
|
55
41
|
|
|
56
|
-
|
|
42
|
+
1. **全掃優先**:A.0 全盤閱讀 + A.1 全 dim + A.1b **全元件** NO-SAMPLE 掃完 → 收集 + **跨元件去重**所有 findings(cross-component drift 只有全部一起看才浮現,例:7 浮層 slide 距離 8px/50%/100% 三制式並存)。**禁**稽核**中途**針對單一元件停下問 user。
|
|
43
|
+
2. **決策 batch-at-end**:全掃完後,C.1 final report **一次**列出「經整體評估後**真是問題** + **只影響 SSOT-UI/UX**(視覺/行為/結構/跨元件設計語言/新 API contract)」的決策清單給 user 拍板。同類決策合併呈現讓 user 通盤權衡。
|
|
44
|
+
3. **非-SSOT-UI/UX autonomous**:doc 對齊 code / 誠實描述 / refactor / 命名一致 / pedantic 駁回 = Claude+codex **辯論共識** → autonomous 做到一致設計語言 + 世界級 + SSOT + 自驗到完美,**不打斷 user**。
|
|
45
|
+
4. **codex 同軌**:codex 走**相同**全掃流程(B.1 三重對等),**禁** codex 只做部分元件;codex findings 併入同一次 batch。
|
|
57
46
|
|
|
58
|
-
|
|
47
|
+
**反 pattern(禁)**:稽核途中「Tooltip 跑完→問 user→HoverCard 跑完→又問」piecemeal(抓不到跨元件 drift + 反覆打斷 + 同類決策分散難通盤權衡)。Anchor:2026-07-11 user 抓「你應該先全掃完再一個一個看違規…不然怎麼抓跨元件不一致?…全部稽核完最後再列真的需要我決策的(真問題且只影響 SSOT-UI/UX)要我拍板…其他你和 codex 辯論共識照建議做到完美」。
|
|
59
48
|
|
|
60
49
|
### A.0 — 全盤閱讀 preflight(M29 升級,**禁止憑記憶**)
|
|
61
50
|
|
|
62
|
-
**強制 read sweep**(不可 sample,不可挑)
|
|
63
|
-
1. `CLAUDE.md` 全文
|
|
64
|
-
2. `.claude/rules/{meta-patterns,spec-rules,ui-development,story-rules,self-verify}.md` 全文
|
|
65
|
-
3. `.claude/references/{ssot-index,ssot-consultation,build-ui-canonicals,naming-conventions}.md`
|
|
66
|
-
4. `packages/design-system/src/**/*.spec.md` 全部(83 file,通過 Glob 列舉 + Read)
|
|
67
|
-
5. `packages/design-system/src/tokens/**/*.spec.md` + `packages/design-system/src/patterns/**/*.spec.md` 全部
|
|
68
|
-
6. 本 session 對話脈絡 + memory `~/.claude/.../memory/MEMORY.md` index + active project memory files
|
|
51
|
+
**強制 read sweep**(不可 sample,不可挑)7 項:CLAUDE.md 全文 / 5 rules 全文 / 4 references(ssot-index 等)/ 全 spec.md ×86(components+tokens+patterns,Glob 列舉 + Read)/ session 對話脈絡 + memory index + active project memory / 全 SKILL.md ×22(2026-07-10 hunt 抓 row13 超前宣稱補真 — skill 文字宣稱 vs 行為是弱軸,A.0 至少保 read 層)。逐 file list canonical → `references/phase-a-workflow.md` A.0。
|
|
69
52
|
|
|
70
53
|
**完成 gate**:Phase A.0 output = `phaseA-preflight-checklist.md`(session-local,列出讀過的 N file + 任何 spec 漂移嫌疑點)。**禁** skip / sample / 「先看標題判斷」。
|
|
71
54
|
|
|
@@ -81,33 +64,31 @@ detect_mode() {
|
|
|
81
64
|
|
|
82
65
|
**DETERMINISTIC dim 必驗「mode 真的有跑」(2026-06-11 加)**:script exit 0 ≠ 該 dim 宣稱的模式真的執行了 — 必看輸出證據(per-mode 計數 / cell label / scenario 數)確認 flag 真生效。Anchor:dim 51 `--matrix` flag 接受後 `MATRIX_CELLS` 定義但 main loop 從未消費(dead code),跑出來是無 matrix 的普通 scan + exit 0 = 連續假綠;另 cell 清單含 Storybook 不認識的 globals(hc/rtl)= 注入後靜默 fallback = 假覆蓋。兩層都要驗:flag→行為、行為→真值。
|
|
83
66
|
|
|
84
|
-
**PURE-JUDGMENT dim 真跑證據強制(2026-05-30 generalize,user 問「包括所有 infra 稽核?」)**:judgment dim(無 deterministic script / write-time hook 兜底者,含 infra 62/66/68/72 fork-onboarding/runtime/API-surface)report 必逐 dim show「DS-wide N files scanned + file:line findings / 或『0 after 全掃』」真跑證據,**禁只 mention dim 號**。report-validator `check_audit_post_report_validator.sh` Validator G 機械強制(evidence marker 數 < judgment dim 數 = BLOCKER)。DETERMINISTIC
|
|
67
|
+
**PURE-JUDGMENT dim 真跑證據強制(2026-05-30 generalize,user 問「包括所有 infra 稽核?」)**:judgment dim(無 deterministic script / write-time hook 兜底者,含 infra 62/66/68/72 fork-onboarding/runtime/API-surface)report 必逐 dim show「DS-wide N files scanned + file:line findings / 或『0 after 全掃』」真跑證據,**禁只 mention dim 號**。report-validator `check_audit_post_report_validator.sh` Validator G 機械強制(evidence marker 數 < judgment dim 數 = BLOCKER)。DETERMINISTIC + HOOK-ENFORCED dim 由 CI / write-time hook 兜底,不在此 risk;tier 數禁 hardcode,以 `npm run audit:coverage-matrix`(`.claude/logs/audit-coverage-matrix.json`)動態值為準(snapshot 2026-07-10:24/40/27,total 91)。
|
|
85
68
|
|
|
86
69
|
**🚨 反抽樣鐵律 — 「機械涵蓋」必先 breadth-verify(2026-06-05 user 抓 story-title 又抽樣,verbatim「這個問題已經問你一百次了結果你還是抽樣」)**:把某 judgment dim 標為「DETERMINISTIC/HOOK 已兜底、不在 judgment risk」**= 一種抽樣**,除非該 gate 的偵測廣度被**證明**對齊 canonical。**強制兩步,缺一即視同抽樣**:
|
|
87
70
|
1. **Breadth-test**:對該 gate 注入一個「已知違規」樣本 → 跑 gate → 確認被抓(exit 1)→ revert。沒通過 = 該 gate **不算**涵蓋該 dim,退回 PURE-JUDGMENT 跑完整枚舉。
|
|
88
|
-
2. **完整枚舉 + partition-review**(judgment dim sample-proof 跑法):deterministic 腳本枚舉**全部單元**(eg. `gen-ds-story-manifest.mjs`
|
|
89
|
-
- **錨例**:dim 40/41/43 被當「story-quality:check 已涵蓋」排除
|
|
71
|
+
2. **完整枚舉 + partition-review**(judgment dim sample-proof 跑法):deterministic 腳本枚舉**全部單元**(eg. `gen-ds-story-manifest.mjs` — **scope 注意:regex 只收 components/internal 兩 family、元件名 ≤2 段,patterns/tokens stories 不在內**;story-name 類 dim 要真全集需直接讀 `storybook-static/index.json` 全 entries)→ 機械 auto-pass 明確合規者 → 剩餘 candidate **切 N chunk,每 chunk agent 審它每一個**(chunk 互斥涵蓋全集 → 每單元剛好審一次,數學上不可能漏)。**禁** agent 自選 top N。
|
|
72
|
+
- **錨例**:dim 40/41/43 被當「story-quality:check 已涵蓋」排除 → gate 有 detection gap(只抓 100%-English)+ scope gap(漏 anatomy/principles),放過 84 違規還報「0 violations」假綠。修:補 `name_mixed_english` + 全 storyFiles scope + breadth-verified。對齊 M34「spec broad + hook narrow = gap 必補」。
|
|
90
73
|
|
|
91
74
|
### A.1b — Claim-vs-code + docblock + spec-internal adversarial verification(MANDATORY,NO-SAMPLE,per-component)
|
|
92
75
|
|
|
93
|
-
**2026-05-30 anchor(user verbatim
|
|
94
|
-
|
|
95
|
-
**為何不能只靠 deterministic grep**:2026-05-30 嘗試建 `audit-anatomy-prop-existence.mjs`(已刪除不存在)機械驗 prop-existence,但 **prop passthrough(元件 `...props` 轉發 Radix/react-day-picker)使 naive grep 必 over-flag 合法 prop** → 不可靠 → 刪除。**結論:FALSE_CLAIM 驗證本質需 LLM 讀 source 判斷,無法純 grep gate → 故必用「強制 + 報告驗證確認真跑」的機制保證**。
|
|
76
|
+
**2026-05-30 anchor(user verbatim「之前他媽都在偷懶?」)**:獨立 adversarial 再審抓 **403 findings / 64 單元 / 202 FALSE_CLAIM**(doc 系統性記載 code 沒有的行為,如 Calendar 宣稱方向鍵導覽、Alert 記不存在的 `actions` prop)。根因 = 前期把 story-content dim(12/24/25/30/43 等)當「散文 looks-fine 掃」,沒 adversarial 讀 .tsx(+ wrap 的 lib)逐句比對宣稱。**為何不能純 grep**:prop passthrough(`...props` 轉發 Radix 等)使 naive prop-existence grep 必 over-flag 合法 prop(2026-05-30 建過即刪)→ **FALSE_CLAIM 驗證本質需 LLM 讀 source,故用「強制 + report-validator 確認真跑」機制保證**。
|
|
96
77
|
|
|
97
78
|
**強制流程**(deep-audit 每次必跑,no skip):
|
|
98
79
|
0. **機械 gate 先跑(deterministic,2026-06-02 加)**:`npm run typecheck:stories`(deterministic 抓 stories 的 `{var}`-undefined / prop 型別錯 —— **這是 SizeMatrix `{size}` crash 的真防線**;主 tsc -b exclude stories 故必跑此)+ `node scripts/storybook-smoke-test.mjs --full`(runtime crash render 掃)。先過才進 adversarial read。Anchor:2026-06-02 Field SizeMatrix `{size}` JSX-undefined crash 隨 beta.44 ship。**注**:smoke 全覆蓋 coverage-gate(防靜默-skip 假綠燈)attempted 但 CI server 規模化降級(~60 story 後 timeout 撞 20-min budget)→ **defer**(需 robust-server / browser-recycle + 可靠測試環境);故 typecheck:stories 是目前 deterministic 主防線。
|
|
99
|
-
1. **per-component(NO-SAMPLE,全
|
|
80
|
+
1. **per-component(NO-SAMPLE,全 64 component + 全 pattern)** dispatch adversarial agent。
|
|
100
81
|
2. 每 agent 必 **Read 元件 .tsx + 其 wrap 的 lib(Radix/cmdk/react-day-picker/sonner 等)source**,對該元件**所有** anatomy / a11y / principles / spec 宣稱**逐句**比對:鍵盤 map / ARIA role / focus 行為 / prop 存在性 / 視覺 token / 預設值 / native-vs-custom。
|
|
101
82
|
**+ 2026-06-04 補兩 lens(Dim 15 cross-doc 明文涵蓋但前期被「散文 skim」漏的同 class failure;非抽樣、非無覆蓋,是「有 dim 淺跑」)**:
|
|
102
83
|
- **(a) 元件 `.tsx` 自己的 docblock / inline 註解 vs 同檔 code**:A.1b 原設計把 `.tsx` 當「真相來源」去驗別人(story/spec),**從不反驗它自己的註解** → docblock claim 的 padding / typography mode / hover / 行為 vs code 真實值,逐行比。
|
|
103
84
|
- **(b) spec 段落間描述性一致(spec-internal cross-section)**:A.1b 原驗 claim-vs-code,**不驗 spec-段-vs-段** → 同一 spec 內 Mode 表 typography 標籤 / padding 值 / gap 值 / surface 行為,跨 section 不可打架。
|
|
104
85
|
- **(c) token / pattern spec 的 cross-file consumer-list claims(2026-06-11 加)**:token spec 常有「消費者清單」宣稱**其他檔案**的行為(如 motion.spec「hover-card.tsx Provider 預設 override 為 --hover-delay-rich」)— per-component A.1b 只驗「該元件自己的 spec vs 自己的 code」,**cross-file 宣稱兩邊都不在誰的 claim set 裡 = 系統性盲區**。每個 token / pattern spec 的消費者清單必逐檔開 code 驗。Anchor:2026-06-11 hover delay 雙 drift(HoverCard 沒接 token / OverflowIndicator 誤 tier)連續多輪 deep-audit 漏抓,正是此 lens 缺;現另有 `scripts/audit-motion-delay-invariants.mjs` 機械凍結 motion 域。
|
|
105
|
-
- **Anchor**:2026-06-04 user 抓「deep-audit 多次沒發現」—— tsx docblock(`閱讀模式 1.5` / `hover:bg-neutral-hover`,自 2026-04-23 stale)+ spec Mode 表 typography stale,全是 Dim 15 該抓、卻被當散文掃漏。納入此強制 adversarial(Validator F
|
|
86
|
+
- **Anchor**:2026-06-04 user 抓「deep-audit 多次沒發現」—— tsx docblock(`閱讀模式 1.5` / `hover:bg-neutral-hover`,自 2026-04-23 stale)+ spec Mode 表 typography stale,全是 Dim 15 該抓、卻被當散文掃漏。納入此強制 adversarial(Validator F 檢查 A.1b 證據存在 keyword 級;逐 component 覆蓋由 A.1b 流程 + CP-A1b 自律),不再可 skim。
|
|
106
87
|
3. **「自上次 audit 無 code 改動」≠ 可跳過** —— content 宣稱可在 code 沒變下就是假的(前期正是用此藉口跳過 = 違規)。
|
|
107
88
|
4. output per-component:`{component, claimsVerified: N, falseClaims: [{fileLine, 宣稱, 真實 code 行為}]}`。
|
|
108
89
|
5. findings 併入 A.2 triage(FALSE_CLAIM 對齊 doc-to-code = autonomous;substantive design-language tension = HOLD propose)。
|
|
109
90
|
|
|
110
|
-
**完成 gate**:report 必含**每個** component 的 story-vs-code verdict(claimsVerified count + falseClaims list)。report-validator hook `check_audit_post_report_validator.sh` Validator F
|
|
91
|
+
**完成 gate**:report 必含**每個** component 的 story-vs-code verdict(claimsVerified count + falseClaims list)。report-validator hook `check_audit_post_report_validator.sh` Validator F 檢查 A.1b 證據存在(keyword 級;deep-audit 規模 report 全缺 story-vs-code 證據 = BLOCKER),**不逐 component 計數** — 逐 component 覆蓋由本流程 + CP-A1b checkpoint 自律(見 Mechanical enforcement)。
|
|
111
92
|
|
|
112
93
|
### A.2 — Triage findings → 中文人話 propose SSOT-UI/UX / autonomous non-SSOT
|
|
113
94
|
|
|
@@ -116,8 +97,8 @@ detect_mode() {
|
|
|
116
97
|
- **Non-SSOT**(bug fix / clean / refactor / 命名一致 / test / audit / verify / hook regex 加廣 / pointer 補 / spec typo / 漂移 mechanical 對齊)→ **AUTO 整批做完**
|
|
117
98
|
|
|
118
99
|
**SSOT-UI/UX propose 必過 gate + 中文人話 format**(SSOT 在主檔,不在此重述以免多處抄寫漂移):
|
|
119
|
-
- **Propose 前必過 7-Q gate**(Q0 先驗「問題是否真存在」/ Q1 cite / Q1' DS canonical 優先 / Q2 SSOT consume / Q3 Rule-of-3 / Q4 下游吸收 / Q5 issue 100% mapped)→ SSOT `.claude/skills/propose-options/SKILL.md`(hook `check_propose_pre_grep_verify.sh`
|
|
120
|
-
- **中文人話 propose format + 禁用 jargon 對照表** → SSOT `.claude/memory/feedback_propose_discipline.md`(hook `check_propose_discipline.sh
|
|
100
|
+
- **Propose 前必過 7-Q gate**(Q0 先驗「問題是否真存在」/ Q1 cite / Q1' DS canonical 優先 / Q2 SSOT consume / Q3 Rule-of-3 / Q4 下游吸收 / Q5 issue 100% mapped)→ SSOT `.claude/skills/propose-options/SKILL.md`(hook `check_propose_pre_grep_verify.sh` soft warn 提示 Q0 — P1 stderr、僅 planning/reports/handoff md 寫入時 fire;reply 通道靠 M18 mindset);M18 為 meta anchor
|
|
101
|
+
- **中文人話 propose format + 禁用 jargon 對照表** → SSOT `.claude/memory/feedback_propose_discipline.md`(hook `check_propose_discipline.sh` r1 = Stop soft warn 自我修正訊號〔exit 0〕;r2 claim 無 cite 才 exit 2 BLOCKER)
|
|
121
102
|
- **Triage 分流 + format 細則** → `references/triage-rubric.md`
|
|
122
103
|
|
|
123
104
|
### A.3 — Autonomous batch execute(non-SSOT,M33 anti-defer)
|
|
@@ -148,14 +129,28 @@ detect_mode() {
|
|
|
148
129
|
- 全 ❌ **且** cwd = `fork-user-repo` → **auto-fallback Phase A only**(不 interactive ASK),印中文:`「Codex 未裝(@openai/codex 不在你的 fork repo deps),skip Phase B 比稿。Phase A solo audit 已完整跑完。若要 dual-track 比稿請 npm i --save-dev @openai/codex 後重跑」`(2026-05-29 verified:`/tmp/ds-product-template/node_modules/.bin/codex` 不存在 = fork user 預設無 codex,此 fallback 為正常路徑)
|
|
149
130
|
- 全 ❌ **且** cwd = `ds-repo` → 報 user(DS owner config issue,需 fix)
|
|
150
131
|
- **禁** Explore 替身 / 嘗試 `sudo npm i -g` / 繞 M28 開 PR(per `memory/feedback_codex_exec_transport_canonical.md` Anti-pattern)
|
|
151
|
-
-
|
|
132
|
+
- **最強模型算力強制(2026-07-10 user directive「應強制使用 codex 最新最強的模型與算力」)**:codex exec **禁帶任何 `-c model_reasoning_effort` / `-m` 降檔 override** — `~/.codex/config.toml`(**無 model pin** + effort xhigh)= SSOT,不帶 flag 即繼承 CLI default(隨版本自動跟最新 model)。大型 brief 死局(r1-r4 anchor)對策 = `--dangerously-bypass-approvals-and-sandbox` + **只拆更小 single-axis focused brief 並行**、不降 effort(2026-05-29 死局根因是 brief 太大非 effort;降檔 = 稽核品質打折)。詳 `memory/feedback_codex_exec_transport_canonical.md` Rule 3
|
|
133
|
+
- **B.0 前置 freshness 閘(2026-07-10 加 + 同日二次升級,「不用 user 提醒」機制)**:brief codex 前**必先跑** `node scripts/check-codex-freshness.mjs` — (1) CLI 落後 npm latest → **直接自動 `npm i -D @openai/codex@latest`**(不問 user);(2) model pin 出現 → 刪(pin 鎖舊);(3) **effort = 探測出的最高可用檔**:檔位支援是執行期資料(server-driven),靜態查不到 → CLI 換版 / cache 缺 / pin 漂移 → **自動跑 `--probe`**(由高往低 1-行-prompt 實測,自動改 config pin + 寫 cache)。錨例:2026-07-10 裝 0.134.0 落後 10 版 + pin gpt-5.5;同日 user 抓「xhigh 不一定永遠最高」→ 實測 ultra 可用,probe 機自動 xhigh→ultra;unpin 後 default 解析 gpt-5.6-sol = OpenAI 官方對「大型可拆分複雜工作」的推薦組合(Ultra=多子代理並行,Max=單題深想 — 稽核屬前者,user 圖一 ChatGPT 引官方定位)。**B.0 必 relay 本次實際解析 settings(model + effort,取自 probe cache)進 C.1 report**;官方檔位語義若再變(新檔名出現)→ freshness 閘紅燈觸發重評,選「適合稽核」而非盲選最高名
|
|
134
|
+
|
|
135
|
+
- **Codex 失敗守衛(2026-07-10 user「codex 額度不足要通知我」)**:所有 `codex exec` 必經 `node scripts/codex-run-guarded.mjs`(--brief/--stdin)。outcome 非 SUCCESS(QUOTA/AUTH/EMPTY/ERROR)→ **立即 STOP + PushNotification 通知 user 處理**(額度耗盡 / 重登 / 縮 brief),**禁**把空/錯輸出當「codex 0 findings = clean」續跑(false-green)。詳 memory 「Codex 失敗守衛」段。
|
|
152
136
|
|
|
153
137
|
### B.1 — Brief codex 跑相同 Phase A 完整流程
|
|
154
138
|
|
|
139
|
+
**三重對等條款(2026-07-10 user directive「任務、擁有的資訊、閱讀的資訊都要一模一樣」)**:
|
|
140
|
+
(a) **任務對等** — 相同 Phase A 流程(A.0/A.1/**A.1b per-component claim-vs-code**/A.4,brief SSOT-pointer 指 SKILL Phase A 全段,hook 7️⃣ 驗 A.1b)+ 相同動態 dim 清單(dispatch 注入)+ 回程 dim 對帳(B.2 Step 0);
|
|
141
|
+
(b) **資訊/環境對等** — `-C "$PWD"` 同 repo root(同 spec/scripts/node_modules)+ bypass 可跑同一套機械驗證(M31 Step 2);
|
|
142
|
+
(c) **閱讀對等** — brief 閱讀清單**逐字鏡射 A.0 六項**(泛 glob 不算;hook 5️⃣ 驗 meta-patterns/memory 錨點);唯一結構性差異 = session 對話脈絡,以 user-verbatim(Step 0.05)+ Phase A 摘要補償(明文契約)。
|
|
143
|
+
(d) **判準對等(2026-07-10 user「同樣的完美標準」)** — codex 必讀 `design-system-audit/references/audit-prompts.md` 每-dim rubric + 逐 dim 套用(= Claude dim sub-agent 判準 SSOT);hook 6️⃣ 驗 audit-prompts 錨點。只給 dim 編號 = 標準不對稱。
|
|
144
|
+
|
|
155
145
|
Brief 必含 4 段(完整 template SSOT → `references/phase-b-codex-brief.md`,per codex-collab Step 0.05 user-verbatim faithful relay + Step 0.5 own-version invariant):**(1)** user 原話 verbatim(中英符號圖文全保)**(2)** Claude Phase A 結果摘要(P0/P1/P2 count + propose N 項 + landed M 項 file:line)**(3)** 請 codex 獨立跑相同 Phase A(全盤閱讀 + 全 dim NO-SAMPLE + 完整報告 + 不 frame 答案)**(4)** 回「你抓 Claude 漏 / Claude 抓你不同意 / 兩邊都漏」。Send via `codex exec`(local CLI per M31 Step 0.4)或 cloud `@codex`。
|
|
156
146
|
|
|
157
147
|
### B.2 — Receive codex report + Step 4 self-check + Step 4.5 verify
|
|
158
148
|
|
|
149
|
+
**Step 0(2026-07-10 加,user「codex 要稽核一模一樣的所有項目,有確保嗎?」)— dim 覆蓋對帳(mandatory,不齊禁進 B.3)**:
|
|
150
|
+
彙總全部 codex 回覆的「dim 覆蓋對帳段」→ 逐號對 `dispatch-audit-dims.mjs` 動態 dim 列;
|
|
151
|
+
**缺任一 dim → 補發該 dim 的 focused brief 再跑,不得以「大致蓋到」放行**。對帳表(dim 號 × Claude 掃了 / codex 掃了)必進 C.1 final report。
|
|
152
|
+
保證鏈三段:brief 端(check_codex_brief_invariants.sh 攔缺 invariant 的 brief)→ 回程端(本對帳步)→ 報告端(對帳表進 report 供 report-validator 掃)。
|
|
153
|
+
|
|
159
154
|
**禁 pass-through**(per M31 + `feedback_codex_dual_track_synthesizer.md`):
|
|
160
155
|
- Step 4:M22/M23/M27/M8 4 題自檢
|
|
161
156
|
- **Step 4.5 verify each claim**:grep / WebFetch / run invariant script / counter-example scan
|
|
@@ -188,37 +183,31 @@ Brief 必含 4 段(完整 template SSOT → `references/phase-b-codex-brief.md`,
|
|
|
188
183
|
|
|
189
184
|
Deep-audit 收尾**必自動跑** `/knowledge-prune` deep — **前提鐵律:確保產出不打折、以產出完美為前提**(quality-first,= knowledge-prune SKILL 2026-06-02 核心前提:只清真冗餘提升 signal,每一條真實 invariant / 機械防線必完整保留,retire 前必確認保護已被別處覆蓋;2026-06-11 user verbatim「請確保有確保產出不打折且產出完美,且未來也必須要確保產出不打折以產出為完美的前提跑 knowledge prune deep」)。governance headroom / session-start trigger 命中時 scope 聚焦觸發點,否則 quarterly scope。**禁問 user「要不要跑」**(anchor:2026-06-11 user verbatim「deep audit cross codex不是會自動…跑 knowledge prune deep?為何每次都要問我是否要跑?」)。分權不變:P0+P1(表達層對齊/清 stale)AUTO 執行;**P2(retire 機械防線 / 動 canonical)整理成候選表進 C.1 拍板清單** — user 只拍板 P2 內容,不拍板「跑不跑」。
|
|
190
185
|
|
|
191
|
-
### C.
|
|
186
|
+
### C.0b — 判準化 harvest(predicate-ization,2026-07-07 user 拍板治理進化方向 1)
|
|
192
187
|
|
|
193
|
-
|
|
188
|
+
Deep-audit 收尾(C.0a 旁)**必跑**:讀 `node scripts/audit-coverage-matrix.mjs` 的 PURE-JUDGMENT gap list,**選 top 1-3 個本輪已充分理解的 judgment 維度,當場寫成 deterministic script**(invariant .mjs / hook rule);寫不成的必記一行「為何不能謂詞化」(品味 / 需 LLM 讀 source / 外部演進類)。**雙柱模型**:完整稽核 = 永久機構(存量 / 外來 / 漂移 / 防線腐化 / 品味五類永遠需要);謂詞化 = 稽核的機械化引擎——每類問題轉謂詞後,同一謂詞對存量與外來元件全量零抽樣免費掃,稽核不縮編、機械部分逐季變厚。KPI(PURE-JUDGMENT 佔比 trend)由 `/governance-health` 月度追蹤。SSOT → `.claude/planning/2026-07-07-governance-evolution-roadmap.md`。錨例:2026-07-07 selected/active meta 謂詞、VR shifted-clock(當場謂詞化,存量 63 元件一次掃平)。
|
|
194
189
|
|
|
195
|
-
### C.
|
|
190
|
+
### C.0b — 治理全軸覆蓋對照(2026-07-10 user「deep audit 會稽核所有治理軸嗎?要確保」)
|
|
196
191
|
|
|
197
|
-
|
|
198
|
-
|
|
192
|
+
收尾必讀 `.claude/references/governance-audit-coverage.md`(治理 home × 稽核者覆蓋表)逐 row 對照:
|
|
193
|
+
(1) 本輪新增/改動的治理物(新 hook / script / reference / registry / home)在表上**有 row 嗎**?沒有 → 當場補 row(誰稽核它、多常跑);(2) 表上 4 個弱軸(gate script meta-test / SKILL claim-vs-behavior / eslint 發佈 / planning 靜置)狀態有變 → 更新。**沒對照 = C 階段不完整**。
|
|
199
194
|
|
|
200
|
-
###
|
|
201
|
-
- 全 dim findings: <P0 N / P1 M / P2 K>
|
|
202
|
-
- Autonomous landed: <N 項> commit <hash>
|
|
203
|
-
- SSOT-UI/UX 已拍板: <M 項>
|
|
204
|
-
- SSOT-UI/UX 待拍板: <列出 + 簡述>
|
|
195
|
+
### C.0 — 收斂判準(rerun stop gate,2026-06-01)
|
|
205
196
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
- Cite battle: <K 題,各題 verdict + evidence>
|
|
210
|
-
- 共識 SSOT-UI/UX 待拍板: <列出 + 簡述>
|
|
211
|
-
- 共識 autonomous landed: <N 項> commit <hash>
|
|
197
|
+
決定「**再 rerun 嗎**」必過此 gate:deep-audit = LLM 對抗式 non-deterministic + 高假陽性,**追零 = 跑步機 + 誘發 regression**。STOP 判準 = **某輪 adversarial 二次驗證後真 material/regression = 0(只剩 marginal + false-positive)**——不追零、不過早收。收斂靠 CI gate + 寫入時紀律,非 audit loop。三分類表 + 「改一處看 N 處」→ `references/triage-rubric.md`「收斂判準」。
|
|
198
|
+
|
|
199
|
+
### C.1 — Final report(送 user)
|
|
212
200
|
|
|
213
|
-
|
|
214
|
-
<決策 1-N(per A.2 format)>
|
|
201
|
+
四段骨架(Phase A 結果 / Phase B 結果〔含 B.2 Step 0 dim 覆蓋對帳表〕/ 待你拍板 / Verify artifact〔backlog 項必附 verifyCmd+fixedSignal 可攜指令,對帳 = `node scripts/verify-backlog.mjs`,2026-07-07 軌道 3〕)完整 template → `references/triage-rubric.md`「C.1 final report template」。
|
|
215
202
|
|
|
216
|
-
**每題必附「SSOT 理由:」一句**(= 為何這是「會影響 SSOT 的 UI/UX 增刪改」:新 API contract / 改 canonical 語意 / 新視覺 design language,三類之一,具體指出)。**寫不出 SSOT 理由 = 該題不是拍板題,移回 AUTO 自己做**(2026-06-11 user 第 3 次糾正 codify:bug fix / a11y 對齊 W3C / 對齊 spec 既有意圖 / story 內容 / 治理 / 補 rationale 文件 / dead code 清除,全部 AUTO 不問)。Hook
|
|
203
|
+
**每題必附「SSOT 理由:」一句**(= 為何這是「會影響 SSOT 的 UI/UX 增刪改」:新 API contract / 改 canonical 語意 / 新視覺 design language,三類之一,具體指出)。**寫不出 SSOT 理由 = 該題不是拍板題,移回 AUTO 自己做**(2026-06-11 user 第 3 次糾正 codify:bug fix / a11y 對齊 W3C / 對齊 spec 既有意圖 / story 內容 / 治理 / 補 rationale 文件 / dead code 清除,全部 AUTO 不問)。Hook `check_audit_post_report_validator.sh` Validator H 機械強制。
|
|
217
204
|
|
|
218
|
-
|
|
219
|
-
-
|
|
220
|
-
-
|
|
221
|
-
|
|
205
|
+
**🔒 決策品質四要件(2026-07-13 user verbatim「需我拍板的議題,不是應該確保你和 codex 來回討論辯論出來的共識與解法有研究過世界級的設計且符合我們需求與一致設計語言和設計原則並確保 SSOT?現在跟未來都應該要確保這件事永遠成立」)—— 每個送 user 拍板的 decision 必全備,缺一即不成熟、退回研究/辯論、禁送 user**:
|
|
206
|
+
1. **SSOT-check 先行**:先 grep 我方 spec + memory + user 歷史拍板,查**是否已有 canonical / 你已拍板過**。已有 → 對齊即可、移回 AUTO,**不重問**(錨例:2026-07-13 誤把 MenuItem-internal〔你 2026-06-05 Q2 已拍板「可 subpath 消費」〕+ menu selected×hover 色〔你 2026-07-04 Q2 已拍板 neutral-selected 且已 cite Ant/VS Code〕當「新決策」問你 → 應是 autonomous 對齊,不是拍板題)。
|
|
207
|
+
2. **World-class ≥3 cite(M26)**:每個真決策的 recommendation 必附 **≥3 家世界級 DS 在該情況的真實做法**(WebFetch 真 source + URL,禁憑印象)。
|
|
208
|
+
3. **Claude↔codex 雙軌辯論(M31)**:兩 model **各自獨立研究 + propose + cite battle → 共識**;禁單方憑感覺直接給 user。
|
|
209
|
+
4. **設計語言/原則 fit**:明寫此建議如何符合我方**既有一致設計語言 + 設計原則 + 需求**。
|
|
210
|
+
**判準**:decision block 缺「SSOT-check / ≥3 world-class cite / codex verdict / design-fit」任一 marker → 該題不成熟。Hook `check_audit_post_report_validator.sh` Validator K 機械強制(送 user 的 decision 缺四要件 marker → exit 2 BLOCK;2026-07-14 ship,letter I 已被 D3/D4/D5 chain validator 佔用故定 K)。
|
|
222
211
|
|
|
223
212
|
### C.2 — Push trigger gate(M28 solo-work canonical)
|
|
224
213
|
|
|
@@ -247,8 +236,8 @@ Deep-audit 收尾**必自動跑** `/knowledge-prune` deep — **前提鐵律:確
|
|
|
247
236
|
|
|
248
237
|
## References
|
|
249
238
|
|
|
250
|
-
- `references/phase-a-workflow.md` — A.0 全盤閱讀 file list canonical + A.1 全 dim sub-agent dispatch template
|
|
239
|
+
- `references/phase-a-workflow.md` — Phase 0 detect/mode 表/fork-safety 完整版 + A.0 全盤閱讀 file list canonical + A.1 全 dim sub-agent dispatch template
|
|
251
240
|
- `references/phase-b-codex-brief.md` — codex brief template(B.1)+ Step 4.5 verify checklist + Step 5 比稿 matrix template
|
|
252
|
-
- `references/triage-rubric.md` — Scope classifier(SSOT-UI/UX vs non-SSOT)+ 中文人話 propose format +
|
|
253
|
-
- `references/upstream-directives-r-mapping.md` — 上游 context / 框架(SSOT integrity invariant + 生態位 + canonical 全繼承)+ user-verbatim directives(2026-05-18 + 2026-05-29)+
|
|
241
|
+
- `references/triage-rubric.md` — Scope classifier(SSOT-UI/UX vs non-SSOT)+ 中文人話 propose format + 收斂判準 + C.1 final report template
|
|
242
|
+
- `references/upstream-directives-r-mapping.md` — 上游 context / 框架(SSOT integrity invariant + 生態位 + canonical 全繼承)+ user-verbatim directives(2026-05-18 + 2026-05-29)+ 機械強制對齊清單(R18-R22 / R24-R26,R23 未單列詳檔頭)
|
|
254
243
|
- `references/skill-relationships-antipatterns-benchmarks.md` — 與其他 skill 分工 + Anti-pattern(永久 ban)+ 世界級對照
|
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Phase A — Claude solo full audit workflow
|
|
2
2
|
|
|
3
|
+
## Phase 0 — Cwd context detection 完整版(2-mode branching,2026-05-29 加;SKILL Phase 0 摘要的 detail SSOT)
|
|
4
|
+
|
|
5
|
+
Skill 必能跑在 **DS repo + fork user repo** 兩處(per user 2026-05-29「fork user 在自己獨立環境下 infra 仍正確運行」directive)。Phase 0 自動偵測 cwd 切 scope:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
detect_mode() {
|
|
9
|
+
if [ -d "packages/design-system/src" ]; then echo "ds-repo"
|
|
10
|
+
elif grep -q '"@qijenchen/design-system"' package.json 2>/dev/null; then echo "fork-user-repo"
|
|
11
|
+
else echo "non-ds"; exit 0; fi
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**為何 2-mode 不是 3-mode**(per user「避免原則無限膨脹」):「template SSOT」實際上是 ds-repo 內 `template/ds-product-template/` 子目錄;DS owner 編 template scaffold 仍在 ds-repo cwd 跑,**無 semantic 區隔**。Published `ds-product-template` GitHub repo 跟 fork user new repo 在 file structure 上一致(都消費 DS via npm + plugin),統一 fork-user-repo mode 處理。3-mode 設計 dead code:`ds-template-ssot` 永不 trigger 因 `packages/design-system/src` 條件先 win。
|
|
16
|
+
|
|
17
|
+
| Mode | A.0 全盤閱讀 scope | A.1 audit dim scope | Phase B codex scope |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| **ds-repo**(DS owner workflow,含 template SSOT 編輯)| full DS canonical + spec + token + pattern + memory + `template/ds-product-template/` scaffold | 全 dim per `/design-system-audit --deep` SSOT(含 dim 83 cross-3-repo runtime audit)**+ chain `/product-ui-audit` 對 `apps/template`**(DS owner dogfood 自家消費端 surface,用 fork user 同等產品標準把關)| 全 dim parallel verify |
|
|
20
|
+
| **fork-user-repo**(published template repo / fork user product repo)| `node_modules/@qijenchen/design-system/CLAUDE.md` + `ds-canonical/rules/meta-patterns.md` + `apps/**` + 本 repo `CLAUDE.md` | dim 83 fork-side runtime checks(**C-prime committed 治理鏈 fire〔fork-governance-dispatcher.sh Pre/Post/UserPromptSubmit 讀 ds-canonical/fork/manifest.json + inject_fork_governance_preamble.sh SessionStart;免 plugin,2026-06-17 改版〕** / cross-load / setup-netlify smoke / **deploy URL hook 每次 push 吐 URL live** / **環境建置斷點清單通暢 + 無法自動的斷點有 plain-中文引導**)+ **完整 consumer/fork enforcement dim 集(2026-05-30 補,原僅 62-67 漏掉 bootstrap 等)**:58(plugin install + bootstrap chicken-egg gate)/ 59(approval-preflight `apps/**`)/ 62(Netlify onboarding + 斷點清單 + ≥6 條中文引導話術)/ 63(deploy URL auto-reply 每次必吐)/ 64(post-main-push SSOT propagation)/ 69-71(consumer no-catalog / @story-baseline / DS primitive misuse)/ 73-74(full-story sweep / overlay probe)/ 75(plugin freshness)/ 76(escape marker abuse)/ 82(consumer app story title)| 同 dim,fork-side verify;**禁** propose DS source change |
|
|
21
|
+
|
|
22
|
+
### Fork-mode safety invariants(2026-05-29 加)
|
|
23
|
+
|
|
24
|
+
當 cwd = `fork-user-repo`:
|
|
25
|
+
- A.2 propose scope 限 fork user's product code(`apps/**`,可選 `packages/<consumer-utils>/**`)
|
|
26
|
+
- **禁** propose DS source 改動(`node_modules/@qijenchen/design-system/**` read-only;要改 file PR 回 DS repo)
|
|
27
|
+
- A.3 autonomous batch fix scope 同上
|
|
28
|
+
- Commit / push 仍走 M28 working branch + user push trigger
|
|
29
|
+
- Hooks fire 信任 committed C-prime 治理鏈(settings.json → fork-governance-dispatcher.sh 讀 ds-canonical/fork/manifest.json;免 plugin,2026-06-17 改版)— skill 不重複實作 hook logic
|
|
30
|
+
|
|
3
31
|
## A.0 全盤閱讀 file list canonical(禁 sample)
|
|
4
32
|
|
|
5
33
|
### 治理 home(always-load + path-scoped)
|
|
@@ -33,6 +61,7 @@ find packages/design-system/src -name "*.spec.md" -type f
|
|
|
33
61
|
- `~/.claude/.../memory/MEMORY.md`(index)
|
|
34
62
|
- 對 MEMORY.md 列的每個 active project memory file Read 全文(`project_*.md`)
|
|
35
63
|
- 對 feedback memory(`feedback_*.md`)只讀 description 比對 user 提的 topic 是否觸及 → 觸及才 Read 全文
|
|
64
|
+
- `.claude/skills/*/SKILL.md` 全部 ×22(2026-07-10 加,對齊 SKILL A.0 第 7 項)
|
|
36
65
|
|
|
37
66
|
### Output gate
|
|
38
67
|
|
|
@@ -19,11 +19,12 @@ ls -la ~/.codex/auth.json # 3 Auth(
|
|
|
19
19
|
node_modules/.bin/codex exec \
|
|
20
20
|
--dangerously-bypass-approvals-and-sandbox \ # user-authorized;codex shell 可跑 audit script
|
|
21
21
|
--skip-git-repo-check -C "$PWD" \ # 同 repo root → 同 spec.md / scripts / node_modules
|
|
22
|
-
-c model_reasoning_effort=low \ # 避大 brief plan-turn 燒 budget(per memory Rule 3)
|
|
23
22
|
--output-last-message /tmp/codex-phaseB.md \ # 截 verdict artifact 供 Step 4.5 diff
|
|
24
23
|
< brief.md > /tmp/codex-phaseB.log 2>&1 &
|
|
25
24
|
```
|
|
26
25
|
|
|
26
|
+
**最強模型算力強制(2026-07-10 user directive)**:**禁帶 `-c model_reasoning_effort` / `-m` 降檔 flag** — `~/.codex/config.toml`(最強 model + xhigh)= SSOT,不帶即繼承。大 brief 死局對策 = 只拆更小 single-axis brief,不降 effort(詳 memory Rule 3)。
|
|
27
|
+
|
|
27
28
|
**安全護欄(bypass 解鎖 shell 但仍禁寫源)**:
|
|
28
29
|
- Brief 必含「**禁 edit / delete / write `packages/design-system/src/**` 及任何 DS 源**;只跑唯讀 audit script + grep + Playwright screenshot」。
|
|
29
30
|
- **每次 bypass 需 user explicit authorize**(anti-pattern:AI 自動 bypass 不問,per `memory/feedback_codex_exec_transport_canonical`)。
|
|
@@ -59,19 +60,37 @@ node_modules/.bin/codex exec \
|
|
|
59
60
|
|
|
60
61
|
## 你的任務(Phase B,獨立)
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
63
|
+
**⚠️ 本 brief 的 SSOT 宣告(2026-07-10 user「codex 和 Claude 在 deep audit 所做的所有事包括所有判斷標準、稽核任務等都應是 SSOT」)**:
|
|
64
|
+
你要做的稽核 = **Claude 的 deep audit Phase A 完整鏡像,只差模型**。任務 / 判準 / 流程的**唯一真相來源(SSOT)= 這些檔,你必逐字讀並遵循**,本 brief 只補「檔案得不到的動態」(user 原話 / Claude Phase A 摘要 / live dim 清單):
|
|
65
|
+
- `.claude/skills/deep-audit-cross-codex/SKILL.md` Phase A 全段(A.0 全盤閱讀 / A.1 全 dim / **A.1b per-component claim-vs-code 對抗** / A.4 verify-to-perfection)—— **你做 A.0→A.1→A.1b→A.4 每一步,標準與 Claude 同**
|
|
66
|
+
- `.claude/skills/design-system-audit/SKILL.md` dim 表 + `references/audit-prompts.md` 每-dim rubric(你的判準 = Claude 的判準)
|
|
67
|
+
- 下方逐條 = 上述 SSOT 的**執行清單摘要**,若與 SSOT 檔衝突以 SSOT 檔為準(未來 Phase A 新增步驟自動經此傳到你,不需改本 brief)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
1. **全盤閱讀 — 逐字鏡射 Claude A.0 六項**(2026-07-10 user directive「codex 擁有/閱讀的資訊要跟 Claude 一模一樣」;泛 glob ≠ 對等,hook 5️⃣ 驗錨點):
|
|
71
|
+
1. `CLAUDE.md` 全文
|
|
72
|
+
2. `.claude/rules/{meta-patterns,spec-rules,ui-development,story-rules,self-verify}.md` 全文
|
|
73
|
+
3. `.claude/references/{ssot-index,ssot-consultation,build-ui-canonicals,naming-conventions}.md`
|
|
74
|
+
4. `packages/design-system/src/**/*.spec.md` 全部(brief-gen 時跑 `find packages/design-system/src -name '*.spec.md' | wc -l` 取真數,禁硬寫)
|
|
75
|
+
5. `packages/design-system/src/tokens/**/*.spec.md` + `packages/design-system/src/patterns/**/*.spec.md` 全部
|
|
76
|
+
6. repo `.claude/memory/MEMORY.md` index + active project memory files(repo mirror,codex 讀得到)
|
|
77
|
+
**A.0 第 6 項的「session 對話脈絡」是唯一結構性拿不到的 — 以本 brief 第 1 段(user 原話 verbatim,Step 0.05)+ 第 2 段(Claude Phase A 結果摘要)補償,此為明文契約非省略**
|
|
78
|
+
**環境對等**:`-C "$PWD"` 同 repo root = 同 spec / 同 scripts / 同 node_modules;bypass sandbox = 可跑跟 Claude 一模一樣的 tsc / invariant / playwright(M31 Step 2 verify 對稱)
|
|
79
|
+
|
|
80
|
+
2. **全 dim deep audit NO-SAMPLE — 判準對等**(對齊 `.claude/skills/design-system-audit/SKILL.md` Group A-Q 全 dim):
|
|
81
|
+
- **判準對等(2026-07-10 user「兩邊都用同樣的完美標準去稽核同樣的完整項目」)**:codex **必讀** `.claude/skills/design-system-audit/references/audit-prompts.md`(每 dim 的 rubric)+ SKILL.md dim 表,**逐 dim 套用該 rubric 判**(= Claude 的 dim sub-agent 判準 SSOT,SKILL.md:257)。**禁**只憑 dim 名 / 自己理解判 —— 那是標準不對稱。
|
|
69
82
|
- **live dim 清單由 Claude brief-gen 時注入**:跑 `node scripts/dispatch-audit-dims.mjs --summary` 把編號 / batch 貼進 brief,並要求 codex **自己再跑一次自確認**(read-only 跑不了 → 用 bypass 跑;禁硬寫 dim 數字,per SKILL.md SSOT-integrity invariant)
|
|
70
83
|
- 每 dim 全 DS-wide 掃,禁 sample top N
|
|
84
|
+
- **回覆必附「dim 覆蓋對帳段」**(2026-07-10 加,回程可驗):列出本 brief 實際掃過的 dim 號 +
|
|
85
|
+
每 dim 一行「N files scanned / M findings(或 0 after 全掃)」。拆多 brief 時每份都要附
|
|
86
|
+
—— B.2 會彙總對 dispatch 清單逐號對帳,缺號 = 補 brief 再跑,不齊不得進 B.3 比稿
|
|
71
87
|
- **機械維度 codex 自己跑**(bypass sandbox,做跟 Claude 一樣的事):`npx tsc -b` / `node scripts/audit-content-quality.mjs --check` / 相關 `node scripts/*-invariants.mjs` / Playwright screenshot(sequential navigate→wait→screenshot→evaluate,per memory Rule 2,禁 batch unsafe)。**貼每個 command 的 literal stdout 當 cite**;真跑不了的(帳號 / 網路 scoped)明標「mechanical-uncoverable, eyeball-only」讓 Claude B.2 補跑
|
|
72
88
|
- 每 finding 必 cite: <file:line> + <quote> + <違反 spec / rule>
|
|
73
89
|
|
|
74
|
-
3.
|
|
90
|
+
3. **A.1b — per-component claim-vs-code 對抗驗證(MANDATORY,NO-SAMPLE;= Claude SKILL A.1b 鏡像,歷史最高產出 pass)**:
|
|
91
|
+
對**每個** component + pattern(全 62+,禁 sample):Read 該元件 `.tsx` **+ 它 wrap 的 lib**(Radix / cmdk / react-day-picker / sonner 等)source,對該元件**所有** anatomy / a11y / principles / spec / docblock 宣稱**逐句**比對真實 code:鍵盤 map / ARIA role / focus 行為 / prop 存在性 / 預設值 / native-vs-custom / token。**「自上次無 code 改動」≠ 可跳過**(content 宣稱可在 code 沒變下就是假的)。輸出 per-component `{component, claimsVerified: N, falseClaims: [{fileLine, 宣稱, 真實 code 行為}]}`。錨:2026-05-30 此 pass 抓 403 findings / 202 FALSE_CLAIM。
|
|
92
|
+
|
|
93
|
+
4. **整理完整報告**(P0 / P1 / P2 分類):
|
|
75
94
|
```
|
|
76
95
|
### Codex Phase B audit
|
|
77
96
|
- P0: <list>
|
|
@@ -87,7 +106,7 @@ node_modules/.bin/codex exec \
|
|
|
87
106
|
- <題 1>: Claude 立場 / 你立場 / spec.md path:line 引文 / world-class ≥3 家對照
|
|
88
107
|
```
|
|
89
108
|
|
|
90
|
-
|
|
109
|
+
5. **禁**:
|
|
91
110
|
- frame 答案進 Claude 思路(不可 paraphrase Claude 結論)
|
|
92
111
|
- sample / heavy agent skip(NO-SAMPLE STRICT)
|
|
93
112
|
- pass-through 共識(必獨立 own report)
|
|
@@ -59,6 +59,27 @@
|
|
|
59
59
|
|
|
60
60
|
**收斂真正靠**:決定性 CI gate(`tsc` / invariant script / hook BLOCKER)+ **寫入時紀律**,**不是** audit loop。deep-audit 是**週期性工具**(release / SSOT 大改 / 季度),不該對「沒變的內容」反覆跑。對齊 Linux kernel `checkpatch.pl` deterministic pre-submit / Toyota TPS Jidoka(機器發現異常自停,非人工反覆巡)。
|
|
61
61
|
|
|
62
|
+
## C.1 final report template(骨架;canonical 規則〔SSOT 理由 / 決策品質四要件〕住 SKILL C.1,本檔不重述)
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
## Deep Audit Cross-Codex 完整報告(N 日期)
|
|
66
|
+
|
|
67
|
+
### Phase A 結果
|
|
68
|
+
- 全 dim findings: <P0/P1/P2> / Autonomous landed: <N 項> commit <hash>
|
|
69
|
+
- SSOT-UI/UX 已拍板: <M 項> / 待拍板: <列出 + 簡述>
|
|
70
|
+
|
|
71
|
+
### Phase B 結果
|
|
72
|
+
- Codex 抓 Claude 漏: <N 項> / Claude 抓 Codex 漏: <M 項> / Cite battle: <K 題,各題 verdict + evidence>
|
|
73
|
+
- 共識 SSOT-UI/UX 待拍板: <列出 + 簡述> / 共識 autonomous landed: <N 項> commit <hash>
|
|
74
|
+
- dim 覆蓋對帳表(B.2 Step 0 契約):dim 號 × Claude 掃了 / codex 掃了,缺號 = 補 brief
|
|
75
|
+
|
|
76
|
+
### 待你拍板(中文人話)
|
|
77
|
+
<決策 1-N(per A.2 format;每題必附「SSOT 理由:」+ 決策品質四要件 marker,canonical 詳 SKILL C.1)>
|
|
78
|
+
|
|
79
|
+
### Verify artifact
|
|
80
|
+
- tsc / invariant / content-quality / visual probe 全 PASS + file:line + diff link;backlog 項必附 verifyCmd+fixedSignal(可攜指令),對帳 = `node scripts/verify-backlog.mjs`(2026-07-07 軌道 3;anchor:C1 十筆考古 9 筆早已修)
|
|
81
|
+
```
|
|
82
|
+
|
|
62
83
|
## 共識決策(Phase B.5)同 format
|
|
63
84
|
|
|
64
85
|
Phase B 共識(Claude + Codex 雙 verify PASS)走相同 propose / autonomous 分流:
|
|
@@ -60,6 +60,11 @@ Purpose: 產品 / feature 通過 prototype → audit → stakeholder 決策後
|
|
|
60
60
|
|
|
61
61
|
### Phase 1 — Inventory 生成
|
|
62
62
|
|
|
63
|
+
**Deterministic 源優先(2026-07-07 治理進化收尾:本 skill 原「幾乎零機械依賴」列冊補強)**:
|
|
64
|
+
- Component / story 母集 = `node scripts/gen-ds-story-manifest.mjs` 產出的 manifest(禁憑記憶列)
|
|
65
|
+
- Token 使用 = `rg -o -- '--[a-z][a-z0-9-]*' <feature files> | sort | uniq -c`(機械計數,非印象;字元類含 0-9 — DS token 名 46% 含數字如 `--chart-1`/`--black-a02`,缺數字會截斷合併成假 key)
|
|
66
|
+
- 消費統計交叉驗 `scripts/audit-orphan-tokens.mjs` 的消費通道邏輯(同一套 5 通道定義)
|
|
67
|
+
|
|
63
68
|
scan 目標 feature 的 code,自動 inventory:
|
|
64
69
|
|
|
65
70
|
1. **Component 清單**(哪些 DS 元件被此 feature 消費):
|