@erclx/canon 5.42.0 → 5.44.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 (195) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/auto-ship/SKILL.md +3 -3
  3. package/claude/skills/backlog-triage/references/apply.md +6 -6
  4. package/claude/skills/canon-cli/SKILL.md +4 -4
  5. package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
  6. package/claude/skills/canvas-board/SKILL.md +1 -1
  7. package/claude/skills/ci-workflow/REQUIREMENT.md +2 -1
  8. package/claude/skills/ci-workflow/SKILL.md +12 -2
  9. package/claude/skills/ci-workflow/references/workflows.md +12 -9
  10. package/claude/skills/context-fold/references/context.md +1 -1
  11. package/claude/skills/create-rule/SKILL.md +1 -0
  12. package/claude/skills/create-skill/REQUIREMENT.md +1 -1
  13. package/claude/skills/create-skill/SKILL.md +2 -2
  14. package/claude/skills/create-skill/references/skill-requirement.md +68 -9
  15. package/claude/skills/create-skill/references/skill.md +1 -1
  16. package/claude/skills/decision-escalate/SKILL.md +1 -2
  17. package/claude/skills/design-identity/REQUIREMENT.md +40 -0
  18. package/claude/skills/design-identity/SKILL.md +138 -0
  19. package/claude/skills/{draft-identity → design-identity}/references/card-route.md +2 -2
  20. package/claude/skills/design-taste/REQUIREMENT.md +4 -4
  21. package/claude/skills/design-taste/SKILL.md +2 -2
  22. package/claude/skills/design-taste/references/kinds.md +1 -1
  23. package/claude/skills/design-taste/references/preflight.md +1 -1
  24. package/claude/skills/document-health/references/axes.md +2 -1
  25. package/claude/skills/draft-and-pick/REQUIREMENT.md +8 -69
  26. package/claude/skills/draft-and-pick/SKILL.md +3 -153
  27. package/claude/skills/draft-doc/REQUIREMENT.md +9 -30
  28. package/claude/skills/draft-doc/SKILL.md +4 -76
  29. package/claude/skills/draft-figure/REQUIREMENT.md +8 -42
  30. package/claude/skills/draft-figure/SKILL.md +3 -77
  31. package/claude/skills/draft-identity/REQUIREMENT.md +8 -23
  32. package/claude/skills/draft-identity/SKILL.md +3 -130
  33. package/claude/skills/draft-ready/REQUIREMENT.md +8 -37
  34. package/claude/skills/draft-ready/SKILL.md +3 -128
  35. package/claude/skills/draft-screencast/REQUIREMENT.md +8 -23
  36. package/claude/skills/draft-screencast/SKILL.md +3 -62
  37. package/claude/skills/draft-slides/REQUIREMENT.md +8 -27
  38. package/claude/skills/draft-slides/SKILL.md +3 -72
  39. package/claude/skills/draw-figure/REQUIREMENT.md +59 -0
  40. package/claude/skills/draw-figure/SKILL.md +85 -0
  41. package/claude/skills/{draft-figure → draw-figure}/references/architecture-set.md +2 -2
  42. package/claude/skills/{draft-figure → draw-figure}/references/hand-drawn.md +2 -2
  43. package/claude/skills/{draft-figure → draw-figure}/references/mermaid-path.md +2 -2
  44. package/claude/skills/{draft-figure → draw-figure}/references/mermaid.md +1 -1
  45. package/claude/skills/git-commit/references/commit.md +1 -5
  46. package/claude/skills/git-pr/references/pr.md +1 -0
  47. package/claude/skills/make-deck/REQUIREMENT.md +44 -0
  48. package/claude/skills/make-deck/SKILL.md +80 -0
  49. package/claude/skills/markdown-craft/REQUIREMENT.md +1 -1
  50. package/claude/skills/markdown-craft/SKILL.md +2 -2
  51. package/claude/skills/pick-by-eye/REQUIREMENT.md +86 -0
  52. package/claude/skills/pick-by-eye/SKILL.md +161 -0
  53. package/claude/skills/plan-feature/SKILL.md +3 -2
  54. package/claude/skills/plan-feature/references/plan.md +25 -11
  55. package/claude/skills/plan-groundwork/SKILL.md +1 -1
  56. package/claude/skills/plan-intake/SKILL.md +1 -1
  57. package/claude/skills/plan-ready/REQUIREMENT.md +54 -0
  58. package/claude/skills/plan-ready/SKILL.md +136 -0
  59. package/claude/skills/{draft-ready → plan-ready}/references/assembly.md +1 -1
  60. package/claude/skills/{draft-ready → plan-ready}/references/ready.md +1 -1
  61. package/claude/skills/pr-evidence/references/evidence.md +1 -1
  62. package/claude/skills/record-screencast/REQUIREMENT.md +3 -3
  63. package/claude/skills/record-screencast/SKILL.md +2 -2
  64. package/claude/skills/role-orchestrator/REQUIREMENT.md +1 -1
  65. package/claude/skills/role-orchestrator/SKILL.md +2 -0
  66. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +5 -2
  67. package/claude/skills/role-orchestrator/references/orchestrator-output.md +4 -0
  68. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
  69. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +18 -13
  70. package/claude/skills/role-planner/REQUIREMENT.md +1 -1
  71. package/claude/skills/role-planner/SKILL.md +5 -4
  72. package/claude/skills/role-worker/REQUIREMENT.md +2 -0
  73. package/claude/skills/role-worker/SKILL.md +35 -2
  74. package/claude/skills/script-screencast/REQUIREMENT.md +40 -0
  75. package/claude/skills/script-screencast/SKILL.md +70 -0
  76. package/claude/skills/{draft-screencast → script-screencast}/references/beats-template.md +2 -2
  77. package/claude/skills/search-craft/REQUIREMENT.md +4 -4
  78. package/claude/skills/search-craft/SKILL.md +2 -2
  79. package/claude/skills/target-setup/SKILL.md +1 -0
  80. package/claude/skills/task-board/SKILL.md +11 -9
  81. package/claude/skills/task-board/references/board.md +15 -12
  82. package/claude/skills/teach-workspace/SKILL.md +1 -1
  83. package/claude/skills/teach-workspace/references/lesson-craft.md +2 -2
  84. package/claude/skills/ui-checklist/SKILL.md +2 -0
  85. package/claude/skills/write-doc/REQUIREMENT.md +46 -0
  86. package/claude/skills/write-doc/SKILL.md +83 -0
  87. package/claude/skills/{draft-doc → write-doc}/references/context.md +2 -2
  88. package/claude/skills/{draft-doc → write-doc}/references/docs.md +2 -2
  89. package/claude/skills/{draft-doc → write-doc}/references/readme.md +2 -2
  90. package/claude/skills/{draft-doc → write-doc}/references/wiki-kind.md +4 -4
  91. package/claude/skills/{draft-doc → write-doc}/references/wiki.md +1 -1
  92. package/docs/agents/audits.md +1 -0
  93. package/docs/agents/markdown-audit.md +4 -2
  94. package/docs/agents/migrate.md +13 -10
  95. package/docs/target/migrations.md +28 -4
  96. package/docs/target/projects.md +1 -1
  97. package/docs/workflow/parallel-features.md +3 -2
  98. package/docs/workflow/skill-map-on-request.md +18 -12
  99. package/docs/workflow/skill-map.md +13 -12
  100. package/docs/workflow/visual-design-workflow.md +2 -2
  101. package/governance/detect.toml +4 -0
  102. package/governance/ledger/framework/astro.md +73 -0
  103. package/governance/ledger/framework/fastapi.md +76 -0
  104. package/governance/ledger/framework/nextjs.md +86 -0
  105. package/governance/ledger/framework/react.md +83 -0
  106. package/governance/ledger/framework/shadcn.md +60 -0
  107. package/governance/ledger/framework/tailwind.md +55 -0
  108. package/governance/rules/canon/context.md +2 -1
  109. package/governance/rules/canon/plan.md +3 -5
  110. package/governance/rules/canon/scratch.md +3 -1
  111. package/governance/rules/canon/task-scope.md +2 -1
  112. package/governance/rules/canon/tasks.md +2 -1
  113. package/governance/rules/canon/worktrees.md +5 -2
  114. package/governance/rules/claude/output.md +7 -4
  115. package/governance/rules/claude/skill.md +6 -4
  116. package/governance/rules/framework/astro.md +12 -14
  117. package/governance/rules/framework/fastapi.md +20 -24
  118. package/governance/rules/framework/nextjs.md +19 -27
  119. package/governance/rules/framework/react.md +22 -33
  120. package/governance/rules/framework/shadcn.md +11 -15
  121. package/governance/rules/framework/tailwind.md +12 -14
  122. package/governance/rules/tooling/ci-workflow.md +6 -39
  123. package/governance/rules/ui/design-reference.md +37 -0
  124. package/governance/rules/writing/markdown.md +3 -2
  125. package/package.json +6 -6
  126. package/src/audits/catalog.ts +42 -0
  127. package/src/claude/cases/authoring.ts +15 -3
  128. package/src/claude/cases/misc.ts +12 -0
  129. package/src/claude/cases/workflow.ts +19 -1
  130. package/src/claude/settings.ts +8 -4
  131. package/src/claude/skills-audit.ts +113 -1
  132. package/src/commands/claude.ts +45 -12
  133. package/src/commands/demo.ts +1 -1
  134. package/src/commands/gov.ts +198 -0
  135. package/src/commands/markdown.ts +1 -1
  136. package/src/commands/migrate.ts +125 -2
  137. package/src/commands/pr.ts +34 -83
  138. package/src/commands/tasks.ts +383 -2
  139. package/src/commands/tooling.ts +3 -3
  140. package/src/commands/worktrees.ts +49 -0
  141. package/src/context/audit.ts +1 -1
  142. package/src/demo/beats.ts +1 -1
  143. package/src/gate/stages.ts +15 -0
  144. package/src/gov/audit.ts +441 -0
  145. package/src/listeners/belongs.ts +21 -0
  146. package/src/listeners/machine.ts +93 -0
  147. package/src/listeners/parse.ts +41 -0
  148. package/src/markdown/scope.ts +45 -35
  149. package/src/migrate/record-layout.ts +1 -1
  150. package/src/migrate/session-defaults.ts +138 -0
  151. package/src/migrate/skill-names.ts +68 -21
  152. package/src/pr/frames.ts +14 -3
  153. package/src/pr/local.ts +4 -69
  154. package/src/records/validate.ts +31 -0
  155. package/src/sync/check.ts +15 -0
  156. package/src/tasks/board.ts +854 -0
  157. package/src/tasks/record.ts +20 -1
  158. package/src/tasks/validate.ts +206 -9
  159. package/src/tooling/stamp.ts +56 -12
  160. package/src/worktrees/stop.ts +92 -0
  161. package/tooling/astro/configs/card-src/pages/og-card.astro +1 -1
  162. package/tooling/astro/reference.md +2 -2
  163. package/tooling/base/configs/.github/workflows/phase-label-gate.yml +6 -2
  164. package/tooling/base/configs/commitlint.config.js +0 -20
  165. package/tooling/base/reference.md +1 -1
  166. package/tooling/base/seeds/.github/workflows/verify.yml +4 -1
  167. package/tooling/claude/reference.md +13 -7
  168. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +65 -0
  169. package/tooling/claude/seeds/.claude/settings.json +8 -0
  170. package/tooling/claude/user/settings.template.json +0 -4
  171. package/tooling/cloudflare/configs/.github/workflows/deploy.yml +5 -5
  172. package/tooling/public/configs/.github/dependabot.yml +12 -0
  173. package/tooling/public/configs/.github/workflows/release-please.yml +30 -0
  174. package/tooling/public/manifest.toml +8 -0
  175. package/tooling/public/reference.md +53 -0
  176. package/tooling/public/seeds/.github/ISSUE_TEMPLATE/bug.yml +48 -0
  177. package/tooling/public/seeds/.github/ISSUE_TEMPLATE/config.yml +5 -0
  178. package/tooling/public/seeds/.github/ISSUE_TEMPLATE/feature.yml +16 -0
  179. package/tooling/public/seeds/.release-please-manifest.json +3 -0
  180. package/tooling/public/seeds/CONTRIBUTING.md +50 -0
  181. package/tooling/public/seeds/LICENSE +21 -0
  182. package/tooling/public/seeds/SECURITY.md +13 -0
  183. package/tooling/public/seeds/release-please-config.json +12 -0
  184. package/tooling/shell/configs/.github/workflows/shell.yml +4 -1
  185. package/tooling/web/configs/.github/workflows/readme-screenshot.yml +6 -3
  186. package/tooling/web/configs/.github/workflows/verify.yml +15 -12
  187. /package/claude/skills/{draft-figure → draw-figure}/references/figures.md +0 -0
  188. /package/claude/skills/{draft-slides → make-deck}/references/deck.md +0 -0
  189. /package/claude/skills/{draft-and-pick → pick-by-eye}/references/live-arms.md +0 -0
  190. /package/claude/skills/{draft-doc → write-doc}/references/readme/agent-facing.md +0 -0
  191. /package/claude/skills/{draft-doc → write-doc}/references/readme/application.md +0 -0
  192. /package/claude/skills/{draft-doc → write-doc}/references/readme/cli.md +0 -0
  193. /package/claude/skills/{draft-doc → write-doc}/references/readme/library.md +0 -0
  194. /package/claude/skills/{draft-doc → write-doc}/references/readme/plugin.md +0 -0
  195. /package/claude/skills/{draft-doc → write-doc}/references/requirements.md +0 -0
