@erclx/canon 5.35.0 → 5.37.0

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 (238) hide show
  1. package/README.md +11 -11
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/SKILL.md +6 -0
  4. package/claude/skills/backlog-triage/SKILL.md +7 -7
  5. package/claude/skills/build-in-slices/SKILL.md +6 -0
  6. package/claude/skills/build-in-slices/references/adopted.md +3 -0
  7. package/claude/skills/canon-cli/REQUIREMENT.md +2 -2
  8. package/claude/skills/canon-cli/SKILL.md +5 -1
  9. package/claude/skills/canon-feedback/SKILL.md +5 -0
  10. package/claude/skills/canon-feedback-triage/SKILL.md +3 -0
  11. package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
  12. package/claude/skills/canvas-board/SKILL.md +5 -2
  13. package/claude/skills/canvas-board/references/canvas.md +12 -0
  14. package/claude/skills/canvas-board/references/design.md +53 -36
  15. package/claude/skills/ci-workflow/SKILL.md +5 -0
  16. package/claude/skills/code-craft/SKILL.md +6 -0
  17. package/claude/skills/codebase-layout/REQUIREMENT.md +1 -1
  18. package/claude/skills/codebase-layout/SKILL.md +2 -2
  19. package/claude/skills/context-fold/references/context.md +48 -34
  20. package/claude/skills/create-rule/REQUIREMENT.md +6 -8
  21. package/claude/skills/create-rule/SKILL.md +19 -17
  22. package/claude/skills/create-rule/references/rule.md +17 -23
  23. package/claude/skills/create-skill/SKILL.md +11 -2
  24. package/claude/skills/create-skill/references/skill-disclosure.md +26 -0
  25. package/claude/skills/create-skill/references/skill-paths.md +3 -0
  26. package/claude/skills/create-skill/references/skill-reference.md +12 -0
  27. package/claude/skills/create-skill/references/skill.md +26 -25
  28. package/claude/skills/deprecation-migration/SKILL.md +6 -0
  29. package/claude/skills/deprecation-migration/references/adopted.md +3 -0
  30. package/claude/skills/design-taste/REQUIREMENT.md +6 -6
  31. package/claude/skills/design-taste/SKILL.md +8 -2
  32. package/claude/skills/design-taste/references/craft.md +4 -1
  33. package/claude/skills/design-taste/references/preflight.md +18 -2
  34. package/claude/skills/design-taste/references/tells.md +1 -1
  35. package/claude/skills/docs-sync/references/docs.md +6 -0
  36. package/claude/skills/docs-sync/references/readme.md +15 -0
  37. package/claude/skills/draft-and-pick/SKILL.md +12 -0
  38. package/claude/skills/draft-doc/references/context.md +1 -1
  39. package/claude/skills/draft-doc/references/readme.md +3 -0
  40. package/claude/skills/draft-figure/references/mermaid.md +6 -0
  41. package/claude/skills/draft-identity/SKILL.md +3 -2
  42. package/claude/skills/draft-slides/SKILL.md +3 -0
  43. package/claude/skills/git-branch/references/branch.md +16 -11
  44. package/claude/skills/git-commit/references/commit.md +19 -11
  45. package/claude/skills/git-commit/references/versioning.md +9 -0
  46. package/claude/skills/git-issue/references/issue.md +12 -9
  47. package/claude/skills/git-pr/SKILL.md +5 -0
  48. package/claude/skills/git-pr/references/pr.md +24 -6
  49. package/claude/skills/git-ship/SKILL.md +3 -0
  50. package/claude/skills/git-split/SKILL.md +6 -0
  51. package/claude/skills/git-stage/SKILL.md +3 -0
  52. package/claude/skills/git-worktree/SKILL.md +6 -6
  53. package/claude/skills/markdown-craft/references/markdown.md +27 -8
  54. package/claude/skills/plan-feature/SKILL.md +10 -1
  55. package/claude/skills/plan-feature/references/plan.md +20 -8
  56. package/claude/skills/plan-groundwork/SKILL.md +6 -0
  57. package/claude/skills/plan-groundwork/references/groundwork.md +10 -7
  58. package/claude/skills/plan-intake/references/intake.md +6 -6
  59. package/claude/skills/read-frames/SKILL.md +3 -0
  60. package/claude/skills/review-craft/SKILL.md +3 -0
  61. package/claude/skills/review-craft/references/ui.md +1 -1
  62. package/claude/skills/review-ui/SKILL.md +6 -3
  63. package/claude/skills/role-orchestrator/SKILL.md +3 -0
  64. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +7 -4
  65. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +3 -0
  66. package/claude/skills/role-planner/SKILL.md +3 -0
  67. package/claude/skills/role-worker/SKILL.md +12 -0
  68. package/claude/skills/search-craft/SKILL.md +3 -0
  69. package/claude/skills/systematic-debugging/SKILL.md +6 -0
  70. package/claude/skills/target-check/references/domains.md +5 -0
  71. package/claude/skills/target-setup/SKILL.md +5 -0
  72. package/claude/skills/task-board/references/tasks.md +9 -6
  73. package/claude/skills/task-complete/references/archive.md +3 -0
  74. package/claude/skills/teach-workspace/SKILL.md +3 -0
  75. package/claude/skills/teach-workspace/references/glossary.md +3 -0
  76. package/claude/skills/teach-workspace/references/lesson-build.md +3 -0
  77. package/claude/skills/teach-workspace/references/lesson-craft.md +3 -0
  78. package/claude/skills/teach-workspace/references/teach.md +8 -8
  79. package/claude/skills/test-craft/SKILL.md +7 -2
  80. package/claude/skills/ux-audit/REQUIREMENT.md +1 -1
  81. package/claude/skills/ux-audit/SKILL.md +2 -2
  82. package/claude/skills/ux-measure/REQUIREMENT.md +1 -1
  83. package/claude/skills/video-craft/SKILL.md +6 -0
  84. package/claude/skills/write-human/SKILL.md +9 -0
  85. package/claude/skills/write-human/references/machine-tells.md +12 -0
  86. package/docs/agents/capture.md +2 -0
  87. package/docs/agents/commands.md +59 -56
  88. package/docs/agents/comments.md +1 -1
  89. package/docs/agents/context-audit-checks.md +6 -0
  90. package/docs/agents/context-audit.md +8 -8
  91. package/docs/agents/context-classify.md +2 -0
  92. package/docs/agents/drift-surfaces.md +5 -5
  93. package/docs/agents/gate.md +6 -7
  94. package/docs/agents/gov-detect.md +1 -1
  95. package/docs/agents/index.md +2 -2
  96. package/docs/agents/install-and-sync.md +6 -6
  97. package/docs/agents/markdown-audit-weight.md +11 -3
  98. package/docs/agents/markdown-audit.md +14 -2
  99. package/docs/agents/output-shape.md +1 -1
  100. package/docs/agents/overview.md +2 -2
  101. package/docs/agents/pr-frames.md +17 -3
  102. package/docs/agents/rule-citations.md +5 -10
  103. package/docs/agents/scripting.md +1 -1
  104. package/docs/agents/sessions-transfer.md +8 -6
  105. package/docs/agents/skills-audit.md +9 -1
  106. package/docs/target/projects.md +2 -2
  107. package/docs/target/scenarios.md +5 -5
  108. package/docs/target/standards-moved.md +20 -18
  109. package/docs/workflow/ai-workflow.md +4 -1
  110. package/docs/workflow/visual-design-workflow.md +8 -3
  111. package/governance/detect.toml +32 -32
  112. package/governance/renames.toml +44 -0
  113. package/governance/rules/lib/{305-e2e-reliability.md → e2e-reliability.md} +1 -1
  114. package/governance/rules/lib/{306-test-scope.md → test-scope.md} +2 -2
  115. package/governance/rules/ui/{410-a11y.md → a11y.md} +1 -1
  116. package/governance/rules/ui/{440-surface-capture.md → surface-capture.md} +3 -3
  117. package/governance/stacks/base.toml +6 -6
  118. package/governance/stacks/go.toml +1 -1
  119. package/governance/stacks/node.toml +1 -1
  120. package/governance/stacks/php.toml +1 -1
  121. package/governance/stacks/python.toml +1 -1
  122. package/package.json +2 -2
  123. package/scripts/core/install-check.sh +2 -7
  124. package/src/capture/frame-values.ts +3 -6
  125. package/src/cli/help-all.ts +96 -0
  126. package/src/cli/help.ts +28 -27
  127. package/src/cli.ts +8 -1
  128. package/src/commands/claude.ts +29 -0
  129. package/src/commands/context.ts +29 -4
  130. package/src/commands/design.ts +22 -1
  131. package/src/commands/gate.ts +1 -8
  132. package/src/commands/gov.ts +25 -3
  133. package/src/commands/init.ts +10 -1
  134. package/src/commands/markdown.ts +148 -3
  135. package/src/commands/pr.ts +17 -10
  136. package/src/commands/records.ts +1 -1
  137. package/src/commands/sync.ts +11 -0
  138. package/src/commands/tooling.ts +8 -0
  139. package/src/context/audit.ts +83 -0
  140. package/src/context/classify/prompts.ts +6 -1
  141. package/src/context/gate.ts +6 -3
  142. package/src/design/budget.ts +14 -10
  143. package/src/design/document.ts +5 -5
  144. package/src/design/parse.ts +21 -4
  145. package/src/design/render.ts +3 -3
  146. package/src/gate/measures.ts +187 -2
  147. package/src/gate/sequencer.ts +0 -4
  148. package/src/gate/stages.ts +32 -27
  149. package/src/git/files.ts +30 -0
  150. package/src/gov/adapter.ts +2 -2
  151. package/src/gov/citations.ts +10 -33
  152. package/src/gov/install.ts +2 -2
  153. package/src/gov/list.ts +1 -1
  154. package/src/gov/payload.ts +1 -1
  155. package/src/gov/stacks.ts +4 -4
  156. package/src/inventory/subjects.ts +1 -1
  157. package/src/markdown/ceiling.ts +6 -1
  158. package/src/markdown/colons.ts +86 -0
  159. package/src/markdown/gate.ts +25 -0
  160. package/src/markdown/growth.ts +43 -0
  161. package/src/markdown/heading-case.ts +74 -0
  162. package/src/markdown/stacks.ts +74 -0
  163. package/src/markdown/structure.ts +72 -4
  164. package/src/migrate/rule-layout.ts +12 -12
  165. package/src/pr/frames.ts +66 -1
  166. package/src/shipped/references.ts +14 -14
  167. package/src/sync/check.ts +23 -23
  168. package/src/sync/copy.ts +4 -5
  169. package/tooling/astro/configs/tsconfig.json +1 -1
  170. package/tooling/astro/manifest.toml +0 -1
  171. package/tooling/astro/reference.md +2 -10
  172. package/tooling/base/configs/scripts/verify.json +1 -1
  173. package/tooling/base/configs/scripts/verify.ts +23 -13
  174. package/tooling/base/manifest.toml +6 -5
  175. package/tooling/base/reference.md +15 -22
  176. package/tooling/base/seeds/.github/workflows/verify.yml +0 -6
  177. package/tooling/base/seeds/.lintstagedrc +1 -2
  178. package/tooling/base/seeds/canon/context/ci.md +7 -8
  179. package/tooling/base/seeds/canon/context/development.md +10 -10
  180. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +9 -1
  181. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +27 -2
  182. package/tooling/claude/seeds/CLAUDE.md +1 -1
  183. package/tooling/claude/seeds/canon/DESIGN.md +24 -37
  184. package/tooling/shell/configs/.github/workflows/shell.yml +30 -0
  185. package/tooling/shell/manifest.toml +12 -0
  186. package/tooling/shell/reference.md +46 -0
  187. package/tooling/vite-react/configs/tsconfig.json +1 -1
  188. package/tooling/vite-react/configs/vitest.config.ts +1 -1
  189. package/tooling/vite-react/manifest.toml +0 -1
  190. package/tooling/vite-react/reference.md +2 -10
  191. package/tooling/web/configs/.github/workflows/readme-screenshot.yml +3 -5
  192. package/tooling/web/configs/.github/workflows/verify.yml +0 -6
  193. package/tooling/web/configs/src/test/setup.ts +1 -1
  194. package/tooling/web/manifest.toml +4 -4
  195. package/tooling/web/reference.md +4 -4
  196. package/tooling/base/configs/scripts/verify.sh +0 -2
  197. /package/governance/rules/canon/{606-git.md → git.md} +0 -0
  198. /package/governance/rules/canon/{611-indexes.md → indexes.md} +0 -0
  199. /package/governance/rules/canon/{604-scratch.md → scratch.md} +0 -0
  200. /package/governance/rules/canon/{602-tasks.md → task-scope.md} +0 -0
  201. /package/governance/rules/canon/{605-worktrees.md → worktrees.md} +0 -0
  202. /package/governance/rules/claude/{566-output.md → output.md} +0 -0
  203. /package/governance/rules/code/{000-code.md → routing.md} +0 -0
  204. /package/governance/rules/code/{010-testing.md → testing.md} +0 -0
  205. /package/governance/rules/framework/{210-astro.md → astro.md} +0 -0
  206. /package/governance/rules/framework/{220-fastapi.md → fastapi.md} +0 -0
  207. /package/governance/rules/framework/{230-nextjs.md → nextjs.md} +0 -0
  208. /package/governance/rules/framework/{200-react.md → react.md} +0 -0
  209. /package/governance/rules/framework/{260-shadcn.md → shadcn.md} +0 -0
  210. /package/governance/rules/framework/{250-tailwind.md → tailwind.md} +0 -0
  211. /package/governance/rules/lang/{130-go.md → go.md} +0 -0
  212. /package/governance/rules/lang/{140-php.md → php.md} +0 -0
  213. /package/governance/rules/lang/{110-python.md → python.md} +0 -0
  214. /package/governance/rules/lang/{100-typescript.md → typescript.md} +0 -0
  215. /package/governance/rules/lib/{370-database.md → database.md} +0 -0
  216. /package/governance/rules/lib/{340-pydantic.md → pydantic.md} +0 -0
  217. /package/governance/rules/lib/{360-security-server.md → security-server.md} +0 -0
  218. /package/governance/rules/lib/{350-security-web.md → security-web.md} +0 -0
  219. /package/governance/rules/lib/{320-tanstack-query.md → tanstack-query.md} +0 -0
  220. /package/governance/rules/lib/{335-testing-go.md → testing-go.md} +0 -0
  221. /package/governance/rules/lib/{336-testing-php.md → testing-php.md} +0 -0
  222. /package/governance/rules/lib/{330-testing-py.md → testing-py.md} +0 -0
  223. /package/governance/rules/lib/{300-testing-ts.md → testing-ts.md} +0 -0
  224. /package/governance/rules/lib/{310-zod.md → zod.md} +0 -0
  225. /package/governance/rules/tooling/{700-ci-workflow.md → ci-workflow.md} +0 -0
  226. /package/governance/rules/tooling/{790-code-comments.md → code-comments.md} +0 -0
  227. /package/governance/rules/tooling/{780-config-comments.md → config-comments.md} +0 -0
  228. /package/governance/rules/tooling/{775-dependencies.md → dependencies.md} +0 -0
  229. /package/governance/rules/ui/{480-canvas.md → canvas.md} +0 -0
  230. /package/governance/rules/ui/{400-ui.md → copy.md} +0 -0
  231. /package/governance/rules/ui/{460-design-taste.md → design-taste.md} +0 -0
  232. /package/governance/rules/ui/{420-forms.md → forms.md} +0 -0
  233. /package/governance/rules/ui/{465-interface-casing.md → interface-casing.md} +0 -0
  234. /package/governance/rules/ui/{450-link-behavior.md → link-behavior.md} +0 -0
  235. /package/governance/rules/ui/{470-motion.md → motion.md} +0 -0
  236. /package/governance/rules/ui/{430-ux-completeness.md → ux-completeness.md} +0 -0
  237. /package/tooling/{base → shell}/configs/.editorconfig +0 -0
  238. /package/tooling/{base → shell}/configs/.shellcheckrc +0 -0
