@erclx/canon 5.38.0 → 5.40.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 (246) hide show
  1. package/README.md +5 -5
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/SKILL.md +12 -9
  4. package/claude/skills/auto-ship/SKILL.md +43 -23
  5. package/claude/skills/backlog-triage/SKILL.md +62 -53
  6. package/claude/skills/backlog-triage/references/apply.md +69 -0
  7. package/claude/skills/build-in-slices/SKILL.md +8 -4
  8. package/claude/skills/canon-cli/SKILL.md +5 -1
  9. package/claude/skills/canon-feedback/SKILL.md +18 -8
  10. package/claude/skills/canon-feedback-triage/SKILL.md +10 -3
  11. package/claude/skills/canvas-board/SKILL.md +37 -18
  12. package/claude/skills/ci-workflow/SKILL.md +5 -4
  13. package/claude/skills/code-craft/SKILL.md +10 -6
  14. package/claude/skills/codebase-layout/SKILL.md +3 -5
  15. package/claude/skills/context-fold/REQUIREMENT.md +4 -4
  16. package/claude/skills/context-fold/SKILL.md +42 -23
  17. package/claude/skills/context-fold/references/context-refresh.md +4 -3
  18. package/claude/skills/context-fold/references/context.md +79 -64
  19. package/claude/skills/create-rule/SKILL.md +7 -3
  20. package/claude/skills/create-skill/SKILL.md +27 -7
  21. package/claude/skills/create-skill/references/skill-reference.md +41 -17
  22. package/claude/skills/decision-escalate/SKILL.md +8 -5
  23. package/claude/skills/deploy-app/SKILL.md +1 -1
  24. package/claude/skills/deprecation-migration/SKILL.md +12 -4
  25. package/claude/skills/design-taste/SKILL.md +17 -11
  26. package/claude/skills/docs-sync/REQUIREMENT.md +1 -0
  27. package/claude/skills/docs-sync/SKILL.md +17 -6
  28. package/claude/skills/docs-sync/references/docs.md +54 -21
  29. package/claude/skills/docs-sync/references/readme.md +32 -8
  30. package/claude/skills/document-health/SKILL.md +3 -4
  31. package/claude/skills/draft-and-pick/SKILL.md +73 -47
  32. package/claude/skills/draft-doc/SKILL.md +9 -4
  33. package/claude/skills/draft-doc/references/context.md +4 -4
  34. package/claude/skills/draft-doc/references/docs.md +1 -0
  35. package/claude/skills/draft-doc/references/wiki.md +3 -2
  36. package/claude/skills/draft-figure/SKILL.md +9 -7
  37. package/claude/skills/draft-identity/SKILL.md +24 -52
  38. package/claude/skills/draft-identity/references/card-route.md +46 -0
  39. package/claude/skills/draft-ready/SKILL.md +19 -7
  40. package/claude/skills/draft-screencast/SKILL.md +6 -112
  41. package/claude/skills/draft-screencast/references/beats-template.md +119 -0
  42. package/claude/skills/draft-slides/SKILL.md +9 -7
  43. package/claude/skills/draft-slides/references/deck.md +183 -0
  44. package/claude/skills/git-branch/SKILL.md +3 -3
  45. package/claude/skills/git-commit/SKILL.md +5 -3
  46. package/claude/skills/git-followup/SKILL.md +16 -9
  47. package/claude/skills/git-issue/SKILL.md +6 -5
  48. package/claude/skills/git-pr/SKILL.md +56 -44
  49. package/claude/skills/git-pr/references/evidence.md +2 -2
  50. package/claude/skills/git-pr/references/final-command.md +1 -1
  51. package/claude/skills/git-pr/references/labels.md +1 -1
  52. package/claude/skills/git-pr/references/publish.md +1 -1
  53. package/claude/skills/git-ship/SKILL.md +43 -34
  54. package/claude/skills/git-ship/references/ci-watch.md +31 -0
  55. package/claude/skills/git-split/SKILL.md +28 -100
  56. package/claude/skills/git-split/references/independent.md +40 -0
  57. package/claude/skills/git-split/references/stacked.md +73 -0
  58. package/claude/skills/git-stage/SKILL.md +9 -7
  59. package/claude/skills/git-worktree/SKILL.md +27 -49
  60. package/claude/skills/git-worktree/references/cleanup.md +55 -0
  61. package/claude/skills/markdown-craft/SKILL.md +2 -2
  62. package/claude/skills/markdown-craft/references/markdown.md +82 -53
  63. package/claude/skills/plan-feature/SKILL.md +52 -46
  64. package/claude/skills/plan-feature/references/batches.md +46 -0
  65. package/claude/skills/plan-groundwork/SKILL.md +60 -74
  66. package/claude/skills/plan-groundwork/references/output.md +48 -0
  67. package/claude/skills/plan-intake/SKILL.md +28 -21
  68. package/claude/skills/plan-intake-answer/SKILL.md +14 -13
  69. package/claude/skills/read-frames/SKILL.md +2 -0
  70. package/claude/skills/record-screencast/SKILL.md +31 -11
  71. package/claude/skills/review-address/SKILL.md +76 -158
  72. package/claude/skills/review-address/references/rebase-only.md +34 -0
  73. package/claude/skills/review-craft/SKILL.md +27 -11
  74. package/claude/skills/review-pr/SKILL.md +91 -40
  75. package/claude/skills/review-ui/SKILL.md +63 -37
  76. package/claude/skills/review-ui/references/hosted-preview.md +30 -0
  77. package/claude/skills/role-orchestrator/SKILL.md +105 -74
  78. package/claude/skills/role-orchestrator/references/orchestrator-filing.md +26 -0
  79. package/claude/skills/role-orchestrator/references/orchestrator-handback.md +1 -1
  80. package/claude/skills/role-planner/SKILL.md +66 -64
  81. package/claude/skills/role-reviewer/SKILL.md +57 -46
  82. package/claude/skills/role-worker/SKILL.md +68 -63
  83. package/claude/skills/search-craft/SKILL.md +7 -5
  84. package/claude/skills/session-compact/SKILL.md +16 -11
  85. package/claude/skills/session-map/SKILL.md +31 -10
  86. package/claude/skills/session-relay/SKILL.md +32 -65
  87. package/claude/skills/session-resume/SKILL.md +18 -13
  88. package/claude/skills/session-worktree/SKILL.md +70 -42
  89. package/claude/skills/systematic-debugging/SKILL.md +6 -1
  90. package/claude/skills/target-check/SKILL.md +13 -6
  91. package/claude/skills/target-setup/SKILL.md +39 -27
  92. package/claude/skills/task-board/SKILL.md +68 -60
  93. package/claude/skills/task-board/references/board.md +1 -1
  94. package/claude/skills/task-board/references/create-report.md +36 -0
  95. package/claude/skills/task-board/references/tasks.md +1 -1
  96. package/claude/skills/task-complete/SKILL.md +20 -18
  97. package/claude/skills/teach-workspace/SKILL.md +61 -33
  98. package/claude/skills/test-craft/SKILL.md +2 -1
  99. package/claude/skills/test-first/SKILL.md +15 -9
  100. package/claude/skills/ui-checklist/SKILL.md +18 -16
  101. package/claude/skills/ux-audit/SKILL.md +9 -10
  102. package/claude/skills/ux-measure/SKILL.md +23 -19
  103. package/claude/skills/video-craft/SKILL.md +15 -7
  104. package/claude/skills/write-human/SKILL.md +9 -1
  105. package/claude/skills/youtube-transcripts/SKILL.md +2 -1
  106. package/docs/agents/audits.md +61 -60
  107. package/docs/agents/context-audit.md +40 -58
  108. package/docs/agents/index.md +11 -61
  109. package/docs/agents/indexes.md +25 -29
  110. package/docs/agents/install-and-sync.md +125 -235
  111. package/docs/agents/markdown-audit.md +54 -96
  112. package/docs/agents/migrate.md +41 -16
  113. package/docs/agents/output-shape.md +60 -45
  114. package/docs/agents/overview.md +36 -12
  115. package/docs/agents/records.md +37 -79
  116. package/docs/agents/sessions-transfer.md +26 -70
  117. package/docs/agents/targets.md +25 -77
  118. package/docs/target/index.md +0 -1
  119. package/docs/target/migrations.md +57 -66
  120. package/docs/target/projects.md +36 -78
  121. package/docs/target/scenarios.md +9 -19
  122. package/docs/target/sync.md +27 -68
  123. package/docs/workflow/ai-workflow.md +22 -68
  124. package/docs/workflow/operating-model.md +32 -186
  125. package/docs/workflow/parallel-features.md +29 -66
  126. package/docs/workflow/skill-map-on-request.md +22 -24
  127. package/docs/workflow/skill-map.md +72 -76
  128. package/docs/workflow/visual-design-workflow.md +25 -118
  129. package/docs/workflow/zshrc-aliases.md +18 -37
  130. package/package.json +1 -1
  131. package/src/canvas/client/inspector/fields.css +4 -0
  132. package/src/canvas/index.html +6 -0
  133. package/src/claude/skills-reach.ts +2 -2
  134. package/src/cli/ui.ts +3 -1
  135. package/src/commands/canvas.ts +23 -0
  136. package/src/commands/capture.ts +14 -0
  137. package/src/commands/claude.ts +14 -1
  138. package/src/commands/context.ts +106 -7
  139. package/src/commands/demo.ts +22 -0
  140. package/src/commands/deps.ts +6 -0
  141. package/src/commands/driver.ts +28 -2
  142. package/src/commands/gov.ts +52 -18
  143. package/src/commands/hooks.ts +63 -0
  144. package/src/commands/intake.ts +17 -0
  145. package/src/commands/labels.ts +38 -5
  146. package/src/commands/markdown.ts +169 -32
  147. package/src/commands/pr.ts +160 -43
  148. package/src/commands/records.ts +8 -0
  149. package/src/commands/secrets.ts +6 -0
  150. package/src/commands/sessions.ts +8 -0
  151. package/src/commands/tasks.ts +52 -0
  152. package/src/commands/teach.ts +13 -0
  153. package/src/commands/upstream.ts +25 -1
  154. package/src/commands/worktrees.ts +5 -0
  155. package/src/context/audit.ts +274 -5
  156. package/src/context/classify/prompts.ts +1 -1
  157. package/src/context/folders.ts +1 -1
  158. package/src/context/gate.ts +23 -7
  159. package/src/context/shape-gated.ts +30 -0
  160. package/src/counts/scan.ts +1 -1
  161. package/src/design/components.ts +1 -1
  162. package/src/design/document.ts +1 -1
  163. package/src/design/tokens.ts +1 -1
  164. package/src/gate/boundaries.ts +4 -1
  165. package/src/gate/measures.ts +16 -191
  166. package/src/gate/stages.ts +14 -30
  167. package/src/git/env.ts +6 -0
  168. package/src/hooks/reply-links.ts +110 -0
  169. package/src/markdown/density.ts +258 -0
  170. package/src/markdown/gate.ts +57 -18
  171. package/src/markdown/reference-shape.ts +103 -0
  172. package/src/markdown/scope.ts +162 -0
  173. package/src/markdown/structure.ts +9 -59
  174. package/src/pr/lift.ts +153 -19
  175. package/src/pr/painted.ts +87 -0
  176. package/src/roots/record.ts +18 -1
  177. package/src/sandbox/census.ts +1 -1
  178. package/src/sandbox/headless/run.ts +3 -2
  179. package/src/sandbox/headless/watch.ts +3 -4
  180. package/src/shipped/references.ts +1 -1
  181. package/src/slides/convert/master.ts +3 -0
  182. package/src/sync/format.ts +46 -0
  183. package/src/sync/stamp.ts +6 -0
  184. package/tooling/astro/reference.md +2 -2
  185. package/tooling/base/reference.md +1 -1
  186. package/tooling/claude/seeds/.claude/hooks/reply-links.sh +72 -0
  187. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +22 -1
  188. package/tooling/claude/seeds/.claude/settings.json +4 -0
  189. package/tooling/go/reference.md +1 -1
  190. package/tooling/nextjs/reference.md +1 -1
  191. package/tooling/php/reference.md +1 -1
  192. package/tooling/python/reference.md +1 -1
  193. package/tooling/vite-react/reference.md +1 -1
  194. package/tooling/web/reference.md +1 -1
  195. package/docs/agents/canvas.md +0 -86
  196. package/docs/agents/capture.md +0 -65
  197. package/docs/agents/census.md +0 -23
  198. package/docs/agents/commands.md +0 -154
  199. package/docs/agents/comments.md +0 -34
  200. package/docs/agents/context-audit-checks.md +0 -90
  201. package/docs/agents/context-classify.md +0 -101
  202. package/docs/agents/counts.md +0 -74
  203. package/docs/agents/demo.md +0 -140
  204. package/docs/agents/docs.md +0 -27
  205. package/docs/agents/drift-surfaces.md +0 -201
  206. package/docs/agents/driver.md +0 -103
  207. package/docs/agents/gate.md +0 -90
  208. package/docs/agents/gov-detect.md +0 -47
  209. package/docs/agents/hooks.md +0 -58
  210. package/docs/agents/intake.md +0 -81
  211. package/docs/agents/key-changes.md +0 -116
  212. package/docs/agents/label-coverage.md +0 -86
  213. package/docs/agents/markdown-audit-weight.md +0 -81
  214. package/docs/agents/pr-evidence-layout.md +0 -70
  215. package/docs/agents/pr-evidence.md +0 -273
  216. package/docs/agents/pr-frames.md +0 -131
  217. package/docs/agents/pr-lift.md +0 -132
  218. package/docs/agents/pr-local.md +0 -111
  219. package/docs/agents/pr-preview.md +0 -155
  220. package/docs/agents/pr-reads.md +0 -111
  221. package/docs/agents/pr-tick.md +0 -72
  222. package/docs/agents/records-push.md +0 -61
  223. package/docs/agents/records-stale.md +0 -40
  224. package/docs/agents/records-validate.md +0 -57
  225. package/docs/agents/restated.md +0 -83
  226. package/docs/agents/routing.md +0 -61
  227. package/docs/agents/rule-citations.md +0 -90
  228. package/docs/agents/sandbox.md +0 -126
  229. package/docs/agents/scripting.md +0 -142
  230. package/docs/agents/sessions.md +0 -128
  231. package/docs/agents/skills-audit.md +0 -120
  232. package/docs/agents/skills-reach.md +0 -64
  233. package/docs/agents/slides.md +0 -176
  234. package/docs/agents/state-scoped-risk.md +0 -105
  235. package/docs/agents/superseded.md +0 -85
  236. package/docs/agents/tasks-archive.md +0 -83
  237. package/docs/agents/tasks-plans.md +0 -152
  238. package/docs/agents/tasks-validate.md +0 -133
  239. package/docs/agents/tasks.md +0 -123
  240. package/docs/agents/teach-authoring.md +0 -118
  241. package/docs/agents/teach.md +0 -157
  242. package/docs/agents/test-order.md +0 -58
  243. package/docs/agents/upstream.md +0 -94
  244. package/docs/agents/worktrees.md +0 -118
  245. package/docs/target/standards-moved.md +0 -34
  246. package/src/markdown/growth.ts +0 -43
