@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
package/README.md CHANGED
@@ -61,17 +61,17 @@ bun install --global @erclx/canon
61
61
 
62
62
  Each domain has a canonical source in this repo and a thin install or sync CLI on your side. The domains split on one line: some are copied into your project and become yours to edit, and some are never copied at all.
63
63
 
64
- | Domain | What it is | How it reaches you |
65
- | -------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------- |
66
- | Plugin skills | Skills that plan a feature, review a diff, sync the planning docs, and run the ship chain | Loaded live from the plugin, never copied |
67
- | Governance | Coding and authoring rules that load into a Claude session when a matching path is edited | Installed per project by `canon gov install`, refreshed by sync |
68
- | Tooling stacks | Golden configs, seeds, and a reference per framework | Laid down by `canon init`, reconciled by `canon tooling sync` |
69
- | Design system | Ships a `DESIGN.md` token format, a skill that drafts one from an existing project or from scratch, and a render command | `canon design render` |
70
- | Slides | A folder of HTML slides per deck, drawn in the project's tokens and rebuilt as editable shapes | `canon slides render` writes PowerPoint |
71
- | Teach | Lessons, sources, and a glossary in one workspace, rendered to a small site | `canon teach` |
72
- | Canvas | Pages of HTML frames on a local pan and zoom surface, each frame drawn with the project's tokens | `canon canvas serve` |
73
- | Transcripts | A YouTube transcript with metadata frontmatter | `canon transcripts <url>` writes it into any repo |
74
- | Sandbox | Scenario scaffolds that provision an isolated project state for verifying each domain flow | `canon sandbox` |
64
+ | Domain | What it is | How it reaches you |
65
+ | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
66
+ | Plugin skills | Skills that plan a feature, review a diff, sync the planning docs, and run the ship chain | Loaded live from the plugin, never copied |
67
+ | Governance | Coding and authoring rules that load into a Claude session when a matching path is edited | Installed per project by `canon gov install`, refreshed by sync |
68
+ | Tooling stacks | Golden configs, seeds, and a reference per framework | Laid down by `canon init`, reconciled by `canon tooling sync` |
69
+ | Design system | Ships a `DESIGN.md` intent format that points at the project's stylesheet for values, a skill that drafts one from an existing project or from scratch, and a render command | `canon design render` |
70
+ | Slides | A folder of HTML slides per deck, drawn in the project's tokens and rebuilt as editable shapes | `canon slides render` writes PowerPoint |
71
+ | Teach | Lessons, sources, and a glossary in one workspace, rendered to a small site | `canon teach` |
72
+ | Canvas | Pages of HTML frames on a local pan and zoom surface, each frame drawn with the project's tokens | `canon canvas serve` |
73
+ | Transcripts | A YouTube transcript with metadata frontmatter | `canon transcripts <url>` writes it into any repo |
74
+ | Sandbox | Scenario scaffolds that provision an isolated project state for verifying each domain flow | `canon sandbox` |
75
75
 
76
76
  Those domains reach you in three shapes. A tooling stack lands as real files under version control, because a config is something your build reads and your project owns. A plugin skill and the references it carries are never copied, so there is no copy in your repo to drift from this one.
77
77
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "canon",
3
3
  "description": "Runs your agent's work and keeps its code good, on one setup for every repo.",
4
- "version": "5.35.0",
4
+ "version": "5.37.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -79,6 +79,9 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
79
79
  - A function returns the object it read from storage, or a type defined beside the storage code.
80
80
  - The same input check appears both at the entry point and inside a function it calls.
81
81
  - A caller matches on the text of an error message.
82
+
83
+ ### Changes, retries, and order
84
+
82
85
  - An existing field is changing type or meaning under the same name.
83
86
  - A write that a client could retry carries no key, or checks for one with a read before the insert.
84
87
  - Output order follows whatever the underlying data returned, and nothing states whether it is sorted.
@@ -91,6 +94,9 @@ Check each line against the surface the change produced. A line answering no is
91
94
  - Every new field, flag, or parameter is optional and defaults to the old behavior.
92
95
  - No storage type, internal identifier, or bookkeeping field appears in what the surface returns.
93
96
  - Every failure on the surface carries the same shape with a stable code.
97
+
98
+ ### Input, writes, and contract
99
+
94
100
  - Input is checked once, at the boundary, and nowhere deeper.
95
101
  - Every write a caller could retry takes a key, claims it atomically, and refuses a reused key with a different body.