@@ -55,13 +55,23 @@ A relative link's destination resolves against the filesystem, over the same cor
55
55
 
56
56
  The placeholder exemption is the one live case the corpus needs. Every current instance is a genuine illustration rather than a literal path, and a marker-based override is available for the day a real one needs an exception instead.
57
57
 
58
+ ### Colons and heading case
59
+
60
+ Two advisory measures report beside the bans and never fail a run.
61
+
62
+ The colon measure reports a colon followed by more text in a prose line, outside the label position. A list item's first colon, a bold or code span label, a line-final colon, a time, a URL, and anything inside a code span or a link are left alone. A heading, a table row, and a fenced line are skipped. Each finding carries the line, the column, the line's text, and the word before the colon as `lead` under `colons` in the `--json` entry.
63
+
64
+ The heading-case measure reports a heading or a frontmatter `title` with a capitalized word after its first, outside code spans and all-caps tokens, under `headingCase`. A proper noun reports as well and is left as it is.
65
+
66
+ `CHANGELOG.md` is exempt from both, since the release tool writes its headings.
67
+
58
68
  ### Weight, cadence, and length
59
69
 
60
- Bullet and paragraph weight, run depth, the two cadence numbers, and the document length ceiling are each a judgment a reader settles rather than a fact a scan settles. What each measures, the samples behind its checkpoint, and why none of them gates are in `markdown-audit-weight.md`.
70
+ Bullet and paragraph weight, bullet stacks, run depth, the two cadence numbers, and the document length ceiling are each a judgment a reader settles rather than a fact a scan settles. What each measures, the samples behind its checkpoint, and why none of them gates are in `markdown-audit-weight.md`.
61
71
 