@@ -6,93 +6,56 @@ category: Workflow
6
6
 
7
7
  # Parallel features
8
8
 
9
- When features are independent, run them in parallel instead of sequentially. Use one git worktree per feature so each session has its own working tree and branch.
9
+ Run independent features in parallel, one git worktree and one Claude Code session per feature.
10
10
 
11
11
  ## One worktree per feature
12
12
 
13
- - Create a worktree per feature, then start a Claude Code session in each
14
- - Invoke `canon:plan-feature` in each session. Plans land at the main worktree root as `.canon/plans/feature-<slug>.md`, one per feature, no collisions. Small features stay in chat and skip the file.
15
- - Implement, verify, and review each feature independently. `ui-checklist` writes a per-branch checklist handoff there too (`tmp/handoff/ui-checklist/<slug>.md`) that `git-pr` posts to the pull request and removes, so parallel sessions do not overwrite each other. The slug is the branch name with any leading type segment dropped, so `feat/jwt-expiration` and the plan at `feature-jwt-expiration.md` meet on one name
16
- - Ship each worktree separately with `canon:git-ship`
17
- - For full autonomy per worktree, invoke `canon:auto-ship` instead of the manual chain. Approve the plan, walk away, come back to a pull request the chain marked as a draft and then read the flag back on. The mark says the work has had no review yet, and it holds no window, since readying a pull request to merge lifts it directly, an act reserved to the operator or to the controlling session that closed the review.
13
+ - Invoke `canon:plan-feature` in each session. Plans land at `.canon/plans/feature-<slug>.md` at the main root.
14
+ - `ui-checklist` writes a per-branch handoff at `tmp/handoff/ui-checklist/<slug>.md`, which `git-pr` posts and removes. The slug is the branch name minus its leading type segment.
15
+ - Ship each worktree with `canon:git-ship`, or `canon:auto-ship` for a draft pull request
16
+ - Only the operator or the controlling session readies a draft
18
17
 