@@ -1,70 +1,11 @@
1
1
  ---
2
2
  name: draft-screencast
3
- description: Drafts a screencast script with pre-seeded beats, defaults, and decisions to `demos/<slug>/beats.md`. Reads project context, asks four discovery questions with proposed defaults, then writes a shippable draft. Use when asked to "draft a screencast", "write a recording script", "plan a demo video", or "scaffold a screencast for X". Do NOT re-invoke to refine an existing draft. Re-running overwrites. Edit the draft file directly.
3
+ description: Renamed from `draft-screencast` to `script-screencast`. Answers a typed invocation of the old screencast skill name by pointing at the new one.
4
+ disable-model-invocation: true
4
5
  metadata:
5
6
  family: generate
6
7
  ---
7
8
 
8
9
  # Draft screencast
9
10
 
10
- ## Guards
11
-
12
- - If no topic is provided, stop: `❌ No screencast topic. Describe what you are recording.`
13
- - Draft, then hand off. Do not edit video, generate captions, or drive the application, since a recording is `record-screencast`'s job. Name it as the next step and stop.
14
- - Stack-agnostic in the draft. Never name a recording tool, an editing tool, a font, or a window manager.
15
- - Keep selectors, URLs, wait conditions, and timings out of the beats, since the compiler adds those four in a plan of its own and a beat carrying them stops being readable
16
-
17
- ## Step 1: read the project context
18
-
19
- Read these in parallel from the project root, skipping any that do not exist:
20
-
21
- - `CLAUDE.md`: behavior rules and project pitch
22
- - `canon/REQUIREMENTS.md`: feature scope, non-goals, audience hints
23
- - `.canon/tasks/index.md`: current scope
24
- - Recent commits via `git log --oneline -20 2>/dev/null || echo "FALLBACK"`: what shipped recently is usually the recording subject.
25
-
26
- ## Step 2: discovery with proposed defaults
27
-
28
- Ask exactly four questions in chat. Each carries a proposed default derived from Step 1. The user confirms, overrides, or says "use defaults" to accept all.
29
-
30
- ```markdown
31
- **Discovery:**
32
-
33
- 1. Audience: proposing technical peers. Override?
34
- 2. Length: proposing 75-90s. Override?
35
- 3. Hero moment: proposing <best guess from context, or "the single thing that has to land">. Override?
36
- 4. What to cut: proposing <best guess, or "anything that is not the hero moment">. Override?
37
- ```
38
-
39
- Wait for answers before drafting. Do not infer silence as acceptance.
40
-
41
- ## Step 3: derive the slug
42
-
43
- Build a 2-to-4-word kebab-case slug from the topic and discovery answers. Examples: `auth-flow-redesign`, `cli-onboarding`, `inline-edit-launch`.
44
-
45
- ## Step 4: write the draft
46
-
47
- Create `demos/<slug>/beats.md` at the project root, creating the folder if it does not exist. The file is committed with the rest of the demo's sources, so a recording can be rebuilt from the folder alone.
48
-
49
- ### Fill the template
50
-
51
- Write all nine sections from `${CLAUDE_SKILL_DIR}/references/beats-template.md`, read on reaching this step. Pre-seed every section with concrete content so the draft ships as-is, and the user edits down rather than fills blanks. A run stopped at discovery skips it.
52
-
53
- Load `canon:video-craft` for every zoom and caption value the draft names, and report it rather than proceeding silently when it does not resolve.
54
-
55
- ## Step 5: output
56
-
57
- Print the file path on its own line and a one-line summary. Do not paraphrase the path into prose.
58
-
59
- ```markdown
60
- 📝 Wrote demos/<slug>/beats.md
61
-
62
- Draft has 5 beats and pre-seeded defaults. Edit the beats, the resolved decisions, and the wrap.
63
-
64
- To record it rather than shoot it by hand:
65
- record-screencast demos/<slug>/beats.md
66
- ```
67
-
68
- Name the skill and stop there. Do not compile the draft, do not run it, and do not generate captions. The operator edits the beats first, and the compiler reports which selectors and URLs they still owe it.
69
-
70
- Say so plainly if `canon demo compile` is not available, rather than driving the application some other way. The command ships with the CLI and the skills ship with the plugin, so a project carrying one and not the other is a real state.
11
+ This skill is now `script-screencast`. Run `/canon:script-screencast` instead, and change any file that still names this one.
@@ -1,44 +1,25 @@
1
1
  ---