96
102
  - The contract states what the surface returns and what it refuses.
@@ -77,13 +77,13 @@ Age is evidence in neither direction. A row untouched for months is not more dec
77
77
 
78
78
  Write one item per row in the intake item format, one cluster file per domain the task touches, numbered in read order. Head each item `### N. <task stem>` so apply can find the task from the heading alone.
79
79
 
80
- - `Problem:` states what this pass measured, with the count, path, or commit behind it
81
- - `Fix:` states what applying the verdict does to the board
82
- - `Worth it:` names the cost or the reach the verdict rests on in one clause, or says the row names neither. A `yes` or a `later` carries no verdict on its own, so a decline can follow either word
83
- - `Open:` reads `decline, archive, keep, or promote?` on every item
84
- - `Suggested:` opens with exactly one of the four verdict tokens, then the reason. An archive suggestion lists every outcome position it closes, as `archive 1, 3: shipped in #NNN`
85
- - `Overlaps:` names a live board task that already carries the work, where one does
86
- - `You:` ships empty
80
+ - **`Problem:`** states what this pass measured, with the count, path, or commit behind it
81
+ - **`Fix:`** states what applying the verdict does to the board
82
+ - **`Worth it:`** names the cost or the reach the verdict rests on in one clause, or says the row names neither. A `yes` or a `later` carries no verdict on its own, so a decline can follow either word
83
+ - **`Open:`** reads `decline, archive, keep, or promote?` on every item
84
+ - **`Suggested:`** opens with exactly one of the four verdict tokens, then the reason. An archive suggestion lists every outcome position it closes, as `archive 1, 3: shipped in #NNN`
85
+ - **`Overlaps:`** names a live board task that already carries the work, where one does
86
+ - **`You:`** ships empty
87
87
 
88
88
  Write `00-overview.md` last, per the intake standard, with the verdict counts by token and an open-questions list linking each item. Where the pass runs out of context before the index, write `99-next-session.md` naming the last row filed, since a compaction drops the rest.
89
89
 
@@ -71,6 +71,9 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
71
71
  - The next commit message needs "and" to say what it does.
72
72
  - A slice has been implemented and its tests have not run yet.
73
73
  - The build or a test is failing and the next slice has already started.
74
+
75
+ ### Scope and ordering
76
+
74
77
  - You opened a file the plan does not name and are about to edit it.
75
78
  - A commit deletes code and adds its replacement in the same change.
76
79
  - You are about to stage a test in a commit after the one that added its code.
@@ -83,6 +86,9 @@ Check each line against the branch the build produced. A line answering no is fi
83
86
  - Every commit on the branch carries one logical change and passed the checks it could affect.
84
87
  - No commit adds code whose test lands in a later commit.
85
88
  - No commit deletes something and adds its replacement together.
89
+
90
+ ### Tree and scope
91
+
86
92
  - The working tree holds no uncommitted implementation work.
87
93
  - Every file changed is in the plan's scope, or its commit says why the plan needed it.
88
94
  - Every defect noticed outside the plan is written in the task's findings or the handover, and its file is unchanged.
@@ -21,6 +21,9 @@ External sources were read and filtered rather than imported. This file is the r
21
21
  - Vertical, risk-first, and contract-first slicing, stated as rules for choosing the next slice rather than as worked examples tied to one stack.
22
22
  - Rule 1, one thing at a time, as one logical change per commit.
23
23
  - Rule 2, keep it compilable, as a build left passing at every commit.
24
+
25
+ #### Rollback and the notes
26
+
24
27
  - Rule 5, rollback-friendly, as the group on keeping each commit safe to revert and the rule against deleting and replacing in one commit.
25
28
  - The "noticed but not touching" list from its scope section, routed to the open task's findings or the handover rather than offered as new tasks, since a worker may not add a row to the board.
26
29
  - The note against re-running a command on unchanged code, scoped to a session's own repeats so it never reads as permission to skip a chain's verify step.
@@ -13,7 +13,7 @@ The damage lands on the files a project owns. A golden config carrying local edi
13
13
 
14
14
  The inverse failure is quieter. A session that assumes a sync will pick up a change edits a seed and waits for an update that never comes, because the seed is copy-once and no sync command writes it again. Both failures are one missing fact available before the command runs.
15
15
 
