@erclx/canon 5.43.0 → 5.44.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 (133) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/backlog-triage/references/apply.md +6 -6
  3. package/claude/skills/canon-cli/SKILL.md +4 -4
  4. package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
  5. package/claude/skills/canvas-board/SKILL.md +1 -1
  6. package/claude/skills/context-fold/references/context.md +1 -1
  7. package/claude/skills/create-skill/REQUIREMENT.md +1 -1
  8. package/claude/skills/create-skill/SKILL.md +2 -2
  9. package/claude/skills/create-skill/references/skill-requirement.md +68 -9
  10. package/claude/skills/create-skill/references/skill.md +1 -1
  11. package/claude/skills/design-identity/REQUIREMENT.md +40 -0
  12. package/claude/skills/design-identity/SKILL.md +138 -0
  13. package/claude/skills/{draft-identity → design-identity}/references/card-route.md +2 -2
  14. package/claude/skills/design-taste/REQUIREMENT.md +4 -4
  15. package/claude/skills/design-taste/SKILL.md +2 -2
  16. package/claude/skills/design-taste/references/kinds.md +1 -1
  17. package/claude/skills/design-taste/references/preflight.md +1 -1
  18. package/claude/skills/draft-and-pick/REQUIREMENT.md +8 -69
  19. package/claude/skills/draft-and-pick/SKILL.md +3 -153
  20. package/claude/skills/draft-doc/REQUIREMENT.md +9 -30
  21. package/claude/skills/draft-doc/SKILL.md +4 -76
  22. package/claude/skills/draft-figure/REQUIREMENT.md +8 -42
  23. package/claude/skills/draft-figure/SKILL.md +3 -77
  24. package/claude/skills/draft-identity/REQUIREMENT.md +8 -23
  25. package/claude/skills/draft-identity/SKILL.md +3 -130
  26. package/claude/skills/draft-ready/REQUIREMENT.md +8 -37
  27. package/claude/skills/draft-ready/SKILL.md +3 -128
  28. package/claude/skills/draft-screencast/REQUIREMENT.md +8 -23
  29. package/claude/skills/draft-screencast/SKILL.md +3 -62
  30. package/claude/skills/draft-slides/REQUIREMENT.md +8 -27
  31. package/claude/skills/draft-slides/SKILL.md +3 -72
  32. package/claude/skills/draw-figure/REQUIREMENT.md +59 -0
  33. package/claude/skills/draw-figure/SKILL.md +85 -0
  34. package/claude/skills/{draft-figure → draw-figure}/references/architecture-set.md +2 -2
  35. package/claude/skills/{draft-figure → draw-figure}/references/hand-drawn.md +2 -2
  36. package/claude/skills/{draft-figure → draw-figure}/references/mermaid-path.md +2 -2
  37. package/claude/skills/{draft-figure → draw-figure}/references/mermaid.md +1 -1
  38. package/claude/skills/make-deck/REQUIREMENT.md +44 -0
  39. package/claude/skills/make-deck/SKILL.md +80 -0
  40. package/claude/skills/markdown-craft/REQUIREMENT.md +1 -1
  41. package/claude/skills/markdown-craft/SKILL.md +2 -2
  42. package/claude/skills/pick-by-eye/REQUIREMENT.md +86 -0
  43. package/claude/skills/pick-by-eye/SKILL.md +161 -0
  44. package/claude/skills/plan-feature/SKILL.md +2 -1
  45. package/claude/skills/plan-feature/references/plan.md +24 -10
  46. package/claude/skills/plan-groundwork/SKILL.md +1 -1
  47. package/claude/skills/plan-intake/SKILL.md +1 -1
  48. package/claude/skills/plan-ready/REQUIREMENT.md +54 -0
  49. package/claude/skills/plan-ready/SKILL.md +136 -0
  50. package/claude/skills/{draft-ready → plan-ready}/references/assembly.md +1 -1
  51. package/claude/skills/{draft-ready → plan-ready}/references/ready.md +1 -1
  52. package/claude/skills/record-screencast/REQUIREMENT.md +3 -3
  53. package/claude/skills/record-screencast/SKILL.md +2 -2
  54. package/claude/skills/role-orchestrator/REQUIREMENT.md +1 -1
  55. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +5 -2
  56. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
  57. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +18 -13
  58. package/claude/skills/role-planner/SKILL.md +2 -1
  59. package/claude/skills/role-worker/SKILL.md +9 -0
  60. package/claude/skills/script-screencast/REQUIREMENT.md +40 -0
  61. package/claude/skills/script-screencast/SKILL.md +70 -0
  62. package/claude/skills/{draft-screencast → script-screencast}/references/beats-template.md +2 -2
  63. package/claude/skills/search-craft/REQUIREMENT.md +4 -4
  64. package/claude/skills/search-craft/SKILL.md +1 -1
  65. package/claude/skills/target-setup/SKILL.md +1 -0
  66. package/claude/skills/task-board/SKILL.md +11 -9
  67. package/claude/skills/task-board/references/board.md +15 -12
  68. package/claude/skills/teach-workspace/SKILL.md +1 -1
  69. package/claude/skills/teach-workspace/references/lesson-craft.md +2 -2
  70. package/claude/skills/ui-checklist/SKILL.md +2 -0
  71. package/claude/skills/write-doc/REQUIREMENT.md +46 -0
  72. package/claude/skills/write-doc/SKILL.md +83 -0
  73. package/claude/skills/{draft-doc → write-doc}/references/context.md +2 -2
  74. package/claude/skills/{draft-doc → write-doc}/references/docs.md +2 -2
  75. package/claude/skills/{draft-doc → write-doc}/references/readme.md +2 -2
  76. package/claude/skills/{draft-doc → write-doc}/references/wiki-kind.md +3 -3
  77. package/docs/agents/markdown-audit.md +4 -2
  78. package/docs/agents/migrate.md +2 -2
  79. package/docs/target/migrations.md +17 -4
  80. package/docs/target/projects.md +1 -1
  81. package/docs/workflow/parallel-features.md +3 -2
  82. package/docs/workflow/skill-map-on-request.md +18 -12
  83. package/docs/workflow/skill-map.md +13 -12
  84. package/docs/workflow/visual-design-workflow.md +2 -2
  85. package/governance/ledger/framework/astro.md +73 -0
  86. package/governance/ledger/framework/fastapi.md +76 -0
  87. package/governance/ledger/framework/nextjs.md +86 -0
  88. package/governance/ledger/framework/react.md +83 -0
  89. package/governance/ledger/framework/shadcn.md +60 -0
  90. package/governance/ledger/framework/tailwind.md +55 -0
  91. package/governance/rules/framework/astro.md +12 -14
  92. package/governance/rules/framework/fastapi.md +20 -24
  93. package/governance/rules/framework/nextjs.md +19 -27
  94. package/governance/rules/framework/react.md +22 -33
  95. package/governance/rules/framework/shadcn.md +11 -15
  96. package/governance/rules/framework/tailwind.md +12 -14
  97. package/governance/rules/writing/markdown.md +1 -1
  98. package/package.json +1 -1
  99. package/src/claude/cases/authoring.ts +15 -3
  100. package/src/claude/cases/misc.ts +12 -0
  101. package/src/claude/cases/workflow.ts +19 -1
  102. package/src/claude/skills-audit.ts +113 -1
  103. package/src/commands/claude.ts +34 -11
  104. package/src/commands/demo.ts +1 -1
  105. package/src/commands/markdown.ts +1 -1
  106. package/src/commands/migrate.ts +4 -0
  107. package/src/commands/pr.ts +30 -6
  108. package/src/commands/tasks.ts +383 -2
  109. package/src/context/audit.ts +1 -1
  110. package/src/demo/beats.ts +1 -1
  111. package/src/gov/audit.ts +3 -2
  112. package/src/markdown/scope.ts +45 -35
  113. package/src/migrate/record-layout.ts +1 -1
  114. package/src/migrate/skill-names.ts +68 -21
  115. package/src/pr/frames.ts +14 -3
  116. package/src/records/validate.ts +31 -0
  117. package/src/tasks/board.ts +854 -0
  118. package/src/tasks/record.ts +20 -1
  119. package/src/tasks/validate.ts +206 -9
  120. package/tooling/astro/configs/card-src/pages/og-card.astro +1 -1
  121. package/tooling/astro/reference.md +2 -2
  122. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +65 -0
  123. package/tooling/claude/seeds/.claude/settings.json +4 -0
  124. /package/claude/skills/{draft-figure → draw-figure}/references/figures.md +0 -0
  125. /package/claude/skills/{draft-slides → make-deck}/references/deck.md +0 -0
  126. /package/claude/skills/{draft-and-pick → pick-by-eye}/references/live-arms.md +0 -0
  127. /package/claude/skills/{draft-doc → write-doc}/references/readme/agent-facing.md +0 -0
  128. /package/claude/skills/{draft-doc → write-doc}/references/readme/application.md +0 -0
  129. /package/claude/skills/{draft-doc → write-doc}/references/readme/cli.md +0 -0
  130. /package/claude/skills/{draft-doc → write-doc}/references/readme/library.md +0 -0
  131. /package/claude/skills/{draft-doc → write-doc}/references/readme/plugin.md +0 -0
  132. /package/claude/skills/{draft-doc → write-doc}/references/requirements.md +0 -0
  133. /package/claude/skills/{draft-doc → write-doc}/references/wiki.md +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "canon",