62
72
  ## Exit codes
63
73
 
64
- Exit codes are `0` for a completed run with no gating finding, `1` for a refusal, `2` for a ban hit or a dead relative link, and `3` for a shipped ban set that arrived empty. A banned character and a relative link resolving to nothing on disk each fail the run, both facts a scan settles rather than a reader judging. Bullet, paragraph, and depth weight are judgments a reader settles, and cadence is a distribution whose healthy range moves with the surface, so all four report under every code. Length reports the same way, since the audit also runs on a plan kept out of version control, and the Document ceiling stage in `canon gate run` owns that verdict instead.
74
+ Exit codes are `0` for a completed run with no gating finding, `1` for a refusal, `2` for a ban hit or a dead relative link, and `3` for a shipped ban set that arrived empty. A banned character and a relative link resolving to nothing on disk each fail the run, both facts a scan settles rather than a reader judging. Bullet, paragraph, and depth weight are judgments a reader settles, and cadence is a distribution whose healthy range moves with the surface, so all four report under every code. A bullet stack, a run of more than 5 plain bullets, reports the same way, and the `bullet-stacks` stage in `canon gate run` owns its verdict. Length reports the same way, since the audit also runs on a plan kept out of version control, and the Document ceiling stage in `canon gate run` owns that verdict instead.
65
75
 
66
76
  `3` is separate from `1` because the two want different responses from a caller. A refusal means no corpus was built, and the `Markdown bans` stage in `canon gate run` is right to report it as unmeasured rather than as a pass. An empty set means the corpus was walked and nothing was looked for, so that stage fails the push on `3` rather than skipping.
67
77
 
@@ -95,6 +105,8 @@ The target push stage excludes `CHANGELOG.md`, unlike every other surface here.
95
105
 
96
106
  The hook prefers a checkout's own `src/cli.ts` over a globally installed binary, so it and the push stage read one build. A published binary lags a branch by whatever has not been released, which would put a ban kind added on the branch into the push and not into the edit. It reads its findings out of the `--json` record rather than off the exit code, so an older binary still reports where the fallback applies. It reads `bans.emptySets` out of the same record, so a set the verb shipped empty reaches the author as a check narrowed to what it could measure rather than as a clean pass.
97
107
 
108
+ It also relays the two advisory measures from the same record. A heading finding reports for the whole file, and a colon finding reports only where the word before the colon and the colon appear in the text the write carried, so an edit is never asked to answer for a colon it left untouched.
109
+
98
110
  That field replaced `bans.missingStandards`, which answered a standard resolving under none of three roots. The set ships with the package now, so the state it named cannot occur and the narrowed check has one cause left, a defect in the build. The hook keeps reading a field either way, since a reader cannot tell a narrowed check from a clean one without it.
99
111
 
100
112
  Both hooks answer an absent record as well. A completed run always writes the record and a refusal writes none, so an empty one means the verb declined to measure rather than measured and found nothing. The verb needs a git repository to build its corpus and refuses without one, which is a project the seeded hook can be installed into, and reading the findings alone reported that as a clean file.
@@ -40,7 +40,7 @@ Rules:
40
40
  └
