@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.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -4
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/canon-cli/SKILL.md +0 -3
- package/claude/skills/context-fold/REQUIREMENT.md +0 -1
- package/claude/skills/design-taste/references/kinds.md +0 -1
- package/claude/skills/draw-figure/REQUIREMENT.md +2 -3
- package/claude/skills/draw-figure/SKILL.md +4 -5
- package/claude/skills/draw-figure/references/figures.md +0 -1
- package/claude/skills/draw-figure/references/hand-drawn.md +1 -1
- package/claude/skills/pick-by-eye/REQUIREMENT.md +0 -1
- package/claude/skills/pick-by-eye/SKILL.md +1 -1
- package/claude/skills/teach-craft/REQUIREMENT.md +30 -0
- package/claude/skills/teach-craft/SKILL.md +39 -0
- package/claude/skills/teach-craft/references/lesson-craft.md +52 -0
- package/claude/skills/{teach-workspace → teach-craft}/references/pedagogy.md +12 -4
- package/docs/agents/audits.md +0 -1
- package/docs/target/migrations.md +10 -1
- package/docs/workflow/parallel-features.md +1 -1
- package/docs/workflow/skill-map-on-request.md +10 -22
- package/docs/workflow/skill-map.md +12 -14
- package/package.json +1 -4
- package/scripts/core/regen-web-previews.ts +2 -67
- package/src/audits/catalog.ts +0 -1
- package/src/browser/engine.ts +3 -6
- package/src/capture/render.ts +1 -1
- package/src/claude/cases/authoring.ts +0 -12
- package/src/claude/cases/misc.ts +0 -17
- package/src/claude/cases/workflow.ts +2 -38
- package/src/claude/skills-audit.ts +0 -1
- package/src/cli/help.ts +0 -7
- package/src/cli.ts +0 -6
- package/src/commands/records.ts +0 -1
- package/src/commands/serve.ts +2 -2
- package/src/design/components.ts +8 -1514
- package/src/design/css.ts +5 -6
- package/src/design/fonts.ts +3 -5
- package/src/driver/drive.ts +3 -4
- package/src/driver/steps.ts +2 -5
- package/src/inventory/walk.ts +1 -1
- package/src/markdown/scope.ts +4 -31
- package/src/records/validate.ts +4 -176
- package/src/sandbox/equivalence.ts +0 -5
- package/claude/skills/draft-and-pick/REQUIREMENT.md +0 -26
- package/claude/skills/draft-and-pick/SKILL.md +0 -11
- package/claude/skills/draft-doc/REQUIREMENT.md +0 -26
- package/claude/skills/draft-doc/SKILL.md +0 -11
- package/claude/skills/draft-figure/REQUIREMENT.md +0 -26
- package/claude/skills/draft-figure/SKILL.md +0 -11
- package/claude/skills/draft-identity/REQUIREMENT.md +0 -26
- package/claude/skills/draft-identity/SKILL.md +0 -11
- package/claude/skills/draft-ready/REQUIREMENT.md +0 -26
- package/claude/skills/draft-ready/SKILL.md +0 -11
- package/claude/skills/draft-screencast/REQUIREMENT.md +0 -26
- package/claude/skills/draft-screencast/SKILL.md +0 -11
- package/claude/skills/draft-slides/REQUIREMENT.md +0 -26
- package/claude/skills/draft-slides/SKILL.md +0 -11
- package/claude/skills/make-deck/REQUIREMENT.md +0 -36
- package/claude/skills/make-deck/SKILL.md +0 -80
- package/claude/skills/make-deck/references/deck.md +0 -183
- package/claude/skills/read-frames/REQUIREMENT.md +0 -30
- package/claude/skills/read-frames/SKILL.md +0 -55
- package/claude/skills/record-screencast/REQUIREMENT.md +0 -35
- package/claude/skills/record-screencast/SKILL.md +0 -99
- package/claude/skills/script-screencast/REQUIREMENT.md +0 -34
- package/claude/skills/script-screencast/SKILL.md +0 -70
- package/claude/skills/script-screencast/references/beats-template.md +0 -119
- package/claude/skills/teach-workspace/REQUIREMENT.md +0 -34
- package/claude/skills/teach-workspace/SKILL.md +0 -196
- package/claude/skills/teach-workspace/references/glossary.md +0 -90
- package/claude/skills/teach-workspace/references/lesson-build.md +0 -106
- package/claude/skills/teach-workspace/references/lesson-craft.md +0 -135
- package/claude/skills/teach-workspace/references/promotion-fold.md +0 -35
- package/claude/skills/teach-workspace/references/promotion.md +0 -116
- package/claude/skills/teach-workspace/references/revisit.md +0 -28
- package/claude/skills/teach-workspace/references/teach.md +0 -211
- package/claude/skills/video-craft/REQUIREMENT.md +0 -35
- package/claude/skills/video-craft/SKILL.md +0 -96
- package/claude/skills/video-craft/references/adopted.md +0 -110
- package/src/commands/demo.ts +0 -542
- package/src/commands/slides.ts +0 -184
- package/src/commands/teach.ts +0 -1401
- package/src/demo/beats.ts +0 -135
- package/src/demo/compile.ts +0 -350
- package/src/demo/container.ts +0 -219
- package/src/demo/cursors.ts +0 -55
- package/src/demo/drive.ts +0 -442
- package/src/demo/pointer.ts +0 -178
- package/src/demo/theme.ts +0 -112
- package/src/demo/timeline.ts +0 -64
- package/src/slides/convert/chart.ts +0 -165
- package/src/slides/convert/deck.ts +0 -244
- package/src/slides/convert/export.ts +0 -567
- package/src/slides/convert/master.ts +0 -198
- package/src/slides/convert/shapes.ts +0 -804
- package/src/slides/convert/svg.ts +0 -38
- package/src/slides/convert/walk.ts +0 -671
- package/src/slides/decks.ts +0 -110
- package/src/slides/open.ts +0 -18
- package/src/slides/package/fonts.ts +0 -301
- package/src/slides/package/motion.ts +0 -316
- package/src/slides/package/test-face.ts +0 -113
- package/src/teach/browser/compile.ts +0 -44
- package/src/teach/browser/dismiss.ts +0 -76
- package/src/teach/browser/focus-line.ts +0 -19
- package/src/teach/browser/glossary-filter.ts +0 -44
- package/src/teach/browser/head.ts +0 -30
- package/src/teach/browser/quiz.ts +0 -19
- package/src/teach/browser/reload.ts +0 -9
- package/src/teach/browser/sidebar.ts +0 -233
- package/src/teach/browser/theme.ts +0 -18
- package/src/teach/components/code.tsx +0 -24
- package/src/teach/components/heading.tsx +0 -11
- package/src/teach/components/list.tsx +0 -17
- package/src/teach/components/paragraph.tsx +0 -29
- package/src/teach/components/refs.tsx +0 -28
- package/src/teach/cross-references.ts +0 -78
- package/src/teach/fonts.ts +0 -16
- package/src/teach/highlight.ts +0 -71
- package/src/teach/html/jsx-dev-runtime.ts +0 -13
- package/src/teach/html/jsx-runtime.ts +0 -113
- package/src/teach/html/raw.ts +0 -28
- package/src/teach/lesson.ts +0 -178
- package/src/teach/nav.ts +0 -1337
- package/src/teach/render.ts +0 -240
- package/src/teach/workspace.ts +0 -1164
- 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
|
|
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
|
|
|
@@ -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.
|
|
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
|
|
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. **
|
|
34
|
-
2. **
|
|
35
|
-
3. **
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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.
|
package/docs/agents/audits.md
CHANGED
|
@@ -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
|
|
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
|
|
14
|
-
|
|
|
15
|
-
| `canon:create-rule`
|
|
16
|
-
| `canon:create-skill`
|
|
17
|
-
| `canon:write-doc`
|
|
18
|
-
| `canon:
|
|
19
|
-
| `canon:
|
|
20
|
-
| `canon:
|
|
21
|
-
| `canon:
|
|
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:
|
|
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:
|
|
29
|
-
| `canon:
|
|
30
|
-
| `canon:
|
|
31
|
-
| `canon:
|
|
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.
|
|
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
|
-
*
|
|
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 {
|
|
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
|
-
}
|
package/src/audits/catalog.ts
CHANGED
package/src/browser/engine.ts
CHANGED
|
@@ -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.
|
|
11
|
-
*
|
|
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
|
*/
|
package/src/capture/render.ts
CHANGED
|
@@ -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 `@/
|
|
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,
|