3
3
  "description": "Runs your agent's work and keeps its code good, on one setup for every repo.",
4
- "version": "5.43.0",
4
+ "version": "5.44.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -25,12 +25,12 @@ An item already applied, by the test in the skill's Step 1, is skipped silently,
25
25
 
26
26
  Take the task stem from the item heading. Every verdict leaves the folder slug on its task, which is how Step 1 and `task-board`'s unlinked-origin scan both see the folder as acted on.
27
27
 
28
- | Verdict | Command and board write |
29
- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
30
- | decline | `canon tasks decline <stem> --reason "<reason>, backlog triage <slug> item <cluster>#<n>" --json`, which clears the backlog line |
31
- | archive | `canon tasks outcome <stem> --close <p> ... --json` for the named positions, then `canon tasks archive <stem> --json` |
32
- | keep | Append the `## Findings` line naming what reproduced, leaving the backlog line |
33
- | promote | Move the backlog line to the bottom of `## Needs a plan` in `.canon/tasks/priority.md`, its `Waiting on` cell stating what cleared and ending in `last` |
28
+ | Verdict | Command and board write |
29
+ | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
30
+ | decline | `canon tasks decline <stem> --reason "<reason>, backlog triage <slug> item <cluster>#<n>" --json`, which clears the backlog line |
31
+ | archive | `canon tasks outcome <stem> --close <p> ... --json` for the named positions, then `canon tasks archive <stem> --json` |
32
+ | keep | Append the `## Findings` line naming what reproduced, leaving the backlog line |
33
+ | promote | `canon tasks place <stem> --group needs-a-plan --bottom --waiting "<what cleared>. Last" --json`, which clears the backlog line |
34
34
 
35
35
  ### Archive and missing files
36
36
 
@@ -43,11 +43,11 @@ Each verb here has a skill that owns the job. Load the skill rather than driving
43
43
 
44
44
  | Job | Verb | Skill |
45
45
  | -------------------------------------------- | ------------------- | --------------------------- |
46
- | Render the design system | `canon design` | `canon:draft-figure` |
47
- | Render a slide deck | `canon slides` | `canon:draft-slides` |
48
- | Render an HTML source to a PNG | `canon capture` | `canon:draft-identity` |
46
+ | Render the design system | `canon design` | `canon:draw-figure` |
47
+ | Render a slide deck | `canon slides` | `canon:make-deck` |
48
+ | Render an HTML source to a PNG | `canon capture` | `canon:design-identity` |
49
49
  | Serve a directory and print the link | `canon serve` | none |
50
- | Record a running app | `canon demo` | `canon:draft-screencast` |
50
+ | Record a running app | `canon demo` | `canon:script-screencast` |
51
51
  | Report one computed property across routes | `canon inventory` | `canon:target-check` |
52
52
  | Walk a page through interactions and measure | `canon drive` | `canon:ux-measure` |
53
53
  | Fetch a YouTube transcript | `canon transcripts` | `canon:youtube-transcripts` |
@@ -43,6 +43,6 @@ When the operator picks a frame, the session leaves the decision on the canvas a
43
43
 
44
44
  - What the canvas verbs do internally, which is the CLI's own contract
45
45
  - The content format a frame and a layout take, which the canvas standard fixes
46
- - Drafting candidates for a taste decision and taking the pick, which `draft-and-pick` runs on this canvas through the same verbs
46
+ - Drafting candidates for a taste decision and taking the pick, which `pick-by-eye` runs on this canvas through the same verbs
47
47
  - Tracing reference images into design values or writing the design document from code, which no skill owns now