41
41
  ```
42
42
 
43
- Help skips the banner. The `Usage:` line sits directly on `├`. Help writes to stdout because `--help` is documentation, not runtime UI.
43
+ Help skips the banner. The `Usage:` line sits directly on `├`. Help writes to stdout because `--help` is documentation, not runtime UI. `--help --all` on a command prints each block unframed, one after another, and a help request naming an unknown subcommand, under a group that takes no operand of its own, writes its refusal to stderr and exits 1.
44
44
 
45
45
  ## JSON and `--names` modes
46
46
 
@@ -11,7 +11,7 @@ This folder is an index of what an agent can run and how to run it cleanly from
11
11
 
12
12
  ## Invocation rules
13
13
 
14
- See `CLAUDE.md` design principles. They apply to every command in this folder.
14
+ `output-shape.md` holds the stream and exit contract. It applies to every command in this folder.
15
15
 
16
16
  ## Where to start
17
17
 
@@ -21,6 +21,6 @@ See `CLAUDE.md` design principles. They apply to every command in this folder.
21
21
 
22
22
  ## Related
23
23
 
24
- - `CLAUDE.md`: project behaviors and design principles
24
+ - `CLAUDE.md`: project behaviors
25
25
  - `.claude/skills/internal-*`: domain-scoped guidance for editing work, in the toolkit checkout only
26
26
  - `docs/index.md`: full docs directory
@@ -8,7 +8,7 @@ description: How canon pr frames pushes a UI review frame to a never-merged bran
8
8
  `canon pr frames` gives a review comment an image it can embed. `review-ui`
9
9
  drives a pull request's checklist and captures a frame per box, and a frame
10
10
  on the reviewer's disk resolves for nobody else. The verb pushes one frame to
11
- the `canon-frames` branch and returns a link to its path there.
11
+ the `canon/frames` branch and returns a link to its path there.
12
12
 
13
13
  ```bash
14
14
  canon pr frames 1341 --add frames/3.png --box 3 --head <sha> --pass 20261002T154450Z --json
@@ -19,7 +19,7 @@ canon pr frames --prune 30 --json
19
19
 
20
20
  ## What it writes
21
21
 
22
- The verb writes `refs/heads/canon-frames` and no other ref. Every call goes
22
+ An add writes `refs/heads/canon/frames` and no other ref. Every call goes
23
23
  through the GitHub git data API, being blobs, trees, commits, and that one ref,
24
24
  so nothing is checked out, no worktree is entered, and neither `main` nor any
25
25
  branch a pull request holds is touched. The branch never merges.
@@ -36,7 +36,7 @@ box therefore writes a new file rather than replacing the image an earlier
36
36
  comment shows, which matters when a preview is minted again at one head.
37
37
 
38
38
  `link` uses the same `blob/<ref>/<path>?raw=true` form as the evidence comment,
39
- naming the `canon-frames` branch rather than a commit. Every drop rewrites the
39
+ naming the `canon/frames` branch rather than a commit. Every drop rewrites the
40
40
  branch, and a link pinned to a commit would stop resolving for every other pull
41
41
  request's frames once GitHub collects the commit it names. A path link lives
42
42
  exactly as long as its file, so it survives every rewrite that drops another
@@ -97,6 +97,20 @@ than that many days ago, in a single rewrite. It keeps one still open, one
97
97
  reopened after closing, one closed exactly the given days ago, and one whose
98
98
  state could not be read, listing that last kind under `unread`.
99
99
 
100
+ ## The legacy branch
101
+
102
+ Frames lived on `canon-frames` before the rename to `canon/frames`. An add
103
+ never writes it. `--drop` and `--prune` also run against it after the
104
+ current branch, remove only, and delete it once empty. `--prune` drains it
105
+ as its pull requests expire, and `--drop` clears one pull request at once.
106
+ The record carries `legacy: true` when that
107
+ pass changed the ref, and its `removed` list folds both branches in, naming
108
+ a pull request once. A missing or unreadable legacy ref never fails a run
109
+ the current branch finished.
110
+
111
+ A link minted before the rename points at `blob/canon-frames/...` and keeps
112
+ resolving until its pull request has been closed 30 days or `--drop` runs.
113
+
100
114
  This repository runs `--prune 30` daily from
101
115
  `.github/workflows/pr-frames-cleanup.yml`. A frame's file stays on the branch
102
116
  until its own pull request has been closed for 30 days, so a link in a review
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Rule citations
3
- description: Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the two forms a citation is written in, the shapes that look like citations and are not, the two classes where an absent path is correct, why the glob half reads one corpus, and why this one gates
3
+ description: Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the one form a citation is written in, the shapes that look like citations and are not, the two classes where an absent path is correct, why the glob half reads one corpus, and why this one gates
4
4
  ---
5
5
 
6
6
  # Rule citations
@@ -28,14 +28,9 @@ Under `--json` the record holds stdout alone and the frame still renders on stde
28
28
 
29
29
  Two files agreeing is what a drift check measures. Whether either one is right about the tree is a different question, and this is the stage that asks it.
30
30
 
31
- ## The two forms
31
+ ## The one form
32
32
 
33
- A citation reaches a reader in one of two shapes, and each resolves against a different root.
34
-
35
- | Form | Shape | Resolves against |
36
- | --------- | ------------------------ | ---------------------------------- |
37
- | `path` | a backticked path | the root |
38
- | `sibling` | a bare `<nnn>-<slug>.md` | the folder the citing rule sits in |
33
+ A citation reaches a reader as a backticked path, reported under the form `path`, and it resolves against the root. A bare filename is never a citation, since with no folder around it nothing tells a rule from a convention such as `index.md`. A rule pointing at another rule writes its repository path.
39
34
 
40
35
  A call to the retired standards verb is no form here. A rule holding one fails the shipped-references stage of `canon gate run`, which reads every shipped file for it.
41
36
 
@@ -46,7 +41,7 @@ A `path` is anchored on the whole backticked span rather than on a trailing patt
46
41
  A rule body is full of backticked spans carrying a slash, and almost none of them names a file in this tree. The stage declines four shapes outright.
47
42
 
48
43
  - A placeholder or glob segment describes a shape rather than naming a file: `canon/context/<domain>.md`, `app/**/route.ts`, `${CLAUDE_SKILL_DIR}/../references/<name>.md`.
49
- - A bare filename names a convention: `route.ts`, `manifest.toml`, `components.json`, `playwright.config.ts`. A bare name is read as a citation only when it matches a rule filename, which is how one authored rule would point at a sibling such as `605-worktrees.md`.
44
+ - A bare filename names a convention: `route.ts`, `manifest.toml`, `components.json`, `playwright.config.ts`.
50
45
  - A span carrying no file extension is a folder or a module specifier: `src/pages/`, `next/font`, `try/except`, `react-hooks/set-state-in-effect`, `oven-sh/setup-bun@v2`, `@/lib/utils`.
51
46
  - A fenced block displays a path rather than pointing at one.
52
47
 
@@ -70,7 +65,7 @@ A rule under `governance/rules/` installs into a target, and its `paths:` entrie
70
65
 
71
66
  `internal/rules/` ships nowhere. The tree it governs is the tree present, which makes the question answerable, and all 14 of its globs across 7 rules match at the commit this shipped on.
72
67
 