19
18
  ## A coordinated flow
20
19
 
21
- To run several worktrees as a coordinated flow rather than ad hoc, assert the orchestrator role in one warm session with `canon:role-orchestrator`. It holds the cross-feature call, plans each feature itself or dispatches a cold planner under `canon:role-planner` to write the plan, refills the ready queue so a free worker never waits, and reviews each worker's PR with `canon:review-pr` or dispatches a cold reviewer under `canon:role-reviewer` to run it, then tells the session holding that branch to run `canon:review-address` whenever the pass posted a finding at any severity, which is the same threshold `canon:review-pr` states and posts its open heading under. The human launches workers and merges. See [operating model](operating-model.md) for the full loop.
20
+ Assert the orchestrator role in one warm session with `canon:role-orchestrator`. It plans each feature or dispatches a cold planner under `canon:role-planner`, and dispatches a reviewer under `canon:role-reviewer` for each PR. The human launches workers and merges. See [operating model](operating-model.md).
22
21
 
23
- Execution order comes off `.canon/tasks/priority.md` and nothing sequences work into versions. Scope stays in `canon/REQUIREMENTS.md` as a statement of what is wanted, and it reaches the board as discrete tasks the orchestrator orders by readiness.
24
-
25
- Run one orchestrator at a time. The board is gitignored, so a second session reads none of the first one's writes and the two collide on labels and archives.
26
-
27
- See [operating model](operating-model.md) for what caps the worker tracks under it and what conflict holds one behind another. An operator caps a session's workers by saying so, and that cap binds for the session rather than standing as a number in a file.
28
-
29
- Before a handoff, the orchestrator checks the plan against the tree rather than reading it: grep each construct it names and count the sites, confirm every phase label it cites is still open, and open each file it describes. A plan goes stale from whatever merged after it was written, and reading cannot catch that.
30
-
31
- A constraint naming a track in flight carries the same problem past the handoff, so the block opens with the commit it was measured against. A worker re-tests before honoring one, fetching and then logging that commit against `origin/main` over the paths the constraint names, and any merge there means the track landed and the constraint is dead. An unstamped block reads as unverified rather than as live, which covers every plan written before the rule.
22
+ - Run one orchestrator at a time
23
+ - Execution order comes off `.canon/tasks/priority.md`
24
+ - Before a handoff, grep each construct the plan names and open each file it describes
25
+ - A constraint naming a track in flight opens with the commit it was measured against. A merge of that track into `origin/main` over the named paths kills the constraint.
32
26
 
33
27
  ## Records at the main root
34
28
 
35
- `.canon/plans/` and `.canon/review/` both resolve at the main worktree root, so artifacts created in any session are visible from any sibling worktree. A session inside a worktree reads them directly, since the file-editing tools refuse a main-root path but `Read` resolves normally. It writes a whole file through the shell and makes a change inside an existing file through a `canon` verb, which resolves the main root in-process. See [Claude Code and git worktrees](../../wiki/claude/worktrees.md) for why the tool refuses the write, and the fan-out section below for the domain-level guidance.
36
-
37
- The plan's shape is fixed by `claude/skills/plan-feature/references/plan.md`: the section list, the filename, and the contract its questions keep. Its lifecycle, from the session that writes it to the archive, is `claude/skills/plan-feature/references/plan-lifecycle.md`. Every question carries a `- Suggested:` line and an empty `- Answer:` slot, and a blank answer accepts the suggestion at execution time. That default is what makes a plan decision-ready in one pass, and it is the opposite of the contract an intake folder keeps, where an empty slot means nobody reached the item.
38
-
39
- An execution that picks other than the suggestion rewrites the `- Suggested:` line as `overridden at execution to <pick>,` followed by the measurement that moved it, and leaves the slot blank. That fixed phrase is how a reader of the archived plan tells an override from a suggestion the execution accepted, since an authored suggestion often carries a number of its own. The same deviation takes one line in the open task's `## Findings`, which is the register that survives the plan being archived. A deviation from a question somebody already answered goes back to whoever answered it instead, since a filled slot is a decision already made.
40
-
41
- `canon records validate plans` reports where a plan and that standard disagree: a filename that is not `feature-<slug>.md`, a missing required section, a files-to-touch entry naming no file, and a question carrying a suggestion with no answer slot. The same verb takes `groundwork`, `intake`, and `teach`, which are governed the same way and were unreachable for the same reason. Nothing fires it automatically, because all four folders are gitignored and every check the repository runs reads changed files from git. It reports and never writes, since the folders are per-machine scratch with no history to recover a wrong repair from.
42
-
43
- `canon records push` carries these folders off the disk they live on, and `canon records pull` brings them back. Every top-level entry under `.canon/` is backed except `tmp`, `ordinal-locks`, and `.records.git`, so a folder added later enters the payload on its own rather than waiting on a name written into a list. Push names each folder it carries the first time it sees it, which is what keeps a stray folder visible instead of silently entering the payload. It refuses the whole push, naming each path, when a new or changed file is over 25 MB or carries a credential `canon secrets scan` would report. The history lives in a second git directory at `.canon/.records.git` with `.canon/` as its work tree, so every path a task file cites stays where it is.
44
-
45
- A person points it at a private repository once and both verbs refuse until they have, and `push` refuses when that origin is also a remote of the project, since the payload is the task board and the groundwork trails. `.husky/post-merge` runs the push after its archive loop, on every merge rather than only on one that closed a task. See [records push](../agents/records-push.md) for the refusal table.
46
-
47
- `canon records size` reports what each of these folders holds, heaviest first, along with `.canon/tmp`. Each row carries the file count, the bytes, how many files were written in the last 7 and 30 days, and the dates of the least and most recently written one. Nothing fails on a number, because a record folder has no correct size. What the verb replaces is a reading somebody had to remember to take: a pen went from 44 entries to 236 between two counts made by hand a fortnight apart, and nothing reported the rate in between.
48
-
49
- `canon records prune-tmp` reports scratch under `.canon/tmp` nobody has touched inside an age window, and deletes it only with `--write`. A `tmp/handoff/` folder and the live `tmp/pr/poll/` baseline are never offered, since a reader deletes a handoff once it is read and a poll baseline is state a session still needs. See [records](../agents/records.md) for the candidate shapes and the exit codes.
29
+ `.canon/plans/` and `.canon/review/` resolve at the main worktree root. File-editing tools refuse a main-root path from a worktree, so write a whole file through the shell and change an existing one through a `canon` verb.
50
30
 
51
- `canon records stale canonical` reports when the requirements record was last reviewed and how many releases have shipped since, so a review of it starts from a count rather than from the tag list. It writes nothing. See [records stale](../agents/records-stale.md) for how the count is taken and the refusals.
31
+ `claude/skills/plan-feature/references/plan.md` fixes the plan's shape and `claude/skills/plan-feature/references/plan-lifecycle.md` its lifecycle. A blank `- Answer:` slot accepts the `- Suggested:` line.
52
32
 
53
- A plan that ships is archived, never deleted. `canon tasks archive` moves it to `.canon/plans/archive/` alongside the task it belonged to and retargets that task's `Plan:` line at the new location, so a completed task still leads to the reasoning behind it. An archive sits inside the record folder it archives rather than beside it, so one ignore entry and one backed-folder entry cover a record and everything it has retired. The folder is gitignored, which is why a deleted plan had no recovery path. A plan cited by more than one task stays put until the last of them closes, since moving it early would strand every other pointer.
33
+ - To pick otherwise, rewrite that line as `overridden at execution to <pick>,` plus the measurement, and add one line to the open task's `## Findings`
54
34
 
