@erclx/canon 5.52.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 (127) hide show
  1. package/CHANGELOG.md +7 -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/pick-by-eye/REQUIREMENT.md +0 -1
  12. package/claude/skills/pick-by-eye/SKILL.md +1 -1
  13. package/claude/skills/teach-craft/REQUIREMENT.md +30 -0
  14. package/claude/skills/teach-craft/SKILL.md +39 -0
  15. package/claude/skills/teach-craft/references/lesson-craft.md +52 -0
  16. package/claude/skills/{teach-workspace → teach-craft}/references/pedagogy.md +12 -4
  17. package/docs/agents/audits.md +0 -1
  18. package/docs/target/migrations.md +10 -1
  19. package/docs/workflow/parallel-features.md +1 -1
  20. package/docs/workflow/skill-map-on-request.md +10 -22
  21. package/docs/workflow/skill-map.md +12 -14
  22. package/package.json +1 -4
  23. package/scripts/core/regen-web-previews.ts +2 -67
  24. package/src/audits/catalog.ts +0 -1
  25. package/src/browser/engine.ts +3 -6
  26. package/src/capture/render.ts +1 -1
  27. package/src/claude/cases/authoring.ts +0 -12
  28. package/src/claude/cases/misc.ts +0 -17
  29. package/src/claude/cases/workflow.ts +2 -38
  30. package/src/claude/skills-audit.ts +0 -1
  31. package/src/cli/help.ts +0 -7
  32. package/src/cli.ts +0 -6
  33. package/src/commands/records.ts +0 -1
  34. package/src/commands/serve.ts +2 -2
  35. package/src/design/components.ts +8 -1514
  36. package/src/design/css.ts +5 -6
  37. package/src/design/fonts.ts +3 -5
  38. package/src/driver/drive.ts +3 -4
  39. package/src/driver/steps.ts +2 -5
  40. package/src/inventory/walk.ts +1 -1
  41. package/src/markdown/scope.ts +4 -31
  42. package/src/records/validate.ts +4 -176
  43. package/src/sandbox/equivalence.ts +0 -5
  44. package/claude/skills/draft-and-pick/REQUIREMENT.md +0 -26
  45. package/claude/skills/draft-and-pick/SKILL.md +0 -11
  46. package/claude/skills/draft-doc/REQUIREMENT.md +0 -26
  47. package/claude/skills/draft-doc/SKILL.md +0 -11
  48. package/claude/skills/draft-figure/REQUIREMENT.md +0 -26
  49. package/claude/skills/draft-figure/SKILL.md +0 -11
  50. package/claude/skills/draft-identity/REQUIREMENT.md +0 -26
  51. package/claude/skills/draft-identity/SKILL.md +0 -11
  52. package/claude/skills/draft-ready/REQUIREMENT.md +0 -26
  53. package/claude/skills/draft-ready/SKILL.md +0 -11
  54. package/claude/skills/draft-screencast/REQUIREMENT.md +0 -26
  55. package/claude/skills/draft-screencast/SKILL.md +0 -11
  56. package/claude/skills/draft-slides/REQUIREMENT.md +0 -26
  57. package/claude/skills/draft-slides/SKILL.md +0 -11
  58. package/claude/skills/make-deck/REQUIREMENT.md +0 -36
  59. package/claude/skills/make-deck/SKILL.md +0 -80
  60. package/claude/skills/make-deck/references/deck.md +0 -183
  61. package/claude/skills/read-frames/REQUIREMENT.md +0 -30
  62. package/claude/skills/read-frames/SKILL.md +0 -55
  63. package/claude/skills/record-screencast/REQUIREMENT.md +0 -35
  64. package/claude/skills/record-screencast/SKILL.md +0 -99
  65. package/claude/skills/script-screencast/REQUIREMENT.md +0 -34
  66. package/claude/skills/script-screencast/SKILL.md +0 -70
  67. package/claude/skills/script-screencast/references/beats-template.md +0 -119
  68. package/claude/skills/teach-workspace/REQUIREMENT.md +0 -34
  69. package/claude/skills/teach-workspace/SKILL.md +0 -196
  70. package/claude/skills/teach-workspace/references/glossary.md +0 -90
  71. package/claude/skills/teach-workspace/references/lesson-build.md +0 -106
  72. package/claude/skills/teach-workspace/references/lesson-craft.md +0 -135
  73. package/claude/skills/teach-workspace/references/promotion-fold.md +0 -35
  74. package/claude/skills/teach-workspace/references/promotion.md +0 -116
  75. package/claude/skills/teach-workspace/references/revisit.md +0 -28
  76. package/claude/skills/teach-workspace/references/teach.md +0 -211
  77. package/claude/skills/video-craft/REQUIREMENT.md +0 -35
  78. package/claude/skills/video-craft/SKILL.md +0 -96
  79. package/claude/skills/video-craft/references/adopted.md +0 -110
  80. package/src/commands/demo.ts +0 -542
  81. package/src/commands/slides.ts +0 -184
  82. package/src/commands/teach.ts +0 -1401
  83. package/src/demo/beats.ts +0 -135
  84. package/src/demo/compile.ts +0 -350
  85. package/src/demo/container.ts +0 -219
  86. package/src/demo/cursors.ts +0 -55
  87. package/src/demo/drive.ts +0 -442
  88. package/src/demo/pointer.ts +0 -178
  89. package/src/demo/theme.ts +0 -112
  90. package/src/demo/timeline.ts +0 -64
  91. package/src/slides/convert/chart.ts +0 -165
  92. package/src/slides/convert/deck.ts +0 -244
  93. package/src/slides/convert/export.ts +0 -567
  94. package/src/slides/convert/master.ts +0 -198
  95. package/src/slides/convert/shapes.ts +0 -804
  96. package/src/slides/convert/svg.ts +0 -38
  97. package/src/slides/convert/walk.ts +0 -671
  98. package/src/slides/decks.ts +0 -110
  99. package/src/slides/open.ts +0 -18
  100. package/src/slides/package/fonts.ts +0 -301
  101. package/src/slides/package/motion.ts +0 -316
  102. package/src/slides/package/test-face.ts +0 -113
  103. package/src/teach/browser/compile.ts +0 -44
  104. package/src/teach/browser/dismiss.ts +0 -76
  105. package/src/teach/browser/focus-line.ts +0 -19
  106. package/src/teach/browser/glossary-filter.ts +0 -44
  107. package/src/teach/browser/head.ts +0 -30
  108. package/src/teach/browser/quiz.ts +0 -19
  109. package/src/teach/browser/reload.ts +0 -9
  110. package/src/teach/browser/sidebar.ts +0 -233
  111. package/src/teach/browser/theme.ts +0 -18
  112. package/src/teach/components/code.tsx +0 -24
  113. package/src/teach/components/heading.tsx +0 -11
  114. package/src/teach/components/list.tsx +0 -17
  115. package/src/teach/components/paragraph.tsx +0 -29
  116. package/src/teach/components/refs.tsx +0 -28
  117. package/src/teach/cross-references.ts +0 -78
  118. package/src/teach/fonts.ts +0 -16
  119. package/src/teach/highlight.ts +0 -71
  120. package/src/teach/html/jsx-dev-runtime.ts +0 -13
  121. package/src/teach/html/jsx-runtime.ts +0 -113
  122. package/src/teach/html/raw.ts +0 -28
  123. package/src/teach/lesson.ts +0 -178
  124. package/src/teach/nav.ts +0 -1337
  125. package/src/teach/render.ts +0 -240
  126. package/src/teach/workspace.ts +0 -1164
  127. package/src/teach/write-if-changed.ts +0 -17
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
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
+
3
10
  ## [5.52.0](https://github.com/erclx/canon/compare/v5.51.0...v5.52.0) (2026-10-21)