16
- A third gap is the route itself. `canon --help` lists every top-level verb with a partial hint, and a session with a job in hand pays a `--help` read per candidate to find the one that does it, or picks by name and lands on the wrong one. The job-to-verb mapping is the fact the session needs and no verb answers.
16
+ A third gap is the route itself. `canon --help` lists every top-level verb by a one-line description, and a session with a job in hand pays a `--help` read per candidate to find the one that does it, or picks by name and lands on the wrong one. The job-to-verb mapping is the fact the session needs and no verb answers.
17
17
 
18
18
  Being reachable is a separate problem from being right. This is a pure reference whose moment happens inside another skill's run, so nothing brings it up unless a body names it. A route lives in a body or it does not exist, and a mention in a sibling's requirement file is not one.
19
19
 
@@ -23,7 +23,7 @@ Being reachable is a separate problem from being right. This is a pure reference
23
23
  - Route an author-and-render verb to the skill that owns it rather than describing it
24
24
  - Warn about a verb that can lose the project's edits before it runs, naming what it replaces
25
25
  - Point each destructive verb at `canon docs install-and-sync`, which owns the overwrite detail
26
- - Point to `canon <verb> --help` and `canon docs agents` for subcommands, flags, and the invocation contract
26
+ - Point to `canon <verb> --help --all` and `canon docs agents` for subcommands, flags, and the invocation contract, and have the session read that help before running a verb no skill body spells out, a verb a skill pins in full being exempt
27
27
  - Defer to `canon docs install-and-sync` when it and this summary disagree, since the summary is a copy and the doc is the source
28
28
 
29
29
  ## Must not
@@ -12,7 +12,8 @@ Consult to pick the `canon` verb for a job, and before running a verb that write
12
12
  ## Find the verb
13
13
 
14
14
  - Each row below names a verb by its job. Subcommands and flags are not listed here, so read them where they are kept.
15
- - Run `canon <verb> --help` for a verb's subcommands and flags.
15
+ - Run `canon <verb> --help --all` for a verb's subcommands and every flag in one read, where `canon <verb> --help` alone stops at the subcommand list.
16
+ - Read `canon <verb> --help --all` before running a verb no skill body spells out. A verb a skill gives in full runs as that skill wrote it.
16
17
  - Run `canon docs agents` for the invocation contract behind every verb, and `canon docs list` for every other reference doc, then `canon docs <topic>` by name.
17
18
 
18
19
  ## Project setup
@@ -84,6 +85,9 @@ Read the doc each line names before running one of these. `canon docs install-an
84
85
  - `canon sync` runs every installed domain's sync, so it carries each risk below.
85
86
  - `canon gov sync` replaces a rule you edited and deletes a rule the toolkit retired, edited or not.
86
87
  - `canon tooling sync --write` replaces every golden config a stack ships. Seeds are copy-once. Nothing writes without the flag. See `canon docs sync`.
88
+
89
+ ### Design, migrate, and indexes
90
+
87
91
  - `canon design sync` replaces the shipped design files and leaves `.claude/design/project/` alone.
88
92
  - `canon migrate --write` rewrites files that cite a retired name or layout. It reports and writes nothing without the flag. See `canon docs migrate`.
89
93
  - `canon indexes regen` rewrites each generated `index.md` from the folder's current state, so a hand edit there is lost. See `canon docs indexes`.
@@ -22,6 +22,11 @@ From the conversation so far, identify:
22
22
  - Target project name or kind, never its full path. The path names a folder on one machine and says nothing a triage session can route on, where the project's own name does. Name a private project by its kind instead, such as `a Next.js app`, since the report leaves the machine.
23
23
  - Toolkit surface and its type (plugin skill, tooling config, governance rule, seed, or CLI). The type leads the `### Surface` field, ahead of the first comma, because the CLI picks the issue's domain labels from that text alone.
24
24
  - Specific toolkit file or name when the session cites one
25
+
26
+ ### Behavior and fix
27
+
28
+ From the same conversation, identify:
29
+
25
30
  - Observed behavior
26
31
  - Expected behavior, or `unclear`
27
32
  - Repro details already in context (commands run, files touched), or `none`
@@ -19,6 +19,9 @@ Run from the toolkit repo root. This skill reads GitHub issues and writes only i
19
19
  - If `gh` is not on PATH, stop: `❌ gh CLI not found. Install it to read feedback issues.`
20
20
  - If `gh auth status` fails, stop: `❌ gh is not authenticated. Run gh auth login.`
21
21
  - If no open `feedback` issues exist, stop: `✅ No open feedback issues.`