55
- An older branch review report takes the other route and is swept rather than archived. It sits flat in `.canon/review/` as `branch-<slug>.md`, the session addressing it read it once, and the durable record of what a review found is the comment `review-pr` posts on the pull request, so `canon:task-complete` deletes any report whose branch is gone. The body that writes a report owns how long it lives, which leaves the shipping branch's own report on disk through the run that cites it and collects it a branch later. What that loses is a local-only review on a branch that never opened a pull request, which is why the report says so where a reader meets it.
56
-
57
- `canon:task-complete` decides which task closed by reading the diff rather than the conversation, as the ship-chain step after `canon:context-fold`. It resolves a merge base against `origin/main`, unions the committed diff with the working tree and untracked files, then matches unchecked outcomes on the board against what shipped. A task that shipped without ever being discussed still gets marked. Decisions stay session-sourced, because a diff cannot carry a judgment, and `canon:context-fold` folds them into the context entries. The requirements record is never folded. A direction change gets one report line naming `canon:document-health`, which reviews that record only when asked.
35
+ - `canon records validate plans` reports a plan breaking its standard, and takes `groundwork`, `intake`, and `teach`
36
+ - `canon records push` and `canon records pull` carry `.canon/` to and from a private repository. See [records](../agents/records.md).
37
+ - `canon records size`, `canon records prune-tmp`, and `canon records stale canonical` report folder size, idle scratch, and releases since the requirements review
38
+ - `canon tasks archive` moves a shipped plan to `.canon/plans/archive/` and retargets the task's `Plan:` line
58
39
 
59
40
  ## Shipping a fan-out
60
41
 
61
- A fan-out of N worktrees produces N pull requests. The order they merge in matters only when two branches touch the same file.
62
-
63
- **Rebase profile.** Work confined to one domain directory, such as a new skill under its own folder or independent fixes in different subtrees of `scripts/`, rarely touches a sibling's files. A shared file does not hold a branch back, per the conflict test in [operating model](operating-model.md). These paths are shared hotspots, the ones a second branch should expect to rebase over and resolve:
64
-
65
- - `CLAUDE.md`, since cross-domain behavior lives there
66
- - `tooling/**`, since stack manifests, golden configs, and seeds are tightly coupled
67
- - `canon/context/context-model/overview.md` and `docs/agents/`, which several domains cross-reference
68
- - Any folder's `index.md`, since `canon indexes regen` rewrites it and two worktrees adding files to a regen-covered folder race on it. Resolve its conflict by running the regen over the rebased tree rather than by hand.
69
-
70
- Land any in-flight edit to a hotspot on `main` before fanning out where you can. A worktree on a stale `CLAUDE.md` costs more to rebase than it saved.
71
-
72
- **Merge order.** Merge the branch with the smallest hotspot footprint first. A branch touching `CLAUDE.md`, a context entry, or a regenerated `index.md` merges last, and its siblings rebase on the new `main` once it lands.
73
-
74
- **Rebase before the next merge.** After one squash-merge, each sibling is behind `main` and may carry a stale copy of a shared file. The branch merging second resolves, in the session that built it and after the first lands, never against a sibling still building: run `/review-address` there, which trial-merges against `origin/main` and rebases a branch that no longer merges or whose files `main` changed. Push, then merge. Never force-merge a stale branch.
42
+ Merge order matters only when two branches touch the same file. Expect to rebase over `CLAUDE.md`, `tooling/**`, `canon/context/context-model.md`, `docs/agents/`, and any folder's `index.md`. Resolve an `index.md` conflict with `canon indexes regen` over the rebased tree.
75
43
 
76
- **Clean up after merge.** Run `/git-worktree cleanup` to remove worktrees whose branches merged on GitHub and prune the local branches. The skill reads merge state through `gh pr view`. To start a fresh feature from a stale worktree, `ExitWorktree(action: "keep")` back to main, then `/session-worktree <new-name>`.
77
-
78
- **When fan-out was the wrong call.** Sharing a file was never the reason. If every rebase needs a decision the tree does not carry, because one branch depended on another, changed a contract the other consumed, moved a path the other wrote, or swept a folder the other wrote inside, the branches should have serialized. Land one, wait, then start the next. The cleanup skill only tidies a flow that already worked.
44
+ - **Merge order.** Merge the smallest hotspot footprint first, and a branch touching `CLAUDE.md` or a context entry last.
45
+ - **Rebase.** The branch merging second runs `/review-address`, which trial-merges against `origin/main` and rebases. Push, then merge.
46
+ - **Clean up.** Run `/git-worktree cleanup` to remove merged worktrees. To start fresh, `ExitWorktree(action: "keep")`, then `/session-worktree <new-name>`.
47
+ - **Wrong call.** If a rebase needs a decision the tree does not carry, land one branch before starting the next.
79
48
 
80
49
  ## The task board
81
50
 
82
- `.canon/tasks/` is gitignored and resolves at the main worktree root, so every session shares one board. One file per task is what keeps concurrent sessions from overwriting each other, since a gitignored board has no history to recover a lost write from. Its `index.md` is generated by a hook rather than by `bun run check`, because the whole-repo index walk skips gitignored folders.
83
-
84
- A hand-maintained `priority.md` sits beside the index carrying execution order and what each task is waiting on, which the alphabetical index cannot express.
85
-
86
- `canon tasks validate` reads a row against its own table before it reads anything the row claims. A blank or prose line closes the table above it, so a row stranded there is checked against the line behind it rather than parsed as a continuation, and a row that clears that test still has its cell count checked against its header. A `## Needs a plan` row that states its own position, searched for `<ordinal> here` or the bare word `last` anywhere in the cell rather than at its start, is checked against where it actually sits, which is what catches a gap, a duplicate, and a sequence starting somewhere other than first alike.
87
-
88
- Past that shape, it checks what a surviving row claims against what the tree holds: every plan pointer resolves, every task file is named by a board row or a backlog line and never by both, no task sits in two groups, and every row marked ready names its files. One check across both surfaces is what lets a task move between the board and the backlog without the move reading as a dropped file. Paths two ready rows share go to a `shared` array moving no exit code, the candidate list the orchestrator's conflict check reads. Blockers re-takes what a parked row waits on, reporting one whose cited task reached the trunk and one whose cited file nothing running still holds. A cited task settles the row by being archived, or by closing every outcome and naming a pull request the trunk carries, since the checkbox alone is marked while the branch is still in review. Both halves read a citation out of the blocker cell, so a row citing neither is reported as untested rather than counted clean, and so is a cited task the trunk could not answer for. It reports and never writes, because a row is the orchestrator's claim and a validator repairing one would assert the claim it exists to test. Nothing fires it automatically, since the board is gitignored per-machine scratch with no shared moment to hang a hook on, so the orchestrator's sweep calls it at the point the readiness claim is made and follows it with the parked re-test.
89
-
90
- `canon:task-board` creates the file, holding the filename convention and the frontmatter contract so a malformed write cannot break the index for every sibling, and declines a task decided against. `canon:task-complete` marks a shipped task's outcomes and moves one the merge hook left to `.canon/tasks/archive/`. Creation is where the origin invariant is enforced: every task names a plan, a groundwork folder, an intake folder, or an issue, since a task with no origin is either lost context or work nobody decided to do.
51
+ `.canon/tasks/` is gitignored and resolves at the main worktree root, one file per task. A hook generates `index.md`, and `priority.md` carries execution order and blockers.
91
52
 
92
- Archiving a task carries its plan with it, in the same act. The merge is what settles a plan, and the hook below reaches the archive with nobody watching, so a second call after it would be a second failure point leaving the task archived and the plan live. A task whose plan a sibling still cites archives on its own and leaves the plan live, since moving it on the first task to close strands every other pointer at a path that has gone.
53
+ `canon tasks validate` reports and never writes:
93
54
 
94
- Nothing chained that archive until the `post-merge` git hook landed. Every earlier step fires from `canon:auto-ship` or `canon:git-ship`, both of which finish while the pull request is still open, so a task archived there would close for work that may be abandoned. The board is gitignored, which rules out reading it from anywhere but the machine that pulled. The hook archives the task a merged pull request closed, through the same verb the base stack ships to every target, and does nothing on a project with no board.
55
+ - A row's cell count must match its header, and a `## Needs a plan` row stating its position is checked against where it sits
56
+ - Every plan pointer resolves, every task file is named once, and every ready row names its files
57
+ - A parked row is reported when its cited task reached the trunk
95
58
 
96
- The archive gates on a pull request number the merge carried and a closed task, because outcomes are marked on the branch and a task can read all `[x]` while its pull request is still open, so `canon:task-complete` still confirms the work reached `main` when a person archives by hand. A companion `post-rewrite` hook carries the same steps for anyone pulling with rebase, which fires that event instead of `post-merge`.
59
+ `canon:task-board` creates a task file, and `canon:task-complete` marks outcomes. The `post-merge` hook archives the task a merged pull request closed, with its plan, and a `post-rewrite` hook does the same for a rebase pull. Both archive only when the merge carried a PR number and the task is closed.
97
60
 