48
48
  - Backing up the canvas folder off one disk
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: canvas-board
3
- description: Drives the local design canvas, where pages hold HTML frames the operator sees, drags, selects, and edits in the browser. Starts the canvas when it is not running, confirms the live shell loads, makes pages and frames, edits a frame through its file, reads what the operator selected or restyled, captures finished frames, and carries a picked direction into the project's design document. Use when asked to "open the canvas", "put this on the canvas", "draw a frame for X", "change the one I selected", "what did I pick", "capture this frame", or "move that frame on the canvas". Do NOT use to draft candidates for a taste decision, which is `draft-and-pick`.
3
+ description: Drives the local design canvas, where pages hold HTML frames the operator sees, drags, selects, and edits in the browser. Starts the canvas when it is not running, confirms the live shell loads, makes pages and frames, edits a frame through its file, reads what the operator selected or restyled, captures finished frames, and carries a picked direction into the project's design document. Use when asked to "open the canvas", "put this on the canvas", "draw a frame for X", "change the one I selected", "what did I pick", "capture this frame", or "move that frame on the canvas". Do NOT use to draft candidates for a taste decision, which is `pick-by-eye`.
4
4
  metadata:
5
5
  family: decide
6
6
  ---
@@ -28,7 +28,7 @@ Does not govern:
28
28
 
29
29
  - Product scope, goals, and non-goals: `requirements.md`
30
30
  - Path-scoped coding rules: `rule.md`
31
- - Figures and architecture views, which answer structure questions an entry hands off: the `draft-figure` skill
31
+ - Figures and architecture views, which answer structure questions an entry hands off: the `draw-figure` skill
32
32
  - The consumer-facing reference under `docs/`, whose reader is operating the project without the source open: `docs.md`
33
33
 
34
34
  ## Organizing principle
@@ -24,7 +24,7 @@ A fifth failure is the confirmation itself. A worker running a plan that adds a
24
24
  - Draft the sibling `REQUIREMENT.md` beside the body, from what the skill is for rather than from the drafted body
25
25
  - Confirm the name and both files with the user before writing, where a person is present to answer. The name is the routing key and a folder that disagrees with its frontmatter fails silently. Where nobody is present, record the three answers and both paths in the output and write.
26
26
  - Write to the conventional skills path, so discovery finds it without configuration. That is `.claude/skills/` in a target project. In the toolkit's own checkout, which the project root's `claude/.claude-plugin/plugin.json` marks, an `internal-*` skill goes under `.claude/skills/` and a plugin skill under `claude/skills/`
27
- - Leave the skills audit's dated-provenance check clean for the new folder before reporting it, with each incident moved to the requirement's `Gap`
27
+ - Leave the skills audit's dated-provenance check clean for the new folder before reporting it, with each incident cut and left to git
28
28
 
29
29
  ## Must not
30
30
 
@@ -38,7 +38,7 @@ Read these in the same pass:
38
38
  - Does the body carry a procedure a session would get wrong from first principles? A one-line wrapper around a single command needs no skill.
39
39
  - Will anything invoke it other than the author typing its name? Carry this one into the drafted `REQUIREMENT.md`'s `Must not` section as a review criterion instead, since nothing can answer it before the skill has run.
40
40
  - Tell the user and stop when the first answer is yes or the second is no. A non-interactive run stops on both too, reporting which question failed and writing no folder.
41
- 2. Draft the full `SKILL.md` from the user's description, stating the current rule alone. An incident and the date it happened belong in the requirement's `Gap`, not in the body or a reference.
41
+ 2. Draft the full `SKILL.md` from the user's description, stating the current rule alone. An incident and the date it happened stay in git, never in the body, a reference, or the requirement.
42
42
  3. Draft the sibling `REQUIREMENT.md` from what the skill is for, in the shape the requirement standard states.
43
43
  - Write the gaps from the user's description rather than from the drafted body, since a requirement derived from the body records whatever the draft overfitted to.
44
44
  4. Confirm the skill name and both files with the user before writing, when a person can answer.
@@ -53,7 +53,7 @@ Steps 5 to 7 write the folder and check what landed before the run reports.
53
53
  - The root is `.claude/skills/` in a target project.
54
54
  - Where the project root holds `claude/.claude-plugin/plugin.json`, which is the toolkit's own checkout, an `internal-*` skill goes under `.claude/skills/` and every other skill under `claude/skills/`, since the plugin ships that tree.
55
55
  6. Run `canon claude skills audit --json` and read `findings.datedProvenance` for rows under `<root>/<name>/`.
56
- - Move each row's incident into `REQUIREMENT.md` under `Gap`, cut the date from the file the row names, and re-run until no row names the folder.
56
+ - Cut each row's date and incident from the file the row names, leaving them to git, and re-run until no row names the folder.
57
57
  - When `canon` does not resolve or its record carries no `datedProvenance` key, say the check did not run rather than reporting the skill clean.
58
58
  7. Run `canon markdown audit <root>/<name>/` over the new body and any references, and fix every ban and density finding it reports.
59
59
  - Re-run it until it reports none, since every file in the folder is this run's draft.
@@ -35,12 +35,36 @@ A requirement that leaves any of the three open is non-conforming regardless of
35
35
  - Write the gaps from what the skill is for, then compare the body against them
36
36
  - A requirement derived from the body records the body's accidents as the requirement, and misinforms a reader who reads it in place of the body
37
37
 
38
+ ## Sections
39
+
40
+ The file carries these H2s in this order and no others. `canon claude skills audit` reports a missing Gap or Must and a Guards heading.
41
+
42
+ | Section | When | Holds |
43
+ | -------------- | ----------------------------------------- | ------------------------------------------------------------- |
44
+ | `Gap` | Always | The failures a session hits today without the skill, as prose |
45
+ | `Must` | Always | The outcomes that close those failures, one per bullet |
46
+ | `Must not` | When a behavior closes a gap and is wrong | That behavior, one per bullet |
47
+ | `Out of scope` | When a sibling owns an adjacent behavior | The behavior and the skill that owns it |
48
+
49
+ `Guards` is retired. A refusal condition is a `Must not` bullet, and the message it prints belongs to the body.
50
+
51
+ ## Caps
52
+
53
+ The audit reports each cap it finds breached, and a rewrite batch turns the report into a gate for the files it brings under.
54
+
55
+ - Each list holds at most 5 bullets. A sixth `Must` is a sign the skill does two jobs or the list restates its steps.
56
+ - The file holds at most 400 words of body, frontmatter excluded
57
+ - Gap carries no `YYYY-MM-DD` date and no `#NNN` issue or pull request number outside a code span
58
+
38
59
  ## Content
39
60
 