22
+
23
+ ### Slots and records
24
+
22
25
  - Never fill a `You:` slot, and never read an empty one as agreement. Answering runs through `plan-intake-answer` or the operator's own edit.
23
26
  - Branch on each `canon` record's `ok` and `reason` rather than on the exit code, which a shell function wrapping `canon` can flatten to zero.
24
27
 
@@ -25,7 +25,7 @@ When the operator picks a frame, the session leaves the decision on the canvas a
25
25
  - Read the operator's selection when they point at something, and treat a stale element pick as unknown
26
26
  - Read a frame's inline styles before restyling it, and say which operator edits were kept and which dropped
27
27
  - Capture once per finished frame or page rather than after every edit
28
- - Carry a picked value into the project's design document, and leave a picked layout on the canvas for the plan that builds it
28
+ - Carry a picked value into the project's stylesheet and its intent into the design document, and leave a picked layout on the canvas for the plan that builds it
29
29
 
30
30
  ## Must not
31
31
 
@@ -49,6 +49,9 @@ Hand the operator the address as a markdown link carrying the URL as its text an
49
49
  - Add a page for each decision being drafted: `canon canvas page add <page> --json`.
50
50
  - Follow the house style in `${CLAUDE_SKILL_DIR}/references/canvas.md` before drafting an explanation frame.
51
51
  - Add each frame through the verb, which writes the starting file and its box in one locked step: `canon canvas frame add <page> <frame> --width <px> --height <px> --json`. Give the width the frame should render at, since a capture and the canvas both render at it. The verb places the frame after the last one, and a position the operator asks for goes through `frame move`.
52
+
53
+ ### Layout and naming
54
+
52
55
  - Lay frames out with `canon canvas frame move <page> <frame> --x <px> --y <px> --json` rather than writing `layout.json` by hand, since the operator's drags write the same file under a lock.
53
56
  - Name pages and frames for what they hold, such as `pricing` and `pricing-dense`, so the operator can say which one by name.
54
57
  - After an insert or a resize, re-lay the page with `canon canvas arrange <page> --json`. It keeps the rows the operator dragged, places each on the standard gap, and drops layout entries whose frame file is gone. `--check` reports without writing.
@@ -105,7 +108,7 @@ The operator restyles elements from the inspector, and each edit lands as inline
105
108
 
106
109
  When the operator picks a frame, the decision leaves the canvas.
107
110
 
108
- - Carry visual values, being color, type, spacing, and radius, into the project's design document, editing its sections in place under the `design.md` standard. Leave structure and layout on the canvas, and name the frame in the plan that builds it.
111
+ - Carry visual values, being color, type, spacing, and radius, into the stylesheet the design document's lead names, and the intent behind them into the document's sections under the `design.md` standard. A project with no stylesheet yet takes the values under `.claude/design/project/` after `canon design install`, and the lead names that path. Leave structure and layout on the canvas, and name the frame in the plan that builds it.
109
112
  - Name the frame the decision came from in the reply, and leave the frame on the canvas until the operator clears it.
110
113
  - Never cite a frame path from a tracked file. The folder is gitignored, so the citation resolves on this machine alone.
111
114
 
@@ -116,7 +119,7 @@ When the operator picks a frame, the decision leaves the canvas.
116
119
  Page: <page>, <n> frames
117
120
  Selected: <page>/<frame>, element <index>, or none, or stale
118
121
  Capture: <path of each capture written>