98
- The hook archives through `canon tasks archive`, which carries the refusals above, so a task whose pull request has not merged stays where it is. Both hooks ship with the `base` tooling stack, so a target project running this workflow gets the same trigger, and `CANON_SKIP_RECLAIM`, `CANON_SKIP_UPGRADE`, and `CANON_SKIP_PLUGIN_UPDATE` turn off the three steps that act on the machine.
61
+ `CANON_SKIP_RECLAIM`, `CANON_SKIP_UPGRADE`, and `CANON_SKIP_PLUGIN_UPDATE` turn off the three hook steps that act on the machine.
@@ -6,34 +6,32 @@ category: Workflow
6
6
 
7
7
  # Skill map on request
8
8
 
9
- These two groups hold the skills no single moment in a project's life calls for, so they sit apart from the moment-ordered groups in the [skill map](skill-map.md). The two pages together are the corpus the coverage claim is measured against, and a skill takes one row across both.
9
+ These skills serve a request rather than a moment. With the [skill map](skill-map.md) they cover every plugin skill once.
10
10
 
11
11
  ## Generate an artifact on demand
12
12
 
13
- | Skill | When to use |
14
- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
15
- | `canon:create-rule` | For a project-specific governance rule the toolkit does not ship |
16
- | `canon:create-skill` | For a new `SKILL.md` |
17
- | `canon:draft-doc` | For a brand-new `docs/` page, context entry, wiki reference page, or `README.md`, drafted against the standard for its kind |
18
- | `canon:draft-ready` | For finished files a worker should copy, written as a ready folder with its overview, thin plan, and task |
19
- | `canon:draft-figure` | For a hand-drawn figure or an architecture view inside an existing doc, drafted in Mermaid or freehand SVG |
20
- | `canon:ci-workflow` | For a GitHub Actions workflow file |
21
- | `canon:draft-slides` | For a deck, drawn as HTML slides in its own folder and rendered to editable PowerPoint |
22
- | `canon:draft-screencast` | For a recording script with beats and defaults already seeded |
23
- | `canon:record-screencast` | For recording a screencast draft, then composing the take into a finished mp4 when the draft asks for a wrap |
24
- | `canon:draft-identity` | For a project's logo mark and its social card, drafted through `draft-and-pick`'s pick loop |
13
+ | Skill | When to use |
14
+ | ------------------------- | ------------------------------------------------- |
15
+ | `canon:create-rule` | A project rule the toolkit does not ship |
16
+ | `canon:create-skill` | A new `SKILL.md` |
17
+ | `canon:draft-doc` | A new `docs/` page, context entry, or `README.md` |
18
+ | `canon:draft-ready` | Finished files a worker should copy |
19
+ | `canon:draft-figure` | A figure or architecture view inside a doc |
20
+ | `canon:ci-workflow` | A GitHub Actions workflow file |
21
+ | `canon:draft-slides` | A deck rendered to editable PowerPoint |
22
+ | `canon:draft-screencast` | A recording script with beats seeded |
23
+ | `canon:record-screencast` | Recording a screencast draft into a finished mp4 |
24
+ | `canon:draft-identity` | A logo mark and social card |
25
25
 
26
26
  ## Answer a question at any point
27
27
 
28
- | Skill | When to use |
29
- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
30
- | `canon:canon-cli` | To pick the `canon` verb that does a job, or before a sync or migrate, to learn which verbs can lose the project's edits |
31
- | `canon:youtube-transcripts` | When a video transcript is wanted in the repo as context |
32
- | `canon:read-frames` | To read a recorded demo back frame by frame and report what each one shows, with no verdict on whether the recording looks right |
33
- | `canon:teach-workspace` | To learn a subject across sessions, in a workspace that holds the progress |
34
- | `canon:markdown-craft` | Before a substantial markdown edit, for the format and structure rules and the audit that follows |
35
- | `canon:write-human` | Before drafting or revising prose, for voice, rhythm, and density |
28
+ | Skill | When to use |
29
+ | --------------------------- | ----------------------------------------------------- |
30
+ | `canon:canon-cli` | To pick a `canon` verb, or learn which can lose edits |
31
+ | `canon:youtube-transcripts` | A video transcript wanted as context |
32
+ | `canon:read-frames` | To read a recorded demo back frame by frame |
33
+ | `canon:teach-workspace` | To learn a subject across sessions |
34
+ | `canon:markdown-craft` | Before a substantial markdown edit |
35
+ | `canon:write-human` | Before drafting or revising prose |
36
36
 
37
- Every row answers a question rather than marking a point in a project's life, so filing one under a phase on the [skill map](skill-map.md) would send a reader to the wrong group.
38
-
39
- A learning workspace produces two halves and only one of them leaves. A lesson is worked through once and stays in the workspace, and a reference page or a glossary carries no learner, so it belongs wherever the project already keeps prose on that subject. Asking `canon:teach-workspace` to promote sorts each durable page by who owns its subject, sending an Anthropic-owned subject to the wiki, an internal one to the matching context entry, and everything else, subject-neutral material included, to the public docs. It proposes and waits, because a promoted page is public prose that needs a line naming who owns the subject, and it writes nothing to a destination: each page the operator confirms goes to a handoff file that `canon:teach-workspace` folds in from a branch in its fold mode. A project with no wiki folder gets a refusal naming `canon wiki init` rather than a folder it never asked for.
37
+ Ask `canon:teach-workspace` to promote a learning workspace's reference pages and glossaries. It proposes a destination per page and waits. An Anthropic-owned subject goes to the wiki, an internal one to the matching context entry, and the rest to the public docs. A project with no wiki folder gets a refusal naming `canon wiki init`.
@@ -6,103 +6,99 @@ category: Workflow
6
6
 
7
7
  # Skill map
8
8
 
9
- Groups run in the order a project meets them. They reconcile the scenarios in [AI workflow](ai-workflow.md) with the lifecycle [target projects](../target/projects.md) describes, so every moment either one names has a group. Each row says when to reach for a skill, and its description says what it does.
10
-
11
- This page and [skill map on request](skill-map-on-request.md) are the corpus the coverage claim is measured against: every name `canon claude skills list --names` reports takes exactly one row across the two. A skill serving two moments sits at the earlier one, this page counting as earlier than the sibling, and a mention on any other page is prose rather than routing. The sibling holds the groups that answer a request rather than mark a moment.
12
-
13
- Each row sits under the group its skill's `metadata.family` names. The landing page's skills field groups by that field and reads each row's text from both pages, so its build refuses a skill with no row, a row naming no skill, a row filed under another group, and a heading on either page naming no family group, even one with no rows under it. A new group takes its vocabulary entry in `src/claude/skills-families.ts` before its heading lands here.
9
+ Groups run in the order a project meets them. Every name `canon claude skills list --names` reports takes one row across this page and [skill map on request](skill-map-on-request.md), under the group its `metadata.family` names.
14
10
 
15
11
  ## Set up a project
16
12
 
17
- | Skill | When to use |
18
- | -------------------- | ----------------------------------------------------------------------------------------------------------- |
19
- | `canon:target-setup` | On a fresh scaffold, to detect the stack and run the install chain, or to reach one phase of it alone |
20
- | `canon:deploy-app` | Once a project is ready to publish, to set up its Cloudflare or Vercel deploy and stop for token and domain |
13
+ | Skill | When to use |
14
+ | -------------------- | --------------------------------------------- |
15
+ | `canon:target-setup` | On a fresh scaffold, to run the install chain |
16
+ | `canon:deploy-app` | When a project is ready to publish |
21
17
 
22
18
  ## Decide what to build
23
19
 