40
- - State each gap as an observed failure, not an intent. "Without this skill a session invents its own filename" can be shown wrong. "This skill helps manage tasks" cannot fail, so it constrains nothing.
41
- - Trace everything under `## Must` to a stated gap. A `Must` with no gap behind it is the padding the file exists to prevent.
42
- - Keep it high level. A requirement that outgrows one file has stopped being a requirement, and `references/` already holds detail.
43
- - Use `name` and `description` frontmatter, matching `SKILL.md` so the pair is consistent.
61
+ - State each gap as a failure a session hits today, in the present tense. "Without this skill a session invents its own filename" can be shown wrong.
62
+ - Never state a gap as an intent. "This skill helps manage tasks" cannot fail, so it constrains nothing.
63
+ - Keep history out of Gap. The incident, its date, and the pull request that earned a rule stay in git, where `git log` on the file finds them.
64
+ - Write each `Must` as an outcome a reader can check against the body, never as a step the body takes. "The committed set is exactly the staged set" is an outcome.
65
+ - Trace every `Must` to a stated gap. A `Must` with no gap behind it is the padding the file exists to prevent.
66
+
67
+ The frontmatter carries `name` and `description`, matching `SKILL.md` so the pair is consistent.
44
68
 
45
69
  ## Template
46
70
 
@@ -54,21 +78,56 @@ description: <one line, distinct from the SKILL.md description>
54
78
 
55
79
  ## Gap
56
80
 
57
- Without this skill, a session <observed failure>, <observed failure>.
81
+ Without this skill, a session <failure it hits today>. <A second failure, when there is one>.
58
82
 
59
83
  ## Must
60
84
 
61
- - <behavior that closes a named gap>
85
+ - <outcome that closes a named failure>
62
86
 
63
87
  ## Must not
64
88
 
65
89
  - <behavior that would be wrong even though it closes a gap>
66
90
 
67
- ## Guards
91
+ ## Out of scope
92
+
93
+ - <adjacent behavior>, which `<sibling-skill>` owns
94
+ ```
95
+
96
+ ### Worked example
97
+
98
+ `git-commit`'s requirement in this shape, at 167 words as the audit counts them.
99
+
100
+ ```markdown
101
+ ---
102
+ name: git-commit
103
+ description: What commit generation is for, the gaps it closes, and where the family boundary sits
104
+ ---
105
+
106
+ # Git commit requirement
107
+
108
+ ## Gap
109
+
110
+ Without this skill, a commit message takes whatever shape the session picks. The type and scope drift from the history's convention, the subject runs past the log's width, and a lockfile diff crowds out the change the message should describe.
111
+
112
+ A plain request to commit also reaches the grouping sibling, which restages whole files, so a hunk-level selection ships wider than the user reviewed.
113
+
114
+ ## Must
115
+
116
+ - The message follows the commit format and versioning references
117
+ - The message describes the staged diff with lockfiles excluded
118
+ - The user sees the message and its length before the commit runs
119
+ - The committed set is exactly the staged set
120
+ - The description claims single-concern and hunk-level staged sets, and names `git-stage` for a mixed one
121
+
122
+ ## Must not
68
123
 
69
- - <the refusal condition and its message>
124
+ - Stage or unstage anything
125
+ - Commit when nothing is staged
126
+ - Emit anything after the result line
70
127
 
71
128
  ## Out of scope
72
129
 
