@erclx/canon 5.68.0 → 5.69.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 (92) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1 -1
  3. package/claude/.claude-plugin/plugin.json +1 -1
  4. package/claude/skills/app-drive/REQUIREMENT.md +5 -5
  5. package/claude/skills/app-drive/SKILL.md +14 -4
  6. package/claude/skills/app-drive/references/drive-record.md +12 -1
  7. package/claude/skills/canon-cli/SKILL.md +2 -2
  8. package/claude/skills/canon-feedback/REQUIREMENT.md +1 -1
  9. package/claude/skills/canon-feedback/SKILL.md +1 -1
  10. package/claude/skills/design-identity/REQUIREMENT.md +4 -4
  11. package/claude/skills/design-identity/SKILL.md +7 -7
  12. package/claude/skills/{pick-by-eye → design-pick}/REQUIREMENT.md +6 -6
  13. package/claude/skills/{pick-by-eye → design-pick}/SKILL.md +18 -10
  14. package/claude/skills/{pick-by-eye → design-pick}/references/board.md +17 -11
  15. package/claude/skills/design-pick/references/design-config.md +33 -0
  16. package/claude/skills/design-record/REQUIREMENT.md +2 -2
  17. package/claude/skills/design-record/SKILL.md +1 -1
  18. package/claude/skills/design-taste/REQUIREMENT.md +2 -2
  19. package/claude/skills/design-taste/SKILL.md +3 -3
  20. package/claude/skills/design-taste/references/preflight.md +1 -1
  21. package/claude/skills/git-issue/REQUIREMENT.md +1 -1
  22. package/claude/skills/git-issue/references/issue.md +1 -1
  23. package/claude/skills/plan-feature/SKILL.md +1 -1
  24. package/claude/skills/plan-feature/references/plan.md +21 -6
  25. package/claude/skills/plan-groundwork/SKILL.md +1 -1
  26. package/claude/skills/pr-evidence/references/evidence.md +2 -2
  27. package/claude/skills/role-orchestrator/references/orchestrator-launch.md +3 -3
  28. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +1 -1
  29. package/claude/skills/role-orchestrator/references/orchestrator-planning-wait.md +24 -0
  30. package/claude/skills/role-planner/SKILL.md +4 -2
  31. package/claude/skills/role-worker/SKILL.md +5 -6
  32. package/claude/skills/task-board/references/tasks.md +1 -1
  33. package/claude/skills/task-complete/references/receipt-sweep.md +1 -1
  34. package/claude/skills/{ux-audit → ui-audit}/REQUIREMENT.md +3 -3
  35. package/claude/skills/{ux-audit → ui-audit}/SKILL.md +7 -7
  36. package/claude/skills/ui-checklist/REQUIREMENT.md +1 -1
  37. package/claude/skills/ui-craft/SKILL.md +1 -1
  38. package/claude/skills/{ui-record → ui-film}/REQUIREMENT.md +2 -2
  39. package/claude/skills/{ui-record → ui-film}/SKILL.md +2 -2
  40. package/claude/skills/{ui-record → ui-film}/references/config.md +3 -3
  41. package/claude/skills/{ui-record → ui-film}/references/handoff.md +4 -4
  42. package/claude/skills/{ui-record → ui-film}/references/pr-clip.md +5 -5
  43. package/claude/skills/{ui-record → ui-film}/references/take-craft.md +1 -1
  44. package/claude/skills/{ux-measure → ui-measure}/REQUIREMENT.md +3 -3
  45. package/claude/skills/{ux-measure → ui-measure}/SKILL.md +6 -6
  46. package/docs/agents/audits.md +1 -1
  47. package/docs/agents/migrate.md +13 -13
  48. package/docs/target/migrations.md +12 -10
  49. package/docs/target/projects.md +1 -1
  50. package/docs/target/sync.md +1 -1
  51. package/docs/workflow/skill-map-on-request.md +1 -2
  52. package/docs/workflow/skill-map.md +9 -10
  53. package/docs/workflow/visual-design-workflow.md +6 -1
  54. package/governance/ledger/claude/background.md +26 -0
  55. package/governance/rules/claude/background.md +19 -0
  56. package/governance/stacks/base.toml +1 -0
  57. package/package.json +4 -4
  58. package/scripts/ci/install-playwright-deps.sh +52 -0
  59. package/src/claude/cases/authoring.ts +2 -2
  60. package/src/claude/cases/misc.ts +1 -1
  61. package/src/claude/cases/setup.ts +0 -5
  62. package/src/claude/cases/workflow.ts +6 -6
  63. package/src/commands/fixtures/gh.sh +64 -0
  64. package/src/commands/gov.ts +33 -3
  65. package/src/commands/migrate.ts +12 -2
  66. package/src/commands/tasks.ts +183 -0
  67. package/src/gate/stages.ts +2 -2
  68. package/src/gov/audit.ts +48 -11
  69. package/src/gov/detect.ts +1 -1
  70. package/src/markdown/scope.ts +9 -14
  71. package/src/migrate/record-layout.ts +5 -3
  72. package/src/migrate/skill-names.ts +21 -4
  73. package/src/records/validate.ts +1 -0
  74. package/src/sandbox/headless/dispatch-shim.sh +15 -0
  75. package/src/sandbox/headless/dispatch.ts +12 -14
  76. package/src/sandbox/stub-gh.sh +26 -0
  77. package/src/sandbox/stub-remote.ts +8 -29
  78. package/src/sync/engine.ts +1 -1
  79. package/src/take/camera.ts +2 -2
  80. package/src/take/film.ts +20 -2
  81. package/src/take/pointer.ts +2 -1
  82. package/src/take/stepper.ts +19 -5
  83. package/src/take/zoom/NOTICE.md +1 -1
  84. package/src/tasks/launch-wait.ts +160 -0
  85. package/tooling/claude/reference.md +1 -1
  86. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +0 -34
  87. package/claude/skills/canon-feedback-triage/SKILL.md +0 -98
  88. package/claude/skills/plan-ready/REQUIREMENT.md +0 -35
  89. package/claude/skills/plan-ready/SKILL.md +0 -136
  90. package/claude/skills/plan-ready/references/assembly.md +0 -75
  91. package/claude/skills/plan-ready/references/ready.md +0 -128
  92. /package/claude/skills/{pick-by-eye → design-pick}/references/live-arms.md +0 -0
@@ -75,8 +75,9 @@ The document opens with `# Feature: <short title>` and one paragraph stating wha
75
75
  | `## Current behavior` | each command run against the thing being changed and what it showed | When the change touches something that runs |