24
- | Skill | When to use |
25
- | -------------------------- | --------------------------------------------------------------------------------- |
26
- | `canon:plan-intake` | When the input is a pile of findings rather than one feature |
27
- | `canon:plan-intake-answer` | When an intake folder holds unread slots waiting on your decision |
28
- | `canon:backlog-triage` | When the backlog needs pruning, to file a verdict per row and apply approved ones |
29
- | `canon:plan-groundwork` | When the state is unmeasured and more than one approach is live |
30
- | `canon:decision-escalate` | When open decisions turn on your preference and want batching into one set |
31
- | `canon:draft-and-pick` | When the call is taste and wants several candidates rendered side by side |
32
- | `canon:canvas-board` | When a direction should be drawn as frames the operator can see, select, and edit |
33
- | `canon:task-board` | When a decided item needs a file on the board, or one is decided against |
34
- | `canon:plan-feature` | When the approach is settled and the next step is a plan |
35
- | `canon:codebase-layout` | When a plan or change adds a file and you need to decide which folder holds it |
20
+ | Skill | When to use |
21
+ | -------------------------- | -------------------------------------------------- |
22
+ | `canon:plan-intake` | The input is a pile of findings |
23
+ | `canon:plan-intake-answer` | An intake folder holds unread slots |
24
+ | `canon:backlog-triage` | The backlog needs pruning |
25
+ | `canon:plan-groundwork` | The state is unmeasured and approaches compete |
26
+ | `canon:decision-escalate` | Open decisions turn on your preference |
27
+ | `canon:draft-and-pick` | The call is taste, wanting candidates side by side |
28
+ | `canon:canvas-board` | A direction should be drawn as editable frames |
29
+ | `canon:task-board` | A decided item needs a file on the board |
30
+ | `canon:plan-feature` | The approach is settled and needs a plan |
31
+ | `canon:codebase-layout` | A change adds a file and needs a folder |
36
32
 
37
33
  ## Build the feature
38
34
 
39
- | Skill | When to use |
40
- | ----------------------------- | ---------------------------------------------------------------------------------------------------------- |
41
- | `canon:session-worktree` | At the plan-to-execute boundary, to get an isolated tree and branch, or to route a refused main-root write |
42
- | `canon:auto-ship` | After plan approval, to chain implement, verify, draft PR |
43
- | `canon:test-first` | Before implementing a planned change, to run its test red, green, then refactor |
44
- | `canon:test-craft` | When writing or changing any test, to pick its layer and filter what it asserts |
45
- | `canon:build-in-slices` | While building a plan, to commit each tested slice and note out-of-scope defects rather than fix them |
46
- | `canon:api-design` | When changing what a caller sees, being an export, a flag, an output shape, or a retried write |
47
- | `canon:deprecation-migration` | When deleting or replacing code something may still call, to migrate its callers and prove none remain |
48
- | `canon:code-craft` | Before writing a function, class, or module, to pick the shape the next change needs |
49
- | `canon:review-craft` | When reviewing a change, for what to look for and how much evidence a finding needs |
50
- | `canon:search-craft` | Before searching outside the project, to derive where the field's authorities publish and search there too |
51
- | `canon:systematic-debugging` | When a test fails or a bug surfaces, to force root cause first |
52
- | `canon:design-taste` | When drafting or judging an interface, or when output reads generic, to settle which decision comes first |
53
- | `canon:video-craft` | Before composing or judging a video, for sourced captions, zoom, pointer, and audio judgment |
54
- | `canon:ui-checklist` | After a UI change, to write what to look at and name what ships untested |
35
+ | Skill | When to use |
36
+ | ----------------------------- | -------------------------------------------------- |
37
+ | `canon:session-worktree` | At plan-to-execute, for an isolated tree |
38
+ | `canon:auto-ship` | After plan approval, to chain implement through PR |
39
+ | `canon:test-first` | Before implementing a planned change |
40
+ | `canon:test-craft` | Writing or changing a test |
41
+ | `canon:build-in-slices` | While building, to commit each slice |
42
+ | `canon:api-design` | Changing what a caller sees |
43
+ | `canon:deprecation-migration` | Deleting or replacing code something may call |
44
+ | `canon:code-craft` | Before writing a function, class, or module |
45
+ | `canon:review-craft` | Reviewing a change |
46
+ | `canon:search-craft` | Before searching outside the project |
47
+ | `canon:systematic-debugging` | A test fails or a bug surfaces |
48
+ | `canon:design-taste` | Drafting or judging an interface |
49
+ | `canon:video-craft` | Before composing or judging a video |
50
+ | `canon:ui-checklist` | After a UI change, to list what to check |
55
51
 
56
52
  ## Check the work before it leaves the branch
57
53
 
58
- | Skill | When to use |
59
- | ----------------------- | --------------------------------------------------------------------------------- |
60
- | `canon:document-health` | When the documents themselves have to answer for length, placement, and staleness |
61
- | `canon:ux-audit` | To read UI source for missing states, edge cases, and inconsistencies |
62
- | `canon:ux-measure` | To start the interface and measure paint, processor, and layout cost |
54
+ | Skill | When to use |
55
+ | ----------------------- | ---------------------------------------------- |
56
+ | `canon:document-health` | Documents must answer for length and staleness |
57
+ | `canon:ux-audit` | To read UI source for missing states |
58
+ | `canon:ux-measure` | To measure paint, processor, and layout cost |
63
59
 
64
60
  ## Ship it
65
61
 
66
- | Skill | When to use |
67
- | --------------------- | ----------------------------------------------------------------------------------------------- |
68
- | `canon:git-ship` | To run the whole post-feature chain from the verify gate through open PR |
69
- | `canon:context-fold` | When decisions diverged from the plan, or the diff left a context entry stale |
70
- | `canon:task-complete` | After the fold, to mark the outcomes the diff shipped, or to archive a task the merge hook left |
71
- | `canon:docs-sync` | When a change since main left `README.md` or `docs/` stale |
72
- | `canon:git-stage` | When the staged set spans several concerns and wants one commit each |
73
- | `canon:git-commit` | When the staged set is one concern, or was staged hunk by hand |
74
- | `canon:git-branch` | When a branch name needs generating or renaming to conventional form |
75
- | `canon:git-pr` | When a pull request needs a title and body written from the diff |
62
+ | Skill | When to use |
63
+ | --------------------- | --------------------------------------------- |
64
+ | `canon:git-ship` | To run the post-feature chain through open PR |
65
+ | `canon:context-fold` | The diff left a context entry untrue |
66
+ | `canon:task-complete` | After the fold, to mark shipped outcomes |
67
+ | `canon:docs-sync` | A change left `README.md` or `docs/` stale |
68
+ | `canon:git-stage` | Staged changes span several concerns |
69
+ | `canon:git-commit` | Staged changes are one concern |
70
+ | `canon:git-branch` | A branch name needs generating or renaming |
71
+ | `canon:git-pr` | A pull request needs a title and body |
76
72
 
77
73
  ## After the pull request opens
78
74
 
79
- | Skill | When to use |
80
- | ---------------------- | ---------------------------------------------------------------------- |
81
- | `canon:review-pr` | From an independent session, to post findings on the PR itself |
82
- | `canon:review-ui` | Beside the code review, to drive the PR's checklist in the running app |
83
- | `canon:review-address` | On the worker's side, to fix posted findings and push a follow-up |
84
- | `canon:git-followup` | For a small self-review edit on a branch whose PR is already open |
85
- | `canon:git-split` | When a branch turns out to carry unrelated commits |
86
- | `canon:git-issue` | When something surfaced that belongs on the tracker rather than here |
87
- | `canon:git-worktree` | After a PR merges, to list worktrees and reclaim the slot |
75
+ | Skill | When to use |
76
+ | ---------------------- | --------------------------------------------- |
77
+ | `canon:review-pr` | From an independent session, to post findings |
78
+ | `canon:review-ui` | Beside code review, to drive the checklist |
79
+ | `canon:review-address` | As the worker, to fix posted findings |
80
+ | `canon:git-followup` | A small edit on a branch with an open PR |
81
+ | `canon:git-split` | A branch carries unrelated commits |
82
+ | `canon:git-issue` | Something belongs on the tracker |
83
+ | `canon:git-worktree` | After a merge, to reclaim worktrees |
88
84
 
89
85
  ## Run several tracks at once
90
86
 