73
- - <the adjacent thing this deliberately does not cover, and what covers it>
130
+ - Splitting a mixed diff into several commits, which `git-stage` owns
131
+ - Naming a branch, which `git-branch` owns
132
+ - Pushing or opening a pull request, which `git-pr` owns
74
133
  ```
@@ -132,7 +132,7 @@ A body holds behavioral rules and pointers to reference docs, front-loading the
132
132
 
133
133
  ### Current rule and grouping
134
134
 
135
- State the current rule only, in the body and in every file under `references/`. The incident and the date that earned a rule go in `REQUIREMENT.md` under `Gap`, or stay in git, and a date inside a fence or a code span is example data and stays.
135
+ State the current rule only, in the body and in every file under `references/`. The incident and the date that earned a rule stay in git, and a date inside a fence or a code span is example data and stays.
136
136
 
137
137
  - Cut any rule that resists crisp one-line phrasing. Vague guidance is worse than none.
138
138
  - Group bullets under H2 headings by concern, keeping dos and don'ts together rather than in flat rules and constraints sections
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: design-identity
3
+ description: Why the mark and the card are one pick rather than two, and where the size sequence and the write folder come from before either is drafted
4
+ ---
5
+
6
+ # Design identity requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a session asked for a logo and a social card either invents shapes with nothing behind them, or drafts the mark and the card as two separate decisions that can land on shapes that do not compose, which is the failure the task filing this skill measured by hand on every project it touched. A search across every shipped skill and standard found zero hits for `logo`, `og:image`, `og-image`, or Open Graph, so nothing in the catalog reached either output.
11
+
12
+ A session building this without a shared loop restates `pick-by-eye`'s render, hand-off, pick, and loop mechanics from scratch, which drifts from the shipped one with nothing comparing the two copies. It also guesses at the icon size sequence and the output folder rather than reading what the project already declares, and it produces one raster per size through a separate render call per size, which multiplies capture invocations for no reason `canon capture` cannot already batch.
13
+
14
+ ## Must
15
+
16
+ - Detect the icon size sequence from the project's own HTML head or manifest before falling back to the stated default set
17
+ - Detect the write folder from the project's own static-asset convention before falling back to the project root, and announce which one decided it
18
+ - Draft every arm already composed inside the card frame, so one pick settles the mark's shape and its composition together
19
+ - Follow `pick-by-eye`'s Steps 2 through 5 for the render, hand-off, pick, and loop, rather than restating them
20
+ - Write the final mark as its own SVG source, not baked into a raster only
21
+ - Render every final size and the card in one capture call, by sharing one selector class across pages, each declared at half its target dimension to land on the literal size once the render engine's fixed 2x scale factor is applied
22
+
23
+ ## Must not
24
+
25
+ - Restate `pick-by-eye`'s render, hand-off, pick, or loop mechanics
26
+ - Add a `## Logo` section to `claude/skills/canvas-board/references/design.md`'s fixed section set. `src/design/parse.ts` reads a fixed key set, and no outcome behind this skill asks for a schema change.
27
+ - Modify `pick-by-eye`, `canon capture`, or `canon design render`. This skill composes all three and extending any of them is a separate change.
28
+ - Assume this skill's own invocation frequency needs no check. Whether anything reaches for it beyond an operator typing its name has no answer at creation time, so a review pass some months in should read that back rather than take it on faith.
29
+
30
+ ## Guards
31
+
32
+ - `canon` not on PATH: stop, since the render loop and the finalize step both need it
33
+ - Fires on a direct request only. A run offering a logo to a project that never asked for one spends a render nobody wanted.
34
+
35
+ ## Out of scope
36
+
37
+ - Wiring the produced files into a project's own HTML head or manifest, which is a separate edit this skill leaves for the operator to make against their own markup
38
+ - Recording the mark's construction rules in `claude/skills/canvas-board/references/design.md`, which the task's own constraint keeps out of the fixed section set
39
+ - Mutating an existing logo file directly, which is a direct edit rather than a skill
40
+ - Auditing an implemented UI against its tokens, which `ux-audit` owns
@@ -0,0 +1,138 @@
1
+ ---
2
+ name: design-identity
3
+ description: Drafts a project's logo mark through pick-by-eye's render-and-pick loop, then composes the picked mark into an icon sequence and a 1200x630 social card. Use when asked to "make a logo", "design a logo mark", "create a favicon", "build the icon set", "generate a social card", "make an og:image", or "draft the logo and social card together". Do NOT use to mutate an existing logo file directly, which is a plain edit, or to record the mark's construction rules in DESIGN.md, which is out of scope.
4
+ metadata:
5
+ family: generate
6
+ ---
7
+
8
+ # Design identity
9
+
10
+ One identity rendered twice: the same mark sized down to an icon sequence and composed with type into the social card sized up. Drafting both from one pick keeps the mark and its card composition from settling on shapes that do not match.
11
+
12
+ ## Guards
13
+
14
+ - If `canon` is not on PATH, stop: `❌ canon CLI not found.`
15
+ - Draft no candidate for a mark the operator has not asked to make. This skill fires on a direct request, never on the model's own read that a project could use one.
16
+
17
+ ## Step 1: read signal
18
+
19
+ Read these in parallel, skipping any that do not exist:
20
+
21
+ - `canon/DESIGN.md`: the `## Overview` paragraph and the role intents under `## Colors` and `## Typography`, read as `## Personality` and `## Color` in an older record
22
+ - The stylesheet `canon/DESIGN.md`'s lead names: the color and type values behind those roles
23
+ - `canon/REQUIREMENTS.md`: the `## Personality` paragraph, when `canon/DESIGN.md` carries none
24
+ - `CLAUDE.md`: the project's stated voice, when neither file above carries a personality signal
25
+
26
+ No signal from any of these is not a stop. Draft against a neutral default, and mark each guessed color and type value with a `/* ? verify */` comment beside its declaration in the `.mark` and `.card` markup, since the design document carries no value to tag.
27
+
28
+ ## Step 2: detect the icon size sequence
29
+
30
+ Check the project's HTML entry points (`index.html`, `public/index.html`, `src/index.html`) for a `<link rel="icon">` or `<link rel="apple-touch-icon">` tag carrying a `sizes` attribute, and any `manifest.json` or `site.webmanifest` for an `icons` array. Take the union of every size found.
31
+
32
+ Fall back to the stated default when nothing is detected, since no `tooling/` stack scaffolds a `public/` folder, a favicon reference, or an `og:image` meta tag:
33
+
34
+ - `16x16`, `32x32`, `48x48`
35
+ - `180x180`
36
+ - `192x192`, `512x512`
37
+
38
+ This default set is raster-only, and Step 6 writes the vector source at `favicon.svg` on either branch. Announce which of the two decided the sequence.
39
+
40
+ ## Step 3: detect the write folder
41
+
42
+ A root-only check misses a site kept in a subfolder, and a Next project keeps its favicon under the App Router with no `public/` at all. Both would fall through to the root while the announcement reads as detected, so walk one level down and know that convention.
43
+
44
+ Read both, from the project root:
45
+
46
+ ```bash
47
+ find . -maxdepth 3 \( -name node_modules -o -name .git -o -name dist -o -name .astro \) -prune -o -type d \( -name public -o -name static \) -print | sort
48
+ find . -maxdepth 4 \( -name node_modules -o -name .git \) -prune -o -type d -path '*/src/app' -print | sort
49
+ ```
50
+
51
+ Take the first tier that answers:
52
+
53
+ 1. A root `public/` or `static/`.
54
+ 2. A `public/` or `static/` one level down, such as `web/public/`. Of several, take the shallowest, then the one whose parent holds the project's framework config.
55
+ 3. A `src/app/` folder, at the root or one level down, which is the Next App Router convention. Take the folder itself, not a `public/` beside it.
56
+ 4. A stack-declared asset folder, where the project's own config names one.
57
+ 5. The project root, which is the fallback rather than a detection.
58
+
59
+ Announce which tier decided, naming the tier rather than the path alone, so the operator can move the files where the project's convention differs. On tier 5 say the detection found nothing and the root is a fallback.
60
+
61
+ ## Step 4: name the decision and the arms
62
+
63
+ Follow `${CLAUDE_SKILL_DIR}/../pick-by-eye/SKILL.md` Step 1, with the decision fixed rather than derived: "the project's logo mark and its composition into the social card." Vary the mark's shape or style across arms, keeping the card's type and layout fixed, per that skill's one-property rule.
64
+
65
+ - Draft each arm inside the full 1200x630 card frame, mark and type together, and add its canvas frame at `--width 1200 --height 630`, so one pick settles shape and composition
66
+ - Arm 0 is the current mark when the Step 3 folder already holds a logo file (`favicon.svg`, `favicon.ico`, `logo.svg`, or similar). Arms start at 1 otherwise.
67
+ - Structure every arm as a `.mark` element, the inline SVG alone, nested inside a `.card` element, the full composition, so Step 6 can address either
68
+
69
+ ## Step 5: draft, render, pick, and loop
70
+
71
+ Follow `${CLAUDE_SKILL_DIR}/../pick-by-eye/SKILL.md` Steps 2 through 5 against the arms from Step 4: draft the arms as frames on a canvas page, render and hand off, take the pick, and loop on it.
72
+
73
+ The final icon and card renders below are not arms, so they stay off the canvas. Call the folder they render from `<dest>`, being `.canon/tmp/<slug>/` under the slug `pick-by-eye` Step 1 derived, which is where this project puts every temporary write.
74
+
75
+ ## Step 6: finalize the mark and the icons
76
+
77
+ This step and Step 7 replace `pick-by-eye`'s own Step 6 items 1 and 2, since the pick here produces several final files rather than one applied surface. Its archive capture, its page delete, and its server stop still run, after Step 7.
78
+
79
+ 1. Extract the picked arm's `.mark` markup as the final vector source. Write it to `<write-folder>/favicon.svg`.
80
+ 2. Under `<dest>/render/`, write one `icon-<w>x<h>.html` page per Step 2 size, carrying the picked `.mark` markup in an element with the shared class `.render`.
81
+ 3. Declare each `.render` element at `<w>/2` by `<h>/2`, since `canon capture` screenshots at a fixed 2x scale and the PNG then lands on the target size.
82
+ 4. Declare no font on them. Each holds the mark alone, and `canon capture` skips the font check on an element with no text, where `system-ui` would be refused.
83
+ 5. Render the batch:
84
+
85
+ ```bash
86
+ canon capture <dest>/render --selector .render --out <write-folder>
87
+ ```
88
+
89
+ 6. Report each written file's path and the dimensions `canon capture` printed, confirming each equals its Step 2 target rather than half of it.
90
+
91
+ The card leaves this batch and takes Step 7 instead. An icon is the mark alone and a scratch page renders it faithfully, where the card composes the mark with the project's own type and color, which a scratch page can only copy.
92
+
93
+ ## Step 7: write the card as a route and capture it through the server
94
+
95
+ A card captured from a page this run deletes leaves a PNG and nothing that produced it, so renaming the project means another pick loop to move one string. Write the composition into a route the project keeps, and capture it through a running server so it reads the real stylesheet, tokens, and fonts.
96
+
97
+ This is Astro-shaped for now, because Astro is the one web stack whose config gives a route a structural build exclusion. A project already holding the card route scaffold takes the route path, and everything else takes the page path. Say which one decided, since the two leave the project different things.
98
+
99
+ ### The route path
100
+
101
+ Read `${CLAUDE_SKILL_DIR}/references/card-route.md` on reaching this path, for the scaffold check, the message to give when it is missing, and the write, serve, and capture sequence. A project with no scaffold skips it.
102
+
103
+ ### The page path
104
+
105
+ Where the project holds no route to write into, write `og-image.html` into `<dest>/render/` with its `.render` wrapper sized 600x315, then capture that one page:
106
+
107
+ ```bash
108
+ canon capture <dest>/render/og-image.html --selector .render --out <write-folder>
109
+ ```
110
+
111
+ It takes its own call because Step 6's batch is already captured by the time this step picks a path. Say that the card shipped as a PNG with no source, and that the project gains one when it grows a route to hold the composition.
112
+
113
+ ### Closing the scratch folder and the canvas
114
+
115
+ Delete `<dest>` once both captures land, then close the canvas through `pick-by-eye` Step 6 items 3 to 8, which archive every arm and delete the pages the run added. The route is not a leftover variant, since it holds the arm the operator picked.
116
+
117
+ A project whose card was generated before this route existed keeps its PNG. Say so rather than regenerating it, since the pick loop spends attention on a file nobody complained about, and the next real edit picks up the route.
118
+
119
+ ## Response format
120
+
121
+ ```plaintext
122
+ 📝 Wrote <write-folder>/favicon.svg
123
+ 📝 Wrote <write-folder>/icon-16x16.png (16x16)
124
+ 📝 Wrote card-src/pages/og-card.astro (route path only)
125
+ 📝 Wrote <write-folder>/og-image.png (1200x630)
126
+
127
+ Write folder: <tier that decided>. Move the files if this project's own convention differs.
128
+ Card source: <the route, captured through the card server|a scratch page, since this project holds no card route>.
129
+ ```
130
+
131
+ ## What this delegates
132
+
133
+ Cite these rather than restating them.
134
+
135
+ - `pick-by-eye` owns Steps 1 through 5 of the render-and-pick loop, cited above
136
+ - `canon:canvas-board` carries a picked direction into `canon/DESIGN.md`. This skill only reads it.
137
+ - `canon capture` owns the render mechanics, its font refusal, its fixed 2x scale, and its reported dimensions. It reads an `http(s)://` source, where `--out` names the PNG.
138
+ - The `astro` tooling stack owns the card route's scaffold, its second config, and the exclusion check, read with `canon tooling reference astro`. This skill writes into the route and never reshapes it.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: Card route path
3
- description: How draft-identity writes the picked card composition into a project's existing Astro card route and captures it through the card server
3
+ description: How design-identity writes the picked card composition into a project's existing Astro card route and captures it through the card server
4
4
  ---