119
- Carried: <the design document the pick went to, the plan that cites the frame, or not yet>
122
+ Carried: <the stylesheet and design document the pick went to, the plan that cites the frame, or not yet>
120
123
  ```
121
124
 
122
125
  Write the canvas line's URL as a markdown link. Omit the capture line when nothing was captured and the carried line when no direction was picked. Emit every path from the project root.
@@ -58,6 +58,9 @@ A canvas failing these is non-conforming even when it satisfies every shape rule
58
58
  - Write a frame as a whole document or as a fragment. The server writes in the `html`, `head`, and `body` a fragment leaves out, marked so a pick still matches the file.
59
59
  - State a `body` whenever the frame states a `head`. The browser builds one the file leaves out, and an address the operator picks inside the frame can no longer be matched to the file.
60
60
  - Write every table with its `tbody` stated, for the same reason. A browser adds one the file leaves out.
61
+
62
+ ### Content and edits
63
+
61
64
  - Keep a frame self-contained. Inline its own styles and scripts, or link a file inside the same page folder, since a frame is served from its page and nothing outside the canvas resolves.
62
65
  - Use the project's custom properties, `var(--<name>)`, for every value the token stylesheet defines. A literal copied from it shows the right color today and the wrong one after the next token change.
63
66
  - Edit a frame by rewriting its file. The file is the frame, and nothing else holds a copy of its markup.
@@ -70,6 +73,9 @@ Applies to an explanation frame only. A mockup of the project's interface render
70
73
  - Keep lines short, one fact a line.
71
74
  - Set body text at 20px or larger and headings at 44px or larger. Set nothing under 16px.
72
75
  - Render an explanation frame about 1100px wide.
76
+
77
+ ### Colors, faces, and fit
78
+
73
79
  - Take colors from the project's custom properties. A frame that defines colors of its own sets the dark values on `:root` and the light ones under `[data-theme="light"]`, since the shell sets `data-theme` on each frame's root.
74
80
  - Name only the faces the canvas serves into every frame: `Geist Variable` for text, `Noto Sans Mono` for code, and `Excalifont` for a hand-drawn look. They render the same in a capture and in any browser, so a height fitted against them holds.
75
81
  - Make each box tall enough to show all its content, with no scrollbar and no clipped line. Run `canon canvas fit <page>/<frame>` rather than estimating, since it measures the content in the capture browser and sets the height.
@@ -80,6 +86,9 @@ Applies to an explanation frame only. A mockup of the project's interface render
80
86
  - Keep one `layout.json` per page, beside its frames. It holds each frame's box and nothing else, so moving a frame never rewrites its markup.
81
87
  - Key each box by the frame's name, under one top-level `frames` object.
82
88
  - Give every box four finite numbers in pixels: `x` and `y` for its top-left corner on the page, `width` for the width the frame renders at, and `height` for the height it shows on the canvas.
89
+
90
+ ### Missing boxes and writes
91
+
83
92
  - Leave a frame out of the layout only when its position does not matter yet. A reader places an unnamed frame in a row after the others, at the default size of 1440 by 900.
84
93
  - Never write the file while a writer holds its lock, which is the same name with `.lock` appended. Two writers each replacing the whole file lose one of the two edits.
85
94
  - Treat a layout that does not parse as a defect to repair, never as an empty one to overwrite. Writing over it erases every box it held.
@@ -106,6 +115,9 @@ The keys below are the ones a reader parses. The frame names are placeholders.
106
115
  - Do not assume a viewport. A frame renders at its layout width on the canvas and in a capture alike, so size it with media queries against that width rather than against the operator's window.
107
116
  - Do not assume the theme. The canvas theme toggle is the operator's own state, and a capture shows each frame in its default theme.
108
117
  - Do not assume a network. Name a served face, or ship the font beside the frame, since a capture refuses a frame naming a font it cannot find.
118
+
119
+ ### Font, source, and checkout
120
+
109
121
  - Do not assume a default font. Set `font-family` with a served face first on an element the frame's text inherits from, since a capture checks the first family of the text it renders and the browser's default serif is absent from many machines. A frame naming a machine family such as `DejaVu Sans` renders at another height in another browser, which `canon canvas fit` reports.
110
122
  - Do not assume the frame is the source. A picked direction is carried into the project's design document or a plan, and the operator clears the frame once it has been carried.
111
123
  - Do not assume the canvas survives the checkout. The folder is gitignored, so a lost checkout loses every page in it.
@@ -10,104 +10,121 @@ Applies to `canon/DESIGN.md`. Captures visual intent and the decisions behind ho
10
10
  ## Contents
11
11
 
12
12
  - [Scope](#scope)
13
+ - [Two shapes](#two-shapes)
13
14
  - [What goes in](#what-goes-in)
14
15
  - [What does not go in](#what-does-not-go-in)
15
16
  - [Format](#format)
16
17
  - [Prose budget](#prose-budget)
17
- - [The uncertainty tag](#the-uncertainty-tag)
18
18
  - [Sections](#sections)
19
+ - [The uncertainty tag](#the-uncertainty-tag)
19
20
  - [Template](#template)
20
21
 
21
22
  ## Scope
22
23
 
23
- Governs the visual-intent document at `canon/DESIGN.md`: tokens described as intent, layout constraints, and the omissions that keep visual scope closed.
24
+ Governs the visual-intent document at `canon/DESIGN.md`, being the rules and omissions that keep visual scope closed, the intent behind each role, and the pointer to where the values live.
24
25
 
25
26
  Does not govern:
26
27
 
27
28
  - Per-domain implementation narrative: `context.md`
29
+ - The token values themselves, which live in the project's stylesheet
30
+
31
+ ## Two shapes
32
+
33
+ - **An intent record** is the shape a project writes by hand. It carries rules, omissions, and each role's intent, and its lead names the stylesheet the values live in. It carries no value, since a hand-typed copy of the stylesheet drifts from it.
34
+ - **A values record** is generated from a token source and carries the value tables beside the rules. It is never edited by hand, and its lead names the module it is rendered from. The toolkit's own record is one.
35
+
36
+ Everything below applies to both shapes unless it names one.
28
37
 
29
38
  ## What goes in
30
39
 
31
- - A token's exact value, anchored to the surface it was read from and tagged per `## The uncertainty tag` when unconfirmed. Fall back to intent language ("mid gray, muted text") only where no source exists yet to anchor from.
32
- - Layout constraints and sizing rules not obvious from the tokens and the code
40
+ - In the lead, the stylesheet a reader takes values from, such as `src/styles/tokens.css` or a Tailwind `@theme` block
41
+ - What each color role and each shape role is for, with the custom property that carries it
42
+ - Layout constraints and sizing rules not obvious from the stylesheet and the code
33
43
  - Visual rules a developer could get wrong without guidance