4
11
 
5
12
 
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.52.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
 
@@ -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
  ---
@@ -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 |
@@ -130,7 +130,7 @@ From the registry the walk reports `historyUnavailable`, so check both paths by
130
130
  | `git-commit` | `commit`, `versioning` |
131
131
  | `git-pr` | `pr`, `publish` |
132
132
  | `markdown-craft` | `markdown` |
133
- | `teach-workspace` | `glossary`, `teach` |
133
+ | `teach-workspace` | `glossary`, `teach` <!-- canon-keep-retired --> |
134
134
  | `plan-groundwork` | `groundwork`, `groundwork-spikes` |
135
135
  | `plan-intake` | `intake` |
136
136
  | `plan-feature` | `plan`, `plan-lifecycle` |
@@ -148,6 +148,15 @@ The wireframes record is retired, and nothing deletes what a project holds.
148
148
  - Delete the `@canon/wireframes/index.md` line in your `CLAUDE.md` with the folder. `canon claude sync` does not rewrite it.
149
149
  - `canon gov sync` removes `.claude/rules/canon/standards/wireframes.md`
150
150
 
151
+ ## Keep or delete the retired product files, your call
152
+
153
+ The learning workspace, the deck renderer, and the app recorder are retired with their verbs and skills, and nothing deletes what a project holds.
154
+
155
+ - `.canon/teach/` holds rendered HTML that opens as it is, so it needs nothing <!-- canon-keep-retired -->
156
+ - `.canon/slides/` and a `demos/` folder hold sources nothing renders any more, so delete them once nothing cites them <!-- canon-keep-retired -->
157
+ - Replace a `canon:teach-workspace` reference with `canon:teach-craft` by hand, since `canon migrate skill-names` does not rewrite it <!-- canon-keep-retired -->
158
+ - Delete a `canon:make-deck`, `canon:script-screencast`, `canon:record-screencast`, `canon:read-frames`, or `canon:video-craft` reference, since none has a successor <!-- canon-keep-retired -->
159
+
151
160
  ## Move decisions out of a held architecture record, once