73
- What that leaves unreached is a glob that matches real files and still reaches none of the work it was scoped at. `governance/rules/lib/305-e2e-reliability.md` scoped itself at `e2e/*.ts` and `e2e/**/*.ts` and now reads `**/e2e/**/*.ts`. No probe in this repository is written under `e2e/`, so the rule asking a session to watch a new guard fail never fired for the session writing guards. Resolution is mechanical and reach is a judgment about where the work happens, so only the first is here.
68
+ What that leaves unreached is a glob that matches real files and still reaches none of the work it was scoped at. `governance/rules/lib/e2e-reliability.md` scoped itself at `e2e/*.ts` and `e2e/**/*.ts` and now reads `**/e2e/**/*.ts`. No probe in this repository is written under `e2e/`, so the rule asking a session to watch a new guard fail never fired for the session writing guards. Resolution is mechanical and reach is a judgment about where the work happens, so only the first is here.
74
69
 
75
70
  ## The exemption marker
76
71
 
@@ -79,7 +79,7 @@ CANON_NON_INTERACTIVE=1 canon tooling diff astro /path/to/project
79
79
  CANON_NON_INTERACTIVE=1 canon tooling sync astro /path/to/project --write
80
80
 
81
81
  # Install a governance stack (the stack argument is required headlessly)
82
- CANON_NON_INTERACTIVE=1 canon gov install node --add 210-astro,260-shadcn /path/to/project
82
+ CANON_NON_INTERACTIVE=1 canon gov install node --add astro,shadcn /path/to/project
83
83
 
84
84
  # Update installed governance rules, dropping a retired .claude/GOV.md
85
85
  CANON_NON_INTERACTIVE=1 canon gov sync /path/to/project
@@ -67,12 +67,14 @@ The transcript and side folder land under `projects/<encoding>/`, where the enco
67
67
 
68
68
  Exit codes: `0` the session was placed, `1` refused. The refusal carries one of these reasons:
69
69
 
70
- - `not-a-bundle`: the file is no gzip tarball, carries no manifest at format `1`, or names a path outside its own session, such as one climbing out with `..` or an absolute one
71
- - `other-repository`: the local `origin` differs from the one the bundle recorded
72
- - `exists`: the target transcript or side folder is already there, or any other project folder already holds a transcript for the id, which `--resume <id>` could reach first
73
- - `live-here`: the id is live in the local roster, so a second copy would fork it
74
- - `write-failed`: a write failed partway for a reason other than a copy appearing, such as a bundle carrying a file where it also needs a folder
75
- - `no-archive`: the running Bun predates `Bun.Archive`
70
+ | Reason | Meaning |
71
+ | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
72
+ | `not-a-bundle` | the file is no gzip tarball, carries no manifest at format `1`, or names a path outside its own session, such as one climbing out with `..` or an absolute one |
73
+ | `other-repository` | the local `origin` differs from the one the bundle recorded |
74
+ | `exists` | the target transcript or side folder is already there, or any other project folder already holds a transcript for the id, which `--resume <id>` could reach first |
75
+ | `live-here` | the id is live in the local roster, so a second copy would fork it |
76
+ | `write-failed` | a write failed partway for a reason other than a copy appearing, such as a bundle carrying a file where it also needs a folder |
77
+ | `no-archive` | the running Bun predates `Bun.Archive` |
76
78
 
77
79
  A write that fails partway removes every file this run placed and every folder it created before refusing, so a retry of the same bundle does not refuse on its own leftovers. Any path it could not remove is named in the message. A copy that appears between the existence check and the write refuses as `exists` on the same terms.
78
80
 
@@ -28,14 +28,22 @@ The audit reads the directory it is pointed at, defaulting to the cwd. `canon cl
28
28
 
29
29
  Each check traces to a line in the standard.
30
30
 
31
- - `REQUIREMENT.md` present in every skill folder
31
+ ### Folder and frontmatter
32
+
32
33
  - Frontmatter `name` matching the folder name
33
34
  - Frontmatter `description` present
34
35
  - `description` under 1024 characters
35
36
  - No `README.md` inside a skill folder
36
37
  - Folder name in kebab-case
38
+
39
+ ### Requirement and content
40
+
41
+ - `REQUIREMENT.md` present in every skill folder
37
42
  - Each `REQUIREMENT.md` declaring `Gap` and `Must`, matched at any heading level
38
43
  - No ISO date in `SKILL.md` or any file under `references/`, reported as `datedProvenance` in the JSON record's `findings`
44
+
45
+ ### Practice, references, and family
46
+
39
47
  - Each listed practice skill closing with `## Excuses and rebuttals`, `## Red flags`, and `## Before handing over`, and each skill on the wider ledger list carrying `references/adopted.md`, reported together as `practiceShape`
40
48
  - Each file under `references/` running over 100 lines opening with a `## Contents` H2, reported as `referenceContents`
41
49
  - Each skill under `claude/skills/` declaring a `metadata.family` that names a key in `checkpoints.families`, reported as `family`
@@ -72,7 +72,7 @@ Keep the `## Scripts` table in `canon/context/development.md` current as scripts
72
72
  Scaffold installs tooling and seeds. It does not fill the planning docs or the design system. Complete those before the first feature session:
73
73
 
74
74
  1. Fill `canon/REQUIREMENTS.md`. The seed asks for the problem in one line, then goals and non-goals, and the scope is yours to write. The seed states its own cap of 600 words, and `canon context audit` gates on it. Edit the number in the record to loosen it. A decision about how the project is built goes in the `canon/context/` entry of the domain it constrains.
75
- 2. For a UI project, write `canon/DESIGN.md` from the seed template, or work the direction out with `canon:canvas-board` and carry the pick in. Skip for non-UI projects.
75
+ 2. For a UI project, write `canon/DESIGN.md` from the seed template and name the project's stylesheet in its lead, or work the direction out with `canon:canvas-board` and carry the pick in. Skip for non-UI projects.
76
76
  3. Optionally invoke `canon:draft-figure` naming an architecture view, such as system context or components, and the document it belongs in. It draws the view from the context index, the folder layout, and the requirements and renders it to verify the layout, which downloads the Mermaid CLI on first use and takes about 15 seconds.
77
77
  4. Start the feature loop. See [AI workflow](../workflow/ai-workflow.md) for the per-feature sequence.
78
78
 
@@ -88,7 +88,7 @@ Escalate for a project writing code. The `target-setup` skill reads `package.jso
88
88
 
89
89
  In a monorepo the skill reads each folder holding a `package.json`, `pyproject.toml`, `go.mod`, `composer.json`, or `Cargo.toml` to depth two, skipping what git ignores. Each of those folders gets its own tooling stack and a `canon tooling sync <stack> <folder> --skip base` in the preview. Governance still installs once at the root, since a rule's `paths:` globs reach every subfolder, so a subfolder's language rules join the root install through `--add`.
90
90
 
91
- The server-side security and persistence rules belong to no stack. `canon gov detect` proposes both from a server framework or database client in the manifest, which you confirm in the preview, or add them by hand with `--add 360-security-server,370-database`.
91
+ The server-side security and persistence rules belong to no stack. `canon gov detect` proposes both from a server framework or database client in the manifest, which you confirm in the preview, or add them by hand with `--add security-server,database`.
92
92
 
93
93
  Markdown-heavy projects, CLI tools, docs sites, research notebooks, and scripting repos stay on `base`. Escalation is a ceiling move, not a default.
94
94
 
@@ -26,7 +26,7 @@ bun create vite my-app && cd my-app
26
26
  claude
27
27
  ```