5
5
 
6
6
  # Card route path
7
7
 
8
- Applies to Step 7 of `draft-identity` when the project already holds the card route scaffold. A project without it takes the page path in the skill body instead.
8
+ Applies to Step 7 of `design-identity` when the project already holds the card route scaffold. A project without it takes the page path in the skill body instead.
9
9
 
10
10
  ## The scaffold
11
11
 
@@ -9,9 +9,9 @@ description: Why a design round needs a stated layer ordering and a taste catalo
9
9
 
10
10
  Without this skill, a design round has no vocabulary to declare what it is varying and no standard of quality once it has. Both halves failed together and each is measured.
11
11
 
12
- The failure was measured on a real page. Four `draft-and-pick` rounds ran against one landing page in a single working session, and three changed nothing the operator could see. Each varied a property at Surface, being palette, figure treatment, heading separation and underline reach, against a page whose defect sat at composition.
12
+ The failure was measured on a real page. Four `pick-by-eye` rounds ran against one landing page in a single working session, and three changed nothing the operator could see. Each varied a property at Surface, being palette, figure treatment, heading separation and underline reach, against a page whose defect sat at composition.
13
13
 
14
- The instruction against that already existed. `draft-and-pick` Step 1 says to name the layer and Step 2 says a palette cannot be picked ahead of a composition. All four rounds skipped both, and nothing reported it. A session told to name a layer has no catalog to name from, so the rule had nothing behind it.
14
+ The instruction against that already existed. `pick-by-eye` Step 1 says to name the layer and Step 2 says a palette cannot be picked ahead of a composition. All four rounds skipped both, and nothing reported it. A session told to name a layer has no catalog to name from, so the rule had nothing behind it.
15
15
 
16
16
  The second half is the output itself. A model with no stated direction draws the population average of its training data, which produces interfaces that satisfy every craft rule and still read templated.
17
17
 
@@ -56,7 +56,7 @@ A rule failing any of the four is recorded as considered and declined rather tha
56
56
  - Express intensity as a numeric scale. A session picks a middle value and reports compliance, which satisfies the rule and decides nothing.
57
57
  - Claim the reported failure is closed. Nothing measures whether a round follows these rules, so this skill states them and the measurement is owed separately.
58
58
  - Duplicate a rule a surface already states for itself, such as slide layout or terminal color, where pointing at that surface is the whole of the correct answer
59
- - Be reached only by an author typing its name. `claude/skills/create-skill/references/skill.md` makes this a review criterion rather than a check, since nothing answers it before the skill has run. The intended non-author caller is the declared read in `draft-and-pick`'s output. A round producing no read, with this skill never loaded, is the evidence that the description's triggers are too weak.
59
+ - Be reached only by an author typing its name. `claude/skills/create-skill/references/skill.md` makes this a review criterion rather than a check, since nothing answers it before the skill has run. The intended non-author caller is the declared read in `pick-by-eye`'s output. A round producing no read, with this skill never loaded, is the evidence that the description's triggers are too weak.
60
60
 
