@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
@@ -1,35 +0,0 @@
1
- ---
2
- name: record-screencast
3
- description: Why compiling and running a screencast draft needs a routed skill rather than an operator typing two verbs by hand, and why the unresolved-field refusal cannot be a suggestion
4
- ---
5
-
6
- # Record screencast requirement
7
-
8
- ## Gap
9
-
10
- Without this skill, nothing routes a session from a screencast draft to `canon demo compile` and `canon demo run`. An operator has to know both verbs, type them in order, and read the compile record for unresolved fields by hand.
11
-
12
- A session that fills an unresolved field in on its own reproduces the failure `plan-unresolved` exists to catch, where nothing enforces it. A take with no composition ships raw, and an unguided one reaches for generic defaults.
13
-
14
- ## Must
15
-
16
- - The default plan path resolves the way `canon demo compile` resolves it, and an existing plan there is run rather than recompiled, since its timing may be tuned by hand
17
- - Every unresolved field from the compile or run record is reported and the run stops there
18
- - Every path a run wrote is reported, skipping any the record carries as null
19
- - The video craft guidance loads before composing, and a draft whose wrap section asks for anything becomes a finished mp4 through HyperFrames, checked before rendering and handed to `read-frames`
20
- - A wrap section reading `none` throughout stops at the take, and an absent HyperFrames stops with its install command
21
-
22
- ## Must not
23
-
24
- - Pass `--force` to compile, or guess what to compile when no draft path is given
25
- - Guess or fill a target, a URL, or any other unresolved field
26
- - Drive the application through anything other than `canon demo run`
27
- - Install HyperFrames, vendor it, or restate its composition rules
28
- - Assume anything reaches for this skill beyond `script-screencast`'s closing pointer or an operator, which a later review reads back
29
-
30
- ## Out of scope
31
-
32
- - Drafting the beats, which `script-screencast` owns
33
- - The captions, zoom, pointer, and audio judgment, which `video-craft` owns
34
- - Reading the render back, which `read-frames` owns
35
- - Filling an existing plan's target or URL, which the operator owns
@@ -1,99 +0,0 @@
1
- ---
2
- name: record-screencast
3
- description: Drives a screencast draft through to a recording. Compiles it with `canon demo compile` when no plan exists yet at the default path, skipping compile when one is already there, runs `canon demo run` once nothing is unresolved, then composes the take into a finished mp4 through HyperFrames when the draft's wrap section asks for anything. Reports every unresolved field from the compile or run record and stops rather than guessing one. Use when asked to "record the screencast", "run the demo", "compile and record this draft", or right after `script-screencast` prints its next-step line. Do NOT use to draft the beats, which is `script-screencast`, or to fill in a plan's target or URL, which is the operator's own edit.
4
- metadata:
5
- family: generate
6
- ---
7
-
8
- # Record screencast
9
-
10
- ## Guards
11
-
12
- - If no draft path is given, stop: `❌ No draft path. Pass the path script-screencast printed.`
13
- - Never guess or fill an unresolved field, a target, a URL, or anything else the compile or run record names. Report it and stop.
14
- - Filling one in reproduces the failure `canon demo run`'s `plan-unresolved` reason exists to catch, one layer up where nothing enforces it
15
- - Never pass `--force` to compile. A plan at the default output path may carry timing tuned by hand that the draft cannot reproduce.
16
- - Drive the application through `canon demo run` alone. Never open a browser, click through the app, or write to the output paths some other way.
17
-
18
- ## Step 1: resolve the plan path
19
-
20
- A draft lives at `demos/<slug>/beats.md`, so `<slug>` is the folder holding it and the plan sits beside it at `demos/<slug>/plan.json`. `demos/inline-edit/beats.md` resolves to `demos/inline-edit/plan.json`.
21
-
22
- Pass `--slug <slug>` to compile, since its default reads the draft's filename and would name every demo `beats`. A plan compiled before the folder layout sits at `demos/<slug>.json`, so pass it to Step 3 by path when the caller names it.
23
-
24
- ## Step 2: compile only when no plan exists yet
25
-
26
- Check whether the resolved plan path already exists.
27
-
28
- - **It exists.** A person may have tuned it by hand since compiling. Skip compiling and go to Step 3 with this path.
29
- - **It does not exist.** Run:
30
-
31
- ```bash
32
- canon demo compile <draft> --slug <slug> --json
33
- ```
34
-
35
- Branch on the record rather than the exit code:
36
- - `reason: draft-missing` or `reason: draft-unreadable`: report the reason, plus the record's `message` when it carries one, and stop.
37
- - No `reason` key, meaning the plan was written: read `unresolved` off the record.
38
- - Non-empty: report the plan path and every field the array names, one per line, and stop. Do not proceed to Step 3.
39
- - Empty: continue to Step 3 with the record's `plan` path.
40
-
41
- ## Step 3: run
42
-
43
- Run:
44
-
45
- ```bash
46
- canon demo run <plan> --json
47
- ```
48
-
49
- Branch on the record's `reason`:
50
-
51
- | `reason` | Do |
52
- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------- |
53
- | `plan-unresolved` | Report every field in `unresolved`, one per line, and stop. A pre-existing plan skipped Step 2's check. |
54
- | `plan-missing`, `plan-unreadable`, `no-output-requested`, `cursor-unreadable`, `engine-missing`, `browser-missing` | Report the reason, plus the record's `message` or `install` line when it carries one, and stop |
55
- | None, meaning the run wrote its output | Continue to Step 4 |
56
-
57
- The take lands in `demos/<slug>/take/`, which git ignores.
58
-
59
- ## Step 4: compose when the draft asks for it
60
-
61
- Read the draft's `## Wrap` section. When intro, outro, and music all say `none`, or the section is absent, stop at the take and go to Step 6, since an empty composition says nothing the take does not.
62
-
63
- ### Presence test
64
-
65
- Otherwise confirm HyperFrames' `hyperframes` skill resolves. `bunx` would fetch the package on a machine without it, which installs by the back door, so the skill is the presence test.
66
-
67
- - When it does not resolve, stop and report `bunx -y hyperframes init`, warning that init installs its skills machine-wide without asking
68
- - Report the take's paths as Step 6 does, so the operator still holds the recording
69
- - Never install it from here
70
-
71
- ### Build and render
72
-
73
- When it resolves, load it, then load `canon:video-craft` for the captions, zoom, pointer, and audio judgment, reporting it rather than proceeding silently when it does not resolve. Those two skills own the composition rules, so this body states none.
74
-
75
- Build `demos/<slug>/index.html` around the take with the intro, outro, and music the wrap names, aiming each zoom from the timeline the run wrote beside the take. Then run both from `demos/<slug>/`:
76
-
77
- ```bash
78
- bunx -y hyperframes check
79
- bunx -y hyperframes render --quality delivery --output renders/<slug>.mp4
80
- ```
81
-
82
- Report a failing check, with the take's paths, and stop rather than rendering past it. The render sits in `demos/<slug>/renders/`, which git ignores.
83
-
84
- ## Step 5: read the render
85
-
86
- Hand the render to `read-frames` as its video path, so the composed result is checked rather than only the raw take.
87
-
88
- ## Step 6: output
89
-
90
- The record carries `video`, `mp4`, `gif`, `still`, and `timeline`, each a path or `null`. Report each one that is not `null`, one per line, and add the render path when Step 4 wrote one.
91
-
92
- | Output | Name it as |
93
- | ---------- | ----------------------------------------------------- |
94
- | `mp4` | The deliverable |
95
- | webm | The raw take |
96
- | `gif` | The form for a host that strips video |
97
- | `timeline` | The per-step timing a composition aims its zooms from |
98
-
99
- Say so plainly if `canon demo compile` or `canon demo run` is not available, rather than driving the application some other way. Both ship with the CLI and this skill ships with the plugin, so a project carrying one and not the other is a real state.
@@ -1,34 +0,0 @@
1
- ---
2
- name: script-screencast
3
- description: Why a recording script ships pre-seeded rather than blank, what the four discovery questions buy, and why the draft stays stack-agnostic
4
- ---
5
-
6
- # Script screencast requirement
7
-
8
- ## Gap
9
-
10
- Without this skill, a recording plan arrives as blank fields, so the user fills a template instead of editing a draft. The opposite failure costs more. A session skipping discovery guesses the audience, the length, and the hero moment, and writes beats that get thrown away. What surrounds the take surfaces only at compose time.
11
-
12
- A draft naming the recording software, the editing software, or the window manager pins the script to one person's setup. Re-invoking to refine silently overwrites the edits the user made in the file, which destroys work rather than wasting it.
13
-
14
- ## Must
15
-
16
- - Project context and recent commits are read before proposing, and exactly four discovery questions each carry a default derived from them
17
- - The run waits for answers rather than reading silence as acceptance
18
- - Every section is pre-seeded with concrete content, so the draft ships as written and the user edits down
19
- - The draft lands at `demos/<slug>/beats.md` at the project root, with the slug derived from the topic and the answers, and its path printed on its own line
20
- - A wrap section names intro, outro, and music with a default each
21
-
22
- ## Must not
23
-
24
- - Name recording software, editing software, fonts, or window managers
25
- - Record, edit video, or generate captions
26
- - Re-run against an existing draft to refine it, since re-running overwrites
27
- - Infer the hero moment without asking, or guess the topic when none is given
28
-
29
- ## Out of scope
30
-
31
- - Producing the recording, which `record-screencast` owns
32
- - Slide decks, which `make-deck` owns
33
- - Refining an existing draft, which a direct edit of the file owns
34
- - Where the recording ships, which the user owns
@@ -1,70 +0,0 @@
1
- ---
2
- name: script-screencast
3
- description: Drafts a screencast script with pre-seeded beats, defaults, and decisions to `demos/<slug>/beats.md`. Reads project context, asks four discovery questions with proposed defaults, then writes a shippable draft. Use when asked to "draft a screencast", "write a recording script", "plan a demo video", or "scaffold a screencast for X". Do NOT re-invoke to refine an existing draft. Re-running overwrites. Edit the draft file directly.
4
- metadata:
5
- family: generate
6
- ---
7
-
8
- # Script screencast
9
-
10
- ## Guards
11
-
12
- - If no topic is provided, stop: `❌ No screencast topic. Describe what you are recording.`
13
- - Draft, then hand off. Do not edit video, generate captions, or drive the application, since a recording is `record-screencast`'s job. Name it as the next step and stop.
14
- - Stack-agnostic in the draft. Never name a recording tool, an editing tool, a font, or a window manager.
15
- - Keep selectors, URLs, wait conditions, and timings out of the beats, since the compiler adds those four in a plan of its own and a beat carrying them stops being readable
16
-
17
- ## Step 1: read the project context
18
-
19
- Read these in parallel from the project root, skipping any that do not exist:
20
-
21
- - `CLAUDE.md`: behavior rules and project pitch
22
- - `canon/REQUIREMENTS.md`: feature scope, non-goals, audience hints
23
- - `.canon/tasks/index.md`: current scope
24
- - Recent commits via `git log --oneline -20 2>/dev/null || echo "FALLBACK"`: what shipped recently is usually the recording subject.
25
-
26
- ## Step 2: discovery with proposed defaults
27
-
28
- Ask exactly four questions in chat. Each carries a proposed default derived from Step 1. The user confirms, overrides, or says "use defaults" to accept all.
29
-
30
- ```markdown
31
- **Discovery:**
32
-
33
- 1. Audience: proposing technical peers. Override?
34
- 2. Length: proposing 75-90s. Override?
35
- 3. Hero moment: proposing <best guess from context, or "the single thing that has to land">. Override?
36
- 4. What to cut: proposing <best guess, or "anything that is not the hero moment">. Override?
37
- ```
38
-
39
- Wait for answers before drafting. Do not infer silence as acceptance.
40
-
41
- ## Step 3: derive the slug
42
-
43
- Build a 2-to-4-word kebab-case slug from the topic and discovery answers. Examples: `auth-flow-redesign`, `cli-onboarding`, `inline-edit-launch`.
44
-
45
- ## Step 4: write the draft
46
-
47
- Create `demos/<slug>/beats.md` at the project root, creating the folder if it does not exist. The file is committed with the rest of the demo's sources, so a recording can be rebuilt from the folder alone.
48
-
49
- ### Fill the template
50
-
51
- Write all nine sections from `${CLAUDE_SKILL_DIR}/references/beats-template.md`, read on reaching this step. Pre-seed every section with concrete content so the draft ships as-is, and the user edits down rather than fills blanks. A run stopped at discovery skips it.
52
-
53
- Load `canon:video-craft` for every zoom and caption value the draft names, and report it rather than proceeding silently when it does not resolve.
54
-
55
- ## Step 5: output
56
-
57
- Print the file path on its own line and a one-line summary. Do not paraphrase the path into prose.
58
-
59
- ```markdown
60
- 📝 Wrote demos/<slug>/beats.md
61
-
62
- Draft has 5 beats and pre-seeded defaults. Edit the beats, the resolved decisions, and the wrap.
63
-
64
- To record it rather than shoot it by hand:
65
- record-screencast demos/<slug>/beats.md
66
- ```
67
-
68
- Name the skill and stop there. Do not compile the draft, do not run it, and do not generate captions. The operator edits the beats first, and the compiler reports which selectors and URLs they still owe it.
69
-
70
- Say so plainly if `canon demo compile` is not available, rather than driving the application some other way. The command ships with the CLI and the skills ship with the plugin, so a project carrying one and not the other is a real state.
@@ -1,119 +0,0 @@
1
- ---
2
- title: Beats template
3
- description: The nine-section template script-screencast writes to demos/<slug>/beats.md, pre-seeded so the draft ships as-is
4
- ---
5
-
6
- # Beats template
7
-
8
- Applies to the draft `script-screencast` Step 4 writes. Fill every placeholder from the project context and the discovery answers. The template states no zoom or caption value, since each traces to a source `canon:video-craft` records.
9
-
10
- ## Template
11
-
12
- ```markdown
13
- # Screencast: <short title>
14
-
15
- ## 1. Header
16
-
17
- - Audience: <from discovery>
18
- - Length: <from discovery>
19
- - Hero moment: <from discovery>
20
- - Pitch: <one sentence, derived from project context>
21
-
22
- ## 2. Pre-recording checklist
23
-
24
- - [ ] Browser at 1920x1080 with notifications silenced
25
- - [ ] Session storage and history cleared for the recorded surfaces
26
- - [ ] Cursor highlighter on
27
- - [ ] Live URLs and fixtures verified healthy
28
- - [ ] <one or two project-specific items derived from context>
29
-
30
- ## 3. Beat sheet
31
-
32
- Five beats. Each uses five fields. Add a sixth `Transition out` only when non-default.
33
-
34
- ### Beat 1: Cold open
35
-
36
- - On screen: <derived from hero moment>
37
- - Action: <one verb, derived>
38
- - Watch for:
39
- - Emphasis: zoom onto the action, scale and speed per `canon:video-craft`
40
- - Caption:
41
-
42
- ### Beat 2: Setup
43
-
44
- - On screen:
45
- - Action:
46
- - Watch for:
47
- - Emphasis: none
48
- - Caption:
49
-
50
- ### Beat 3: Hero moment
51
-
52
- - On screen: <hero moment from discovery>
53
- - Action:
54
- - Watch for:
55
- - Emphasis: highlight overlay
56
- - Caption:
57
-
58
- ### Beat 4: Payoff
59
-
60
- - On screen:
61
- - Action:
62
- - Watch for:
63
- - Emphasis: none
64
- - Caption:
65
-
66
- ### Beat 5: Outro
67
-
68
- - On screen:
69
- - Action:
70
- - Watch for:
71
- - Emphasis: zoom out to full frame
72
- - Caption:
73
-
74
- ## 4. Sequencing notes
75
-
76
- - Hover before click. The cursor needs a beat to register.
77
- - Do not cut mid-reset. Let state changes complete on screen.
78
- - Cut on action, not on stillness.
79
- - <one or two project-specific gotchas derived from context>
80
-
81
- ## 5. Production notes
82
-
83
- - Resolution: 1920x1080
84
- - Frame rate: 30fps
85
- - Container: mp4 H.264
86
- - Zoom: only on an action too small to read at full frame, scale, speed, and dwell per `canon:video-craft`, zoomed out before every cut
87
- - Highlight overlay: ~1.5s soft glow
88
-
89
- ## 6. Captions
90
-
91
- - Each caption names what its beat's frame shows, at most two lines of 42 characters, per `canon:video-craft`
92
- - Hold and reading rate per `canon:video-craft`, splitting a caption across beats rather than shortening its hold
93
- - Placed off the element the beat acts on
94
-
95
- ## 7. Distribution
96
-
97
- Where the recording ships. Strike rows that do not apply.
98
-
99
- - [ ] Native upload to social platform
100
- - [ ] Canonical host (long-form video platform)
101
- - [ ] Linked from project README or release notes
102
-
103
- ## 8. Resolved decisions
104
-
105
- Pre-seeded with the common picks. Strike or rewrite as needed.
106
-
107
- - Audio: silent plus captions
108
- - Language: English
109
- - Chip order: <leave for user, derived from beats>
110
- - Thumbnail: hero-moment frame
111
-
112
- ## 9. Wrap
113
-
114
- What surrounds the take in the finished video. Each row carries a proposed default. Write `none` on every row to ship the raw take.
115
-
116
- - Intro: <proposed title card of two to three seconds naming the subject, or `none`>
117
- - Outro: <proposed closing card naming where to go next, or `none`>
118
- - Music: none
119
- ```
@@ -1,34 +0,0 @@
1
- ---
2
- name: teach-workspace
3
- description: Scope boundary for learning a subject across sessions, and the split between the disposable lesson and the durable reference page
4
- ---
5
-
6
- # Teach workspace requirement
7
-
8
- ## Gap
9
-
10
- Without this skill, a session asked to teach answers in the conversation, so everything dies with it. It teaches from recall, picks topics from the subject's order rather than the learner's errors, and asks nothing about what they know. A structure lesson points at a diagram and ships none.
11
-
12
- A worked-through page and a looked-up page have different lifetimes, and merging them yields disposable material kept or durable material carrying a quiz. Opened by bare path, a lesson renders unstyled. A workspace resolved against the current directory forks per worktree, and the editing tools refuse a main-root write from one.
13
-
14
- ## Must
15
-
16
- - Hold the workspace at the main worktree root, name the write route from a linked worktree, and route edits to an existing workspace file through a verb that resolves the root
17
- - Ask the learner's starting point, research from sources chosen by the teach standard's ladder, and place each lesson from the learning records
18
- - Split the output by lifetime into lessons and reference pages, record the wrong answer itself rather than a count, and decide each lesson's figure before its body
19
- - Hand the learner a link to the workspace in a real browser on every run, read back from the verb that served it
20
- - Propose each durable page's destination by who owns its subject, wait for the operator, and hand the page off through a named file a branch lands and deletes
21
-
22
- ## Must not
23
-
24
- - Teach from recall without saying which claims rest on it
25
- - Write to a destination surface outside the fold mode, or overwrite a file a promotion block routes to
26
- - Promote a lesson at any age, since it is generated markup carrying a quiz
27
- - Open a second workspace on a covered subject, or renumber anything
28
- - Scaffold a wiki folder the project never chose
29
-
30
- ## Out of scope
31
-
32
- - What the verbs do internally, which the `canon teach` CLI domain owns
33
- - What a lesson renders as and how its quiz behaves, which the lesson-craft reference and the rendering layer own
34
- - Firing on a description match, since opening a workspace is the learner's call
@@ -1,196 +0,0 @@
1
- ---
2
- name: teach-workspace
3
- description: Opens and runs a learning workspace on one subject, holding a mission, resources, numbered lessons, reference pages, a glossary, and learning records that survive across sessions, proposes where a durable page from one belongs once it outgrows the workspace, and lands the confirmed pages from a branch. Use when asked to "teach me X", "open a learning workspace", "I want to learn X", "quiz me on this", "continue the lesson", "resume my workspace on X", "promote this reference page", or "fold the promoted pages in". Do NOT use to write project documentation, which belongs to the surface owning that document, and do NOT use to answer one question, which is an ordinary reply. Do NOT auto-trigger.
4
- argument-hint: <subject to learn, the topic of a workspace to resume or promote, or fold>
5
- metadata:
6
- family: answer
7
- ---
8
-
9
- # Teach workspace
10
-
11
- Run a learning workspace on one subject across sessions. The workspace holds what the learner has been through, so a session weeks later resumes from the folder rather than from the conversation.
12
-
13
- ## References
14
-
15
- Read `${CLAUDE_SKILL_DIR}/references/teach.md` before writing anything into the folder, since it fixes the workspace's shape. The glossary answers to `${CLAUDE_SKILL_DIR}/references/glossary.md` wherever it lands.
16
-
17
- The pedagogy sits in `${CLAUDE_SKILL_DIR}/references/pedagogy.md`, the lesson craft and its build in `${CLAUDE_SKILL_DIR}/references/lesson-craft.md` and `lesson-build.md`, the revisit schedule in `revisit.md`, and the promotion routing in `${CLAUDE_SKILL_DIR}/references/promotion.md`.
18
-
19
- ## Guards
20
-
21
- - If the invocation names no subject and no existing workspace matches, stop: `❌ No subject. Invoke with the subject to learn, or the topic of a workspace to resume.`
22
- - Never trust recall for what the subject says. Research first, cite what was read, and say what was not.
23
- - Write nothing outside the workspace folder, apart from the one handoff file Step 6 names and the destinations the fold mode lands from that file
24
- - A durable page stays in `reference/` until the operator confirms a destination, and only the fold mode copies it out, from a branch
25
-
26
- ### Workspaces and promotion
27
-
28
- One subject takes one workspace, and only its reference pages ever leave it.
29
-
30
- - Do not open a second workspace on a subject one already covers. Resume that one.
31
- - Never promote a lesson. It is generated markup carrying a quiz and a learner, and no request makes it promotable.
32
- - Never write a favicon link by hand. `canon teach nav` puts the toolkit's icon on every page and in a lesson's `style` region, so a hand-written one gives the page two.
33
-
34
- ## Step 0: let the CLI resolve the workspace root
35
-
36
- Workspaces live at the main worktree root, never inside a linked worktree. A copy per worktree forks the learning records, and the learner is one person.
37
-
38
- Every `canon teach` verb resolves that root in-process, so no step below composes a path to a workspace file. Read the folder through the CLI:
39
-
40
- ```bash
41
- canon teach list --json
42
- ```
43
-
44
- It reports every workspace with its path, its counts, and the ordinal a new one would take. A `no-teach` refusal means the project has opened none yet, which is Step 1's new-workspace path, and the open verb creates the folder.
45
-
46
- Every path under the main root is a main-root write, routed the way `session-worktree` states. The route splits by what the write does to the file:
47
-
48
- - Creating a whole file that does not exist yet, which is a lesson, a reference page, and a learning record, goes out as a heredoc
49
- - Changing a line inside a file that already exists goes through the verb that owns it
50
-
51
- ## Step 1: open or resume
52
-
53
- A topic the listing already carries is a resume, and anything else is a new workspace. Two invocations are neither.
54
-
55
- - One asking to promote reads the named workspace through the listing and goes to Step 6, which teaches nothing and writes no lesson
56
- - One asking to fold confirmed promotions in goes to `## Fold mode`
57
-
58
- ### On a resume
59
-
60
- Run `canon teach list <topic> --json` for the files behind each count, then read the highest-numbered learning record and `GLOSSARY.md`, which carry where the learner stopped and what they got wrong.
61
-
62
- - The record's `success` holds the mission's success lines, the exit criteria. Report them with what is already met before teaching anything.
63
- - `due` lists what the learning records schedule, soonest first, each with its item, date, rung, `overdue` flag, and the two dates the next record could write
64
- - Read `due` here, since `canon teach lesson` takes a `--slug` naming a choice already made. Report what is overdue before proposing a lesson.
65
- - An empty `due` on a workspace holding records means no record scheduled anything, which is a gap in the records rather than a clear schedule
66
-
67
- ### On a new workspace
68
-
69
- Settle the starting point first, by asking rather than by assuming. Difficulty with no floor under it teaches nobody, and the mission cannot be written without it. Then open the workspace, which derives the ordinal and writes all three required files:
70
-
71
- ```bash
72
- canon teach open <topic> --json \
73
- --subject "<one line stating the subject>" \
74
- --starting-point "<what the learner already knows>" \
75
- --success "<an observable thing the learner will be able to do>" \
76
- --out-of-scope "<what this workspace does not cover>"
77
- ```
78
-
79
- Repeat `--success` and `--out-of-scope` per line. The verb refuses a topic another workspace already covers, which is the guard against opening a second one on the same subject.
80
-
81
- ## Step 2: research before teaching
82
-
83
- Read the subject from sources rather than from recall, chosen by the standard's `### Choosing sources` ladder, with a third-rung source's reason in its title. Record what was read and what was only found through the verb that owns the file:
84
-
85
- ```bash
86
- canon teach resource <topic> --json \
87
- --read "<title, naming which claims rest on it>=<url>" \
88
- --lead "<title>=<url>"
89
- ```
90
-
91
- Each flag repeats, and the pair splits on the first `=` so a URL carrying one survives. A listed URL is refused, but `--read` moves an opened lead.
92
-
93
- A claim nothing was read for is the failure this step exists against. Where no source is reachable, say so in the lesson and mark what rests on recall.
94
-
95
- ## Step 3: place the learner
96
-
97
- Pick the next lesson from the learning records rather than from the subject's own order. The target is the band immediately past what the learner can already do unaided, which `${CLAUDE_SKILL_DIR}/references/pedagogy.md` states in full.
98
-
99
- - Open on what `due` reports as overdue, oldest date first, before anything new
100
- - Where nothing is overdue, open on retrieval of what the last session got wrong. A learner who cannot retrieve the previous lesson is not ready for the next one.
101
- - Never place from the last record alone, since a topic missed three sessions ago is invisible to that read and sits in `due` with a date already past
102
-
103
- ## Step 4: write the lesson and the reference
104
-
105
- Two outputs with two lifetimes, and the split decides the format.
106
-
107
- - A lesson is a self-contained page carrying its own quiz, a teach-back block, and feedback per question, embedding one shared stylesheet. It is disposable and never promoted.
108
- - A reference page goes to `reference/<slug>.md`, written for a reader with no learner in it. It is the half that survives, so it passes the authoring gates a promotion applies.
109
- - A lesson's `refs` pass the source ladder, and a learner's or organization's file goes in the body, labeled
110
- - `canon teach nav` renders a reference to a `reference/<slug>.html` sibling, and a lesson links that sibling, since a served `.md` opens as plain text
111
-
112
- ### Resolve the lesson
113
-
114
- Resolve the lesson before writing it, rather than composing its name or its quiz order by hand:
115
-
116
- ```bash
117
- canon teach lesson <topic> --json \
118
- --slug <kebab slug for what this lesson covers> \
119
- --questions <how many questions the quiz carries> \
120
- --options <how many options each question carries>
121
- ```
122
-
123
- It writes nothing and reports three things:
124
-
125
- - `lesson`, the numbered path the lesson takes. Write it there.
126
- - `success`, the mission's success lines, carried here so Step 5 needs no second read.
127
- - `quiz`, one entry per question, carrying `order` and `answer`.
128
-
129
- Write the correct option first, then present the options in the order `order` reports, as authored indices where `0` is the correct one. Take the order as given, since a lesson that reorders by judgment puts the answer back in the first slot.
130
-
131
- ### The quiz, the teach-back block, and the lesson body
132
-
133
- Read `${CLAUDE_SKILL_DIR}/references/lesson-craft.md` before writing the lesson. Its `## Quiz construction` and `## Teach back` fix the markup `canon teach nav`'s stepper gates on, and a quiz in any other shape shows every question at once with nothing reporting it.
134
-
135
- - Then read `${CLAUDE_SKILL_DIR}/references/lesson-build.md` for the block list, the four marker pairs, the render, nav, stylesheet, and glossary verbs, and the rule against hand-composing any of them
136
- - Keep every quiz answer the same length, so formatting leaks no clue about which one is correct
137
- - Decide the figure first, by `## Diagrams` in `lesson-craft.md`
138
-
139
- ### Hand over a link, never a path
140
-
141
- A lesson is a page carrying a script, and an editor preview cannot run it, so a path alone opens markup with no working quiz. Serve the teach root and give the learner a link. One verb refreshes every page's chrome and serves the folder from the main worktree root:
142
-
143
- ```bash
144
- canon teach up <topic> --json
145
- ```
146
-
147
- - Where the installed CLI predates `up`, run the line the `Open` step of `canon teach list <topic>` prints, with `--json` appended
148
- - Never hand-write `canon serve .canon/teach`, which serves an absent folder from a linked worktree
149
- - Start it in the background and read `url` off the record, since the verb walks past a port already in use and a guessed URL gets that port wrong
150
- - Report the refusal and its `reason` when `ok` is false, and report it rather than proceeding silently when the verb does not resolve at all
151
- - Do this on every run that opens or resumes a workspace, including one that writes no lesson, since the learner's route in is the same link
152
-
153
- ## Step 5: record what happened
154
-
155
- Write `learning-records/<nnnn>-<slug>.md` before the session ends, carrying the lessons covered, what the learner retrieved unaided, what they got wrong with the wrong answer itself, and a `## Revisit` section.
156
-
157
- - Record the wrong answer rather than the count. The next session places the learner from this file, and a tally carries no misconception to work against.
158
- - Record what the teach-back left out under what the learner got wrong, naming the concept and where the explanation broke, since both are retrieval failures one section holds
159
- - Read `${CLAUDE_SKILL_DIR}/references/revisit.md` before writing `## Revisit`, for the bullet shape, where each date and rung comes from, and an unscheduled item's first schedule
160
-
161
- ### Restate the mission
162
-
163
- Restate the mission's success lines from the `success` the lesson verb reported, rather than from `MISSION.md` by eye. Report each line as met or not met, and name what the learner did that meets it.
164
-
165
- A mission whose lines are all met is finished, and saying so is what closes a workspace.
166
-
167
- ## Step 6: propose where the durable half belongs
168
-
169
- Run this when the invocation asks for it, or offer it in one line when a mission finishes, since its reference pages then stop changing. Never run it unasked mid-course.
170
-
171
- Read `${CLAUDE_SKILL_DIR}/references/promotion.md` first. It carries what may be promoted, the routing test, the wiki folder and its refusal, each destination's expectations, and under `## Proposing and handing off` the proposal, the handoff file, and the fold instruction. Propose and wait, and write nothing to a destination here.
172
-
173
- ## Fold mode
174
-
175
- Run this only when the invocation asks to fold, and only from a branch in a linked worktree, since every destination is a tracked file committing with the branch while the handoff sits in gitignored scratch at the main root.
176
-
177
- Read `${CLAUDE_SKILL_DIR}/references/promotion-fold.md` for how each block lands, the overwrite refusal, the handoff delete, and the output lines, which replace the Output block below.
178
-
179
- ## Output
180
-
181
- ```plaintext
182
- ✅ <opened|resumed> .canon/teach/<nn>-<topic>/
183
- Lesson: .canon/teach/<nn>-<topic>/lessons/<nnnn>-<slug>.html
184
- Reference: .canon/teach/<nn>-<topic>/reference/<slug>.md
185
- Record: .canon/teach/<nn>-<topic>/learning-records/<nnnn>-<slug>.md
186
- Figure: <drawn through draw-figure, or the one-line reason prose carries it>
187
- Progress: <n> of <m> success lines met
188
- Open: [<the url the serve verb reported>](<the same url>)
189
- ```
190
-
191
- - Omit the reference line where the lesson produced no durable page
192
- - Never omit the open line, the learner's only route into the page. It carries what the serving verb reported, or names the refusal where the verb refused.
193
- - Write that line as a markdown link with the URL as both text and target, never a bare URL or a code span the reader has to copy
194
- - Emit every path from the project root, in the form the project's instruction file sets
195
-
196
- A promotion pass reports the shape `${CLAUDE_SKILL_DIR}/references/promotion.md` gives at the end of `## Proposing and handing off` instead.