28
28
 
29
- Invoke `canon:target-setup`. The skill reads `package.json` and the Vite config, resolves tooling to `vite-react` and governance to `node`, proposes `200-react` and the other rules its manifest matches as extras, and runs `canon init` with the resolved flags.
29
+ Invoke `canon:target-setup`. The skill reads `package.json` and the Vite config, resolves tooling to `vite-react` and governance to `node`, proposes `react` and the other rules its manifest matches as extras, and runs `canon init` with the resolved flags.
30
30
 
31
31
  Ongoing maintenance:
32
32
 
@@ -34,22 +34,22 @@ Ongoing maintenance:
34
34
  - Seed drift: merge by hand against the toolkit copy
35
35
  - Catch-all sync: `canon sync .`
36
36
  - Governance rule refresh only: `canon gov sync .`
37
- - Layer a new rule on top, for example `260-shadcn` after adopting shadcn: `canon gov install node --add 260-shadcn .`
37
+ - Layer a new rule on top, for example `shadcn` after adopting shadcn: `canon gov install node --add shadcn .`
38
38
 
39
39
  ## Monorepo with multiple language roots
40
40
 
41
41
  The repo root owns the shared `base` layer, and each language lives in its own subfolder.
42
42
 
43
43
  ```bash
44
- canon init --stack node --add 200-react .
44
+ canon init --stack node --add react .
45
45
  canon tooling sync vite-react ./frontend --skip base --write
46
46
  canon tooling sync python ./backend --skip base --write
47
47
  ```
48
48
 
49
- `--skip base` drops the `base` layer from each subtree sync, so husky, prettier, commitlint, and CI stay single at the repo root. The one exception is base's verify runner, `scripts/verify.sh`, `scripts/verify.ts`, and `scripts/verify.json`, which every subtree still receives so it can verify on its own. Without it, every subtree re-drops husky, and since git honors only one `core.hooksPath` the extra hook dirs silently break. Each subtree still gets its own framework configs (eslint, vitest, tsconfig, vite), and its own stack reference reads through `canon tooling reference <stack>`.
49
+ `--skip base` drops the `base` layer from each subtree sync, so husky, prettier, commitlint, and CI stay single at the repo root. The one exception is base's verify runner, `scripts/verify.ts` and `scripts/verify.json`, which every subtree still receives so it can verify on its own. Without it, every subtree re-drops husky, and since git honors only one `core.hooksPath` the extra hook dirs silently break. Each subtree still gets its own framework configs (eslint, vitest, tsconfig, vite), and its own stack reference reads through `canon tooling reference <stack>`.
50
50
 
51
51
  A sync whose target sits below the git root knows it is writing into a subfolder:
52
52
 
53
53
  - It withholds `.github/`, since GitHub reads workflows only at the repository root, and names each withheld file. Run the subtree from a job in the root workflow instead, with `working-directory` set to the subtree path the sync prints, such as `working-directory: frontend`.
54
54
  - It installs no dependencies and adds no scripts to a subtree without a `package.json`. It names what it skipped and ends on `run 'bun init' in <path>, then sync again`.
55
- - The subtree carries no `check` script, since that lives in the root's base layer, so run `./scripts/verify.sh` there. It skips the format and shell phases a subtree does not declare, since the root runs them, and still fails on a missing lint, typecheck, or test script, the phases its stack's `scripts/verify.json` requires.
55
+ - The subtree carries no `check` script, since that lives in the root's base layer, so run `bun scripts/verify.ts` there. It skips the format phase a subtree does not declare, since the root runs them, and still fails on a missing lint, typecheck, or test script, the phases its stack's `scripts/verify.json` requires.
@@ -10,23 +10,25 @@ category: Agent surface
10
10
 
11
11
  Each standard now lives at `references/<name>.md` in the skill that owns it. Load that skill and read the reference it names:
12
12
 
13
- - `task-board`: `board`, `tasks`, `tasks-decline`
14
- - `context-fold`: `context`
15
- - `canvas-board`: `canvas`, `design`
16
- - `docs-sync`: `docs`, `readme`
17
- - `draft-figure`: `figures`, `mermaid`
18
- - `create-rule`: `rule`
19
- - `create-skill`: `skill`, `skill-paths`, `skill-practice`, `skill-requirement`
20
- - `git-branch`: `branch`, `slug`
21
- - `git-commit`: `commit`, `versioning`
22
- - `git-pr`: `pr`, `publish`
23
- - `markdown-craft`: `markdown`
24
- - `teach-workspace`: `glossary`, `teach`
25
- - `plan-groundwork`: `groundwork`, `groundwork-spikes`
26
- - `plan-intake`: `intake`
27
- - `plan-feature`: `plan`, `plan-lifecycle`
28
- - `draft-ready`: `ready`
29
- - `draft-doc`: `requirements`, `wiki`
30
- - `session-map`: `session`
13
+ | Skill | Standards |
14
+ | ----------------- | ------------------------------------------------------------- |
15
+ | `task-board` | `board`, `tasks`, `tasks-decline` |
16
+ | `context-fold` | `context` |
17
+ | `canvas-board` | `canvas`, `design` |
18
+ | `docs-sync` | `docs`, `readme` |
19
+ | `draft-figure` | `figures`, `mermaid` |
20
+ | `create-rule` | `rule` |
21
+ | `create-skill` | `skill`, `skill-paths`, `skill-practice`, `skill-requirement` |
22
+ | `git-branch` | `branch`, `slug` |
23
+ | `git-commit` | `commit`, `versioning` |
24
+ | `git-pr` | `pr`, `publish` |
25
+ | `markdown-craft` | `markdown` |
26
+ | `teach-workspace` | `glossary`, `teach` |
27
+ | `plan-groundwork` | `groundwork`, `groundwork-spikes` |
28
+ | `plan-intake` | `intake` |
29
+ | `plan-feature` | `plan`, `plan-lifecycle` |
30
+ | `draft-ready` | `ready` |
31
+ | `draft-doc` | `requirements`, `wiki` |
32
+ | `session-map` | `session` |
31
33
 
32
34
  One name moved under a new filename. `standard`, the shape of a standard itself, became `skill-reference.md` in `create-skill`, since the toolkit no longer ships a standards folder to hold one.