2
2
  name: draft-slides
3
- description: Why the skill draws a deck as HTML in the project's tokens inside its own folder, why the CLI owns the conversion, and why one render is read back before the deck is called done
3
+ description: Why a pointer answers under the old `draft-slides` name, and the test that retires it
4
4
  ---
5
5
 
6
6
  # Draft slides requirement
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a deck request turns into hand-built output. The session writes a deck into whatever path occurs to it, so a second deck overwrites the first and nothing lists either. It writes pptxgenjs code or hex colors per deck, so the deck takes neither the project's design nor any other deck's, and it invents attributes the converter does not read, so a section, a chart, or an entrance silently goes missing. Every slide comes out as a title over bullets, which is the shape that needs no decision and reads as a document rather than a deck.
11
-
12
- A first render shipped unread hands the audience the overlap, the overflow, and every element the converter fell back to a picture for, since markup that looks correct says nothing about the file it produces.
10
+ Without this skill, a person typing the old name after the rename to `make-deck` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
13
11
 
14
12
  ## Must
15
13
 
16
- - Read the existing decks and the slide format from the CLI before drawing, and pick a deck name no listed deck carries unless the request names one
17
- - Write each deck into its own folder under the slides record folder, one HTML file per slide in filename order
18
- - Draw with the project's custom properties so the deck takes the project's design
19
- - Vary the composition across the deck rather than repeating one shape
20
- - Size content to fit the slide frame, keeping titles short and lines tight
21
- - Shell out to the render command for the deck itself
22
- - Read every fallback and refusal the render reports, run one QA pass over the rendered images, and fix what both report
14
+ - Name `make-deck` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
23
16
 