61
61
  ## Guards
62
62
 
@@ -70,7 +70,7 @@ A rule failing any of the four is recorded as considered and declined rather tha
70
70
  - State coverage, empty and loading treatment, destructive confirmation and truncation, which `ux-completeness` owns
71
71
  - Validation timing, error placement and save blocking, which `forms` owns
72
72
  - Rendered copy casing, button labels and error wording, which `copy` owns
73
- - The candidate loop, the arm set, the render and the pick, which `draft-and-pick` owns and which this skill is loaded alongside rather than inside
73
+ - The candidate loop, the arm set, the render and the pick, which `pick-by-eye` owns and which this skill is loaded alongside rather than inside
74
74
  - The shape of the project's design document, its sections and its role tables, which `claude/skills/canvas-board/references/design.md` governs
75
75
  - Prose on the surface being designed, which `write-human` and `markdown.md` govern between them
76
76
  - Measuring whether finished output followed these rules, which needs a check this skill does not carry and which no command reaches while a render is an image rather than a parse
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design-taste
3
- description: Carries the layer model that decides which design decision settles first, the rules that keep a surface coherent across sections, and the catalog of defaults a model reaches for when nothing states a direction. Use when drafting or judging an interface, a page, or any rendered surface, when output reads generic or templated, when redesigning something that already exists, or when asked to "make this look designed", "why does this look like AI made it", "give it taste", "what layer is this decision at", or "grey-box this first". Do NOT use for accessibility, forms, or state coverage, which the `ui` governance rules carry, for the shape of the project's design document, which `design.md` governs, or to run the candidate loop, which is `draft-and-pick`.
3
+ description: Carries the layer model that decides which design decision settles first, the rules that keep a surface coherent across sections, and the catalog of defaults a model reaches for when nothing states a direction. Use when drafting or judging an interface, a page, or any rendered surface, when output reads generic or templated, when redesigning something that already exists, or when asked to "make this look designed", "why does this look like AI made it", "give it taste", "what layer is this decision at", or "grey-box this first". Do NOT use for accessibility, forms, or state coverage, which the `ui` governance rules carry, for the shape of the project's design document, which `design.md` governs, or to run the candidate loop, which is `pick-by-eye`.
4
4
  metadata:
5
5
  family: build
6
6
  ---
@@ -156,7 +156,7 @@ Run `${CLAUDE_SKILL_DIR}/references/preflight.md` against the output. It is the
156
156
 
157
157
  Four neighbors own the rest.
158
158
 
159
- - The candidate loop, the arm set, the render, and the pick: `draft-and-pick`
159
+ - The candidate loop, the arm set, the render, and the pick: `pick-by-eye`
160
160
  - The shape of the project's design document and where its values live: `${CLAUDE_SKILL_DIR}/../canvas-board/references/design.md`
161
161
  - Reading source for roughness: `ux-audit`. Measuring what a running interface costs to paint: `ux-measure`
162
162
  - Prose on the surface being designed: the `write-human` skill
@@ -47,7 +47,7 @@ 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 `draft-slides`, which carries the deck's design rules. Take the layer ordering and the floor from the body and the rest from it.
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
51
  - **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
52
 
53
53
  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.
@@ -101,5 +101,5 @@ Every word on the surface states what is true of it.
101
101
 
102
102
  ## Handover
103
103
 
104
- - [ ] The weakest thing on the surface is named out loud, per `draft-and-pick` Step 3, and fixed where naming it would embarrass the work
104
+ - [ ] The weakest thing on the surface is named out loud, per `pick-by-eye` Step 3, and fixed where naming it would embarrass the work
105
105
  - [ ] The floor the `ui` governance rules carry has been applied, not assumed
@@ -1,86 +1,25 @@
1
1
  ---
2
2
  name: draft-and-pick
3
- description: Why a decision settled by looking needs its own surface, and where its boundary against the planning, audit, measurement, and recording skills falls
3
+ description: Why a pointer answers under the old `draft-and-pick` name, and the test that retires it
4
4
  ---
5
5
 
6
6
  # Draft and pick requirement
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session facing a decision nobody can settle from a diff:
11
-
12
- - Describes two options in prose and asks the operator to choose. The operator decides by looking, so a described option is not an option and the answer that comes back is arbitrary.
13
- - Produces one answer for a decision that was taste, so the operator never sees what they were choosing between and the call is taken silently by whoever wrote the code.
14
- - Reports that a candidate reads well without rendering it, so the claim rests on the markup having been written rather than on the page having been seen.
15
- - Hands over one image per arm, which asks the operator to hold the differences in memory rather than showing them. The comparison is the artifact and a set of separate files is not one.
16
- - Varies three properties at once across the arms, so the pick cannot say which difference decided it and the next iteration guesses.
17
- - Writes the candidates into the real surface, so the losing arms have to be unpicked out of a tree the operator has not judged yet, and a variant left behind a flag becomes a second design nobody maintains.
18
- - Stops the loop when the arms stop differing rather than when the operator says the pick is right, which ends the run on the session's own patience.
19
- - Reads a driver record as a verdict and drops an arm on it. `canon drive` reports findings and never gates, so a run filtering the arms on a probe reading has made a claim the probe catalog has not earned.
20
- - Reads a color without compositing its alpha, samples a round control at the corner of its bounding box, or confirms a panel's dimensions while it sits above the viewport. Each reads as a passing measurement about something no reader sees.
21
- - Meets a machine with no browser binary and reports on the arms anyway, since nothing in the default flow separates a render that failed from one that was never attempted.
22
- - Hand-writes a mockup of a surface a running app already serves, which drifts from what ships by a few pixels and a few words the moment the app's own markup or stylesheet moves on.
23
- - Varies a property the decision is not about, which satisfies the one-property rule and produces a set differing in the layer a reader notices least. Five palettes over one identical page read as five skins of one design, and the operator rejected the whole set on sight.
24
- - Renders each arm in whatever theme it happens to carry, so a set spanning both themes cannot be compared without the operator toggling every arm and holding the earlier ones in memory.
25
- - Looks at a render to confirm it came out rather than to judge whether it is worth showing, which satisfies the rule against reporting an unseen result and still hands over weak work.
26
- - Writes the run's renders to a scratch path outside the record that cites them, leaving the folder holding source markup and none of the images, so the judgment is unreachable to everyone except the session that made it.
27
- - Narrows the page onto the picked arm in place on each iteration, so every earlier round is overwritten and a later pass cannot see what was already rejected.
28
- - Names no layer at all, since the instruction to name one carries no catalog to name from and nothing reports the omission. Four consecutive rounds against one page each varied a property at the top layer while the defect sat two below it, and three of the four changed nothing the operator could see.
29
- - Judges a lower layer through a finished higher one, so an operator asked about composition looks at the palette instead and answers about that.
30
- - Hands over the combined page alone for a decision about layout, where every arm sits in a column while the media queries answer to the whole window, so no arm is ever seen at its own viewport and a fault that appears only narrower survives the pick.
31
- - Rebuilds a navigation harness by hand on a run with several rounds, since each round writes its own folder and nothing reaches all of them from one address. Two design tracks hand-wrote the same page picker and theme toggle.
32
- - Meets a session with no canvas server and drafts into a file instead, which leaves the operator a second surface to open and the run a second close to remember. The canvas is the one drafting surface, so a run without one starts it rather than falling back.
33
- - Puts the pick question with no address in its output, after capturing the page and reading the image back. The operator then has to ask for a served page before they can look, so the question goes unanswered or gets answered blind.
34
- - Sets the theme on an arm that persists its own and reads it back on load, so the control reports one theme while the arm renders the other and the set is compared across two.
10
+ Without this skill, a person typing the old name after the rename to `pick-by-eye` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
35
11
 