@@ -17,7 +17,7 @@ Project docs split across three roots at the project root. What the project auth
17
17
  ```plaintext
18
18
  canon/
19
19
  ├── REQUIREMENTS.md ← problem, goals, non-goals
20
- ├── DESIGN.md ← visual intent and token decisions (UI projects)
20
+ ├── DESIGN.md ← visual intent, pointing at the stylesheet (UI projects)
21
21
  └── context/ ← per-domain narrative loaded on demand via index.md
22
22
 
23
23
  .claude/
@@ -52,6 +52,9 @@ Work in Claude Code directly. It reads `CLAUDE.md` automatically and has full fi
52
52
  - When the input is a pile of findings rather than one feature, invoke `canon:plan-intake` first. It files the dump into `.canon/intake/<nn>-<slug>/`, one item per finding carrying a problem measured against the tree, a proposed fix, and a verdict, then names which items are plan-ready, which need measuring, and which are already settled.
53
53
  - When the backlog has grown past what anyone rereads, invoke `canon:backlog-triage`. It files one item per backlog row into an intake folder, suggesting decline, archive, keep, or promote and leaning toward decline, and once `canon:plan-intake-answer` has taken your answers, a second run applies the approved verdicts through the task verbs.
54
54
  - When the current state is unmeasured and more than one approach is live, invoke `canon:plan-groundwork` first. It opens a track folder under `.canon/groundwork/<nn>-<slug>/` and ends in a decision, which may be to do nothing. Skip it when the approach is already settled.
55
+
56
+ Then plan and build:
57
+
55
58
  - Invoke `canon:plan-feature` to scan for code-level conflicts and ambiguities, confirm approach before proceeding
56
59
  - Implement the feature, then Claude Code runs the commands defined in `CLAUDE.md`, fixes failures, and iterates until all pass
57
60
  - For UI changes, invoke `canon:ui-checklist` to write what a reviewer has to look at and name any behavior shipping without a test
@@ -14,19 +14,19 @@ The tier framework sits alongside [Claude Design](../../wiki/claude/design.md),
14
14
 
15
15
  ## Tier 0: prose only
16
16
 
17
- The default. `canon/DESIGN.md` holds visual intent as token tables for color, typography, spacing, and borders, with one Personality paragraph and at most three one-line rules a section, motion and iconography included.
17
+ The default. `canon/DESIGN.md` holds visual intent, being one Overview paragraph, at most three one-line rules a section, and a table naming what each color and shape role is for. Its lead names the stylesheet the values live in, since a hand-typed copy of them drifts from the CSS.
18
18
 
19
19
  Claude Code reads it and writes the implementation. Works for CLI tools, internal dashboards, admin panels, and backend-focused projects.
20
20
 
21
21
  ### Seed shape
22
22
 
23
- The toolkit seed in `tooling/claude/seeds/canon/DESIGN.md` ships a token-table template with a starting set of roles, and `claude/skills/canvas-board/references/design.md` carries the same tables under `## Template` with placeholder rows. The column headers are what the renderer parses, so they stay verbatim in either, while the rows and values are the project's own.
23
+ The toolkit seed in `tooling/claude/seeds/canon/DESIGN.md` ships an intent template with a starting set of roles, each naming its custom property, and `claude/skills/canvas-board/references/design.md` carries the same tables under `## Template` with placeholder rows. The column headers are what the parser reads, so they stay verbatim in either, while the rows are the project's own. The seed's lead asks for the project's own stylesheet, such as `src/styles/tokens.css` or a Tailwind `@theme` block, and falls back to `.claude/design/project/` only when the project has none.
24
24
 
25
25
  `canon design render` writes an HTML plus CSS preview to `.canon/tmp/render/design/` for eyeballing the current system without leaving Claude Code. See `canon/context/design/index.md`.
26
26
 
27
27
  A project wanting a neutral starting point to override runs `canon design install`, which copies one stylesheet to `.claude/design/base.css` carrying an achromatic token set as custom properties and two components built on them. Greys run from near-black to near-white and the accent is monochrome, so the only palette the project renders is one it writes itself. That file is toolkit-owned and `canon design sync` refreshes it, so a project overrides a value in `.claude/design/project/` instead, which sync never touches. Nothing arrives without that install, and the two channels are independent: a record the project wrote is its own, and the installed stylesheet is the toolkit's.
28
28
 
29
- A cell no source anchors ends in `? verify`, and the preview shows that marker beside the value rather than folding it in, so a swatch and a font sample stay built from the value alone. A confidence line above the sections names how many cells are anchored against how many are tagged, which is what tells a reader whether they are looking at a record of the code or a proposal about it. It reads the columns a source could anchor and leaves out the row names, so the ratio is not diluted by cells no tag could ever reach. The proposal path tags nearly all of them, so that count reads low on day one by design.
29
+ A record generated from a token source carries the values in tables instead, which is the shape this toolkit's own record takes. There a cell no source anchors ends in `? verify`, and the preview shows that marker beside the value rather than folding it in, so a swatch and a font sample stay built from the value alone. A confidence line above the sections names how many cells are anchored against how many are tagged, which is what tells a reader whether they are looking at a record of the code or a proposal about it. It reads the columns a source could anchor and leaves out the row names, so the ratio is not diluted by cells no tag could ever reach. The proposal path tags nearly all of them, so that count reads low on day one by design.
30
30
 
31
31
  ### Tools
32
32
 
@@ -35,9 +35,14 @@ A cell no source anchors ends in `? verify`, and the preview shows that marker b
35
35
 
36
36
  ### Skills
37
37
 
38
+ #### Reviewing and measuring
39
+
38
40
  - `canon:ui-checklist` for what a reviewer has to look at after UI changes, and what ships without a test
39
41
  - `canon:ux-audit` for UX gap detection on existing surfaces
40
42
  - `canon:ux-measure` for what a running surface costs to paint, read against published thresholds
43
+
44
+ #### Drafting
45
+
41
46
  - `canon:draft-and-pick` for a call settled by looking, drafting several candidates as frames on the canvas and taking your pick
42
47
  - `canon:canvas-board` for a direction worked out over several turns, drawn as HTML frames you drag, select, and restyle in the browser while the session reads your changes back. Only the pick moves into `canon/DESIGN.md`, since the canvas folder is gitignored
43
48
  - `canon:draft-identity` to draft a project's logo mark and compose it into an icon sequence and a social card, through `draft-and-pick`'s own render-and-pick loop. On an Astro project holding the card route scaffold, the card lands as a route the project keeps and is captured through a running server, so it reads the project's real stylesheet rather than typed copies of every color. Everywhere else it ships as a PNG and the run says so.
@@ -21,67 +21,67 @@
21
21
  deps = []
22
22
  files = [".claude/skills", "claude/skills"]
23
23
 
24
- ["700-ci-workflow"]
24
+ ["ci-workflow"]
25
25
  deps = []
26
26
  files = [".github/workflows"]
27
27
 
28
- ["775-dependencies"]
28
+ ["dependencies"]
29
29
  deps = []
30
30
  files = ["**/package.json", "**/pyproject.toml", "**/go.mod", "**/composer.json"]
31
31
 
32
- ["780-config-comments"]
32
+ ["config-comments"]
33
33
  deps = []
34
34
  files = [".editorconfig", "**/Dockerfile*", "**/*.config.*", "**/.env.example"]
35
35
 
36
- ["790-code-comments"]
36
+ ["code-comments"]
37
37
  deps = []
38
38
  files = ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx", "**/*.sh", "**/*.py"]
39
39
 
40
- ["130-go"]
40
+ ["go"]
41
41
  deps = []
42
42
  files = ["**/go.mod"]
43
43
 
44
- ["140-php"]
44
+ ["php"]
45
45
  deps = []
46
46
  files = ["**/composer.json"]
47
47
 
48
- ["200-react"]
48
+ ["react"]
49
49
  deps = ["react"]