24
17
  ## Must not
25
18
 
26
- - Hardcode a deck name, an attribute, or a chart type, which goes stale the moment the CLI changes
27
- - Reimplement the conversion, the master, or the packaging, which the CLI owns
28
- - Write a deck into the shared layouts folder, which is never listed as a deck
29
- - Invent token values when the project has no token stylesheet
30
- - Write centered body text or content that overflows a slide
31
- - Loop on aesthetics past a single fix pass
32
-
33
- ## Guards
34
-
35
- - No token stylesheet: draw the deck anyway and say it renders unstyled.
36
- - Image conversion tools missing: skip the image pass and say so. Do not fail the render over a verification step.
19
+ - Carry any part of the deck draft, which would give one behavior two bodies that drift apart
20
+ - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
37
21
 
38
22
  ## Out of scope
39
23
 
40
- - Converting HTML to PowerPoint, which the CLI owns end to end
41
- - The project's palette and faces, which live in its token stylesheet rather than in the slides
42
- - Writing the content the deck is about, which the caller brings
43
- - Drafting a deck as a canvas page, which waits on a measurement of that authoring surface
44
- - Recording a demo, which `draft-screencast` owns
24
+ - The work itself, which `make-deck` owns
25
+ - Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board
@@ -1,80 +1,11 @@
1
1
  ---
2
2
  name: draft-slides
3
- description: Draws a deck as HTML slides in the project's own design, one folder under `.canon/slides/` per deck, then renders it to an editable PowerPoint file via `canon slides render`. Use when asked to "draft slides", "make a deck", "build a presentation", "turn this into slides", or "render the deck". Holds the deck design rules. Do NOT reimplement the conversion. The CLI owns layout into PowerPoint shapes, the master, and packaging. Assumes the `canon` CLI is on PATH.
3
+ description: Renamed from `draft-slides` to `make-deck`. Answers a typed invocation of the old slides skill name by pointing at the new one.
4
+ disable-model-invocation: true
4
5
  metadata:
5
6
  family: generate
6
7
  ---
7
8
 
8
9
  # Draft slides
9
10
 