91
- | Skill | When to use |
92
- | ------------------------- | ----------------------------------------------------------------------------------------------------------- |
93
- | `canon:role-orchestrator` | To assert the control session that owns the queue and dispatches a reviewer for each worker's PR |
94
- | `canon:role-planner` | To assert the thinking role for a cold session writing a plan, a groundwork track, or an intake pass |
95
- | `canon:role-reviewer` | To assert the reviewing role for a cold session dispatched to review one pull request |
96
- | `canon:role-worker` | To assert the worker role for a cold session building one branch under one plan |
97
- | `canon:session-relay` | When this session owes another session a message, with or without a role |
98
- | `canon:session-resume` | At the start of a session, to pick up what a previous one left |
99
- | `canon:session-compact` | Before a compaction or a move to another machine, to write a plain session's handoff note outside the board |
100
- | `canon:session-map` | At the close of an orchestrating session, to write its board-side handoff |
87
+ | Skill | When to use |
88
+ | ------------------------- | --------------------------------------------------- |
89
+ | `canon:role-orchestrator` | To assert the control session that dispatches |
90
+ | `canon:role-planner` | To assert the role of a session writing a plan |
91
+ | `canon:role-reviewer` | To assert the role of a session reviewing one PR |
92
+ | `canon:role-worker` | To assert the role of a session building one branch |
93
+ | `canon:session-relay` | This session owes another a message |
94
+ | `canon:session-resume` | At session start, to pick up a previous one |
95
+ | `canon:session-compact` | Before a compaction, to write a handoff |
96
+ | `canon:session-map` | When an orchestrating session closes |
101
97
 
102
98
  ## Keep the project current with the toolkit
103
99
 
104
- | Skill | When to use |
105
- | ----------------------------- | -------------------------------------------------------------------------------------- |
106
- | `canon:target-check` | In a target project, to report per domain what it holds against what the toolkit ships |
107
- | `canon:canon-feedback` | When something in the toolkit is broken, missing, or off, to open an issue on it |
108
- | `canon:canon-feedback-triage` | In the toolkit repo, to file the open feedback issues into an intake folder |
100
+ | Skill | When to use |
101
+ | ----------------------------- | ---------------------------------------------------- |
102
+ | `canon:target-check` | In a target, to compare each domain with the toolkit |
103
+ | `canon:canon-feedback` | The toolkit is broken, missing, or off |
104
+ | `canon:canon-feedback-triage` | In the toolkit repo, to file feedback issues |
@@ -6,147 +6,54 @@ category: Workflow
6
6
 
7
7
  # Visual design workflow
8
8
 
9
- Three tiers cover the range from prose-only design docs to a fully graphical design source of truth. Pick one per project based on how UI-heavy the work is, whether stakeholders review visuals, and whether a designer is involved. Tiers stack, so moving up does not invalidate work done at a lower tier.
10
-
11
- The tier framework sits alongside [Claude Design](../../wiki/claude/design.md), the one catalog page in this range. Excalidraw and the surrounding MCP and skill ecosystem are named inline below rather than catalogued separately. This page decides when to reach for what.
12
-
13
- [Claude Design](../../wiki/claude/design.md), released 2026-04-17 and priced inside Claude subscriptions, is the ceiling tool for tier 1 and tier 2. Reserve it for codebase extraction and the richly annotated handoff bundle.
9
+ Three tiers run from prose-only design docs to a graphical source of truth, and tiers stack. [Claude Design](../../wiki/claude/design.md) is the ceiling tool for tiers 1 and 2.
14
10
 
15
11
  ## Tier 0: prose only
16
12
 
17
- The default. `canon/DESIGN.md` holds visual intent, being one Overview paragraph, at most three one-line rules a section, and a table naming what each color and shape role is for. Its lead names the stylesheet the values live in, since a hand-typed copy of them drifts from the CSS.
18
-
19
- Claude Code reads it and writes the implementation. Works for CLI tools, internal dashboards, admin panels, and backend-focused projects.
20
-
21
- ### Seed shape
22
-
23
- The toolkit seed in `tooling/claude/seeds/canon/DESIGN.md` ships an intent template with a starting set of roles, each naming its custom property, and `claude/skills/canvas-board/references/design.md` carries the same tables under `## Template` with placeholder rows. The column headers are what the parser reads, so they stay verbatim in either, while the rows are the project's own. The seed's lead asks for the project's own stylesheet, such as `src/styles/tokens.css` or a Tailwind `@theme` block, and falls back to `.claude/design/project/` only when the project has none.
24
-
25
- `canon design render` writes an HTML plus CSS preview to `.canon/tmp/render/design/` for eyeballing the current system without leaving Claude Code. See `canon/context/design/index.md`.
26
-
27
- A project wanting a neutral starting point to override runs `canon design install`, which copies one stylesheet to `.claude/design/base.css` carrying an achromatic token set as custom properties and two components built on them. Greys run from near-black to near-white and the accent is monochrome, so the only palette the project renders is one it writes itself. That file is toolkit-owned and `canon design sync` refreshes it, so a project overrides a value in `.claude/design/project/` instead, which sync never touches. Nothing arrives without that install, and the two channels are independent: a record the project wrote is its own, and the installed stylesheet is the toolkit's.
28
-
29
- A record generated from a token source carries the values in tables instead, which is the shape this toolkit's own record takes. There a cell no source anchors ends in `? verify`, and the preview shows that marker beside the value rather than folding it in, so a swatch and a font sample stay built from the value alone. A confidence line above the sections names how many cells are anchored against how many are tagged, which is what tells a reader whether they are looking at a record of the code or a proposal about it. It reads the columns a source could anchor and leaves out the row names, so the ratio is not diluted by cells no tag could ever reach. The proposal path tags nearly all of them, so that count reads low on day one by design.
30
-
31
- ### Tools
32
-
33
- - None beyond Claude Code itself
34
- - Playwright CLI optional for verifying journeys across routes and browser-only behavior. See [`test-craft`](../../claude/skills/test-craft/SKILL.md) for which layer a journey belongs at.
13
+ The default. `canon/DESIGN.md` holds visual intent as one Overview paragraph, at most three one-line rules a section, and a table naming each color and shape role, with a lead naming the stylesheet. Claude Code alone suffices, and [`test-craft`](../../claude/skills/test-craft/SKILL.md) says which layer a Playwright journey belongs at.
35
14
 
36
- ### Skills
15
+ - The seed is `tooling/claude/seeds/canon/DESIGN.md`, and its column headers stay verbatim
16
+ - `canon design render` previews it in `.canon/tmp/render/design/`
17
+ - `canon design install` copies a neutral base to `.claude/design/base.css`, so override values in `.claude/design/project/`. See `canon/context/features/design.md`.
37
18
 
38
- #### Reviewing and measuring
19
+ These skills cover the tier:
39
20
 
40
- - `canon:ui-checklist` for what a reviewer has to look at after UI changes, and what ships without a test
41
- - `canon:ux-audit` for UX gap detection on existing surfaces
42
- - `canon:ux-measure` for what a running surface costs to paint, read against published thresholds
21
+ - `canon:ui-checklist`, `canon:ux-audit`, and `canon:ux-measure` review and measure a UI
22
+ - `canon:draft-and-pick` drafts candidates as frames on the canvas and takes your pick
23
+ - `canon:canvas-board` works a direction out as HTML frames you edit in the browser. Only the pick moves into `canon/DESIGN.md`.
24
+ - `canon:draft-identity` drafts a logo mark and social card
43
25
 
44
- #### Drafting
45
-
46
- - `canon:draft-and-pick` for a call settled by looking, drafting several candidates as frames on the canvas and taking your pick
47
- - `canon:canvas-board` for a direction worked out over several turns, drawn as HTML frames you drag, select, and restyle in the browser while the session reads your changes back. Only the pick moves into `canon/DESIGN.md`, since the canvas folder is gitignored
48
- - `canon:draft-identity` to draft a project's logo mark and compose it into an icon sequence and a social card, through `draft-and-pick`'s own render-and-pick loop. On an Astro project holding the card route scaffold, the card lands as a route the project keeps and is captured through a running server, so it reads the project's real stylesheet rather than typed copies of every color. Everywhere else it ships as a PNG and the run says so.
49
- - Anthropic's `frontend-design` plugin optional for light visual steering
50
-
51
- ### When to pick
52
-
53
- - UI is not the core product
54
- - Design decisions are few and can be written as sentences
55
- - No designer on the project
56
- - Stakeholders review code or behavior rather than mockups
26
+ Pick tier 0 when the UI is not the core product, decisions fit in sentences, and stakeholders review code.
57
27
 
58
28
  ## Tier 1: visual companion
59
29
 