34
44
  - Non-obvious omissions ("no motion", "no custom icons") that prevent scope creep
35
45
 
36
46
  ## What does not go in
37
47
 
48
+ - A token's value in an intent record, whether a hex, a font stack, a size, a step, or a radius. The stylesheet the lead names carries it.
38
49
  - CSS classes and prop names. Those live in code.
39
50
  - Anything that needs updating every time the code is refactored
40
- - The history of how a value or a mark was chosen: the candidates, the rounds, the date of a pick. State the rule and the current value, and cut the trail. Git keeps it.
51
+ - The history of how a value or a mark was chosen, being the candidates, the rounds, and the date of a pick. State the rule and cut the trail, since version control keeps it.
41
52
 
42
53
  ## Format
43
54
 
44
- - Use tables for token systems, one row per token. Write every other rule as a short bullet, one decision per line, within `## Prose budget`.
45
- - Plain English over technical notation. If a section could be removed and the developer would still build correctly from the tokens and code alone, remove it.
46
- - Keep table headers and role names intact so the render tooling can parse the token tables.
55
+ - Write every rule as a short bullet, one decision per line, within `## Prose budget`.
56
+ - Plain English over technical notation. If a section could be removed and the developer would still build correctly from the stylesheet and code alone, remove it.
57
+ - Keep table headers and role names intact so the parser can read the tables.
47
58
 
48
59
  ## Prose budget
49
60
 
50
- The record is a lookup, so its prose stays short enough to scan beside the tables. Why a value was chosen belongs in the project's context entry for design, never here.
61
+ The record is a lookup, so its prose stays short enough to scan. Why a rule was chosen belongs in the project's context entry for design, never here.
51
62
 
52
- - Personality: one paragraph of at most 60 words
63
+ - Overview: one paragraph of at most 60 words
53
64
  - Any other section: at most 3 rules beside its table, each at most 25 words. A bullet is one rule, and so is a paragraph.
54
65
  - The lead before the first section: at most 40 words
55
66
 
56
67
  Headings and table rows are never counted, and a section holding a table and no rules is within budget. A bullet wrapping over several lines counts as one rule, and a nested bullet counts as its own.
57
68
 
58
- ## The uncertainty tag
69
+ ## Sections
59
70
 
60
- A cell no source anchors ends in ` ? verify`, written inside the cell rather than as a trailing column, since a trailing marker breaks the table parse. A cell wrapping itself in a code span carries the tag inside the span, as in `` `#ffffff ? verify` ``. Both spellings parse.
71
+ Use `## Overview`, `## Colors`, `## Typography`, `## Spacing`, `## Shapes`, `## Motion`, and `## Iconography`, in that order, which follows Google's DESIGN.md for the sections the two share. An optional `## Layout` sits between Spacing and Shapes. The parser still reads a record written under the earlier names, `## Personality`, `## Color`, and `## Borders`, as the sections they became.
61
72
 