76
76
  | `## Constraints` | durable rules the work must respect | When supplied |
77
77
  | `## Files to touch` | each file with a one-line reason | Always |
78
- | `## Verbatim` | settled wording that lands unchanged in an existing file, one H3 per block | When wording is settled |
78
+ | `## Verbatim` | settled wording that lands unchanged in a file, one H3 per block | When wording is settled |
79
79
  | `## Design references` | the tracked design folders the change builds against, each with its surface | When Files to touch names a rendered-surface file |
80
+ | `## Reference images` | the untracked images the plan was shaped against, each from the main root | When an image shaped the plan |
80
81
  | `## Verification` | the test or command that proves each outcome | Always |
81
82
  | `## Risks` | conflicts, coupling, and the tricky spots | Always |
82
83
  | `## Review focus` | the inputs or states that would break the change, for the reviewer | Always |
@@ -166,22 +167,24 @@ Re-test a stamped constraint before honoring it, fetching and scoping the log in
166
167
  git fetch origin main --quiet && git log <commit>..origin/main --oneline -- <the paths the constraint names>
167
168
  ```
168
169
 
169
- ### Fan-in and ready constraints
170
+ ### Fan-in constraints
170
171
 
171
172
  A batch in a fan-in set declares its side in a constraint bullet, ``Fan-in member of `feature-<integrator>` `` on a member and ``Fans in `feature-<a>`, `feature-<b>` `` on the integrator. `batches.md` holds when to fan in, and `canon records validate plans` reports `fan-in-unmatched` for a set whose two sides disagree.
172
173
 
173
- A constraint naming a `.canon/ready/` folder is a third shape beside the hold and the shared path. It makes that folder's files the verbatim source for the paths this plan's `## Files to touch` lists, per `ready.md`, so the executing session copies those paths rather than authoring them.
174
-
175
174
  ### Verbatim
176
175
 
177
- A `## Verbatim` section carries wording someone settled, landing in an existing file exactly as written. Wording the planner only proposes stays a `- Suggested:` question, and a whole new file goes in the ready folder per `ready.md`, so the two never describe the same file.
176
+ A `## Verbatim` section carries wording someone settled, landing in a file exactly as written. Wording the planner only proposes stays a `- Suggested:` question, so the two never describe the same file.
178
177
 
179
178
  - Give each block an H3 naming it, then a lead sentence with the action, the full path, and the anchor, then a fenced `text` block holding the wording
180
- - Name the action as Add, Insert, or Replace. A Replace quotes the old line in the lead's code span.
179
+ - Name the action as Add, Insert, Replace, or Create. A Replace quotes the old line in the lead's code span.
181
180
  - Write the block as the project's formatter leaves it, since a formatter that re-pads a table row or rewraps a line makes the grep fail on correct text
182
181
  - Name the outcome in a grep bullet and put a command past 200 characters in a fenced `bash` block under it, since `S4` reports a longer bullet
183
182
  - Give each block one `## Verification` bullet running `grep -cF -e` on its whole first line against its file, so a reworded line fails a check the reviewer already runs.
184
183
 
184
+ A Create block makes a new file, so its lead names a path that does not exist yet and no anchor. Its grep bullet takes the first distinctive line, such as the `title:` line or the H1, since a markdown file opens on `---` and that line matches any file with frontmatter.
185
+
186
+ Keep a Create block to 80 lines. A longer new file goes in `## Files to touch` for the executing session to write, since a plan carrying a whole skill body costs every session that reads it.
187
+
185
188
  ### Design references
186
189
 
187
190
  A plan whose `## Files to touch` names a rendered-surface file (`.tsx`, `.jsx`, `.astro`, `.vue`, `.svelte`, `.html`, or `.css`) carries this section. It tells the building session which accepted design to open before it writes a line.