60
- Prose stays as source of truth. Add a visual render as a feedback surface for the agent and for human review.
61
-
62
- - Excalidraw handles agent-drawn layouts when the round-trip canvas loop matters
63
- - Claude Design joins only when codebase extraction or the annotated handoff bundle is worth the ceiling cost
64
-
65
- Both produce derived artifacts, so human edits are review annotations rather than source changes.
66
-
67
- ### Seed shape
68
-
69
- Same as tier 0. `DESIGN.md` stays human-maintained.
70
-
71
- Impeccable, if installed, keeps its own root `DESIGN.md` and `PRODUCT.md` in its own format. These are separate files from the toolkit's `canon/DESIGN.md` and are not synced with it. Treat impeccable's pair as its own source of truth for its commands, and the toolkit's `canon/DESIGN.md` as the source other toolkit skills read.
72
-
73
- ### Tools
74
-
75
- - Excalidraw canvas server on localhost plus the community [`yctimlin/mcp_excalidraw`](https://github.com/yctimlin/mcp_excalidraw) MCP shim, for projects that need an agent to draw, read back, and revise a canvas. MIT-licensed, plaintext JSON scene format. `describe_scene` and `get_canvas_screenshot` let the agent verify its own layout before claiming it is correct.
76
- - Playwright MCP ([`microsoft/playwright-mcp`](https://github.com/microsoft/playwright-mcp)) for browser-side verification, driven off the accessibility tree rather than screenshots.
77
- - Chrome DevTools MCP ([`ChromeDevTools/chrome-devtools-mcp`](https://github.com/ChromeDevTools/chrome-devtools-mcp)) for live frontend debugging: performance traces, network inspection, and DOM and CSS inspection.
78
- - Claude Design as the ceiling option for codebase extraction or polished handoff bundles. See [Claude Design](../../wiki/claude/design.md).
30
+ Prose stays the source of truth, with a visual render as a feedback surface. Human edits to these derived artifacts are review annotations.
79
31
 
80
- ### Skills
32
+ - Excalidraw canvas server plus the community [`yctimlin/mcp_excalidraw`](https://github.com/yctimlin/mcp_excalidraw) MCP, where the agent draws, reads back, and revises
33
+ - Playwright MCP ([`microsoft/playwright-mcp`](https://github.com/microsoft/playwright-mcp)) for browser checks off the accessibility tree
34
+ - Chrome DevTools MCP ([`ChromeDevTools/chrome-devtools-mcp`](https://github.com/ChromeDevTools/chrome-devtools-mcp)) for traces, network, DOM, and CSS
35
+ - Claude Design for codebase extraction or a polished handoff bundle
36
+ - A frontend design skill: [pbakaus/impeccable](https://github.com/pbakaus/impeccable), [nextlevelbuilder/ui-ux-pro-max-skill](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill), or Anthropic's `frontend-design`
81
37
 
82
- - Everything from tier 0
83
- - A frontend design skill to steer visual quality. Pick one of [pbakaus/impeccable](https://github.com/pbakaus/impeccable), which bundles curated anti-pattern references and is the strongest default, [nextlevelbuilder/ui-ux-pro-max-skill](https://github.com/nextlevelbuilder/ui-ux-pro-max-skill), which maps product type to UI rules through a reasoning engine, or Anthropic's `frontend-design` plugin.
38
+ Impeccable keeps its own root `DESIGN.md` and `PRODUCT.md`, separate from `canon/DESIGN.md`. Use Excalidraw for agent-driven layout iteration, and Claude Design for one extraction pass or the final handoff. Most projects pick one.
84
39
 
85
- ### When to pick
86
-
87
- - UI is a meaningful part of the product but not the entire product
88
- - Stakeholders want to see layout proposals before code exists
89
- - Design decisions benefit from visual inspection
90
- - A single contributor owns both design and implementation
91
-
92
- ### Excalidraw vs Claude Design in tier 1
93
-
94
- The two tools solve non-overlapping halves of the visual companion problem.
95
-
96
- Excalidraw gives the agent a canvas it can read back over MCP. Output is agent-facing and persists as a JSON file in the repo. Pick it when Claude Code needs to iterate on layouts autonomously, not when a human needs polished review artifacts.
97
-
98
- Claude Design reads the raw codebase without prose curation and produces a polished handoff bundle with chat history. Weekly quota makes it expensive, so reserve it for the extraction pass or the final handoff moment, not daily iteration.
99
-
100
- Most tier 1 projects pick one. Projects with a messy codebase and no curated `DESIGN.md` may want Claude Design once for the initial extraction.
40
+ Pick tier 1 when stakeholders want layouts before code and one contributor owns design and implementation.
101
41
 
102
42
  ## Tier 2: visual as source of truth
103
43
 
104
- Design happens in a graphical tool. `canon/DESIGN.md` either regenerates from the graphical source or takes a secondary role as agent-facing summary. Implementation follows the graphical source, either through an MCP round-trip or a one-way handoff bundle. Fits teams with a dedicated designer or projects where design iteration outpaces code changes.
105
-
106
- ### Seed shape
107
-
108
- `canon/DESIGN.md` becomes a generated artifact. A top-of-file note identifies the upstream source, either a Claude Design project ID or a Figma file URL. Manual edits in the seed carry a warning tag because they will not survive regeneration.
109
-
110
- ### Tools
111
-
112
- - Figma desktop app with the official [Figma Dev Mode MCP](https://www.figma.com/blog/introducing-claude-code-to-figma/) for teams with a dedicated designer already on Figma. Bidirectional sync and Code to Canvas capture of a running Claude Code UI into editable Figma frames.
113
- - Claude Design with its Claude Code handoff bundle for teams without an existing Figma investment and for solo founders or PMs driving design themselves. One-way handoff, no bidirectional sync. See [Claude Design](../../wiki/claude/design.md).
114
- - Playwright and Chrome DevTools MCPs as in tier 1
44
+ Design happens in a graphical tool, and implementation follows it. `canon/DESIGN.md` becomes generated, with a top note naming the upstream Claude Design project ID or Figma file URL.
115
45
 
116
- ### Skills
46
+ - Figma desktop with the official [Figma Dev Mode MCP](https://www.figma.com/blog/introducing-claude-code-to-figma/) for teams with a designer already on Figma. It syncs both ways and captures a running UI into editable frames.
47
+ - Claude Design with its Claude Code handoff bundle for teams without Figma. The handoff is one-way.
48
+ - The Playwright and Chrome DevTools MCPs from tier 1
117
49
 
118
- - Everything from tier 1
119
-
120
- ### When to pick
121
-
122
- - UI is the product or a major differentiator
123
- - A dedicated designer is on the project or will join
124
- - Design review happens in the graphical tool rather than in code
125
- - Design changes more often than implementation
126
-
127
- ### Figma vs Claude Design in tier 2
128
-
129
- Figma wins when a dedicated designer already owns a Figma file, external collaborators expect Figma for review, or the workflow needs the agent to capture a running Claude Code UI and push it back as editable frames via Code to Canvas. Figma's MCP is bidirectional.
130
-
131
- Claude Design wins when nobody on the team has a Figma workflow yet and the handoff bundle with chat history is the intended implementation path. Claude Design's handoff is one-way, and its quota limits daily iteration, so it is most useful for the initial extraction pass and the final handoff moment rather than day-to-day design work.
50
+ Pick tier 2 when the UI is the product, a designer owns it, and design changes more often than code.
132
51
 
133
52
  ## Decision guide
134
53
 
135
- Four questions. Each yes weighs toward a higher tier.
54
+ Count yes answers to four questions. Zero or one is tier 0, two or three is tier 1, and four is tier 2.
136
55
 
137
56
  - Is the UI the product rather than a thin interface over a backend?
138
57
  - Do non-engineers review visual proposals before code exists?
139
58
  - Is there a dedicated designer, or will there be one?
140
59
  - Does design iterate independently of code?
141
-
142
- Zero or one yes: tier 0. Two or three: tier 1. Four: tier 2.
143
-
144
- Resist over-tiering early. Moving up is cheap because tiers stack. Moving down means abandoning tooling and confusing collaborators.
145
-
146
- ## References
147
-
148
- - [Claude Design](../../wiki/claude/design.md): first-party hosted design product and handoff bundle
149
- - `canon/context/claude-plugin/skill-strategy/overview.md`: how to decide between workflow and domain-knowledge skills
150
- - [`microsoft/playwright-mcp`](https://github.com/microsoft/playwright-mcp): browser automation MCP used in tier 1 and tier 2
151
- - [`ChromeDevTools/chrome-devtools-mcp`](https://github.com/ChromeDevTools/chrome-devtools-mcp): live frontend debugging MCP used in tier 1 and tier 2
152
- - [`yctimlin/mcp_excalidraw`](https://github.com/yctimlin/mcp_excalidraw): community MCP server behind the tier 1 visual companion