62
- The renderer splits the tag off the value, so a swatch and a font sample are built from the value alone and the marker shows beside it. The preview also reports how many cells are anchored against how many are tagged, which is the reading a reviewer takes the record's overall confidence from.
73
+ In an intent record, `## Colors` carries a `Role | Property | Intent` table and `## Shapes` a `Role | Property | When used` table. Each row names the custom property the stylesheet declares for that role, such as `--color-accent`. Typography and Spacing carry rules alone.
63
74
 
64
- Which columns that ratio reads is fixed by the table rather than by the record. The first column of each table names its row, and `Multiplier` and `When used` restate what the row already carries, so none of them is something a source could anchor and none is counted. That leaves `Intent` and `Value` in Color, `Family`, `Weight`, `Size`, and `Line height` in Typography, `Value` in Spacing, and `Radius` and `Width` in Borders. A cell tagged outside that set counts anyway, so a marker the preview draws is never missing from the ratio beside it.
75
+ Add either optional section when the project has content for it:
65
76
 
66
- A prose section takes its uncertainty inline instead, in a sentence saying what is proposed and what has yet to confirm it. A tag appended to a paragraph renders verbatim.
77
+ - `## Layout`: page width, breakpoints, and grid rules, as current constraints. The surface-capture rule reads the breakpoints from here, so a project with none declared here is captured at the 320 reflow floor alone.
78
+ - `## Mark`: the logo's construction rules and the files that carry it
67
79
 
68
- ## Sections
80
+ ## The uncertainty tag
69
81
 
70
- Use `## Personality`, `## Color`, `## Typography`, `## Spacing`, `## Borders`, `## Motion`, and `## Iconography`. The token tables carry fixed headers the renderer reads.
82
+ Applies to a values record alone. An intent record carries no value to tag, and a guessed value is marked where it is written, in the stylesheet.
71
83
 
72
- Add either optional section when the project has content for it:
84
+ A cell no source anchors ends in ` ? verify`, written inside the cell rather than as a trailing column, since a trailing marker breaks the table parse. A cell wrapping itself in a code span carries the tag inside the span, as in `` `#ffffff ? verify` ``. Both spellings parse.
73
85
 
74
- - `## Layout`: page width, breakpoints, and grid rules, as current constraints. The surface-capture rule reads the breakpoints from here, so a project with none declared here is captured at the 320 reflow floor alone.
75
- - `## Mark`: the logo's construction rules and the files that carry it
86
+ The renderer splits the tag off the value, so a swatch and a font sample are built from the value alone and the marker shows beside it. The preview also reports how many cells are anchored against how many are tagged, which is the reading a reviewer takes the record's overall confidence from.
87
+
88
+ Which columns that ratio reads is fixed by the table rather than by the record. The first column of each table names its row, and `Multiplier` and `When used` restate what the row already carries, so none of them is something a source could anchor and none is counted. That leaves `Intent` and `Value` in Colors, `Family`, `Weight`, `Size`, and `Line height` in Typography, `Value` in Spacing, and `Radius` and `Width` in Shapes. A cell tagged outside that set counts anyway, so a marker the preview draws is never missing from the ratio beside it.
89
+
90
+ A prose section takes its uncertainty inline instead, in a sentence saying what is proposed and what has yet to confirm it. A tag appended to a paragraph renders verbatim.
76
91
 
77
92
  ## Template
78
93
 
79
- The column headers are the strings the renderer parses, read by exact key, so they stay verbatim. Row names are not. Each is slugged into the variable name it emits, which leaves a project free to rename a row, add one, or drop one it has no use for.
94
+ The template is the intent record. The column headers are read by exact key, so they stay verbatim. Row names are not, which leaves a project free to rename a role, add one, or drop one it has no use for.
80
95
 