36
12
  ## Must
37
13
 
38
- - Produce three to five arms with the shipping state among them, each carrying an id, a label, and what the arm costs.
39
- - Draft every arm of a round as one self-contained frame on one canvas page and capture that page once as a composite, so the comparison arrives as one image, except where the surface under decision is a running app: there each frame links a copy of the built stylesheet inside the page folder rather than inlining it, per `references/live-arms.md`.
40
- - Start the canvas when none is serving, and stop on a canvas that refuses to start or answers with a blank shell, rather than drafting into a file.
41
- - Emit the layer in the run's own output, drawn from the catalog `design-taste` fixes rather than from a word invented per run, and vary the arms at that layer alone. A layer held privately is one nothing can report missing, which is how the instruction went unfollowed while every round passed its own rules.
42
- - Grey-box the set when the declared layer sits below typography, and say the set is grey-boxed when handing it over, so the operator reads a flat page as the question rather than as unfinished work.
43
- - Theme every arm off the attribute the canvas toggle sets on each frame, so one control sets the whole set and the comparison holds still while the operator reads it, and give no arm a script that reads a stored preference back on load over the toggle.
44
- - Give each frame the width the arm is judged at, since a frame renders at its own layout width and answers how an arm behaves at a width where a column on a shared page could not.
45
- - Judge each render against a stated bar before handing it over, name the weakest thing on the page, and fix it where that sentence would embarrass the work.
46
- - Write each iteration to its own canvas page rather than narrowing the previous one in place, so every earlier round stays openable from the canvas page list.
47
- - Write the run's renders inside the record that cites them wherever one exists, and reserve the scratch path for inputs that are re-runnable and cited by nothing.
48
- - Render before reporting on any arm, and report a missing browser binary as a refusal naming the repair rather than describing an arm nobody has seen.
49
- - Take the pick through the structured question surface, with the recommendation ranked first and marked, and every option carrying its cost. Read the canvas selection only to resolve an answer that points at it, and treat an empty or stale selection as no answer.
50
- - Keep every write inside the run's own canvas pages until the pick is final.
51
- - Apply the winning arm in one change.
52
- - Capture every arm from the round the pick came from, whichever round that is, as an image named for its frame before deleting the run's pages, rather than discarding the losing arms with them.
53
- - Delete only the canvas pages the run itself added, recorded as it adds them, and stop only a canvas server the run itself started.
54
- - Resolve the archival capture's destination against the main worktree root, never against a linked worktree the run happens to be building in.
55
- - Put the candidates on the canvas on every run, whatever the decision's layer, and emit the canvas link ahead of the first pick question, so the operator can open the page the question is about and a still is never the only address.
14
+ - Name `pick-by-eye` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
56
16
 
57
17
  ## Must not
58
18
 
59
- - Take the pick where two arms are both defensible and the difference is taste. That call is the operator's, and taking it silently is the failure this skill exists to prevent.
60
- - Draft candidates for a decision the operator has not asked to make. Each arm costs a render, and a run offering options everywhere spends their attention rather than saving it.
61
- - Restate the mechanics of the canvas, the render, or the probes. `canon canvas` and `canon drive` own those and their help text is the source, so a second copy here hands one case two answers.
62
- - Read a `canon drive` finding as a gate over the arms.
63
- - Fire on a request that already names one answer.
64
-
65
- ## Guards
66
-
67
- The refusal strings sit in the body, since the runtime loads that file and ignores this one. Two conditions stop a run: a request naming one answer and asking for it to be built, and a decision with no visible form for a render to show.
19
+ - Carry any part of the draft and pick loop, which would give one behavior two bodies that drift apart
20
+ - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
68
21
 
69
22
  ## Out of scope
70
23
 
71
- - `plan-feature` plans the work once the answer is settled, and declares the pull request boundary its plan carries. This produces the answer to pick from and stops before the plan.
72
- - `ux-audit` reads source to find roughness and reports it. This takes its input from the operator and changes nothing until they pick.
73
- - `ux-measure` measures what a running interface costs to paint. This measures whatever a visual claim depends on, which is usually geometry or contrast rather than cost.
74
- - `ui-checklist` writes what to look at on a change already made. This runs before there is a change to look at.
75
- - `draft-screencast` scripts a recording of something already built. This has nothing built yet.
76
- - `canon canvas` owns the page, the frames, the selection, the address, and the render, and `canon drive` owns the probes. Both are invoked rather than reimplemented.
77
-
78
- ### What did not travel
79
-
80
- This descends from a project-local skill whose interactive half was written against one repository. Three of its capabilities do not travel, and the two verbs above are what stands in their place:
81
-
82
- - An arm switcher compiled into the project's own page, driven by a query parameter. A canvas page of frames replaces it, which puts the arms on the canvas rather than in the source and removes the call site a run had to remember to delete.
83
- - A copy cycle keyed to canonical page text held in a second repository. No toolkit surface has that shape, so a project holding one owns the second edit and this skill states nothing about it.
84
- - A walker that reads every control on every page and groups them by treatment. `canon drive` probes one page and reports findings, so a sweep across every surface of a site is out of reach here and a run needing one measures by hand.
85
-
86
- The capture mechanics traveled with a change of owner rather than being lost. They sat in a project-local path-scoped rule that fired whether or not the skill ran, and `canon canvas capture` owns them here, which is why this file bars restating them rather than naming a rule to defer to.
24
+ - The work itself, which `pick-by-eye` owns
25
+ - Rewriting a stale citation, which `canon migrate skill-names` owns in a tracked file and the controlling session owns on the board