10
- Draw each slide as an HTML file in a deck folder, then shell out to `canon slides render`. The CLI lays every slide out in a browser and rebuilds it as editable PowerPoint shapes. This skill owns the content, the slide markup, and the design choices the markup encodes.
11
-
12
- ## Read the decks and the format
13
-
14
- Run the list first, then read the format. Never hardcode a deck name, an attribute, or a chart type.
15
-
16
- ```bash
17
- canon slides list --json 2>/dev/null
18
- ```
19
-
20
- The list returns one row per deck, carrying its `name`, `title`, slide count, and `path`. When the request names a deck the list holds, edit that folder. Otherwise pick a new kebab-case name no row carries.
21
-
22
- Read `${CLAUDE_SKILL_DIR}/references/deck.md`. It states what `deck.json` holds, what each slide declares on its `<body>`, the motion attributes, speaker notes, and charts. Each refusal prints as a `✗` line from the render.
23
-
24
- ## Draw the deck
25
-
26
- A deck folder sits at `.canon/slides/<deck>/` from the project root, and holds:
27
-
28
- - One `.html` file per slide, rendered in filename order. Number them with a zero-padded prefix, such as `01-cover.html`, so a slide inserted later sorts where it belongs.
29
- - `deck.json`, optional, for the title, the header and footer bands, slide numbers, the mark, and embedded faces.
30
- - `assets/` for images the slides reference by a relative path.
31
-
32
- Never write a slide into `.canon/slides/layouts/`. That folder holds the project's shared layouts and is never listed as a deck.
33
-
34
- Each slide is a full HTML document laid out at 1280 by 720 CSS pixels. Position its blocks absolutely or with a flex or grid container sized to that frame, and keep every element inside it.
35
-
36
- ## Design rules
37
-
38
- The render injects the project's token stylesheet ahead of each slide's own styles, so the deck takes the project's design rather than the toolkit's.
39
-
40
- - Use the project's custom properties, such as `var(--color-accent)`, for every color, face, and spacing value, read from `.claude/design/base.css` and overrides under `.claude/design/project/`
41
- - When neither exists, say the deck renders unstyled rather than inventing values to cover it
42
- - Leave the `--color-*` roles to the stylesheet. The master reads its colors off the first slide's `<html>`, so a slide computing its own `--color-text` is reported, since the bands keep the master's.
43
- - Vary the composition across slides. Never repeat a title over bullets on every slide. Reach for columns, a row of large numbers, a grid of cards, a chart, a pull quote, and section dividers.
44
-
45
- ### Fit and shapes
46
-
47
- Text and shapes have to survive the conversion.
48
-
49
- - Keep titles short and lines tight, so text fits its box at the size the design sets rather than overflowing the frame.
50
- - Never write centered body text.
51
- - Prefer CSS the converter maps to native shapes. An unmappable property is drawn as a picture and reported on stderr, so a slide full of gradients and filters stops being editable.
52
-
53
- ## Render
54
-
55
- Shell out to the CLI. It writes the deck and reports the path.
56
-
57
- ```bash
58
- canon slides render <deck>
59
- ```
60
-
61
- With one deck in the project the name can be left out. The render refuses with the deck list when there are several. Pass `--open` to open the deck, and `--mirror <dir>`, or set `CANON_SLIDES_MIRROR`, to copy it into a synced folder.
62
-
63
- Read every `✗` line the render prints. A picture fallback, a refused link, chart, or effect, and a missing token each leave the deck written with that piece degraded or left out.
64
-
65
- ## QA loop
66
-
67
- Run this once after the first render, then stop.
68
-
69
- 1. Convert the deck with `soffice --headless --convert-to pdf <deck>.pptx`, then `pdftoppm -r 90 -png <deck>.pdf slide`. If either is missing, skip the image pass and say so rather than fail the render.
70
- 2. Open and inspect every rendered image in this session, checking each slide for overlap, overflow, low contrast, and empty regions.
71
- 3. Fix the reported issues and the `✗` lines in the slide files once, re-render, and stop. Do not loop indefinitely on aesthetics.
72
-
73
- ## Response
74
-
75
- After rendering, report:
76
-
77
- - The deck folder, the slide count, and the written `.pptx` path
78
- - Whether the project's token stylesheet was found
79
- - Each `✗` line the final render printed, or that it printed none
80
- - Any QA issues found and what changed, or that the deck passed clean
11
+ This skill is now `make-deck`. Run `/canon:make-deck` instead, and change any file that still names this one.
@@ -0,0 +1,59 @@
1
+ ---
2
+ name: draw-figure
3
+ description: Why a figure decides between Mermaid, an architecture view, and freehand SVG before drawing, and why the Mermaid path carries a render-verification loop
4
+ ---
5
+
6
+ # Draw figure requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session asked for a figure reaches for whichever path it thought of first. A graph-shaped subject gets model-authored SVG coordinates nobody checked against a render, drifting from the hand-drawn look every other figure in the project carries. A subject that is not graph-shaped gets forced through Mermaid's node-and-edge model, producing a diagram that answers a different question than the one asked. Either failure ships a figure a reader cannot trust, and a figure exists only to be trusted at a glance.
11
+
12
+ A teach lesson breaks the Mermaid path outright. The lesson letters its figures in a hand font the renderer cannot load, so the render sizes every label in a narrower fallback face and the lesson clips the text it actually shows. The check then reads the standalone image, rendered in that same fallback, and passes a figure the reader sees clipped. Both happened on one lesson, where every group title clipped mid-word and only a capture taken inside the lesson showed it.
13
+
14
+ An architecture view asked for one at a time fails its own way. A session asked to refresh one view redraws every view beside it, so pictures nobody checked change in the same commit and the reviewer cannot tell which one the pass was about. It reaches for C4, state, or class diagrams that render differently in every viewer. A Mermaid source can satisfy every rule in the standard and still render as a picture asserting something false about the system, so a session that judges the source and calls it verified has spent the only signal a reader has on a picture nobody looked at.
15
+
16
+ The color failure is the quiet one. Mermaid's own theme writes literal hex values, and a figure carrying one stops re-coloring itself the moment the host page switches its palette, which the figure standard's own accessibility bar rules out.
17
+
18
+ ## Must
19
+
20
+ - Apply the standard's earn-its-place bar before drawing anything
21
+ - Decide between the Mermaid path and the freehand path by whether the subject reduces to a graph, not by which is faster to produce
22
+ - Draw an architecture view from its named source signal, inside `flowchart` and `sequenceDiagram`, and render it through the Mermaid path
23
+ - Draw only the view the request names, leaving every other figure in the destination untouched
24
+ - Draw a figure bound for a teach lesson freehand whatever its shape, since the lesson's hand font is one the renderer cannot measure
25
+ - Verify a figure bound for a rendered page by capturing it inside that page, and fall back to the standalone render only where the destination has no page to load
26
+ - Keep the scoped overflow style as the documented fallback for a clipped group title wherever the Mermaid path still runs
27
+ - Render the Mermaid path with the hand-drawn look and the figure font stack, never with Mermaid's default look
28
+ - Rewrite every literal color the renderer wrote into the custom property the host stylesheet defines
29
+ - Read the Mermaid render back and judge it against what the figure means to say, rather than judging the source
30
+ - Read the node labels by hand, since no hook checks inside a fence
31
+ - Cite only code paths that exist in an architecture view's caption or prose
32
+ - Wrap either path in a `<figure>` and `<figcaption>` and give it an accessible name
33
+
34
+ ## Must not
35
+
36
+ - Force a non-graph-shaped subject through Mermaid, or route a graph-shaped one through freehand SVG coordinates a model authored by hand outside a teach lesson
37
+ - Report a figure bound for a rendered page as verified from the standalone render alone
38
+ - Ship a literal hex color on either path
39
+ - Report a clean verification when the Mermaid render was skipped or a defect survived
40
+ - Loop past two correction passes on a surviving defect
41
+ - Commit a scratch render. Only the SVG that ships in the destination document survives
42
+ - Redraw a figure the request did not name, or report one as drawn when it was left alone
43
+ - Leave an architecture view as an unrendered fence
44
+
45
+ ## Guards
46
+
47
+ - No subject given: stop, since nothing states what the figure has to show
48
+ - No destination document given: stop, since the figure has nowhere to land
49
+ - Subject does not clear the earn-its-place bar: stop rather than drawing decoration
50
+ - An architecture view with no planning file and no folder structure to scan: stop, because nothing anchors it
51
+ - Render fails for any reason: continue to the output and name the skipped check. A missing renderer degrades the loop rather than failing it.
52
+
53
+ ## Out of scope
54
+
55
+ - Mermaid's own layout, budgets, and label rules for the fence itself: the mermaid standard, cited rather than restated here
56
+ - A UI screen mockup: `canvas-board`
57
+ - Design tokens and the visual system: `canvas-board`, which carries a picked direction into the design document
58
+ - Implementation detail behind an architecture view, which belongs in a context entry the caption points at
59
+ - Which lesson needs a figure and where it sits among the lesson's blocks: `teach-workspace`, which calls this skill to draw one
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: draw-figure
3
+ description: Drafts one hand-drawn figure for a document, deciding whether the subject is Mermaid-shaped, an architecture view, or needs freehand SVG, then draws it. Renders the Mermaid path through Mermaid's own hand-drawn look, reads the render back, and fixes what it exposes. Wraps every path in the figure standard's caption, color, and accessibility rules. Use when asked to "draw a figure", "add a hand-drawn diagram", "draft a figure for this doc", "draw this relationship as a figure", "draw the architecture", "diagram the system", or "show the components". Do NOT use for a UI screen mockup, which is `canvas-board`.
4
+ metadata:
5
+ family: generate
6
+ ---
7
+
8
+ # Draw figure
9
+
10
+ Decide whether a requested figure reduces to a graph Mermaid can draw, is one of the architecture views, or needs freehand SVG, then draw it and verify what a reader will actually see.
11
+
12
+ ## Guards
13
+
14
+ - If no subject is given, stop: `❌ No subject given. Name the relationship, boundary, path, or before-and-after this figure should show.`
15
+ - If no destination document is given, stop: `❌ No destination given. Name the file this figure belongs in.`
16
+
17
+ ## Step 1: read sources
18
+
19
+ Read these in parallel:
20
+
21
+ - `${CLAUDE_SKILL_DIR}/references/figures.md`: when a figure earns its place, the render-first policy, wrapping and captioning, and the color and accessibility rules
22
+ - `${CLAUDE_SKILL_DIR}/../markdown-craft/references/markdown.md`: formatting for the caption prose
23
+ - The `write-human` skill: voice and rhythm for the caption prose
24
+
25
+ ## Step 2: does it earn its place
26
+
27
+ Apply the standard's bar: a relationship, a boundary, a path, or a before-and-after that prose or a list cannot carry as well. Stop when it does not: `❌ <subject> reads fine as prose. A figure adds nothing here.`
28
+
29
+ ## Step 3: pick the path
30
+
31
+ Take the first that matches, and state which path was picked and why in one sentence:
32
+
33
+ 1. **A teach lesson**, a page in a learning workspace's `lessons/` folder: the hand-drawn path, any shape. The renderer cannot load the lesson's hand font, so Mermaid labels measure narrow and clip.
34
+ 2. **An architecture view**, meaning the request names system context, components, request flow, data pipeline, or deployment: the architecture set, then the Mermaid path.
35
+ 3. **Graph-shaped**, meaning the relationship, boundary, or path is already what a flowchart or sequence diagram expresses: the Mermaid path.
36
+ 4. **Anything else**, a spatial or physical arrangement no flowchart reduces to: the hand-drawn path.
37
+
38
+ The standard states this as a render-first policy rather than a ban on any tool-exported drawing, so outside a teach lesson a graph-shaped subject always routes through Mermaid even though that is itself an external renderer.
39
+
40
+ ## Step 4: draw
41
+
42
+ Read the reference for the path Step 3 picked and follow it:
43
+
44
+ - Architecture set: shape the view per `${CLAUDE_SKILL_DIR}/references/architecture-set.md`, then draw, render, and read back per `${CLAUDE_SKILL_DIR}/references/mermaid-path.md`
45
+ - Mermaid path: read `${CLAUDE_SKILL_DIR}/references/mermaid-path.md`.
46
+ - Hand-drawn path: read `${CLAUDE_SKILL_DIR}/references/hand-drawn.md`.
47
+
48
+ ## Step 5: wrap, caption, and verify
49
+
50
+ - Wrap the drawing in a `<figure>` element with a `<figcaption>` naming what to take from the figure, never what it shows. Let it run wider than the surrounding prose column.
51
+ - On the Mermaid path, run the read-back `mermaid-path.md` states before confirming.
52
+ - On every path, confirm the figure still reads once every color and font it depends on is stripped to its fallback, per the standard's own working-figure bar.
53
+ - On a rendered page, an HTML file a browser loads, the check that counts is the figure in the page, which Step 6 captures on either path. A markdown destination's whole check is the checks above.
54
+
55
+ ## Step 6: confirm and write
56
+
57
+ Show the destination path, the decided path, and the full `<figure>` markup before writing. Confirm with the user, since the path decision and the render verdict are judgment calls with no diff to preview, then write the figure where the user named.
58
+
59
+ When the destination is a rendered page, read the `## Capture in the page` section of `${CLAUDE_SKILL_DIR}/references/hand-drawn.md` and run it, on the Mermaid path as well as the hand-drawn one, within the same two correction passes the read-back allows.
60
+
61
+ ### Cleaning up
62
+
63
+ Renders and captures under `.canon/tmp/figures/` are verification artifacts. Delete the scratch PNGs, the stamps beside them, and the JSON config once the checks confirm, since only the SVG ships, and keep the `.mmd` source a later refresh redraws from.
64
+
65
+ ## Output
66
+
67
+ ### Preview
68
+
69
+ **Destination:** `<path>`
70
+ **Render path:** `<mermaid | architecture | freehand>`, `<one-sentence reason>`
71
+
72
+ ```html
73
+ <drafted figure markup></drafted>
74
+ ```
75
+
76
+ ### After confirmation
77
+
78
+ Report the write in this shape.
79
+
80
+ ```plaintext
81
+ ✅ Drafted figure in <path>
82
+ Render path: <mermaid | architecture | freehand>
83
+ Verified <in page | as a standalone render>. <defect or skipped check, one line, omitted when clean>
84
+ <Font not embedded: run `canon design css --figures` to ship Virgil and Excalifont. Omitted when the project already ran it.>
85
+ ```
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: Architecture set
3
- description: The five architecture views with each one's question, source signal, and diagram type, the code-scan fallback, cited paths, and what moves to canon/context/ instead, read by draft-figure when a request names an architecture view
3
+ description: The five architecture views with each one's question, source signal, and diagram type, the code-scan fallback, cited paths, and what moves to canon/context/ instead, read by draw-figure when a request names an architecture view
4
4
  ---