81
96
  ```markdown
82
97
  # Design
83
98
 
84
- ## Personality
99
+ Values live in `<path to the stylesheet>`. This record holds the intent behind them.
100
+
101
+ ## Overview
85
102
 
86
103
  <one paragraph on voice, tone, and the feeling a user should have>
87
104
 
88
- ## Color
105
+ ## Colors
106
+
107
+ - <a rule a developer could get wrong>
89
108
 
90
- | Role | Intent | Value |
91
- | ------ | ---------------- | ------- |
92
- | <role> | <what it is for> | <value> |
109
+ | Role | Property | Intent |
110
+ | ------ | ---------------- | ---------------- |
111
+ | <role> | `--color-<role>` | <what it is for> |
93
112
 
94
113
  ## Typography
95
114
 
96
- | Role | Family | Weight | Size | Line height |
97
- | ------ | -------- | -------- | ------ | ----------- |
98
- | <role> | <family> | <weight> | <size> | <height> |
115
+ - <how the roles divide between families, and any role that breaks the pattern>
99
116
 
100
117
  ## Spacing
101
118
 
102
- | Step | Multiplier | Value |
103
- | ------ | ------------ | ------- |
104
- | <step> | <multiplier> | <value> |
119
+ - <the base unit and how the scale steps>
120
+
121
+ ## Shapes
105
122
 
106
- ## Borders
123
+ - <a rule about radius or border a developer could get wrong>
107
124
 
108
- | Role | Radius | Width | When used |
109
- | ------ | -------- | ------- | ----------- |
110
- | <role> | <radius> | <width> | <when used> |
125
+ | Role | Property | When used |
126
+ | ------ | ----------------- | ----------- |
127
+ | <role> | `--radius-<role>` | <when used> |
111
128
 
112
129
  ## Motion
113
130
 
@@ -61,6 +61,11 @@ Before responding, verify:
61
61
  - All actions pinned to major version tags, no `@latest` or `@main`.
62
62
  - A new pipeline folds static, unit, and build into one job, and a gate a run log put past two minutes gives them no `needs` so they run in parallel.
63
63
  - Every name in a `needs` matches a job declared in the same file. E2E names the artifact producer, release and deploy name E2E.
64
+
65
+ ### Artifacts, names, and deploys
66
+
67
+ Before responding, also verify:
68
+
64
69
  - Artifacts upload on `if: failure()` only with `retention-days: 7`.
65
70
  - Job names use emoji + title format.
66
71
  - Deploy, publish, and release jobs carry a placeholder step and a named handoff, never a guessed deploy command.
@@ -83,6 +83,9 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
83
83
  - A new class has one method, or a new function's body is one call with the same arguments.
84
84
  - The change you are making opens a third file to adjust one rule.
85
85
  - You are writing an interface, a factory, or a registry with one implementation behind it.
86
+
87
+ ### Defaults and fixes
88
+
86
89
  - You wrote a default value, a threshold, or a fallback the task never named.
87
90
  - A fix is adding a special case, a catch, or a disabled check rather than changing the code that misbehaved.
88
91
  - The code reads the current time, an environment variable, or a global from inside a rule.
@@ -95,6 +98,9 @@ Check each line against the code the change produced. A line answering no is fix
95
98
  - Every new function or class hides more than its interface asks a caller to learn, with no pass-through left.
96
99
  - No rule the change wrote exists in a second place, and nothing was merged that changes for a different reason.
97
100
  - Every pattern in the diff solves a problem present now, with more than one case behind it.
101
+
102
+ ### Inputs, scope, and fixes
103
+
98
104
  - Clock, environment, and global reads are passed in rather than taken inside a rule.
99
105
  - The diff holds no feature, option, or default the task did not ask for or state.
100
106
  - Every fix changes the code that misbehaved rather than silencing it.
@@ -34,7 +34,7 @@ A placement rule in front of the session is also one it can argue past. Each fla
34
34
  - Carry a hard file-count threshold. A command folder holding sixty files of one role reads fine flat, and a number would fail it.
35
35
  - Restate the layer rule, the layer table, or the final filter `test-craft` owns
36
36
  - Mandate one layout across projects, such as a `features/` tree, over the project's own strategy
37
- - Restate the pointer in `000-code`, which loads in code stacks only. The rule points here and this body carries the depth.
37
+ - Restate the pointer in `routing`, which loads in code stacks only. The rule points here and this body carries the depth.
38
38
 
39
39
  ## Guards
40
40
 
@@ -90,5 +90,5 @@ Check every new path the plan or the change names against each line, and fix the
90
90
  - Which layer a test belongs at: `test-craft`. This skill decides where the test file sits once its layer is chosen.
91
91
  - What a module exposes across its boundary, being its exports, flags, output, and errors: `api-design`. This skill decides where the file holding it sits.
92
92
  - Where a new path gets written into a plan, and the plan's shape: `plan-feature` and the plan standard
93
- - The pointer here that every session of a code stack loads: `000-code`
94
- - Runner, suffix, and top-level test folder conventions per language: `300-testing-ts`, `330-testing-py`, `335-testing-go`, and `336-testing-php`
93
+ - The pointer here that every session of a code stack loads: `routing`
94
+ - Runner, suffix, and top-level test folder conventions per language: `testing-ts`, `testing-py`, `testing-go`, and `testing-php`