152
161
 
153
162
  The toolkit no longer seeds `canon/ARCHITECTURE.md`, and a held file and its `CLAUDE.md` import stay. Move a trap a session would hit into that domain's `## Gotchas`, then delete the file and its `@canon/ARCHITECTURE.md` line.
@@ -32,7 +32,7 @@ Assert the orchestrator role in one warm session with `canon:role-orchestrator`.
32
32
 
33
33
  - To pick otherwise, rewrite that line as `overridden at execution to <pick>,` plus the measurement, and add one line to the open task's `## Findings`
34
34
 
35
- - `canon records validate plans [plan]` reports a plan breaking its standard, plus `structure` misses that never set the exit, and takes `groundwork`, `intake`, and `teach`
35
+ - `canon records validate plans [plan]` reports a plan breaking its standard, plus `structure` misses that never set the exit, and takes `groundwork` and `intake`
36
36
  - `canon records push` and `canon records pull` carry `.canon/` to and from a private repository. See [records](../agents/records.md).
37
37
  - `canon records size`, `canon records prune-tmp`, and `canon records stale canonical` report folder size, idle scratch, and releases since the requirements review
38
38
  - `canon tasks archive` moves a shipped plan to `.canon/plans/archive/` and retargets the task's `Plan:` line
@@ -10,24 +10,15 @@ These skills serve a request rather than a moment. With the [skill map](skill-ma
10
10
 
11
11
  ## Generate an artifact on demand
12
12
 
13
- | Skill | When to use |
14
- | ------------------------- | ---------------------------------------------------------------------------------- |
15
- | `canon:create-rule` | A project rule the toolkit does not ship |
16
- | `canon:create-skill` | A new `SKILL.md` |
17
- | `canon:write-doc` | A new `docs/` page, context entry, or `README.md` |
18
- | `canon:draft-doc` | Never on purpose. A pointer naming `write-doc` <!-- canon-keep-retired --> |
19
- | `canon:plan-ready` | Finished files a worker should copy |
20
- | `canon:draft-ready` | Never on purpose. A pointer naming `plan-ready` <!-- canon-keep-retired --> |
21
- | `canon:draw-figure` | A figure or architecture view inside a doc |
22
- | `canon:draft-figure` | Never on purpose. A pointer naming `draw-figure` <!-- canon-keep-retired --> |
23
- | `canon:ci-workflow` | A GitHub Actions workflow file |
24
- | `canon:make-deck` | A deck rendered to editable PowerPoint |
25
- | `canon:draft-slides` | Never on purpose. A pointer naming `make-deck` <!-- canon-keep-retired --> |
26
- | `canon:script-screencast` | A recording script with beats seeded |
27
- | `canon:draft-screencast` | Never on purpose. A pointer naming `script-screencast` <!-- canon-keep-retired --> |
28
- | `canon:record-screencast` | Recording a screencast draft into a finished mp4 |
29
- | `canon:design-identity` | A logo mark and social card |
30
- | `canon:draft-identity` | Never on purpose. A pointer naming `design-identity` <!-- canon-keep-retired --> |
13
+ | Skill | When to use |
14
+ | ----------------------- | ------------------------------------------------- |
15
+ | `canon:create-rule` | A project rule the toolkit does not ship |
16
+ | `canon:create-skill` | A new `SKILL.md` |
17
+ | `canon:write-doc` | A new `docs/` page, context entry, or `README.md` |
18
+ | `canon:plan-ready` | Finished files a worker should copy |
19
+ | `canon:draw-figure` | A figure or architecture view inside a doc |
20
+ | `canon:ci-workflow` | A GitHub Actions workflow file |
21
+ | `canon:design-identity` | A logo mark and social card |
31
22
 
32
23
  ## Answer a question at any point
33
24
 
@@ -35,9 +26,6 @@ These skills serve a request rather than a moment. With the [skill map](skill-ma
35
26
  | --------------------------- | ----------------------------------------------------- |
36
27
  | `canon:canon-cli` | To pick a `canon` verb, or learn which can lose edits |
37
28
  | `canon:youtube-transcripts` | A video transcript wanted as context |
38
- | `canon:read-frames` | To read a recorded demo back frame by frame |
39
- | `canon:teach-workspace` | To learn a subject across sessions |
29
+ | `canon:teach-craft` | To teach a subject so it sticks |
40
30
  | `canon:markdown-craft` | Before a substantial markdown edit |
41
31
  | `canon:write-human` | Before drafting or revising prose |
42
-
43
- Ask `canon:teach-workspace` to promote a learning workspace's reference pages and glossaries. It proposes a destination per page and waits. An Anthropic-owned subject goes to the wiki, an internal one to the matching context entry, and the rest to the public docs. A project with no wiki folder gets a refusal naming the folder to create.
@@ -17,19 +17,18 @@ Groups run in the order a project meets them. Every name `canon claude skills li
17
17
 
18
18
  ## Decide what to build
19
19
 
20
- | Skill | When to use |
21
- | -------------------------- | ---------------------------------------------------------------------------- |
22
- | `canon:plan-intake` | The input is a pile of findings |
23
- | `canon:plan-intake-answer` | An intake folder holds unread slots |
24
- | `canon:backlog-triage` | The backlog needs pruning |
25
- | `canon:plan-groundwork` | The state is unmeasured and approaches compete |
26
- | `canon:decision-escalate` | Open decisions turn on your preference |
27
- | `canon:pick-by-eye` | The call is taste, wanting candidates side by side |
28
- | `canon:draft-and-pick` | Never on purpose. A pointer naming `pick-by-eye` <!-- canon-keep-retired --> |
29
- | `canon:canvas-board` | A direction should be drawn as editable frames |
30
- | `canon:task-board` | A decided item needs a file on the board |
31
- | `canon:plan-feature` | The approach is settled and needs a plan |
32
- | `canon:codebase-layout` | A change adds a file and needs a folder |
20
+ | Skill | When to use |
21
+ | -------------------------- | -------------------------------------------------- |
22
+ | `canon:plan-intake` | The input is a pile of findings |
23
+ | `canon:plan-intake-answer` | An intake folder holds unread slots |
24
+ | `canon:backlog-triage` | The backlog needs pruning |
25
+ | `canon:plan-groundwork` | The state is unmeasured and approaches compete |
26
+ | `canon:decision-escalate` | Open decisions turn on your preference |
27
+ | `canon:pick-by-eye` | The call is taste, wanting candidates side by side |
28
+ | `canon:canvas-board` | A direction should be drawn as editable frames |
29
+ | `canon:task-board` | A decided item needs a file on the board |
30
+ | `canon:plan-feature` | The approach is settled and needs a plan |
31
+ | `canon:codebase-layout` | A change adds a file and needs a folder |
33
32
 
34
33
  ## Build the feature
35
34
 
@@ -47,7 +46,6 @@ Groups run in the order a project meets them. Every name `canon claude skills li
47
46
  | `canon:search-craft` | Before searching outside the project |
48
47
  | `canon:systematic-debugging` | A test fails or a bug surfaces |
49
48
  | `canon:design-taste` | Drafting or judging an interface |
50
- | `canon:video-craft` | Before composing or judging a video |
51
49
  | `canon:ui-checklist` | After a UI change, to list what to check |
52
50
 
53
51
  ## Check the work before it leaves the branch
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/canon",
3
3
  "type": "module",
4
- "version": "5.52.0",
4
+ "version": "5.53.0",
5
5
  "description": "Runs your agent's work and keeps its code good, on one setup for every repo.",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -54,10 +54,7 @@
54
54
  "@preact/signals": "^2.11.3",
55
55
  "commander": "^13.1.0",
56
56
  "execa": "^9.5.2",
57
- "highlight.js": "^11.12.0",
58
- "jszip": "^3.10.1",
59
57
  "playwright-core": "1.64.1",
60
- "pptxgenjs": "^4.0.1",
61
58
  "preact": "^11.0.0"
62
59
  },
63
60
  "devDependencies": {
@@ -2,19 +2,14 @@
2
2
  * Writes `web/public/previews/design-tokens/index.html` and `design.css` by
3
3
  * calling `renderDesignDoc` directly, the in-process pattern
4
4
  * `regen-web-favicon.ts` already takes rather than spawning a subprocess.
5
- * Writes `web/public/previews/teach-workspace/` the same way, calling
6
- * `generateNav` over an isolated copy of one workspace.
7
5
  *
8
- * Both are embedded live in a landing section as an `<iframe>` rather than a
6
+ * It is embedded live in a landing section as an `<iframe>` rather than a
9
7
  * screenshot, since `web/e2e/home.spec.ts` asserts no `<img>` renders inside
10
8
  * `<main>`.
11
9
  */
12
- import { cpSync, existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs'
13
- import { tmpdir } from 'node:os'
14
- import { join } from 'node:path'
10
+ import { readFileSync } from 'node:fs'
15
11
  import { DESIGN_DOCUMENT } from '@/design/regen'
16
12
  import { renderDesignDoc } from '@/design/render'
17
- import { generateNav } from '@/teach/nav'
18
13
 
19
14
  const root = new URL('../..', import.meta.url).pathname
20
15
 
@@ -33,63 +28,3 @@ if (!/--(color|space|type|radius)-/.test(css)) {
33
28
  }
34
29
 
35
30
  console.log('regen-web-previews: wrote web/public/previews/design-tokens/')
36
-
37
- /**
38
- * The workspace ships alone, on its own isolated nav tree, rather than
39
- * copied straight out of `.canon/teach/`. That folder cross-links every
40
- * sibling workspace by relative path, including the operator's own personal
41
- * study notes, so a copy carrying its live chrome would ship either dead
42
- * links or a path into content never meant to be public. Regenerating the
43
- * chrome over a scratch copy holding this one workspace alone is what keeps
44
- * the jump menus from naming anything else.
45
- *
46
- * `.canon/teach/` is gitignored session scratch, per `claude/skills/teach-workspace/references/teach.md`, so
47
- * it exists on the machine that authored the lesson and nowhere else,
48
- * including CI. `web/public/previews/teach-workspace/` is therefore the
49
- * durable copy: committed once the workspace exists, regenerated here as a
50
- * local convenience when authoring continues, and left untouched by a build
51
- * that cannot see the source, the same way a target without Playwright still
52
- * builds against a committed capture.
53
- */
54
- const TEACH_SLUG = '04-governance-rule-loading'
55
- const teachSource = `${root}.canon/teach/${TEACH_SLUG}`
56
-
57
- if (!existsSync(teachSource)) {
58
- console.log(
59
- `regen-web-previews: no workspace at .canon/teach/${TEACH_SLUG} on this machine, leaving the committed web/public/previews/teach-workspace/ as is`,
60
- )
61
- } else {
62
- const scratchRoot = mkdtempSync(join(tmpdir(), 'canon-teach-preview-'))
63
- try {
64
- cpSync(teachSource, join(scratchRoot, '.canon', 'teach', TEACH_SLUG), {
65
- recursive: true,
66
- })
67
-
68
- const nav = await generateNav(scratchRoot)
69
- if (!nav.ok) {
70
- console.error(`regen-web-previews: ${nav.message}`)
71
- process.exit(1)
72
- }
73
- if (nav.lessons === 0) {
74
- console.error(
75
- 'regen-web-previews: teach-workspace render carries no lesson, refusing an empty preview',
76
- )
77
- process.exit(1)
78
- }
79
-
80
- const dest = `${root}web/public/previews/teach-workspace`
81
- rmSync(dest, { recursive: true, force: true })
82
- cpSync(join(scratchRoot, '.canon', 'teach'), dest, {
83
- recursive: true,
84
- // Only the rendered chrome ships. MISSION.md, RESOURCES.md, and
85
- // GLOSSARY.md carry links relative to `.canon/teach/`, which resolve to
86
- // nothing once copied under `web/public/`, and nothing links to them
87
- // from the rendered pages anyway.
88
- filter: (path) => !path.endsWith('.md'),
89
- })
90
- } finally {
91
- rmSync(scratchRoot, { recursive: true, force: true })
92
- }
93
-
94
- console.log('regen-web-previews: wrote web/public/previews/teach-workspace/')
95
- }
@@ -496,7 +496,6 @@ const RECORD_KINDS: readonly (readonly [string, Corpus])[] = [
496
496
  ['plans', 'per-machine'],
497
497
  ['groundwork', 'per-machine'],
498
498
  ['intake', 'per-machine'],
499
- ['teach', 'per-machine'],
500
499
  ]
501
500
 
502
501
  /**
@@ -7,9 +7,8 @@
7
7
  * The two absences are different states with different remedies. A package that
8
8
  * never resolved means the target installed the CLI without the engine, and a
9
9
  * binary that was never downloaded means the engine is present and its browser
10
- * is not. Both were spelled inside `src/demo/` when `demo` was the only command
11
- * driving a browser, and a second command is what makes them shared rather than
12
- * local.
10
+ * is not. Every command driving a browser reads both, so they sit here rather
11
+ * than beside one caller.
13
12
  */
14
13
 
15
14
  /** Fetches the browser revision the pinned engine expects. */
@@ -72,9 +71,7 @@ export interface KeyboardPage {
72
71
  * browser in pointer modality, where that rule does not match, so a reader
73
72
  * calling it alone reports every correctly styled element as unstyled.
74
73
  *
75
- * It moved here when `@/driver/probes/focus` became the second call site,
76
- * matching how the launch-failure split moved out of `src/demo/` once
77
- * `canon inventory` became the second command driving a browser. One press
74
+ * It moved here when `@/driver/probes/focus` became the second call site. One press
78
75
  * covers the page rather than the element that happens to hold focus, so it
79
76
  * survives the blur every reader takes next.
80
77
  */
@@ -16,7 +16,7 @@ import { formatStamp, hashSource, stampPath } from '@/capture/stamp'
16
16
  * `src/commands/capture.ts` reaches it through a dynamic import so `src/cli.ts`
17
17
  * never resolves the engine at startup.
18
18
  *
19
- * It ships, like `@/demo/drive`, `@/inventory/walk`, and `@/driver/drive`.
19
+ * It ships, like `@/inventory/walk` and `@/driver/drive`.
20
20
  * Regenerating this repository's own committed images was the reason it stayed
21
21
  * behind, and it was a reason about one caller rather than about the mechanism:
22
22
  * a target renders its own generated pages and proves its own fonts resolved,