5
5
 
6
6
  # Architecture set
7
7
 
8
- `draft-figure` reads this file when the request names an architecture view. It shapes the subject, then the figure goes through `${CLAUDE_SKILL_DIR}/references/mermaid-path.md` like any other graph-shaped figure. The destination stays the one the user named.
8
+ `draw-figure` reads this file when the request names an architecture view. It shapes the subject, then the figure goes through `${CLAUDE_SKILL_DIR}/references/mermaid-path.md` like any other graph-shaped figure. The destination stays the one the user named.
9
9
 
10
10
  ## The five views
11
11
 
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: Hand-drawn path
3
- description: Authoring a freehand SVG, its color and accessibility audit, and the in-page capture loop a rendered destination takes, read by draft-figure once a figure is drawn by hand
3
+ description: Authoring a freehand SVG, its color and accessibility audit, and the in-page capture loop a rendered destination takes, read by draw-figure once a figure is drawn by hand
4
4
  ---
5
5
 
6
6
  # Hand-drawn path
7
7
 
8
- `draft-figure` reads this file when Step 3 routes a figure to a freehand drawing: a teach lesson whatever its subject, or a subject no flowchart reduces to.
8
+ `draw-figure` reads this file when Step 3 routes a figure to a freehand drawing: a teach lesson whatever its subject, or a subject no flowchart reduces to.
9
9
 
