@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.
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/backlog-triage/references/apply.md +6 -6
- package/claude/skills/canon-cli/SKILL.md +4 -4
- package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
- package/claude/skills/canvas-board/SKILL.md +1 -1
- package/claude/skills/context-fold/references/context.md +1 -1
- package/claude/skills/create-skill/REQUIREMENT.md +1 -1
- package/claude/skills/create-skill/SKILL.md +2 -2
- package/claude/skills/create-skill/references/skill-requirement.md +68 -9
- package/claude/skills/create-skill/references/skill.md +1 -1
- package/claude/skills/design-identity/REQUIREMENT.md +40 -0
- package/claude/skills/design-identity/SKILL.md +138 -0
- package/claude/skills/{draft-identity → design-identity}/references/card-route.md +2 -2
- package/claude/skills/design-taste/REQUIREMENT.md +4 -4
- package/claude/skills/design-taste/SKILL.md +2 -2
- package/claude/skills/design-taste/references/kinds.md +1 -1
- package/claude/skills/design-taste/references/preflight.md +1 -1
- package/claude/skills/draft-and-pick/REQUIREMENT.md +8 -69
- package/claude/skills/draft-and-pick/SKILL.md +3 -153
- package/claude/skills/draft-doc/REQUIREMENT.md +9 -30
- package/claude/skills/draft-doc/SKILL.md +4 -76
- package/claude/skills/draft-figure/REQUIREMENT.md +8 -42
- package/claude/skills/draft-figure/SKILL.md +3 -77
- package/claude/skills/draft-identity/REQUIREMENT.md +8 -23
- package/claude/skills/draft-identity/SKILL.md +3 -130
- package/claude/skills/draft-ready/REQUIREMENT.md +8 -37
- package/claude/skills/draft-ready/SKILL.md +3 -128
- package/claude/skills/draft-screencast/REQUIREMENT.md +8 -23
- package/claude/skills/draft-screencast/SKILL.md +3 -62
- package/claude/skills/draft-slides/REQUIREMENT.md +8 -27
- package/claude/skills/draft-slides/SKILL.md +3 -72
- package/claude/skills/draw-figure/REQUIREMENT.md +59 -0
- package/claude/skills/draw-figure/SKILL.md +85 -0
- package/claude/skills/{draft-figure → draw-figure}/references/architecture-set.md +2 -2
- package/claude/skills/{draft-figure → draw-figure}/references/hand-drawn.md +2 -2
- package/claude/skills/{draft-figure → draw-figure}/references/mermaid-path.md +2 -2
- package/claude/skills/{draft-figure → draw-figure}/references/mermaid.md +1 -1
- package/claude/skills/make-deck/REQUIREMENT.md +44 -0
- package/claude/skills/make-deck/SKILL.md +80 -0
- package/claude/skills/markdown-craft/REQUIREMENT.md +1 -1
- package/claude/skills/markdown-craft/SKILL.md +2 -2
- package/claude/skills/pick-by-eye/REQUIREMENT.md +86 -0
- package/claude/skills/pick-by-eye/SKILL.md +161 -0
- package/claude/skills/plan-feature/SKILL.md +2 -1
- package/claude/skills/plan-feature/references/plan.md +24 -10
- package/claude/skills/plan-groundwork/SKILL.md +1 -1
- package/claude/skills/plan-intake/SKILL.md +1 -1
- package/claude/skills/plan-ready/REQUIREMENT.md +54 -0
- package/claude/skills/plan-ready/SKILL.md +136 -0
- package/claude/skills/{draft-ready → plan-ready}/references/assembly.md +1 -1
- package/claude/skills/{draft-ready → plan-ready}/references/ready.md +1 -1
- package/claude/skills/record-screencast/REQUIREMENT.md +3 -3
- package/claude/skills/record-screencast/SKILL.md +2 -2
- package/claude/skills/role-orchestrator/REQUIREMENT.md +1 -1
- package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +5 -2
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +18 -13
- package/claude/skills/role-planner/SKILL.md +2 -1
- package/claude/skills/role-worker/SKILL.md +9 -0
- package/claude/skills/script-screencast/REQUIREMENT.md +40 -0
- package/claude/skills/script-screencast/SKILL.md +70 -0
- package/claude/skills/{draft-screencast → script-screencast}/references/beats-template.md +2 -2
- package/claude/skills/search-craft/REQUIREMENT.md +4 -4
- package/claude/skills/search-craft/SKILL.md +1 -1
- package/claude/skills/target-setup/SKILL.md +1 -0
- package/claude/skills/task-board/SKILL.md +11 -9
- package/claude/skills/task-board/references/board.md +15 -12
- package/claude/skills/teach-workspace/SKILL.md +1 -1
- package/claude/skills/teach-workspace/references/lesson-craft.md +2 -2
- package/claude/skills/ui-checklist/SKILL.md +2 -0
- package/claude/skills/write-doc/REQUIREMENT.md +46 -0
- package/claude/skills/write-doc/SKILL.md +83 -0
- package/claude/skills/{draft-doc → write-doc}/references/context.md +2 -2
- package/claude/skills/{draft-doc → write-doc}/references/docs.md +2 -2
- package/claude/skills/{draft-doc → write-doc}/references/readme.md +2 -2
- package/claude/skills/{draft-doc → write-doc}/references/wiki-kind.md +3 -3
- package/docs/agents/markdown-audit.md +4 -2
- package/docs/agents/migrate.md +2 -2
- package/docs/target/migrations.md +17 -4
- package/docs/target/projects.md +1 -1
- package/docs/workflow/parallel-features.md +3 -2
- package/docs/workflow/skill-map-on-request.md +18 -12
- package/docs/workflow/skill-map.md +13 -12
- package/docs/workflow/visual-design-workflow.md +2 -2
- package/governance/ledger/framework/astro.md +73 -0
- package/governance/ledger/framework/fastapi.md +76 -0
- package/governance/ledger/framework/nextjs.md +86 -0
- package/governance/ledger/framework/react.md +83 -0
- package/governance/ledger/framework/shadcn.md +60 -0
- package/governance/ledger/framework/tailwind.md +55 -0
- package/governance/rules/framework/astro.md +12 -14
- package/governance/rules/framework/fastapi.md +20 -24
- package/governance/rules/framework/nextjs.md +19 -27
- package/governance/rules/framework/react.md +22 -33
- package/governance/rules/framework/shadcn.md +11 -15
- package/governance/rules/framework/tailwind.md +12 -14
- package/governance/rules/writing/markdown.md +1 -1
- package/package.json +1 -1
- package/src/claude/cases/authoring.ts +15 -3
- package/src/claude/cases/misc.ts +12 -0
- package/src/claude/cases/workflow.ts +19 -1
- package/src/claude/skills-audit.ts +113 -1
- package/src/commands/claude.ts +34 -11
- package/src/commands/demo.ts +1 -1
- package/src/commands/markdown.ts +1 -1
- package/src/commands/migrate.ts +4 -0
- package/src/commands/pr.ts +30 -6
- package/src/commands/tasks.ts +383 -2
- package/src/context/audit.ts +1 -1
- package/src/demo/beats.ts +1 -1
- package/src/gov/audit.ts +3 -2
- package/src/markdown/scope.ts +45 -35
- package/src/migrate/record-layout.ts +1 -1
- package/src/migrate/skill-names.ts +68 -21
- package/src/pr/frames.ts +14 -3
- package/src/records/validate.ts +31 -0
- package/src/tasks/board.ts +854 -0
- package/src/tasks/record.ts +20 -1
- package/src/tasks/validate.ts +206 -9
- package/tooling/astro/configs/card-src/pages/og-card.astro +1 -1
- package/tooling/astro/reference.md +2 -2
- package/tooling/claude/seeds/.claude/hooks/board-validate.sh +65 -0
- package/tooling/claude/seeds/.claude/settings.json +4 -0
- /package/claude/skills/{draft-figure → draw-figure}/references/figures.md +0 -0
- /package/claude/skills/{draft-slides → make-deck}/references/deck.md +0 -0
- /package/claude/skills/{draft-and-pick → pick-by-eye}/references/live-arms.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/agent-facing.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/application.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/cli.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/library.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/plugin.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/requirements.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/wiki.md +0 -0
|
@@ -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 |
|
|
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:
|
|
47
|
-
| Render a slide deck | `canon slides` | `canon:
|
|
48
|
-
| Render an HTML source to a PNG | `canon capture` | `canon:
|
|
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:
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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
|
|
41
|
-
-
|
|
42
|
-
- Keep
|
|
43
|
-
-
|
|
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 <
|
|
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
|
-
- <
|
|
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
|
-
##
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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 `
|
|
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 `
|
|
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. `
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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: `
|
|
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 `
|
|
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 `
|
|
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
|
|
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
|
|
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
|
-
-
|
|
39
|
-
-
|
|
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
|
-
-
|
|
60
|
-
-
|
|
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
|
-
-
|
|
72
|
-
-
|
|
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
|