@@ -191,6 +194,14 @@ A plan whose `## Files to touch` names a rendered-surface file (`.tsx`, `.jsx`,
191
194
  - Cite a tracked folder only, since the building session opens its light and dark images and its frame HTML from the working tree
192
195
  - `canon records validate plans` reports `section-missing` for a plan that names a rendered-surface file and omits the section
193
196
 
197
+ ### Reference images
198
+
199
+ A plan shaped against an image no tracked folder holds carries this section, such as drive evidence, an image in an intake item, or a design board frame. It tells the building session which images to open before its first edit, and it stays apart from `## Design references`, which cites tracked folders alone.
200
+
201
+ - Give each entry an image path and what the image shows, as one bullet
202
+ - Write each path from the main worktree root, since these images are gitignored and a linked worktree holds no copy. A path relative to a linked worktree resolves nowhere.
203
+ - Leave the section out when no image shaped the plan. It is optional, and `canon records validate plans` reports nothing on a plan without it.
204
+
194
205
  ### Verification
195
206
 
196
207
  Every outcome reaches the review with its proof named.
@@ -325,6 +336,10 @@ Add as <where> in `<path/to/file>`, after <anchor>.
325
336
 
326
337
  - `canon/design/<surface>/`: <the surface it governs>
327
338
 
339
+ ## Reference images
340
+
341
+ - `.canon/intake/<nn>-<slug>/evidence/<name>.png`: <what the image shows>
342
+
328
343
  ## Verification
329
344
 
330
345
  ### <Outcome group>
@@ -37,7 +37,7 @@ Write only inside `.canon/groundwork/<nn>-<slug>/`. A feature plan, source chang
37
37
 
38
38
  What a spike produces stays inside the track, under `.canon/groundwork/<nn>-<slug>/evidence/`, which the first rule already permits. Mode detection matches only top-level entries, so a nested folder cannot be mistaken for a track, and scratch holds only what can be deleted without loss.
39
39
 
40
- A `pick-by-eye` run invoked from inside a live track follows its own branch for this. It writes its renders to `evidence/` here, and drafts its candidates as pages on the Frameboard board at `.canon/canvas/` that its close deletes.
40
+ A `design-pick` run invoked from inside a live track follows its own branch for this. It writes its renders to `evidence/` here, and drafts its candidates as pages on the Frameboard board `design-pick` resolves, where its close removes the round. On a board `canon/config/design.toml` names, the close keeps the picked page.
41
41
 
42
42
  ### Reading and backing
43
43
 
@@ -63,9 +63,9 @@ canon pr evidence <number> --check --json
63
63
  - Skip filming when the record's `reel.head` is a prefix of the `tip` that `canon pr head <number> --json` reports, since the posted reel already shows this head
64
64
  - With no checklist from either source, skip silently, since nothing names an interaction to film
65
65
 
66
- Invoke `canon:ui-record` in pull request mode, passing the number, the local `url`, and the checklist. It films, checks each beat's closing still, pushes the reel to `canon/frames`, and hands back a `link` or a skip reason.
66
+ Invoke `canon:ui-film` in pull request mode, passing the number, the local `url`, and the checklist. It films, checks each beat's closing still, pushes the reel to `canon/frames`, and hands back a `link` or a skip reason.
67
67
 
68
- Report it rather than proceeding silently when `canon:ui-record` does not resolve, and post the evidence without a reel.
68
+ Report it rather than proceeding silently when `canon:ui-film` does not resolve, and post the evidence without a reel.
69
69
 
70
70
  - Hold a `link` for the evidence step, which embeds it under the addresses
71
71
  - Hold a skip's reason and message for the closing report. A skip never stops the chain, and a reel already on the comment carries forward under the older head it names.
@@ -117,7 +117,7 @@ No branch and no worktree exist here and none is created. A planner writes one g
117
117
  claude --bg --model <model> -n "planner-<project>-<slug>" "Run /canon:role-planner, then /canon:plan-feature <task>. Your controller is the session whose sessionId is <dispatcher-id>. Resolve its current name from that id through canon sessions list --json, which carries sessionId per row, at the moment you send, and never resolve an addressee by name prefix. Message it when the plan lands, carrying the path and what the task file got wrong, and message it again if you stop on a question."
118
118
  ```
119
119
 
120
- `<task>` is the row's task file path and `<slug>` the slug its plan will take, resolved off the row. `<dispatcher-id>`, `<model>`, and `<project>` resolve as above, and the prefix reads `planner-` because it marks the role of the session it names.
120
+ `<task>` is the row's task file path and `<slug>` the slug its plan will take, resolved off the row. `<dispatcher-id>`, `<model>`, and `<project>` resolve as above, and the prefix reads `planner-` because it marks the role of the session it names. Then wait per `orchestrator-planning-wait.md`.
121
121
 
122
122
  ### Which checks bind
123
123
 
@@ -131,9 +131,9 @@ What a planning dispatch owes instead is the reverse reading, since a row planne
131
131
 
132
132
  ### One row per dispatch
133
133
 
134
- A session reused across a batch pays the context load once and ages its picture of the tree while it works, which is why the in-flight read sits on the task rather than the batch. One that compacts mid-batch loses the reasoning behind its earlier plans with nothing reporting it.
134
+ A reused session pays the context load once and ages its picture of the tree, which is why the in-flight read sits on each row. One that compacts loses the reasoning behind its earlier plans unreported, so `role-planner` stops it when the operator ends it or a compaction nears.
135
135
 
136
- Cap a reused session where the saving is worth it and say what the cap was.
136
+ Hold all planning of a row any talk session has said by message it is planning, a drive session included, whether by a launch or by `plan-feature` here, unless the operator asks for a cold planner. That session holds what the operator said about the row, and plans a filed row only once it is named back to it.
137
137
 
138
138
  ## Dispatch a talk session
139
139
 
@@ -95,7 +95,7 @@ A local formatter removing the shape on contact says nothing about a target runn
95
95
 
96
96
  ## The plan half
97
97
 
98
- Plan what the pass clears, and any `## Needs a plan` row whose only blocker is the missing plan. This pass runs while workers build and the session is idle, when planning costs the critical path nothing, and a row cleared with no plan is looked at again next pass.
98
+ Plan what the pass clears, and any `## Needs a plan` row whose only blocker is the missing plan, skipping a row a talk session holds per `orchestrator-launch.md`. This pass runs while workers build and the session is idle, when planning costs the critical path nothing, and a row cleared with no plan is looked at again next pass.
99
99
 
100
100
  - Run `plan-feature` for each, carrying the constraint per in-flight track that `## The loop` in `role-orchestrator` requires
101
101
  - Verify each plan against the tree the way that step does, since several branches are already changing it
@@ -0,0 +1,24 @@
1
+ ---
2
+ title: Orchestrator planning wait
3
+ description: How the orchestrator waits in the background on a row whose plan a planner is still writing, through canon tasks launchable, and how it branches on the record the wait ends on
4
+ ---
5
+
6
+ A row whose plan a planner is still writing has nothing to dispatch yet. Run the wait in the background rather than grepping the task file on a loop, and act on the wake:
7
+
8
+ ```bash
9
+ canon tasks launchable <task> --wait --json
10
+ ```
11
+
12
+ The verb resolves the task's `Plan:` line and runs the `plan-answers` gate on the plan it names, re-reading every 30 seconds for up to 1800 seconds by default. It keys on the line rather than the plan file. A planner links a plan only after it validates, so a half-written plan never wakes the loop.
13
+
14
+ ## Branch on the record
15
+
16
+ Branch on the record's `reason` rather than on the exit code, which a shell function wrapping `canon` can flatten to zero.
17
+
18
+ - `launchable`: the plan waits on nobody, so run `${CLAUDE_SKILL_DIR}/references/orchestrator-dispatch.md` from the candidate on, since the wait never reads the branch or the conflict check
19
+ - `timeout`: read `plan` and `open` off the last reading, then act on which one held the row
20
+ - No `plan` means nothing was linked in time, so check the planner is still live and re-arm the wait
21
+ - A non-empty `open` names the questions holding the row, so report each label and reason to the operator, then re-arm the wait
22
+ - A refusal such as `several-plans`, `archived`, or `no-match` means the row cannot launch as it stands, so name the reason and fall back to the human
23
+
24
+ A one-shot read without `--wait` reports `reason: unlinked`, `open`, or `launchable` at once. It suits a pass that only needs the row's state now.
@@ -86,10 +86,11 @@ Each finding in that file opens with the bold source-and-date label that `${CLAU
86
86
 
87
87
  ## The channel
88
88
 
89
- The controlling session cannot watch this one read, so two messages are owed and nothing else.
89
+ The controlling session cannot watch this one read, so the messages below are owed and nothing else.
90
90
 
91
91
  - Announce the record as the file lands, carrying its path and what the task file got wrong. Write no summary beside it, which is a second account of a document the reader is about to open.
92
92
  - Send a block out as a message before it becomes an interactive prompt.
93
+ - Name the handed rows still unplanned when a reused session stops under `## Lifetime`
93
94
  - Send nothing on progress, which rebuilds on this side the poll the announcement retires on the other
94
95
 
95
96
  ### Addressing
@@ -120,5 +121,6 @@ The operator being present is an assumption the launch carries. A talk planner w
120
121
  ## Lifetime
121
122
 
122
123
  - The role runs from the launch to the record landing, and the operator closes a talk session. A session handed a second row works it under the same role and reads the tree again for it.
123
- - A reused session's picture of the tree ages, and it nears a compaction that silently drops the reasoning behind its earlier records. Cap a reused session rather than letting it run the board.
124
+ - A reused session's picture of the tree ages, and a compaction silently drops the reasoning behind its earlier records
125
+ - Run the in-flight read again before each handed row, and stop when the operator ends the session or a compaction nears, telling the controller which rows are still unplanned
124
126
  - Treat this body as possibly older than the branch under it. A plugin skill loads from the marketplace cache rather than from the working tree.
@@ -18,17 +18,16 @@ This body states the role, the boundaries, and the channel, and starts no step o
18
18
 
19
19
  ## Where the session stands
20
20
 
21
- - Resolve `.canon/plans/`, `.canon/tasks/`, `.canon/review/`, and `.canon/ready/` at the main worktree root, never the linked worktree. Being gitignored, they are absent there rather than empty.
21
+ - Resolve `.canon/plans/`, `.canon/tasks/`, and `.canon/review/` at the main worktree root, never the linked worktree. Being gitignored, they are absent there rather than empty.
22
22
  - Report a plan that fails to resolve as unreadable from here, naming the main-root path. Reporting the task as having no plan is wrong about the world, and a reader cannot tell the two apart.
23
23
  - Build the plan the launch named. Never write a second one when the path fails to resolve, since a row citing a plan already has one.
24
24
  - Load `ui-craft` before editing a rendered surface, pointer rule or not
25
25
  - Keep a task list from launch, one item per slice, and tick each as its slice lands. Skip it on a host that offers no list tool, since the list is for the operator watching and not a gate.
26
26
 
27
- ### Ready folders and the draft mark
27
+ ### The draft mark
28
28
 
29
- A ready folder and the draft mark each carry work another session already did, so this one preserves both.
29
+ The draft mark holds the merge until the reviews close, so this session preserves it.
30
30
 
31
- - Copy a ready folder's files verbatim to the paths its plan's `**Constraints:**` block names, editing only what the gate or the overview's list requires, since a rewrite discards the handoff
32
31
  - The ship chain marks the pull request a draft, and only `canon pr lift` or the operator un-marks it
33
32
  - Report a flag reading ready once and leave it. It passed every gate the verb reads or a person readied it, which GitHub requires before a merge, so re-drafting fights them.
34
33
  - Leave the lift to the reviewers, who run `canon pr lift` on their close, with the controlling session as fallback
@@ -53,9 +52,9 @@ Run `canon pr drive-copy --json` before starting `dev`. On `copied`, start it wi
53
52
 
54
53
  A hand-run `git-ship` or `git-pr` starts no server, since only a worker has a lifetime to own one.
55
54
 
56
- ### Building against a design reference
55
+ ### Building against design references and images
57
56
 
58
- A plan carrying a `**Design references:**` section names the accepted design for the surface it changes. Open it before building, since the build matches it and a worker that reads the dark image alone ships a light theme nobody saw.
57
+ A plan's `## Design references` names the accepted design per surface, and `## Reference images` names images it was shaped against by main-root path. Either can appear alone. Open both before building, since a worker reading the dark image alone ships a light theme nobody saw.
59
58
 
60
59
  - Open each cited folder's light and dark images and its frame HTML before the first edit to that surface
61
60
  - Take sizes, spacing, and colors from the frame HTML rather than from the image
@@ -141,7 +141,7 @@ A task with no origin is lost context or work nobody decided to do. The reverse
141
141
 
142
142
  - Write the path relative to `.canon/tasks/`, as `../plans/`, `../groundwork/`, and `../intake/`. A path from the project root resolves to nothing in an editor rooted there.
143
143
  - `Issue:` stays a bare `#NNN`, since a full URL writes the remote into a gitignored file. Several issues list comma-separated, each getting a `git-pr` closing line.
144
- - `Ready:` links `../ready/<nn>-<slug>/`, the folder the plan copies from, only when it exists. `canon tasks archive` reads it to move the folder, falling back to a path in the plan.
144
+ - `Ready:` is a line older tasks carry, linking `../ready/<nn>-<slug>/`. No new task gains one, and `canon tasks archive` still reads it to move and retarget the folder.
145
145
 
146
146
  ### The `Plan:` line
147
147
 
@@ -37,7 +37,7 @@ A branch report is read once, by the session addressing it. The durable record i
37
37
 
38
38
  ### What stays
39
39
 
40
- Do not sweep `ux-audit-*.md` or `ux-measure-*.md`, which are standalone deliverables. They sit at `.canon/review/` itself rather than under a producer folder, so the glob never reaches them.
40
+ Do not sweep `ui-audit-*.md` or `ui-measure-*.md`, which are standalone deliverables. They sit at `.canon/review/` itself rather than under a producer folder, so the glob never reaches them.
41
41
 
42
42
  Output one line per file swept:
43
43
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: ux-audit
2
+ name: ui-audit
3
3
  description: Why UI roughness is reported against stated intent rather than taste, and why the audit observes without fixing
4
4
  ---
5
5
 
6
- # UX audit requirement
6
+ # UI audit requirement
7
7
 
8
8
  ## Gap
9
9
 
@@ -33,4 +33,4 @@ The pass slides into fixing what it finds, and then the audit and the change lan
33
33
  - Feature planning, which `plan-feature` owns
34
34
  - Verifying one specific change, which `ui-checklist` owns
35
35
  - Defining the intent it audits against, which the design document owns
36
- - Measuring what a running interface costs to paint, block, or shift, which `ux-measure` owns, while contrast stays here as two color values off the stylesheet
36
+ - Measuring what a running interface costs to paint, block, or shift, which `ui-measure` owns, while contrast stays here as two color values off the stylesheet
@@ -1,16 +1,16 @@
1
1
  ---
2
- name: ux-audit
3
- description: Audits the current UI for incomplete, inconsistent, or confusing patterns. Reads DESIGN.md for intent, scans UI files, and outputs observations grouped by surface. Use when asked "audit the UX", "audit the UI", "UX audit", or "find UI roughness". Do NOT use for new feature planning or code changes, and do NOT use to measure what a running interface costs to paint, which is `ux-measure`.
2
+ name: ui-audit
3
+ description: Audits the current UI for incomplete, inconsistent, or confusing patterns. Reads DESIGN.md for intent, scans UI files, and outputs observations grouped by surface. Use when asked "audit the UX", "audit the UI", "UX audit", or "find UI roughness". Do NOT use for new feature planning or code changes, and do NOT use to measure what a running interface costs to paint, which is `ui-measure`.
4
4
  metadata:
5
5
  family: check
6
6
  ---
7
7
 
8
- # UX audit
8
+ # UI audit
9
9
 
10
10
  ## Guards
11
11
 
12
12
  - If no UI files exist in the project (no JSX, TSX, Vue, Svelte, or HTML under `src/`), stop: `❌ No UI surfaces found to audit.`
13
- - If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `ux-measure`, since this skill reads source and reaches no number a browser produces
13
+ - If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `ui-measure`, since this skill reads source and reaches no number a browser produces
14
14
  - Contrast is the exception and stays here, since two color values in the stylesheet's custom properties compute it, and the design document's lead names that stylesheet
15
15
 
16
16
  ## Step 1: read context
@@ -65,7 +65,7 @@ If nothing is wrong, use: `✅ No observations.`
65
65
 
66
66
  Derive `<slug>` per `${CLAUDE_SKILL_DIR}/../git-branch/references/slug.md`. Fall back to `latest` on an empty result.
67
67
 
68
- - Write the full report to `.canon/review/ux-audit-<slug>.md` at the main worktree root, resolved the way `session-worktree` does, creating the directory if needed and always overwriting
68
+ - Write the full report to `.canon/review/ui-audit-<slug>.md` at the main worktree root, resolved the way `session-worktree` does, creating the directory if needed and always overwriting
69
69
  - The report is a main-root write, so it goes out as a heredoc, routed the way `session-worktree` states
70
70
  - With no observations, write `✅ No observations.` to the file with a timestamp
71
71
  - `.canon/review/` is gitignored, so do not stage or commit the file
@@ -76,7 +76,7 @@ Output only the summary line and the file path. Do not repeat the full report in
76
76
 
77
77
  ```plaintext
78
78
  X observations across N surfaces.
79
- 📝 Wrote .canon/review/ux-audit-<slug>.md
79
+ 📝 Wrote .canon/review/ui-audit-<slug>.md
80
80
  ```
81
81
 
82
- If no observations: `✅ No observations. Wrote .canon/review/ux-audit-<slug>.md`
82
+ If no observations: `✅ No observations. Wrote .canon/review/ui-audit-<slug>.md`
@@ -28,7 +28,7 @@ A file under a gitignored folder is unreadable to a pull request reviewer, and a
28
28
 
29
29
  ## Out of scope
30
30
 
31
- - Judging whether the UI is any good, which `ux-audit` owns
31
+ - Judging whether the UI is any good, which `ui-audit` owns
32
32
  - The rules for choosing a test layer, which `test-craft` owns
33
33
  - Writing the test itself, which `test-first` owns
34
34
  - Posting the checklist, which `pr-evidence` owns as the sole consumer of the handoff file
@@ -40,5 +40,5 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
40
40
  - How a surface looks, being the layer order, the coherence locks, and the defaults a model reaches for: `design-taste`
41
41
  - The accepted designs under the design folder and how a reference lands there: `design-record`
42
42
  - The visual checklist a reviewer reads beside the screenshots: `ui-checklist`
43
- - Reading source for roughness a rule does not state: `ux-audit`
43
+ - Reading source for roughness a rule does not state: `ui-audit`
44
44
  - Prose on the surface beyond its interface copy: the `write-human` skill
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: ui-record
2
+ name: ui-film
3
3
  description: Why recording a web app runs from beats the operator approved, one take per action, and stops at the clip a HyperFrames composition reads
4
4
  ---
5
5
 
6
- # UI record requirement
6
+ # UI film requirement
7
7
 
8
8
  ## Gap
9
9
 
@@ -1,11 +1,11 @@
1
1
  ---
2
- name: ui-record
2
+ name: ui-film
3
3
  description: Records real footage of a project's own web app for a video. Drafts a plain beat list from the ask, a HyperFrames storyboard, or a `ui-checklist`, gets the operator's approval, writes the take plan, films each beat through `canon take` as a sharp 4K clip with a click log and a per-frame camera track, and hands the set to HyperFrames to compose. Use when asked to "record the app", "film a demo of this feature", "get footage for the launch video", "record a clip for the pull request", or "shoot the takes for this storyboard". Do NOT use to compose, caption, or render the video, which HyperFrames owns, to drive a pull request's checklist, which is `review-ui`, or to drive the app looking for defects, which is `app-drive`.
4
4
  metadata:
5
5
  family: generate
6
6
  ---
7
7
 
8
- # UI record
8
+ # UI film
9
9
 
10
10
  A take is real footage of the app doing one thing, filmed so the edit can zoom into it without going soft. This skill turns an ask into beats the operator approves in plain words, films one take per beat, and hands HyperFrames the clips, the logs, and the camera tracks. Canon renders nothing past the clip.
11
11
 
@@ -1,11 +1,11 @@
1
1
  ---
2
- title: UI record config
2
+ title: UI film config
3
3
  description: What a take reads from canon/config/app-drive.toml, the access key it adds, and what to ask when the file is absent
4
4
  ---
5
5
 
6
- # UI record config
6
+ # UI film config
7
7
 
8
- Read at Step 1 of `ui-record`. A take shares its project's drive config at `canon/config/app-drive.toml` rather than keeping a second file, since both build and serve the same app. The skill reads the file and never writes it.
8
+ Read at Step 1 of `ui-film`. A take shares its project's drive config at `canon/config/app-drive.toml` rather than keeping a second file, since both build and serve the same app. The skill reads the file and never writes it.
9
9
 
10
10
  ```toml
11
11
  launch = "bun install --frozen-lockfile && bun run build && PREVIEW_PORT=4530 bun run preview"
@@ -1,11 +1,11 @@
1
1
  ---
2
- title: UI record handoff
2
+ title: UI film handoff
3
3
  description: What HyperFrames receives from a take, the shape of the click log and camera track, and how a composition applies the camera and draws the cursor
4
4
  ---
5
5
 
6
- # UI record handoff
6
+ # UI film handoff
7
7
 
8
- Read at Step 5 of `ui-record`. Canon stops at the clip, and a HyperFrames composition does the rest. This file states what the composition receives and how it uses each part, so a session composing later needs nothing from the session that filmed.
8
+ Read at Step 5 of `ui-film`. Canon stops at the clip, and a HyperFrames composition does the rest. This file states what the composition receives and how it uses each part, so a session composing later needs nothing from the session that filmed.
9
9
 
10
10
  ## What the takes folder holds
11
11
 
@@ -40,7 +40,7 @@ bunx -y hyperframes init .canon/video/<slug>/composition
40
40
  ```
41
41
 
42
42
  - Use `bunx` when bun is available, falling back to `npx -y hyperframes init ...` otherwise
43
- - Prefix the path with the main worktree root when running from a linked worktree, as `ui-record`'s write scope states
43
+ - Prefix the path with the main worktree root when running from a linked worktree, as `ui-film`'s write scope states
44
44
  - Read each clip from `../takes/<dir>/clip.mp4`, relative to the project, rather than copying it in
45
45
  - Leave renders in the project's `renders/` folder, which `canon records push` skips along with `takes/`, `snapshots/`, `node_modules/`, and any video file
46
46
  - An image the composition adds under `assets/`, such as a logo, is backed up with the project's source
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: Pull request clip
3
- description: Pull request mode of ui-record, run for pr-evidence with no operator present, covering the beat choice from the checklist, the length cap, the still check that stands in for approval, the reel flag, and the push to the frames branch
3
+ description: Pull request mode of ui-film, run for pr-evidence with no operator present, covering the beat choice from the checklist, the length cap, the still check that stands in for approval, the reel flag, and the push to the frames branch
4
4
  ---
5
5
 
6
6
  # Pull request clip
7
7
 
8
- Read at the top of `ui-record` when the caller names pull request mode. `pr-evidence` is the only caller, passing the pull request number, the `url` its `canon pr local` read returned, and the checklist text.
8
+ Read at the top of `ui-film` when the caller names pull request mode. `pr-evidence` is the only caller, passing the pull request number, the `url` its `canon pr local` read returned, and the checklist text.
9
9
 
10
10
  This mode films a short reel of what the checklist asks a reviewer to try, hosts it on `canon/frames`, and hands back the link or the reason it skipped.
11
11
 
@@ -25,7 +25,7 @@ The mode holds only while the caller names it. An ordinary run that finds a pull
25
25
  - Skip Step 1's throwaway copy. Film the address the caller passed, joined to the config's `access` value, and start no server.
26
26
  - Skip Step 2's approval. The beats come from a checklist a reviewer already reads, and the still check below is the guard against posting a wrong take.
27
27
  - Skip Step 5's handoff and its output block, since the reel is the product and HyperFrames composes nothing here
28
- - Write inside `.canon/tmp/ui-record/pr-<number>/` at the current worktree's root in place of the video workspace, since a reel is thrown away once posted
28
+ - Write inside `.canon/tmp/ui-film/pr-<number>/` at the current worktree's root in place of the video workspace, since a reel is thrown away once posted
29
29
  - Ask nothing at any step. Every stop below is a skip with a reason, since the ship chain runs this with nobody to answer.
30
30
 
31
31
  ## Choose the beats
@@ -43,7 +43,7 @@ Keep the whole reel at or under 12 seconds. Each beat opens and closes on a 0.6
43
43
  ## Film the reel
44
44
 
45
45
  ```bash
46
- canon take <url> .canon/tmp/ui-record/pr-<number>/plan.json --out .canon/tmp/ui-record/pr-<number>/takes --reel .canon/tmp/ui-record/pr-<number>/reel.webp --json
46
+ canon take <url> .canon/tmp/ui-film/pr-<number>/plan.json --out .canon/tmp/ui-film/pr-<number>/takes --reel .canon/tmp/ui-film/pr-<number>/reel.webp --json
47
47
  ```
48
48
 
49
49
  Branch on the record's `reason`, never on the exit code.
@@ -69,7 +69,7 @@ Open each beat's `still.jpg`, the closing frame the record names in its `still`
69
69
  Stamp the pass in compact UTC and push the file:
70
70
 
71
71
  ```bash
72
- canon pr frames <number> --reel .canon/tmp/ui-record/pr-<number>/reel.webp --pass "$(date -u +%Y%m%dT%H%M%SZ)" --json
72
+ canon pr frames <number> --reel .canon/tmp/ui-film/pr-<number>/reel.webp --pass "$(date -u +%Y%m%dT%H%M%SZ)" --json
73
73
  ```
74
74
 
75
75
  - `ok`: hold the record's `link`
@@ -5,7 +5,7 @@ description: The filming rules a take plan follows, the frame-stepping limits, a
5
5
 
6
6
  # Take craft
7
7
 
8
- Read at Step 3 of `ui-record`, before writing the first beat. `canon take --help` carries every step kind, the target forms, and each refusal code, so this file carries the judgment and leaves the vocabulary to the verb.
8
+ Read at Step 3 of `ui-film`, before writing the first beat. `canon take --help` carries every step kind, the target forms, and each refusal code, so this file carries the judgment and leaves the vocabulary to the verb.
9
9
 
10
10
  ## Contents
11
11
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: ux-measure
2
+ name: ui-measure
3
3
  description: Why a rendering cost question is answered with a number against a published threshold, and why the runner is detected rather than prescribed
4
4
  ---
5
5
 
6
- # UX measure requirement
6
+ # UI measure requirement
7
7
 
8
8
  ## Gap
9
9
 
@@ -29,7 +29,7 @@ A session that does start one picks a runner on the spot, takes one noisy load,
29
29
 
30
30
  ## Out of scope
31
31
 
32
- - Judging the interface against stated intent, and contrast, which `ux-audit` owns from the stylesheet's color values
32
+ - Judging the interface against stated intent, and contrast, which `ui-audit` owns from the stylesheet's color values
33
33
  - Writing behavioral tests against the interface, which `test-first` and `test-craft` own
34
34
  - Network waterfall, bundle size, and accessibility, which no skill measures
35
35
  - Fixing what the reading found, which a separate change owns
@@ -1,11 +1,11 @@
1
1
  ---
2
- name: ux-measure
3
- description: Measures paint, processor, and layout cost against a running interface and reports numbers against published thresholds. Detects the project's existing browser harness rather than requiring one. Use when asked "how fast is this page", "measure the UI", "what does this cost to render", "check Core Web Vitals", or "profile the interface". Do NOT use to judge UI quality by reading source, which is `ux-audit`.
2
+ name: ui-measure
3
+ description: Measures paint, processor, and layout cost against a running interface and reports numbers against published thresholds. Detects the project's existing browser harness rather than requiring one. Use when asked "how fast is this page", "measure the UI", "what does this cost to render", "check Core Web Vitals", or "profile the interface". Do NOT use to judge UI quality by reading source, which is `ui-audit`.
4
4
  metadata:
5
5
  family: check
6
6
  ---
7
7
 
8
- # UX measure
8
+ # UI measure
9
9
 
10
10
  Report numbers. A sentence about what the source looks like is what this exists to replace, so every finding is a reading beside the threshold it is measured against.
11
11
 
@@ -13,7 +13,7 @@ Report numbers. A sentence about what the source looks like is what this exists
13
13
 
14
14
  - If the project names no command that serves an interface and the user names no URL, stop: `❌ Nothing to serve. Name a running URL or a command that starts one.`
15
15
  - Test for a servable interface rather than source under a folder, since this measures what a browser receives and never reads the tree behind it
16
- - If the request is about intent, consistency, missing states, or contrast, run nothing and name `ux-audit`. That skill reads source and this one runs the interface.
16
+ - If the request is about intent, consistency, missing states, or contrast, run nothing and name `ui-audit`. That skill reads source and this one runs the interface.
17
17
 
18
18
  ## Step 1: reach the interface
19
19
 
@@ -116,7 +116,7 @@ Report the reading and stop there. A remedy is a change with its own review, so
116
116
 
117
117
  Derive `<slug>` per `${CLAUDE_SKILL_DIR}/../git-branch/references/slug.md`. Fall back to `latest` on an empty result.
118
118
 
119
- - Write the full reading to `.canon/review/ux-measure-<slug>.md` at the main worktree root, resolved the way `session-worktree` does, creating the directory if needed and always overwriting
119
+ - Write the full reading to `.canon/review/ui-measure-<slug>.md` at the main worktree root, resolved the way `session-worktree` does, creating the directory if needed and always overwriting
120
120
  - The reading is a main-root write, so it goes out as a heredoc, routed the way `session-worktree` states
121
121
  - `.canon/review/` is gitignored, so do not stage or commit the file
122
122
 
@@ -126,5 +126,5 @@ Output the summary line and the file path. Do not repeat the table in chat.
126
126
 
127
127
  ```plaintext
128
128
  3 metrics measured against <url>. <n> past threshold.
129
- 📝 Wrote .canon/review/ux-measure-<slug>.md
129
+ 📝 Wrote .canon/review/ui-measure-<slug>.md
130
130
  ```
@@ -79,7 +79,7 @@ An audit that finds no corpus reports `absent`, which moves neither the verdict
79
79
  | `secrets` | `canon secrets scan` | Credential-shaped values in the shipped tree | Gates |
80
80
  | `labels` | `canon labels audit` | Changed paths no row of the label map reaches | Reports |
81
81
  | `restated` | `canon gov restated` | Instructions `CLAUDE.md` states that a second surface states too | Reports |
82
- | `rules` | `canon gov audit` | Rules past a shape limit, and here outside-practice rules short of a source ledger | Reports |
82
+ | `rules` | `canon gov audit` | Rules past a shape limit, and here rules short of a ledger or out of step with one | Reports |
83
83
  | `counts` | `canon gov counts` | Sentences stating a closed catalog's size that disagree with the tree | Reports |
84
84
  | `census` | `canon census` | File count, extension breakdown, and line total | Reports |
85
85
  | `deps` | `canon deps audit` | Advisories against the resolved dependencies | Reports |
@@ -8,22 +8,22 @@ kind: reference
8
8
 
9
9
  `canon migrate <verb>` moves a project off a retired name or layout. Each verb reports its plan and writes nothing until `--write`, takes `--json`, and, except `rename`, takes `--root`. A second run rewrites nothing, which confirms the exclusions and markers fired.
10
10
 
11
- | Verb | Moves |
12
- | ------------------ | --------------------------------------------------------------------------------------------------------------- |
13
- | `status` | Nothing. It lists every migration the project still needs, in run order. |
14
- | `rename` | The retired `aitk` name. `--scope target` rewrites toolkit-owned folders only. |
15
- | `skill-names` | Plugin skills off their `claude-` and `draft-` prefixes and other retired names, with every citation |
16
- | `records` | Session records from `.claude/` to `.canon/`, with every tracked citation |
17
- | `surface-roots` | Records such as `context/` and `REQUIREMENTS.md`, and the stamp folder, from `.claude/` to `canon/` by `git mv` |
18
- | `record-tree` | Citations inside the `.canon/` folders a session still follows, listed below the table |
19
- | `rule-layout` | A flat installed-rule layout onto the `canon/`-wrapped one |
20
- | `scratch-evidence` | A folder a durable record cites out of `.tmp/`, with its citations |
21
- | `record-layout` | Review receipts, memory archives, feedback, renders, picks, and evidence into their current folders |
22
- | `session-defaults` | The seeded session defaults into an existing `.claude/settings.json`, listed below the table |
11
+ | Verb | Moves |
12
+ | ------------------ | --------------------------------------------------------------------------------------------------------------------- |
13
+ | `status` | Nothing. It lists every migration the project still needs, in run order. |
14
+ | `rename` | The retired `aitk` name. `--scope target` rewrites toolkit-owned folders only. |
15
+ | `skill-names` | Plugin skills off their `claude-` and `draft-` prefixes and other retired names, with every citation |
16
+ | `records` | Session records from `.claude/` to `.canon/`, with every tracked citation |
17
+ | `surface-roots` | Records such as `context/` and `REQUIREMENTS.md`, and the stamp folder, from `.claude/` to `canon/` by `git mv` |
18
+ | `record-tree` | Citations inside the `.canon/` folders a session still follows, listed below the table |
19
+ | `rule-layout` | A flat installed-rule layout onto the `canon/`-wrapped one |
20
+ | `scratch-evidence` | A folder a durable record cites out of `.tmp/`, with its citations |
21
+ | `record-layout` | Review receipts, memory archives, feedback, renders, picks, evidence, and the design board into their current folders |
22
+ | `session-defaults` | The seeded session defaults into an existing `.claude/settings.json`, listed below the table |
23
23
 
24
24
  `record-tree` follows citations in `diagrams`, `memory`, `plans`, `proposals`, `review`, `tasks`, and `teach`. `session-defaults` denies `Agent`, `Task`, and both merge commands, and turns auto memory off. The bullets below add detail per verb.
25
25
 
26
- - `skill-names` takes no `--scope`, and skips the changelog, eval transcripts, and the pointer each renamed `draft-` skill leaves at its old name
26
+ - `skill-names` takes no `--scope`, and skips the changelog, eval transcripts, replay fixtures, and the pointer each renamed `draft-` skill leaves at its old name
27
27
  - `surface-roots` moves `context/`, `wireframes/`, `ARCHITECTURE.md`, `REQUIREMENTS.md`, `DESIGN.md`, and the stamp folder, and leaves `rules/`, `skills/`, `hooks/`, and `settings.json` in place
28
28
  - `rule-layout` classifies each flat file against the stamp as clean, edited, or unclaimed. Clean and edited files move untouched, and an unclaimed name stays.
29
29
  - `record-layout` labels each evidence folder `(pick)` or `(evidence)` in the dry run
@@ -48,9 +48,7 @@ Run it once, ahead of `canon gov sync` or `canon gov install`.
48
48
 
49
49
  ## Rename the skill citations, once
50
50
 
51
- Plugin skills dropped their `claude-` prefix, so `canon:claude-docs` answers as `canon:context-fold` and `canon:claude-tasks` as `canon:task-board`. The five per-kind drafters merged into `write-doc`, and no pointer under an old name ships. <!-- canon-keep-retired -->
52
-
53
- The seven `draft-` skills took verb-first names for what each makes. `canon migrate skill-names --write` carries a project across, and a pointer under each old name answers a typed invocation until it retires.
51
+ Plugin skills dropped their `claude-` prefix, so `canon:claude-docs` is now `canon:context-fold`. Five drafters merged into `write-doc`, seven `draft-` skills took verb-first names, and four joined their family. No old name keeps a pointer, and `canon migrate skill-names --write` moves a project. <!-- canon-keep-retired -->
54
52
 
55
53
  | Old name | New name |
56
54
  | ------------------ | ----------------------------------------------- |
@@ -58,17 +56,21 @@ The seven `draft-` skills took verb-first names for what each makes. `canon migr
58
56
  | `draft-figure` | `draw-figure` <!-- canon-keep-retired --> |
59
57
  | `draft-identity` | `design-identity` <!-- canon-keep-retired --> |
60
58
  | `draft-slides` | `make-deck` <!-- canon-keep-retired --> |
61
- | `draft-and-pick` | `pick-by-eye` <!-- canon-keep-retired --> |
59
+ | `draft-and-pick` | `design-pick` <!-- canon-keep-retired --> |
62
60
  | `draft-ready` | `plan-ready` <!-- canon-keep-retired --> |
63
61
  | `draft-screencast` | `script-screencast` <!-- canon-keep-retired --> |
62
+ | `pick-by-eye` | `design-pick` <!-- canon-keep-retired --> |
63
+ | `ui-record` | `ui-film` <!-- canon-keep-retired --> |
64
+ | `ux-audit` | `ui-audit` <!-- canon-keep-retired --> |
65
+ | `ux-measure` | `ui-measure` <!-- canon-keep-retired --> |
64
66
 
65
67
  Replace a citation of a skill with no successor by hand, or delete the sentence.
66
68
 
67
- - `canvas` is now `canvas-board`. The sweep rewrites only `canon:canvas` and `skills/canvas`, so replace a bare prose mention by hand. <!-- canon-keep-retired -->
68
- - `draft-ready` is rewritten only as `canon:draft-ready` and `skills/draft-ready`, since bare it also describes a pull request. Replace a bare mention of the skill by hand. <!-- canon-keep-retired -->
69
+ - `canvas` is now `canvas-board`. The sweep rewrites only `canon:canvas` and `skills/canvas`, so replace a bare mention by hand. <!-- canon-keep-retired -->
70
+ - `draft-ready` is rewritten only as `canon:draft-ready` and `skills/draft-ready`, since bare it also describes a pull request, so replace a bare mention by hand. <!-- canon-keep-retired -->
69
71
  - `design-extract` and `sketch-design` are replaced by `canon:canvas-board`. <!-- canon-keep-retired -->
70
- - `review-branch`, `seed-sync`, `restate-plainly`, `bash-cli-script`, `canon-operator`, and `canon-rollout` have no successor <!-- canon-keep-retired -->
71
- - `create-standard`, `markdown-propose`, `memory-review`, `project-commands`, `repo-metadata`, and `ux-walkthrough` have no successor <!-- canon-keep-retired -->
72
+ - `review-branch`, `seed-sync`, `restate-plainly`, `bash-cli-script`, `canon-operator`, `canon-rollout`, and `canon-feedback-triage` have no successor <!-- canon-keep-retired -->
73
+ - `create-standard`, `markdown-propose`, `memory-review`, `project-commands`, `repo-metadata`, `ux-walkthrough`, and `plan-ready` have no successor <!-- canon-keep-retired -->
72
74
 
73
75
  The `memory` record kind left `canon records`, so `canon records validate memory` refuses as an unknown kind and `canon records migrate` is gone.
74
76
 
@@ -134,7 +136,7 @@ From the registry the walk reports `historyUnavailable`, so check both paths by
134
136
  | `plan-groundwork` | `groundwork`, `groundwork-spikes` |
135
137
  | `plan-intake` | `intake` |
136
138
  | `plan-feature` | `plan`, `plan-lifecycle` |
137
- | `plan-ready` | `ready` |
139
+ | `plan-ready` | `ready` <!-- canon-keep-retired --> |
138
140
  | `write-doc` | `requirements`, `wiki` |
139
141
  | `session-map` | `session` |
140
142
 
@@ -160,7 +162,7 @@ A reference to a retired skill takes a hand edit.
160
162
 
161
163
  - Replace a `canon:teach-workspace` reference with `canon:teach-craft` by hand, since `canon migrate skill-names` does not rewrite it <!-- canon-keep-retired -->
162
164
  - 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 -->
163
- - Delete a `canon:canvas-board` reference too. Frameboard, which `canon:pick-by-eye` drives, reads each `.canon/canvas/` folder as a project, so move a kept page under one <!-- canon-keep-retired -->
165
+ - Delete a `canon:canvas-board` reference too. Frameboard, which `canon:design-pick` drives, reads each `.canon/canvas/` folder as a project, so move a kept page under one <!-- canon-keep-retired -->
164
166
 
165
167
  ## Move decisions out of a held architecture record, once
166
168