10
10
  ## Draw
11
11
 
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: Mermaid path
3
- description: The hand-drawn render config, the SVG and PNG pair, the hex rewrite, the scoped overflow fallback, the label check, and the PNG read-back with its two-pass stop, read by draft-figure once a figure routes through Mermaid
3
+ description: The hand-drawn render config, the SVG and PNG pair, the hex rewrite, the scoped overflow fallback, the label check, and the PNG read-back with its two-pass stop, read by draw-figure once a figure routes through Mermaid
4
4
  ---
5
5
 
6
6
  # Mermaid path
7
7
 
8
- `draft-figure` reads this file when Step 3 routes a figure through Mermaid, whether the subject is graph-shaped or an architecture view the architecture set already shaped.
8
+ `draw-figure` reads this file when Step 3 routes a figure through Mermaid, whether the subject is graph-shaped or an architecture view the architecture set already shaped.
9
9
 
10
10
  ## Draft the fence
11
11
 
@@ -13,7 +13,7 @@ Governs the Mermaid attribute wherever a fence is written, being direction and l
13
13
 
14
14
  Does not govern:
15
15
 
16
- - Which architecture view a figure draws and what question it answers: the `draft-figure` skill's architecture set
16
+ - Which architecture view a figure draws and what question it answers: the `draw-figure` skill's architecture set
17
17
  - Language, word choice, punctuation, and formatting in the prose around a fence: `markdown.md`
18
18
  - Voice, rhythm, and sentence construction in that prose: the `write-human` skill
19
19
  - The mechanism behind any component a diagram draws: `context.md`
@@ -56,6 +56,7 @@ A scope names a component, never a file or the type again.
56
56
  - Use imperative mood (`add` not `added`)
57
57
  - Describe the actual technical change, not that something changed
58
58
  - Do not use vague verbs (`improve`, `refine`, `enhance`)
59
+ - Name what changed in the project on a sync or upgrade commit, never the toolkit version, since the config stamp records it
59
60
 
60
61
  ### Form and quoting
61
62
 
@@ -66,11 +67,6 @@ The subject carries the change and nothing around it.
66
67
  - No backslash escaping or internal double quotes
67
68
  - No conversational filler or introductory phrases
68
69
 
69
- ## Trailers
70
-
71
- - Do not add a `Co-authored-by` trailer crediting Claude or Anthropic, by name or by address
72
- - The `commit-msg` hook refuses a commit carrying one, so remove the line and commit again
73
-
74
70
  ## Examples
75
71
 
76
72
  ### Correct
@@ -33,6 +33,7 @@ Does not govern:
33
33
  - Format: `<type>(<scope>): <subject>`, with `!` before the colon for a breaking change
34
34
  - Casing: lowercase for `<type>`, `<scope>`, and first word of `<subject>`
35
35
  - Length: 72 characters maximum
36
+ - Subject: follows the subject rules in `commit.md`, including the one for a sync or upgrade title
36
37
 
37
38
  ## Content
