@erclx/canon 5.51.0 → 5.53.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 (142) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -4
  3. package/claude/.claude-plugin/plugin.json +1 -1
  4. package/claude/skills/canon-cli/SKILL.md +0 -3
  5. package/claude/skills/context-fold/REQUIREMENT.md +0 -1
  6. package/claude/skills/design-taste/references/kinds.md +0 -1
  7. package/claude/skills/draw-figure/REQUIREMENT.md +2 -3
  8. package/claude/skills/draw-figure/SKILL.md +4 -5
  9. package/claude/skills/draw-figure/references/figures.md +0 -1
  10. package/claude/skills/draw-figure/references/hand-drawn.md +1 -1
  11. package/claude/skills/git-pr/references/pr.md +1 -1
  12. package/claude/skills/pick-by-eye/REQUIREMENT.md +0 -1
  13. package/claude/skills/pick-by-eye/SKILL.md +1 -1
  14. package/claude/skills/review-address/SKILL.md +1 -1
  15. package/claude/skills/review-address/references/post-review-findings.md +1 -1
  16. package/claude/skills/review-pr/references/post.md +2 -2
  17. package/claude/skills/target-check/SKILL.md +2 -0
  18. package/claude/skills/target-setup/SKILL.md +1 -1
  19. package/claude/skills/target-update/REQUIREMENT.md +33 -0
  20. package/claude/skills/target-update/SKILL.md +136 -0
  21. package/claude/skills/teach-craft/REQUIREMENT.md +30 -0
  22. package/claude/skills/teach-craft/SKILL.md +39 -0
  23. package/claude/skills/teach-craft/references/lesson-craft.md +52 -0
  24. package/claude/skills/{teach-workspace → teach-craft}/references/pedagogy.md +12 -4
  25. package/docs/agents/audits.md +0 -1
  26. package/docs/agents/migrate.md +2 -1
  27. package/docs/target/migrations.md +12 -1
  28. package/docs/target/projects.md +1 -1
  29. package/docs/target/sync.md +1 -1
  30. package/docs/workflow/parallel-features.md +1 -1
  31. package/docs/workflow/skill-map-on-request.md +10 -22
  32. package/docs/workflow/skill-map.md +13 -14
  33. package/package.json +1 -4
  34. package/scripts/core/regen-web-previews.ts +2 -67
  35. package/src/audits/catalog.ts +0 -1
  36. package/src/browser/engine.ts +3 -6
  37. package/src/capture/render.ts +1 -1
  38. package/src/claude/cases/authoring.ts +0 -12
  39. package/src/claude/cases/misc.ts +0 -17
  40. package/src/claude/cases/setup.ts +7 -0
  41. package/src/claude/cases/workflow.ts +2 -38
  42. package/src/claude/skills-audit.ts +0 -1
  43. package/src/cli/help.ts +0 -7
  44. package/src/cli.ts +0 -6
  45. package/src/commands/labels.ts +9 -7
  46. package/src/commands/records.ts +0 -1
  47. package/src/commands/serve.ts +2 -2
  48. package/src/design/components.ts +8 -1514
  49. package/src/design/css.ts +5 -6
  50. package/src/design/fonts.ts +3 -5
  51. package/src/driver/drive.ts +3 -4
  52. package/src/driver/steps.ts +2 -5
  53. package/src/inventory/walk.ts +1 -1
  54. package/src/markdown/scope.ts +4 -31
  55. package/src/migrate/status.ts +5 -1
  56. package/src/records/validate.ts +4 -176
  57. package/src/sandbox/equivalence.ts +0 -5
  58. package/tooling/claude/seeds/.claude/hooks/review-post-scan.sh +1 -1
  59. package/claude/skills/draft-and-pick/REQUIREMENT.md +0 -26
  60. package/claude/skills/draft-and-pick/SKILL.md +0 -11
  61. package/claude/skills/draft-doc/REQUIREMENT.md +0 -26
  62. package/claude/skills/draft-doc/SKILL.md +0 -11
  63. package/claude/skills/draft-figure/REQUIREMENT.md +0 -26
  64. package/claude/skills/draft-figure/SKILL.md +0 -11
  65. package/claude/skills/draft-identity/REQUIREMENT.md +0 -26
  66. package/claude/skills/draft-identity/SKILL.md +0 -11
  67. package/claude/skills/draft-ready/REQUIREMENT.md +0 -26
  68. package/claude/skills/draft-ready/SKILL.md +0 -11
  69. package/claude/skills/draft-screencast/REQUIREMENT.md +0 -26
  70. package/claude/skills/draft-screencast/SKILL.md +0 -11
  71. package/claude/skills/draft-slides/REQUIREMENT.md +0 -26
  72. package/claude/skills/draft-slides/SKILL.md +0 -11
  73. package/claude/skills/make-deck/REQUIREMENT.md +0 -36
  74. package/claude/skills/make-deck/SKILL.md +0 -80
  75. package/claude/skills/make-deck/references/deck.md +0 -183
  76. package/claude/skills/read-frames/REQUIREMENT.md +0 -30
  77. package/claude/skills/read-frames/SKILL.md +0 -55
  78. package/claude/skills/record-screencast/REQUIREMENT.md +0 -35
  79. package/claude/skills/record-screencast/SKILL.md +0 -99
  80. package/claude/skills/script-screencast/REQUIREMENT.md +0 -34
  81. package/claude/skills/script-screencast/SKILL.md +0 -70
  82. package/claude/skills/script-screencast/references/beats-template.md +0 -119
  83. package/claude/skills/teach-workspace/REQUIREMENT.md +0 -34
  84. package/claude/skills/teach-workspace/SKILL.md +0 -196
  85. package/claude/skills/teach-workspace/references/glossary.md +0 -90
  86. package/claude/skills/teach-workspace/references/lesson-build.md +0 -106
  87. package/claude/skills/teach-workspace/references/lesson-craft.md +0 -135
  88. package/claude/skills/teach-workspace/references/promotion-fold.md +0 -35
  89. package/claude/skills/teach-workspace/references/promotion.md +0 -116
  90. package/claude/skills/teach-workspace/references/revisit.md +0 -28
  91. package/claude/skills/teach-workspace/references/teach.md +0 -211
  92. package/claude/skills/video-craft/REQUIREMENT.md +0 -35
  93. package/claude/skills/video-craft/SKILL.md +0 -96
  94. package/claude/skills/video-craft/references/adopted.md +0 -110
  95. package/src/commands/demo.ts +0 -542
  96. package/src/commands/slides.ts +0 -184
  97. package/src/commands/teach.ts +0 -1401
  98. package/src/demo/beats.ts +0 -135
  99. package/src/demo/compile.ts +0 -350
  100. package/src/demo/container.ts +0 -219
  101. package/src/demo/cursors.ts +0 -55
  102. package/src/demo/drive.ts +0 -442
  103. package/src/demo/pointer.ts +0 -178
  104. package/src/demo/theme.ts +0 -112
  105. package/src/demo/timeline.ts +0 -64
  106. package/src/slides/convert/chart.ts +0 -165
  107. package/src/slides/convert/deck.ts +0 -244
  108. package/src/slides/convert/export.ts +0 -567
  109. package/src/slides/convert/master.ts +0 -198
  110. package/src/slides/convert/shapes.ts +0 -804
  111. package/src/slides/convert/svg.ts +0 -38
  112. package/src/slides/convert/walk.ts +0 -671
  113. package/src/slides/decks.ts +0 -110
  114. package/src/slides/open.ts +0 -18
  115. package/src/slides/package/fonts.ts +0 -301
  116. package/src/slides/package/motion.ts +0 -316
  117. package/src/slides/package/test-face.ts +0 -113
  118. package/src/teach/browser/compile.ts +0 -44
  119. package/src/teach/browser/dismiss.ts +0 -76
  120. package/src/teach/browser/focus-line.ts +0 -19
  121. package/src/teach/browser/glossary-filter.ts +0 -44
  122. package/src/teach/browser/head.ts +0 -30
  123. package/src/teach/browser/quiz.ts +0 -19
  124. package/src/teach/browser/reload.ts +0 -9
  125. package/src/teach/browser/sidebar.ts +0 -233
  126. package/src/teach/browser/theme.ts +0 -18
  127. package/src/teach/components/code.tsx +0 -24
  128. package/src/teach/components/heading.tsx +0 -11
  129. package/src/teach/components/list.tsx +0 -17
  130. package/src/teach/components/paragraph.tsx +0 -29
  131. package/src/teach/components/refs.tsx +0 -28
  132. package/src/teach/cross-references.ts +0 -78
  133. package/src/teach/fonts.ts +0 -16
  134. package/src/teach/highlight.ts +0 -71
  135. package/src/teach/html/jsx-dev-runtime.ts +0 -13
  136. package/src/teach/html/jsx-runtime.ts +0 -113
  137. package/src/teach/html/raw.ts +0 -28
  138. package/src/teach/lesson.ts +0 -178
  139. package/src/teach/nav.ts +0 -1337
  140. package/src/teach/render.ts +0 -240
  141. package/src/teach/workspace.ts +0 -1164
  142. package/src/teach/write-if-changed.ts +0 -17
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [5.53.0](https://github.com/erclx/canon/compare/v5.52.0...v5.53.0) (2026-10-21)
4
+
5
+
6
+ ### Features
7
+
8
+ * **products:** drop teach, slides, and demo for a teach-craft skill ([#2588](https://github.com/erclx/canon/issues/2588)) ([bb1930f](https://github.com/erclx/canon/commit/bb1930fa8911ae637eddadbaabfa498e6e7f769d))
9
+
10
+ ## [5.52.0](https://github.com/erclx/canon/compare/v5.51.0...v5.52.0) (2026-10-21)
11
+
12
+
13
+ ### Features
14
+
15
+ * **labels:** fail the scan on pull request body density ([#2585](https://github.com/erclx/canon/issues/2585)) ([121216f](https://github.com/erclx/canon/commit/121216fa258de521ff2b077aa0b897b5f2b9d519))
16
+ * **skills:** add target-update to catch a target up to the toolkit ([#2583](https://github.com/erclx/canon/issues/2583)) ([065b971](https://github.com/erclx/canon/commit/065b9716df290bd87a94b16bed1e54e4ebf29f4e))
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * **hooks:** anchor the method flag in review-post-scan on whitespace ([#2584](https://github.com/erclx/canon/issues/2584)) ([32c52a2](https://github.com/erclx/canon/commit/32c52a25e4eef6d7d9a88d83aed3d16ab433dcf7))
22
+
3
23
  ## [5.51.0](https://github.com/erclx/canon/compare/v5.50.0...v5.51.0) (2026-10-21)
4
24
 
5
25
 
package/README.md CHANGED
@@ -72,8 +72,6 @@ Each domain has a canonical source in this repo and a thin install or sync CLI o
72
72
  | 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 |
73
73
  | Tooling stacks | Golden configs, seeds, and a reference per framework | Laid down by `canon init`, reconciled by `canon tooling sync` |
74
74
  | Design system | Ships a `DESIGN.md` intent format pointing at your stylesheet for values, a skill that drafts one, and a render command | `canon design render` |
75
- | Slides | A folder of HTML slides per deck, drawn in the project's tokens and rebuilt as editable shapes | `canon slides render` writes PowerPoint |
76
- | Teach | Lessons, sources, and a glossary in one workspace, rendered to a small site | `canon teach` |
77
75
  | Canvas | Pages of HTML frames on a local pan and zoom surface, each frame drawn with the project's tokens | `canon canvas serve` |
78
76
  | Transcripts | A YouTube transcript with metadata frontmatter | `canon transcripts <url>` writes it into any repo |
79
77
  | Sandbox | Scenario scaffolds that provision an isolated project state for verifying each domain flow | `canon sandbox` |
@@ -93,7 +91,7 @@ The workflow this toolkit ships is the workflow that built it. Several Claude Co
93
91
  <img src="demos/agent-view-light/demo.gif" alt="The canon landing page scrolling from the dispatch section to the branch graph, three workers and a planner on disjoint file sets with the pull request each opened">
94
92
  </picture>
95
93
 
96
- That recording is the landing page's own `dispatch` and `workers` sections, driven by `canon demo run` against a local build. The branch graph beside the pull request numbers is authored rather than read, because nothing on a build machine records which files four sessions held.
94
+ That recording is the landing page's own `dispatch` and `workers` sections, driven through a browser against a local build. The branch graph beside the pull request numbers is authored rather than read, because nothing on a build machine records which files four sessions held.
97
95
 
98
96
  ## Documentation
99
97
 
@@ -182,7 +180,6 @@ Each domain carries an entry written for someone maintaining the toolkit rather
182
180
  - [Governance rules](canon/context/surfaces/governance.md)
183
181
  - [Tooling stacks](canon/context/surfaces/tooling.md)
184
182
  - [Design system](canon/context/features/design.md)
185
- - [Slides](canon/context/features/slides.md)
186
183
  - [Transcripts](canon/context/features/transcripts.md)
187
184
  - [Sandbox](canon/context/development/sandbox.md)
188
185
 
@@ -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.51.0",
4
+ "version": "5.53.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -45,14 +45,11 @@ Each verb here has a skill that owns the job. Load the skill rather than driving
45
45
  | Job | Verb | Skill |
46
46
  | -------------------------------------------- | ------------------- | --------------------------- |
47
47
  | Render the design system | `canon design` | `canon:draw-figure` |
48
- | Render a slide deck | `canon slides` | `canon:make-deck` |
49
48
  | Render an HTML source to a PNG | `canon capture` | `canon:design-identity` |
50
49
  | Serve a directory and print the link | `canon serve` | none |
51
- | Record a running app | `canon demo` | `canon:script-screencast` |
52
50
  | Report one computed property across routes | `canon inventory` | `canon:target-check` |
53
51
  | Walk a page through interactions and measure | `canon drive` | `canon:ux-measure` |
54
52
  | Fetch a YouTube transcript | `canon transcripts` | `canon:youtube-transcripts` |
55
- | Open a learning workspace | `canon teach` | `canon:teach-workspace` |
56
53
  | Work on the local canvas | `canon canvas` | `canon:canvas-board` |
57
54
 
58
55
  ## Session and ship
@@ -29,7 +29,6 @@ The context entries describe the repository the session opened with. An entry ke
29
29
  ## Out of scope
30
30
 
31
31
  - Marking outcomes, sweeping receipts, and archiving a task, which `task-complete` owns
32
- - Landing a teach promotion page, which `teach-workspace` owns
33
32
  - Creating or declining a task file, which `task-board` owns
34
33
  - Public-facing docs, which `docs-sync` owns
35
34
  - Regenerating the context catalog, which a commit hook owns
@@ -47,7 +47,6 @@ Documentation, articles, reference pages, learning material. The reader arrived
47
47
  ## Kinds this file does not cover
48
48
 
49
49
  - **Transactional flows** such as checkout, sign-up and settings are read as application UI. Their distinctive rules, state coverage and error recovery, sit in the `ui` governance rules.
50
- - **Presentation surfaces** such as slide decks are drafted by `make-deck`, which carries the deck's design rules. Take the layer ordering and the floor from the body and the rest from it.
51
50
  - **Terminal and text-mode surfaces** have no layout engine and their own color rules, stated where the writing surface is decided rather than here.
52
51
 
53
52
  A read naming any of the three above takes the body's rules and says it has no per-kind guidance, naming the surface that governs it. A read naming a kind this file does not list at all says so rather than borrowing the nearest section.
@@ -7,13 +7,13 @@ description: Why a figure decides between Mermaid, an architecture view, and fre
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session asked for a figure takes the first path it thinks of. A graph gets SVG coordinates nobody checked against a render, and a subject that is not a graph gets forced through Mermaid. In a teach lesson the renderer cannot load the hand font, so labels clip, and a check reading the standalone image passes them.
10
+ Without this skill, a session asked for a figure takes the first path it thinks of. A graph gets SVG coordinates nobody checked against a render, and a subject that is not a graph gets forced through Mermaid.
11
11
 
12
12
  Asked to refresh one architecture view, it redraws every view beside it. It judges the source and calls the figure verified, though a valid source can render a picture asserting something false. Mermaid's theme writes literal hex values, so the figure stops re-coloring when the page switches palette.
13
13
 
14
14
  ## Must
15
15
 
16
- - The figure clears the standard's earn-its-place bar, and its path follows whether the subject reduces to a graph, with a teach lesson drawn freehand whatever its shape
16
+ - The figure clears the standard's earn-its-place bar, and its path follows whether the subject reduces to a graph
17
17
  - An architecture view is drawn from its named source signal in `flowchart` or `sequenceDiagram`, and only the view the request names changes
18
18
  - The Mermaid render uses the hand-drawn look and the figure font stack, with every literal color rewritten to the host's custom property
19
19
  - The render is read back against what the figure means to say, and a figure bound for a rendered page is verified by a capture inside that page
@@ -31,5 +31,4 @@ Asked to refresh one architecture view, it redraws every view beside it. It judg
31
31
 
32
32
  - Mermaid's layout, budgets, and label rules inside the fence, which the mermaid standard owns
33
33
  - A UI screen mockup, and design tokens or the visual system, which `canvas-board` owns
34
- - Which lesson needs a figure and where it sits, which `teach-workspace` owns
35
34
  - Implementation detail behind an architecture view, which the context entry the caption points at owns
@@ -30,12 +30,11 @@ Apply the standard's bar: a relationship, a boundary, a path, or a before-and-af
30
30
 
31
31
  Take the first that matches, and state which path was picked and why in one sentence:
32
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.
33
+ 1. **An architecture view**, meaning the request names system context, components, request flow, data pipeline, or deployment: the architecture set, then the Mermaid path.
34
+ 2. **Graph-shaped**, meaning the relationship, boundary, or path is already what a flowchart or sequence diagram expresses: the Mermaid path.
35
+ 3. **Anything else**, a spatial or physical arrangement no flowchart reduces to: the hand-drawn path.
37
36
 
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.
37
+ The standard states this as a render-first policy rather than a ban on any tool-exported drawing, so a graph-shaped subject always routes through Mermaid even though that is itself an external renderer.
39
38
 
40
39
  ## Step 4: draw
41
40
 
@@ -39,7 +39,6 @@ Route a graph-shaped subject, one whose relationship, boundary, or path a flowch
39
39
 
40
40
  - Reserve freehand inline SVG, plain shapes and lines authored in the markup, for a subject that is not graph-shaped
41
41
  - A figure that cannot express its subject through the deterministic path is a worse failure than an inconsistent hand-drawn one, so the hatch stays open
42
- - Draw a figure in a teach lesson freehand whatever its shape. Its hand font cannot load in the renderer, so Mermaid measures labels in a narrower fallback face and the page clips them.
43
42
  - State this as a render-first policy rather than a ban on a tool-exported drawing, since routing through Mermaid is itself running an external tool
44
43
 
45
44
  ## Wrapping and captioning
@@ -5,7 +5,7 @@ description: Authoring a freehand SVG, its color and accessibility audit, and th
5
5
 
6
6
  # Hand-drawn path
7
7
 
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.
8
+ `draw-figure` reads this file when Step 3 routes a figure to a freehand drawing, for a subject no flowchart reduces to.
9
9
 
10
10
  ## Draw
11
11
 
@@ -129,7 +129,7 @@ A live agent session is never the human a box waits on.
129
129
 
130
130
  ### Density
131
131
 
132
- `canon labels scan` reports each section's density under `density`, naming the section, the kind, and the line in the whole body. Its help lists every limit.
132
+ `canon labels scan` fails on a density finding, naming the section, the kind, and the line in the whole body under `density`. Its help lists every limit.
133
133
 
134
134
  - Every section but Testing holds bullets to 200 characters and 5 in a row, and paragraphs to 350 characters and 2 in a row
135
135
  - Any section reports a `subheading`, and Technical context reports a `mixed-form`
@@ -33,4 +33,3 @@ The evidence fails as well. Arms get reported without being rendered or judged,
33
33
  - Finding roughness by reading source, which `ux-audit` owns
34
34
  - Measuring what a running interface costs to paint, which `ux-measure` owns
35
35
  - Listing what to look at on a change already made, which `ui-checklist` owns
36
- - Scripting a recording of something already built, which `script-screencast` owns
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pick-by-eye
3
- description: Drafts several candidates for a decision judged by looking, lays them out side by side as frames on one canvas page, hands the operator the address, takes the pick through the structured question surface, and loops on the pick until they stop. Use when asked to "draft some options", "show me a few versions", "try a few variations", "mock up alternatives", "give me candidates for X", or when a choice is taste rather than correctness. Do NOT use when the request already names the answer and asks for it to be built, which is `plan-feature`. Do NOT use to read source for roughness, which is `ux-audit`, to measure what a running interface costs to paint, which is `ux-measure`, to write what to look at on a change already made, which is `ui-checklist`, or to script a recording, which is `script-screencast`.
3
+ description: Drafts several candidates for a decision judged by looking, lays them out side by side as frames on one canvas page, hands the operator the address, takes the pick through the structured question surface, and loops on the pick until they stop. Use when asked to "draft some options", "show me a few versions", "try a few variations", "mock up alternatives", "give me candidates for X", or when a choice is taste rather than correctness. Do NOT use when the request already names the answer and asks for it to be built, which is `plan-feature`. Do NOT use to read source for roughness, which is `ux-audit`, to measure what a running interface costs to paint, which is `ux-measure`, or to write what to look at on a change already made, which is `ui-checklist`.
4
4
  metadata:
5
5
  family: decide
6
6
  ---
@@ -124,7 +124,7 @@ canon labels scan --body-file .canon/tmp/pr/reply/reply-<number>.md --json
124
124
  The hook skips `.canon/tmp/`, and the `pull_request` check reads only a pull request's own title and body, so this scan is the only gate on the reply.
125
125
 
126
126
  - Fix any hit, and stop on a `density` entry too, shortening the line it names
127
- - Read the record rather than the exit, since density never sets the exit code
127
+ - Read the record rather than the exit, since a post's density never sets the exit code
128
128
 
129
129
  Then post and keep the `id` the POST answers with, since Step 7 edits this exact comment:
130
130
 
@@ -13,7 +13,7 @@ Write the body the way Step 6 writes a reply.
13
13
 
14
14
  - Load `write-human` for voice and word choice, and follow `${CLAUDE_SKILL_DIR}/../markdown-craft/references/markdown.md` for punctuation
15
15
  - Run the `${CLAUDE_SKILL_DIR}/../git-pr/references/publish.md` scan before posting, with `canon labels scan --body-file .canon/tmp/pr/reply/reply-<number>.md --json`
16
- - Stop on a `density` entry as on any hit, since density never sets the exit code
16
+ - Stop on a `density` entry as on any hit, since a post's density never sets the exit code
17
17
  - Open with `## Post-review findings` rather than `## Review response`, since nothing on the thread is being answered
18
18
  - Close the body with `🤖 Addressed by Claude Code` on its own line, matching the reply's footer
19
19
 
@@ -114,7 +114,7 @@ Run `canon labels scan --title "<title>" --body "<body>" --head <headRefName>` a
114
114
 
115
115
  - Name the token quoted from the title or body for a phase label, a board identifier, or a session link
116
116
  - Name the broken rule, being `structure`, a casing issue, or `length`, for a title-format hit
117
- - A heading in `sections.outside` or `sections.missing`, or a character in `bannedCharacters`, is a hit of the same weight, naming the heading or the character
117
+ - A heading in `sections.outside` or `sections.missing`, an entry in `density`, or a character in `bannedCharacters`, is a hit of the same weight, naming the heading, the line and kind, or the character
118
118
  - This reads the pull request under review, distinct from the comment this pass posts, which the scan later in this step covers
119
119
 
120
120
  ### Why the threshold ignores the grade
@@ -175,7 +175,7 @@ The marker is the read-time record those fields are not.
175
175
  Before posting, run `canon labels scan --body-file .canon/tmp/pr/review/body-<number>-<short-sha>.md`, which applies the rule in `${CLAUDE_SKILL_DIR}/../git-pr/references/publish.md`. Pass `--json` and fix the body and scan again on a finding.
176
176
 
177
177
  - A `density` entry is a finding here, naming a subject or nested bullet past 200 characters, a run past 5 plain bullets, or a paragraph past its limits, by its line in the whole body
178
- - Density never sets the exit code, so the hook below lets the post through on it and this step is the one that stops
178
+ - A post's density never sets the exit code, so the hook below lets the post through on it and this step is the one that stops
179
179
 
180
180
  - A finding phrased against an internal phase label is what the label half of the scan catches here
181
181
  - The call carries no `--title`, so the scan reads the text as a review
@@ -98,3 +98,5 @@ No overall verdict. The harness row is unchecked rather than passing.
98
98
  ```
99
99
 
100
100
  Keep the harness row `unchecked` on every run until a verb reads it. A domain left out of the table reads as a domain that passed, which is the one shape the row exists to prevent.
101
+
102
+ Close on one line naming `/canon:target-update` as the skill that applies the catch-up, when a domain reads behind and `target-update` did not invoke this check.
@@ -59,7 +59,7 @@ Three states reach this skill that the chain does not serve. Name the destinatio
59
59
 
60
60
  ### An existing project
61
61
 
62
- Stop and hand off to `target-check`, which reports what the target already carries before anything is repaired. This chain never reads that, so a per-domain install picked here is a guess against configs nobody read.
62
+ Stop and hand off to `target-check`, which reports what the target already carries before anything is repaired. This chain never reads that, so a per-domain install picked here is a guess against configs nobody read. Name `target-update` when the operator wants the catch-up applied.
63
63
 
64
64
  ### The `.claude/` folder alone
65
65
 
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: target-update
3
+ description: What catching a target up to the toolkit is for, the judgment it holds, and where it hands off to the check and the setup
4
+ ---
5
+
6
+ # Target update requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session catching a target up after a release improvises the order. It runs a sync before the migrations that move its paths, writes a record-tree rewrite with no backup, and lets a sync replace a rule the project customized without saying what was lost.
11
+
12
+ The verbs report every fact, so the gap is the judgment between them. A session reads a refused migration as a step to force, picks rules and seed merges with nobody asked, and ends with no way to tell a current target from one it stopped partway through.
13
+
14
+ ## Must
15
+
16
+ - Show the changelog summary, the pending migrations, and the drift before the first write to the target, and apply only on the operator's go-ahead
17
+ - Read every fact from a `canon` verb, so a later release changes what the skill reports with no edit to its body
18
+ - Stop and ask on a refused migration, a stranded file, an unattributed folder, and a rule the stack newly ships
19
+ - Keep a customized file and a drifted seed as the project wrote them, naming the toolkit change each one skipped
20
+ - End on a clean `target-check` or on named remainders, with nothing written when nothing is pending
21
+
22
+ ## Must not
23
+
24
+ - Detect pending migrations or parse the changelog inside the body, since `canon migrate status` and `canon changelog` own both
25
+ - Name a toolkit version in an update commit's subject
26
+ - Run from the toolkit's own checkout, or write into a target from another repository's session
27
+ - Rely on being typed by name. It is reached through its description and `target-check`'s close, and a quarter of releases with no migration and no drift is the signal to fold it in there.
28
+
29
+ ## Out of scope
30
+
31
+ - First-time scaffold, which `target-setup` owns
32
+ - Reporting drift without repairing it, which `target-check` owns
33
+ - Opening the target's pull request, which `git-ship` owns
@@ -0,0 +1,136 @@
1
+ ---
2
+ name: target-update
3
+ description: Catches a target project up to the toolkit after a release. Upgrades the binary and plugin, previews the changelog summary, the pending migrations, and the drift, then on the operator's go-ahead migrates, syncs, regenerates the indexes, and ends on a clean `target-check` or named remainders. Use when asked to "update this project to the latest canon", "catch this target up", "apply the new release here", "run the pending migrations", or "bring this project current with the toolkit". Do NOT use on a project without the toolkit, which is `target-setup`, or to report drift without repairing it, which is `target-check`.
4
+ metadata:
5
+ family: upkeep
6
+ ---
7
+
8
+ # Target update
9
+
10
+ Takes a target from behind the toolkit to current. Every fact comes from a `canon` verb, and this body holds the order and the judgment calls the verbs leave open. It names no migration, rule, or stack, so a later release reaches it with no edit here.
11
+
12
+ Read `canon docs migrate` for what each migrate verb moves and refuses, and `canon docs sync` for the drift causes. This body cites them rather than restating them.
13
+
14
+ ## Guards
15
+
16
+ Stop with the line beside each state.
17
+
18
+ | State | Stop |
19
+ | ------------------------------------------- | ------------------------------------------------------------------------------------------------- |
20
+ | `canon` absent from the path | `❌ canon is not on PATH, so nothing can be read.` |
21
+ | No `.claude/` directory at the working root | `❌ No .claude/ here, so the toolkit is not installed. Run /canon:target-setup instead.` |
22
+ | A `claude/skills/` folder, no leading dot | `❌ This is the toolkit itself rather than a target. Run this from the target's own session.` |
23
+ | A dirty working tree | `❌ Uncommitted changes here. Commit or stash them first, since canon sync refuses a dirty tree.` |
24
+
25
+ Then hold two rules for every verb this body runs.
26
+
27
+ - Run it under `CANON_NON_INTERACTIVE=1` from the target root
28
+ - Branch on its record's fields rather than its exit, which a shell function wrapping `canon` can flatten
29
+
30
+ ## Step 1: bring the binary and plugin forward
31
+
32
+ Read `skew` off `canon sync --check . --json`. When `installed` trails `latest`, run `canon upgrade --json`, then `canon claude plugin-update --json` whatever the skew reads.
33
+
34
+ Both write to the machine rather than the target, and the preview needs the verbs and the changelog a newer binary carries, so they run before it. The permission dialog gates each. Report a refusal from either and continue on the installed binary, saying the preview reads against it.
35
+
36
+ ## Step 2: read the pending work
37
+
38
+ Run these in parallel from the target root:
39
+
40
+ ```bash
41
+ CANON_NON_INTERACTIVE=1 canon changelog --json
42
+ CANON_NON_INTERACTIVE=1 canon migrate status --json
43
+ CANON_NON_INTERACTIVE=1 canon sync --check . --json
44
+ ```
45
+
46
+ Then take `<stack>` from the first name in the report's `tooling.chain` and run `canon tooling diff <stack> . --json`. Never run it bare, since the stack prompt resolves to the catalog's first entry under the non-interactive variable. Report tooling unmeasured when `tooling.measured` is false or `chain` names nothing.
47
+
48
+ ### When a read refuses
49
+
50
+ A refusal is a fact for the preview, never a gap to fill by reading files.
51
+
52
+ - `changelog` refusing `no-stamp` or `unknown-version`: say the summary is unread and why. Offer `--since <version>` when the operator names one, and never guess a start.
53
+ - `migrate status` carrying no such subcommand: the binary predates it. Stop, since pending migrations cannot be listed without detecting them here, which this skill never does.
54
+ - A missing report key is an older binary rather than an empty answer. Name the installed version beside it.
55
+
56
+ ## Step 3: preview and wait
57
+
58
+ Write the preview from those records alone, then stop and wait for the operator. Nothing in the target is written before the go-ahead.
59
+
60
+ ```markdown
61
+ Target update: `<path>`, canon `<installed>` to `<running>`.
62
+
63
+ **What changed since `<since>`:** <three to six bullets from the changelog entries, each naming what this project will notice, never the version>
64
+
65
+ **Migrations, in run order:** <each pending or refused entry from migrate status, with its verb>
66
+
67
+ **Drift:** <each non-empty cause from sync --check, with its count and paths>
68
+
69
+ **Calls for you:** <each judgment call below this run meets, with the default this skill takes>
70
+
71
+ **Commands, in order:** <the exact commands Steps 4 to 6 will run>
72
+ ```
73
+
74
+ Summarize the changelog for this project, not for the toolkit. Drop an entry that touches nothing the target holds, and lead with anything a migration or a sync will change.
75
+
76
+ ### Nothing pending
77
+
78
+ When the changelog range is empty, `migrate status` lists nothing pending or refused, and the drift lines hold nothing a step here would take, write nothing. Invoke `canon:target-check` and report the target current with its table.
79
+
80
+ ## Step 4: migrate
81
+
82
+ Run each pending migration in the order `migrate status` gave, one at a time, as the entry's `verb` with `--write --json` appended. The verb carries the flags its dry run used, so a bare `canon migrate <name>` would apply a plan the preview never showed.
83
+
84
+ - Run `canon migrate status --json` again after each write, since an applied move can turn a clean entry pending
85
+ - Stop and ask on a `refused` entry, quoting its reason and the remedy it names. Run the remedy only on the operator's word, since a refusal guards a destination the project may own.
86
+ - Stage each write with `git add -A`, since no migrate verb stages and the tree was clean before it, then commit through `canon:git-commit`, one commit per migration
87
+ - Skip the commit when the write changed no tracked file, as `record-tree` does by touching only gitignored records
88
+
89
+ ### Markers
90
+
91
+ A planned rewrite can reach a line that names an old spelling on purpose, such as a dated note or a quoted history. Propose a marker for each such line in the preview, and add it before the write. `canon docs migrate` names the marker for each spelling.
92
+
93
+ ### The record-tree backup
94
+
95
+ The record tree is untracked, so a `record-tree` rewrite has no undo. Run `canon records push --json` before its write. When that reports no backup repository, copy `.canon/` to a dated folder outside the project and name the path in the report.
96
+
97
+ ## Step 5: sync
98
+
99
+ Run `canon sync .`, then `canon tooling sync <stack> . --write` when the tooling diff named files to change. Treat each drift cause the way the preview stated:
100
+
101
+ | Cause | This skill |
102
+ | --------------------------- | ------------------------------------------------------------------------------------------------ |
103
+ | `stale`, `retired`, renamed | Takes the sync's write |
104
+ | `customized` | Keeps the project's file. Shows `git diff -- <rel>` as the toolkit's change, then `git restore`s |
105
+ | `stranded` | Names where the file sits and where the toolkit now installs, and moves it only on the word |
106
+ | `seeds` drifted | Merges by hand against `canon claude seeds list --json`, keeping the project's edits |
107
+ | `seeds` stale or missing | Takes the toolkit's copy whole |
108
+ | `newRules` | Lists them, and installs only the ones the operator picks, with `canon gov install --add` |
109
+
110
+ A `customized` rule is the file `canon sync` replaces, so read it back after the sync rather than trusting the report from Step 2. Report each kept file with the toolkit's change summarized in a line, so the operator can take it later.
111
+
112
+ ### What the toolkit dropped
113
+
114
+ Read `reverse.unclaimed` by attribution. Delete a `dropped` folder, read an `unattributed` one and ask before deleting it, and leave a `project` one alone.
115
+
116
+ Read the report's top-level `superseded` and `unmigrated` lists apart from it. Each names a move only the operator can make, being a file a newer seed replaced or a domain still at the root layout, so name each and move nothing.
117
+
118
+ ## Step 6: regenerate and verify
119
+
120
+ Run `canon indexes regen`, then the project's own check script when it carries one. Invoke `canon:target-check` last.
121
+
122
+ Stage the sync, the merges, and the regenerated indexes with `git add -A`, since `canon sync` leaves its writes unstaged, then commit through `canon:git-stage`. Name what changed in the project in each subject, such as the rules refreshed or the seeds merged, and never the toolkit version.
123
+
124
+ ## Output
125
+
126
+ ```markdown
127
+ Target update: `<path>`, now on canon `<version>`.
128
+
129
+ <the target-check table>
130
+
131
+ **Kept for you:** <each customized or drifted file left as the project wrote it, with the toolkit change it skipped>
132
+
133
+ **Remaining:** <each refusal, stranded file, or unread domain, with the command or decision it waits on>
134
+ ```
135
+
136
+ Omit a section that holds nothing. End on the commits and the check, and leave the pull request to `canon:git-ship`.
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: teach-craft
3
+ description: Scope boundary for the teaching judgment a session carries, and why it ships as knowledge rather than as a workspace
4
+ ---
5
+
6
+ # Teach craft requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session asked to teach explains and calls a smooth reply a lesson. It teaches from recall, picks topics from the subject's order rather than the learner's errors, and asks nothing about what they know.
11
+
12
+ Its quizzes leak the answer through option length or position, and nothing tests the learner later, so fluency passes for retention.
13
+
14
+ ## Must
15
+
16
+ - Carry retrieval, spacing, interleaving, and placement as rules a session applies before picking what to teach next
17
+ - Ask the learner's starting point and read the subject from sources, saying which claims rest on recall
18
+ - State quiz design that leaks no answer, and pair a quiz with a teach-back
19
+ - Hold that the wrong answer itself is what the next session places from
20
+
21
+ ## Must not
22
+
23
+ - Name a verb, a folder, a markup contract, or a stylesheet, since the skill produces nothing of its own
24
+ - Fire on a request to answer one question
25
+ - Go unloaded when a session teaches across exchanges, since a craft body only its author types reaches no lesson
26
+
27
+ ## Out of scope
28
+
29
+ - Where a lesson is stored or how it renders, which belongs to whatever surface the session writes to
30
+ - A cited source ledger for the practice family, which is a follow-on task
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: teach-craft
3
+ description: Carries the judgment for teaching a subject so it sticks, being retrieval over review, spacing, interleaving, placing the learner just past what they can do unaided, quiz design that leaks no answer, the teach-back, and what makes a lesson worth returning to. Use before teaching a subject over more than one exchange, when writing a quiz, a lesson, or a study plan, or when asked "teach me X", "quiz me on this", "how should I learn X", or "is this a good quiz question". Do NOT use to answer one question, which is an ordinary reply, or to write project documentation, which belongs to the surface owning that document.
4
+ metadata:
5
+ family: answer
6
+ ---
7
+
8
+ # Teach craft
9
+
10
+ A session asked to teach explains, and a smooth explanation reads as a lesson learned. It is fluency, which decays within days. This skill carries what turns teaching into retention: test before telling, space the returns, and grade only what the learner produced unaided.
11
+
12
+ It produces nothing of its own. The lesson lands wherever the session already writes, being the conversation, a file, or a page.
13
+
14
+ ## References
15
+
16
+ - `${CLAUDE_SKILL_DIR}/references/pedagogy.md`: fluency against storage strength, retrieval practice, spacing and its ladder, interleaving, where to place the learner, and where difficulty helps
17
+ - `${CLAUDE_SKILL_DIR}/references/lesson-craft.md`: restraint, quiz design, the teach-back, and what makes a lesson worth returning to
18
+
19
+ Read `pedagogy.md` before picking what to teach next, and `lesson-craft.md` before writing a quiz or a lesson.
20
+
21
+ ## Before teaching
22
+
23
+ - Ask what the learner already knows rather than assuming it. Difficulty with no floor under it teaches nobody.
24
+ - Read the subject from sources rather than from recall, and say which claims rest on recall where no source was reachable
25
+ - Open a returning learner on retrieval of what they got wrong last time, before anything new
26
+
27
+ ## While teaching
28
+
29
+ - Place each step just past what the learner can do unaided, from what they got wrong rather than from the subject's own order
30
+ - Carry a quiz and a teach-back, since recognition and production fail differently
31
+ - Record the wrong answer itself rather than a count, since the next session places the learner from the misconception
32
+
33
+ ## Excuses and rebuttals
34
+
35
+ | Excuse | Rebuttal |
36
+ | ----------------------------------------- | -------------------------------------------------------------------------------------------- |
37
+ | They followed the explanation, so move on | Following is fluency. Advance on a retrieval the learner passed unaided. |
38
+ | Review the last lesson before testing it | Review rebuilds the fluency the test would have measured. Test first, then fill what missed. |
39
+ | The answer is obvious from the options | Then the distractors are not misconceptions anyone holds. Rewrite them. |
@@ -0,0 +1,52 @@
1
+ ---
2
+ title: Lesson craft reference
3
+ description: Restraint, quiz design, teach back, and what makes a lesson worth returning to
4
+ ---
5
+
6
+ # Lesson craft reference
7
+
8
+ Judgment rather than shape. This file covers what makes a lesson worth opening twice, whatever surface it renders on.
9
+
10
+ ## Contents
11
+
12
+ - [Restraint](#restraint)
13
+ - [Quiz design](#quiz-design)
14
+ - [Teach back](#teach-back)
15
+ - [What makes a lesson worth returning to](#what-makes-a-lesson-worth-returning-to)
16
+
17
+ ## Restraint
18
+
19
+ Every element competes with the material for attention.
20
+
21
+ - Cut any decoration that carries no information
22
+ - Use at most one accent color, reserved for the thing the learner acts on
23
+ - Do not animate anything the learner did not trigger
24
+ - Prefer whitespace over rules and boxes to separate sections
25
+
26
+ ## Quiz design
27
+
28
+ The quiz is the retrieval, so a leak in its construction turns it into a reading test.
29
+
30
+ - Write every option to the same length, in words and in characters. A longer option reads as the considered one.
31
+ - Rotate the correct option's slot by question number, so question one puts it first, question two second, and so on. An author varying position by judgment settles on the first slot.
32
+ - Make each wrong option a misconception someone actually holds. An obviously wrong option removes itself and shrinks the question.
33
+ - Write one feedback block per question, covering the correct option and why each distractor fails, saying why rather than whether
34
+ - Give feedback after the attempt, never alongside the question
35
+
36
+ One feedback block reads as an explanation where a block per option reads as four verdicts, and only the explanation names what separates a wrong option from the answer. Name the correct option in the feedback text, since it is what a learner reads to find out whether they were right.
37
+
38
+ ## Teach back
39
+
40
+ A quiz is recognition and a teach-back is production, which is the form retrieval practice prefers. Carry both: the quiz places the learner against options someone could hold, and the teach-back is where the learner finds out what they cannot say without help.
41
+
42
+ - Ask for an explanation to a named audience rather than for an answer. Telling a non-programmer why a lazy quantifier is not an optional one has a floor, and "explain lazy quantifiers" has none.
43
+ - Ask about the thing the lesson was for, not a detail beside it. A teach-back on a footnote tests attention rather than the material.
44
+ - Carry a self-check, hidden until the learner opens it, listing what a complete explanation covers. A learner with no session in the room otherwise cannot grade the ask, and hidden leaks nothing.
45
+ - Write the self-check as what the explanation has to cover rather than as the explanation itself. A model answer is read instead of produced, which turns the block back into reading.
46
+
47
+ ## What makes a lesson worth returning to
48
+
49
+ - The worked example is complete. A learner returning for the example finds the whole thing rather than a fragment they have to reconstruct.
50
+ - The lesson states what it assumes. A returning reader can tell in one line whether they are in the right place.
51
+ - The hard part is named as the hard part. Material that flattens everything to one difficulty gives a returning reader nothing to navigate by.
52
+ - Nothing depends on the session it was written in. A lesson referring to what was discussed is unreadable a week later.
@@ -5,7 +5,7 @@ description: Fluency against storage strength, retrieval practice, spacing, inte
5
5
 
6
6
  # Pedagogy reference
7
7
 
8
- The rules a lesson is built from. Read this before picking what to teach next, not while writing the markup.
8
+ The rules a lesson is built from. Read this before picking what to teach next.
9
9
 
10
10
  ## Fluency is not storage strength
11
11
 
@@ -43,8 +43,7 @@ The same total time spread across days beats the same time in one sitting. Forge
43
43
 
44
44
  The ladder is 1, 3, 7, 16, and 35 days. A topic retrieved unaided moves up a rung and a miss drops it back one, held inside the ladder at either end, so a topic the learner keeps missing stays on the shortest gap rather than restarting a sequence.
45
45
 
46
- - Do not compute a date from that ladder by hand. `canon teach list <topic> --json` reports both dates resolved for every item, a number to copy rather than a rule to apply.
47
- - An author told to widen a gap still picks it by judgment, the same reason quiz option order is drawn by a verb rather than stated here
46
+ - Apply the ladder as written rather than picking a gap by judgment, since an author told to widen a gap settles on whatever feels right
48
47
 
49
48
  ## Interleaving
50
49
 
@@ -78,4 +77,13 @@ Parametric recall is confident where it is wrong, and a learner cannot audit it.
78
77
  - Read the subject from sources before teaching, and record each one with its link
79
78
  - Mark any claim resting on recall as resting on recall, in the lesson itself
80
79
  - List a source found and not opened as a lead, and never cite it
81
- - Choose which sources to read by the ladder under `### Choosing sources` in the teach standard, which also rules out the learner's own work as proof of a general claim
80
+ - Rest each general claim on the highest rung of the ladder below that covers it
81
+ - Never take the learner's own projects, or material specific to one employer, as proof of a general claim. Either may appear as a worked application labeled with whose it is.
82
+
83
+ The ladder runs in three rungs, highest first.
84
+
85
+ 1. Documentation or a specification published by whoever owns the subject
86
+ 2. A canonical work on the subject, such as the standard text, a reference book, or a primary paper
87
+ 3. Other material, such as a tutorial, a course, or a post, and only for a claim the first two rungs do not cover
88
+
89
+ A subject nobody owns, such as a mathematical topic or a craft, has no first rung, so its list starts at the second. Record a third-rung source with the claim it covers and why no higher rung does, since that reason is what a later session checks the choice against.
@@ -77,7 +77,6 @@ The placement entry runs pinned to `--backend off`, so its tally stays comparabl
77
77
  | `records-plans` | `canon records validate plans` | Plan records against their shape | Reports |
78
78
  | `records-groundwork` | `canon records validate groundwork` | Groundwork folders against their shape | Reports |
79
79
  | `records-intake` | `canon records validate intake` | Intake folders against their shape | Reports |
80
- | `records-teach` | `canon records validate teach` | Teach records against their shape | Reports |
81
80
  | `comments` | `canon comments scan` | Comment density by language and kind, and `TODO`, `FIXME`, `HACK`, `XXX` | Reports |
82
81
  | `test-order` | `canon gov test-order` | Implementations that reached branch history before their test | Reports |
83
82
  | `secrets` | `canon secrets scan` | Credential-shaped values in the shipped tree | Gates |
@@ -33,7 +33,8 @@ kind: reference
33
33
  - `record-tree` reports closed groundwork and intake trails, the scratch folder, and backup history as counts and rewrites none
34
34
  - `records` reports skipped record folders as a count on its own line
35
35
  - A `record-tree` rewrite has no undo in version control, so read the report before `--write`
36
- - `status` runs each verb as a dry run and exits 2 while any is pending, with a refusal outranking that. A clean entry can turn pending once an earlier one applies, so run it again after each `--write`.
36
+
37
+ `status` runs each verb as a dry run and exits 2 while any is pending, with a refusal outranking that. Each entry's `verb` carries the flags its dry run used, so append `--write` to it. A clean entry can turn pending once an earlier one applies, so run it again after each `--write`.
37
38
 
38
39
  Three markers keep an old spelling on a line. Each also covers the nearest non-blank line, below it for `canon-keep-record-root` and above it for `canon-keep-surface-root`.
39
40