50
50
  files = []
51
51
 
52
- ["210-astro"]
52
+ ["astro"]
53
53
  deps = ["astro"]
54
54
  files = ["**/astro.config.*"]
55
55
 
56
- ["220-fastapi"]
56
+ ["fastapi"]
57
57
  deps = ["fastapi"]
58
58
  files = []
59
59
 
60
- ["230-nextjs"]
60
+ ["nextjs"]
61
61
  deps = ["next"]
62
62
  files = ["**/next.config.*"]
63
63
 
64
- ["250-tailwind"]
64
+ ["tailwind"]
65
65
  deps = ["tailwindcss", "@tailwindcss/vite", "@tailwindcss/postcss"]
66
66
  files = ["**/tailwind.config.*"]
67
67
 
68
- ["260-shadcn"]
68
+ ["shadcn"]
69
69
  deps = []
70
70
  files = ["**/components.json"]
71
71
 
72
- ["305-e2e-reliability"]
72
+ ["e2e-reliability"]
73
73
  deps = ["@playwright/test", "playwright", "cypress"]
74
74
  files = ["**/e2e"]
75
75
 
76
- ["306-test-scope"]
76
+ ["test-scope"]
77
77
  deps = ["@playwright/test", "playwright", "cypress"]
78
78
  files = ["**/e2e"]
79
79
 
80
- ["310-zod"]
80
+ ["zod"]
81
81
  deps = ["zod"]
82
82
  files = []
83
83
 
84
- ["320-tanstack-query"]
84
+ ["tanstack-query"]
85
85
  deps = [
86
86
  "@tanstack/react-query",
87
87
  "@tanstack/vue-query",
@@ -91,23 +91,23 @@ deps = [
91
91
  ]
92
92
  files = []
93
93
 
94
- ["335-testing-go"]
94
+ ["testing-go"]
95
95
  deps = []
96
96
  files = ["**/go.mod"]
97
97
 
98
- ["336-testing-php"]
98
+ ["testing-php"]
99
99
  deps = ["phpunit/phpunit", "pestphp/pest"]
100
100
  files = ["**/phpunit.xml", "**/phpunit.xml.dist"]
101
101
 
102
- ["340-pydantic"]
102
+ ["pydantic"]
103
103
  deps = ["pydantic"]
104
104
  files = []
105
105
 
106
- ["350-security-web"]
106
+ ["security-web"]
107
107
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
108
108
  files = ["index.html", "*/index.html"]
109
109
 
110
- ["360-security-server"]
110
+ ["security-server"]
111
111
  deps = [
112
112
  "express",
113
113
  "fastify",
@@ -129,7 +129,7 @@ deps = [
129
129
  ]
130
130
  files = []
131
131
 
132
- ["370-database"]
132
+ ["database"]
133
133
  deps = [
134
134
  "prisma",
135
135
  "@prisma/client",
@@ -156,42 +156,42 @@ deps = [
156
156
  ]
157
157
  files = ["**/migrations", "**/schema.prisma", "**/*.sql"]
158
158
 
159
- ["400-ui"]
159
+ ["copy"]
160
160
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
161
161
  files = ["index.html", "*/index.html"]
162
162
 
163
- ["410-a11y"]
163
+ ["a11y"]
164
164
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
165
165
  files = ["index.html", "*/index.html"]
166
166
 
167
- ["420-forms"]
167
+ ["forms"]
168
168
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
169
169
  files = ["index.html", "*/index.html"]
170
170
 
171
- ["430-ux-completeness"]
171
+ ["ux-completeness"]
172
172
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
173
173
  files = ["index.html", "*/index.html"]
174
174
 
175
- ["440-surface-capture"]
175
+ ["surface-capture"]
176
176
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
177
177
  files = ["index.html", "*/index.html"]
178
178
 
179
- ["450-link-behavior"]
179
+ ["link-behavior"]
180
180
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
181
181
  files = ["index.html", "*/index.html"]
182
182
 
183
- ["460-design-taste"]
183
+ ["design-taste"]
184
184
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
185
185
  files = ["canon/DESIGN.md", "index.html", "*/index.html"]
186
186
 
187
- ["465-interface-casing"]
187
+ ["interface-casing"]
188
188
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
189
189
  files = ["index.html", "*/index.html"]
190
190
 
191
- ["470-motion"]
191
+ ["motion"]
192
192
  deps = ["react", "vue", "svelte", "astro", "next", "solid-js", "preact"]
193
193
  files = ["index.html", "*/index.html"]
194
194
 
195
- ["480-canvas"]
195
+ ["canvas"]
196
196
  deps = []
197
197
  files = [".canon/canvas"]
@@ -32,3 +32,47 @@
32
32
  "655-tasks" = "tasks"
33
33
  "570-skill" = "skill"
34
34
  "801-markdown" = "markdown"
35
+ "602-tasks" = "task-scope"
36
+ "604-scratch" = "scratch"
37
+ "605-worktrees" = "worktrees"
38
+ "606-git" = "git"
39
+ "611-indexes" = "indexes"
40
+ "566-output" = "output"
41
+ "000-code" = "routing"
42
+ "010-testing" = "testing"
43
+ "200-react" = "react"
44
+ "210-astro" = "astro"
45
+ "220-fastapi" = "fastapi"
46
+ "230-nextjs" = "nextjs"
47
+ "250-tailwind" = "tailwind"
48
+ "260-shadcn" = "shadcn"
49
+ "100-typescript" = "typescript"
50
+ "110-python" = "python"
51
+ "130-go" = "go"
52
+ "140-php" = "php"
53
+ "300-testing-ts" = "testing-ts"
54
+ "305-e2e-reliability" = "e2e-reliability"
55
+ "306-test-scope" = "test-scope"
56
+ "310-zod" = "zod"
57
+ "320-tanstack-query" = "tanstack-query"
58
+ "330-testing-py" = "testing-py"
59
+ "335-testing-go" = "testing-go"
60
+ "336-testing-php" = "testing-php"
61
+ "340-pydantic" = "pydantic"
62
+ "350-security-web" = "security-web"
63
+ "360-security-server" = "security-server"
64
+ "370-database" = "database"
65
+ "700-ci-workflow" = "ci-workflow"
66
+ "775-dependencies" = "dependencies"
67
+ "780-config-comments" = "config-comments"
68
+ "790-code-comments" = "code-comments"
69
+ "400-ui" = "copy"
70
+ "410-a11y" = "a11y"
71
+ "420-forms" = "forms"
72
+ "430-ux-completeness" = "ux-completeness"
73
+ "440-surface-capture" = "surface-capture"
74
+ "450-link-behavior" = "link-behavior"
75
+ "460-design-taste" = "design-taste"
76
+ "465-interface-casing" = "interface-casing"
77
+ "470-motion" = "motion"
78
+ "480-canvas" = "canvas"
@@ -32,4 +32,4 @@ paths:
32
32
 
33
33
  ## Authority
34
34
 
35
- - Follow `.claude/rules/canon/lib/300-testing-ts.md` for framework choice, file placement, and test naming.
35
+ - Follow `.claude/rules/canon/lib/testing-ts.md` for framework choice, file placement, and test naming.