38
39
 
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: make-deck
3
+ description: Why the skill draws a deck as HTML in the project's tokens inside its own folder, why the CLI owns the conversion, and why one render is read back before the deck is called done
4
+ ---
5
+
6
+ # Make deck requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a deck request turns into hand-built output. The session writes a deck into whatever path occurs to it, so a second deck overwrites the first and nothing lists either. It writes pptxgenjs code or hex colors per deck, so the deck takes neither the project's design nor any other deck's, and it invents attributes the converter does not read, so a section, a chart, or an entrance silently goes missing. Every slide comes out as a title over bullets, which is the shape that needs no decision and reads as a document rather than a deck.
11
+
12
+ A first render shipped unread hands the audience the overlap, the overflow, and every element the converter fell back to a picture for, since markup that looks correct says nothing about the file it produces.
13
+
14
+ ## Must
15
+
16
+ - Read the existing decks and the slide format from the CLI before drawing, and pick a deck name no listed deck carries unless the request names one
17
+ - Write each deck into its own folder under the slides record folder, one HTML file per slide in filename order
18
+ - Draw with the project's custom properties so the deck takes the project's design
19
+ - Vary the composition across the deck rather than repeating one shape
20
+ - Size content to fit the slide frame, keeping titles short and lines tight
21
+ - Shell out to the render command for the deck itself
22
+ - Read every fallback and refusal the render reports, run one QA pass over the rendered images, and fix what both report
23
+
24
+ ## Must not
25
+
26
+ - Hardcode a deck name, an attribute, or a chart type, which goes stale the moment the CLI changes
27
+ - Reimplement the conversion, the master, or the packaging, which the CLI owns
28
+ - Write a deck into the shared layouts folder, which is never listed as a deck
29
+ - Invent token values when the project has no token stylesheet
30
+ - Write centered body text or content that overflows a slide
31
+ - Loop on aesthetics past a single fix pass
32
+
33
+ ## Guards
34
+
35
+ - No token stylesheet: draw the deck anyway and say it renders unstyled.
36
+ - Image conversion tools missing: skip the image pass and say so. Do not fail the render over a verification step.
37
+
38
+ ## Out of scope
39
+
40
+ - Converting HTML to PowerPoint, which the CLI owns end to end
41
+ - The project's palette and faces, which live in its token stylesheet rather than in the slides
42
+ - Writing the content the deck is about, which the caller brings
43
+ - Drafting a deck as a canvas page, which waits on a measurement of that authoring surface
44
+ - Recording a demo, which `script-screencast` owns
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: make-deck
3
+ description: Draws a deck as HTML slides in the project's own design, one folder under `.canon/slides/` per deck, then renders it to an editable PowerPoint file via `canon slides render`. Use when asked to "draft slides", "make a deck", "build a presentation", "turn this into slides", or "render the deck". Holds the deck design rules. Do NOT reimplement the conversion. The CLI owns layout into PowerPoint shapes, the master, and packaging. Assumes the `canon` CLI is on PATH.
4
+ metadata:
5
+ family: generate
6
+ ---
7
+
8
+ # Make deck
9
+
10
+ Draw each slide as an HTML file in a deck folder, then shell out to `canon slides render`. The CLI lays every slide out in a browser and rebuilds it as editable PowerPoint shapes. This skill owns the content, the slide markup, and the design choices the markup encodes.
11
+
12
+ ## Read the decks and the format
13
+
14
+ Run the list first, then read the format. Never hardcode a deck name, an attribute, or a chart type.
15
+
16
+ ```bash
17
+ canon slides list --json 2>/dev/null
18
+ ```
19
+
20
+ The list returns one row per deck, carrying its `name`, `title`, slide count, and `path`. When the request names a deck the list holds, edit that folder. Otherwise pick a new kebab-case name no row carries.
21
+
22
+ Read `${CLAUDE_SKILL_DIR}/references/deck.md`. It states what `deck.json` holds, what each slide declares on its `<body>`, the motion attributes, speaker notes, and charts. Each refusal prints as a `✗` line from the render.
23
+
24
+ ## Draw the deck
25
+
26
+ A deck folder sits at `.canon/slides/<deck>/` from the project root, and holds:
27
+
28
+ - One `.html` file per slide, rendered in filename order. Number them with a zero-padded prefix, such as `01-cover.html`, so a slide inserted later sorts where it belongs.
29
+ - `deck.json`, optional, for the title, the header and footer bands, slide numbers, the mark, and embedded faces.
30
+ - `assets/` for images the slides reference by a relative path.
31
+
32
+ Never write a slide into `.canon/slides/layouts/`. That folder holds the project's shared layouts and is never listed as a deck.
33
+
34
+ Each slide is a full HTML document laid out at 1280 by 720 CSS pixels. Position its blocks absolutely or with a flex or grid container sized to that frame, and keep every element inside it.
35
+
36
+ ## Design rules
37
+
38
+ The render injects the project's token stylesheet ahead of each slide's own styles, so the deck takes the project's design rather than the toolkit's.
39
+
40
+ - Use the project's custom properties, such as `var(--color-accent)`, for every color, face, and spacing value, read from `.claude/design/base.css` and overrides under `.claude/design/project/`
41
+ - When neither exists, say the deck renders unstyled rather than inventing values to cover it
42
+ - Leave the `--color-*` roles to the stylesheet. The master reads its colors off the first slide's `<html>`, so a slide computing its own `--color-text` is reported, since the bands keep the master's.
43
+ - Vary the composition across slides. Never repeat a title over bullets on every slide. Reach for columns, a row of large numbers, a grid of cards, a chart, a pull quote, and section dividers.
44
+
45
+ ### Fit and shapes
46
+
47
+ Text and shapes have to survive the conversion.
48
+
49
+ - Keep titles short and lines tight, so text fits its box at the size the design sets rather than overflowing the frame.
50
+ - Never write centered body text.
51
+ - Prefer CSS the converter maps to native shapes. An unmappable property is drawn as a picture and reported on stderr, so a slide full of gradients and filters stops being editable.
52
+
53
+ ## Render
54
+
55
+ Shell out to the CLI. It writes the deck and reports the path.
56
+
57
+ ```bash
58
+ canon slides render <deck>
59
+ ```
60
+
61
+ With one deck in the project the name can be left out. The render refuses with the deck list when there are several. Pass `--open` to open the deck, and `--mirror <dir>`, or set `CANON_SLIDES_MIRROR`, to copy it into a synced folder.
62
+
63
+ Read every `✗` line the render prints. A picture fallback, a refused link, chart, or effect, and a missing token each leave the deck written with that piece degraded or left out.
64
+
65
+ ## QA loop
66
+
67
+ Run this once after the first render, then stop.
68
+
69
+ 1. Convert the deck with `soffice --headless --convert-to pdf <deck>.pptx`, then `pdftoppm -r 90 -png <deck>.pdf slide`. If either is missing, skip the image pass and say so rather than fail the render.
70
+ 2. Open and inspect every rendered image in this session, checking each slide for overlap, overflow, low contrast, and empty regions.
71
+ 3. Fix the reported issues and the `✗` lines in the slide files once, re-render, and stop. Do not loop indefinitely on aesthetics.
72
+
73
+ ## Response
74
+
75
+ After rendering, report:
76
+
77
+ - The deck folder, the slide count, and the written `.pptx` path
78
+ - Whether the project's token stylesheet was found
79
+ - Each `✗` line the final render printed, or that it printed none
80
+ - Any QA issues found and what changed, or that the deck passed clean
@@ -15,7 +15,7 @@ The rules also had three carriers, a standard, a generated rule pointing at it,
15
15
 
16
16
  - Hold the format and structure reference in `references/markdown.md`, the one copy, read by sibling path from every skill that writes markdown
17
17
  - Send the session to `canon markdown audit` after an edit, since the audit reads the bans from the package and a restated list would drift
18
- - Route voice to `write-human` and a Mermaid fence to `draft-figure` rather than restating either
18
+ - Route voice to `write-human` and a Mermaid fence to `draw-figure` rather than restating either
19
19
 
20
20
  ## Must not
21
21
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: markdown-craft
3
- description: Carries the format and structure rules for markdown, being headings, the density limits, paragraph and list shape, code spans, the date form, punctuation, emphasis, file references, American spelling, and frontmatter wording, and runs the audit after an edit. Use before a substantial markdown edit, when writing a README, a doc, a skill body, or any `.md` file, or when asked "what are the markdown rules" or "which characters are banned". Do NOT use for voice, rhythm, or word choice, which is `write-human`, or for a Mermaid fence or figure, which is `draft-figure`.
3
+ description: Carries the format and structure rules for markdown, being headings, the density limits, paragraph and list shape, code spans, the date form, punctuation, emphasis, file references, American spelling, and frontmatter wording, and runs the audit after an edit. Use before a substantial markdown edit, when writing a README, a doc, a skill body, or any `.md` file, or when asked "what are the markdown rules" or "which characters are banned". Do NOT use for voice, rhythm, or word choice, which is `write-human`, or for a Mermaid fence or figure, which is `draw-figure`.
4
4
  metadata:
5
5
  family: answer
6
6
  ---
@@ -14,4 +14,4 @@ Run `canon markdown audit <path>` after the edit, and fix every ban and density
14
14
  ## Routes
15
15
 
16
16
  - Voice, rhythm, sentence construction, and information density: load `write-human`.
17
- - A Mermaid fence or a figure: load `draft-figure`, since the audit skips every line inside a fence.
17
+ - A Mermaid fence or a figure: load `draw-figure`, since the audit skips every line inside a fence.