@erclx/canon 4.66.0 → 4.68.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 (156) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/{claude-autoship → auto-ship}/REQUIREMENT.md +3 -3
  3. package/claude/skills/{claude-autoship → auto-ship}/SKILL.md +36 -36
  4. package/claude/skills/canon-cli/REQUIREMENT.md +2 -2
  5. package/claude/skills/canon-cli/SKILL.md +2 -2
  6. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +1 -1
  7. package/claude/skills/canon-feedback-triage/SKILL.md +3 -3
  8. package/claude/skills/canon-operator/REQUIREMENT.md +1 -1
  9. package/claude/skills/canon-operator/SKILL.md +4 -4
  10. package/claude/skills/canon-rollout/REQUIREMENT.md +6 -6
  11. package/claude/skills/canon-rollout/SKILL.md +7 -7
  12. package/claude/skills/{claude-design-extract → design-extract}/REQUIREMENT.md +4 -4
  13. package/claude/skills/{claude-design-extract → design-extract}/SKILL.md +1 -1
  14. package/claude/skills/{claude-docs → docs-fold}/REQUIREMENT.md +3 -3
  15. package/claude/skills/{claude-docs → docs-fold}/SKILL.md +14 -14
  16. package/claude/skills/{claude-docs → docs-fold}/references/anchor-sweep.md +1 -1
  17. package/claude/skills/{claude-docs → docs-fold}/references/wireframe-sweep.md +1 -1
  18. package/claude/skills/docs-sync/REQUIREMENT.md +3 -3
  19. package/claude/skills/docs-sync/SKILL.md +1 -1
  20. package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -4
  21. package/claude/skills/draft-and-pick/SKILL.md +6 -6
  22. package/claude/skills/draft-context/REQUIREMENT.md +2 -2
  23. package/claude/skills/draft-context/SKILL.md +3 -3
  24. package/claude/skills/{claude-diagram → draft-diagram}/REQUIREMENT.md +4 -4
  25. package/claude/skills/{claude-diagram → draft-diagram}/SKILL.md +3 -3
  26. package/claude/skills/draft-docs/REQUIREMENT.md +1 -1
  27. package/claude/skills/draft-wireframes/REQUIREMENT.md +1 -1
  28. package/claude/skills/draft-wireframes/SKILL.md +2 -2
  29. package/claude/skills/git-followup/REQUIREMENT.md +1 -1
  30. package/claude/skills/git-followup/SKILL.md +1 -1
  31. package/claude/skills/git-pr/SKILL.md +3 -3
  32. package/claude/skills/git-ship/REQUIREMENT.md +2 -2
  33. package/claude/skills/git-ship/SKILL.md +8 -8
  34. package/claude/skills/git-worktree/REQUIREMENT.md +2 -2
  35. package/claude/skills/git-worktree/SKILL.md +3 -3
  36. package/claude/skills/identity/REQUIREMENT.md +2 -2
  37. package/claude/skills/identity/SKILL.md +3 -3
  38. package/claude/skills/{claude-markdown-propose → markdown-propose}/REQUIREMENT.md +8 -8
  39. package/claude/skills/{claude-markdown-propose → markdown-propose}/SKILL.md +5 -5
  40. package/claude/skills/{claude-markdown-propose → markdown-propose}/references/format.md +1 -1
  41. package/claude/skills/{claude-memory-capture → memory-capture}/REQUIREMENT.md +5 -5
  42. package/claude/skills/{claude-memory-capture → memory-capture}/SKILL.md +13 -13
  43. package/claude/skills/{claude-memory-review → memory-review}/REQUIREMENT.md +4 -4
  44. package/claude/skills/{claude-memory-review → memory-review}/SKILL.md +10 -10
  45. package/claude/skills/migration-context/SKILL.md +1 -1
  46. package/claude/skills/migration-standards-drop/REQUIREMENT.md +1 -1
  47. package/claude/skills/migration-superseded/REQUIREMENT.md +1 -1
  48. package/claude/skills/{claude-feature → plan-feature}/REQUIREMENT.md +4 -4
  49. package/claude/skills/{claude-feature → plan-feature}/SKILL.md +4 -4
  50. package/claude/skills/{claude-groundwork → plan-groundwork}/REQUIREMENT.md +5 -5
  51. package/claude/skills/{claude-groundwork → plan-groundwork}/SKILL.md +8 -8
  52. package/claude/skills/{claude-intake → plan-intake}/REQUIREMENT.md +6 -6
  53. package/claude/skills/{claude-intake → plan-intake}/SKILL.md +10 -10
  54. package/claude/skills/{claude-intake-answer → plan-intake-answer}/REQUIREMENT.md +4 -4
  55. package/claude/skills/{claude-intake-answer → plan-intake-answer}/SKILL.md +5 -5
  56. package/claude/skills/{claude-address-review → review-address}/REQUIREMENT.md +5 -5
  57. package/claude/skills/{claude-address-review → review-address}/SKILL.md +6 -6
  58. package/claude/skills/{claude-address-review → review-address}/references/rebase-conflicts.md +1 -1
  59. package/claude/skills/{claude-review → review-branch}/REQUIREMENT.md +4 -4
  60. package/claude/skills/{claude-review → review-branch}/SKILL.md +4 -4
  61. package/claude/skills/{claude-pr-review → review-pr}/REQUIREMENT.md +5 -5
  62. package/claude/skills/{claude-pr-review → review-pr}/SKILL.md +11 -11
  63. package/claude/skills/{claude-orchestrate → role-orchestrator}/REQUIREMENT.md +5 -5
  64. package/claude/skills/{claude-orchestrate → role-orchestrator}/SKILL.md +20 -20
  65. package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-dispatch.md +30 -30
  66. package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-handoff.md +2 -2
  67. package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-parked.md +8 -8
  68. package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-poll.md +8 -8
  69. package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-resume.md +1 -1
  70. package/claude/skills/{claude-orchestrate → role-orchestrator}/references/orchestrator-sweep.md +1 -1
  71. package/claude/skills/{claude-orchestrate → role-orchestrator}/scripts/poll.sh +6 -6
  72. package/claude/skills/{claude-planner → role-planner}/REQUIREMENT.md +12 -12
  73. package/claude/skills/{claude-planner → role-planner}/SKILL.md +4 -4
  74. package/claude/skills/{claude-worker → role-worker}/REQUIREMENT.md +8 -8
  75. package/claude/skills/{claude-worker → role-worker}/SKILL.md +6 -6
  76. package/claude/skills/{claude-seed-sync → seed-sync}/REQUIREMENT.md +2 -2
  77. package/claude/skills/{claude-seed-sync → seed-sync}/SKILL.md +3 -3
  78. package/claude/skills/session-map/REQUIREMENT.md +2 -2
  79. package/claude/skills/session-map/SKILL.md +2 -2
  80. package/claude/skills/session-resume/REQUIREMENT.md +2 -2
  81. package/claude/skills/session-resume/SKILL.md +2 -2
  82. package/claude/skills/{claude-worktree → session-worktree}/REQUIREMENT.md +3 -3
  83. package/claude/skills/{claude-worktree → session-worktree}/SKILL.md +6 -6
  84. package/claude/skills/setup-plugins/references/plugin-catalog.md +1 -1
  85. package/claude/skills/{claude-standards-audit → standards-audit}/REQUIREMENT.md +2 -2
  86. package/claude/skills/{claude-standards-audit → standards-audit}/SKILL.md +2 -2
  87. package/claude/skills/systematic-debugging/REQUIREMENT.md +1 -1
  88. package/claude/skills/{claude-tasks → task-board}/REQUIREMENT.md +3 -3
  89. package/claude/skills/{claude-tasks → task-board}/SKILL.md +7 -7
  90. package/claude/skills/{claude-teach → teach-workspace}/REQUIREMENT.md +2 -2
  91. package/claude/skills/{claude-teach → teach-workspace}/SKILL.md +4 -4
  92. package/claude/skills/test-first/REQUIREMENT.md +2 -2
  93. package/claude/skills/{claude-ui-test → ui-test}/REQUIREMENT.md +3 -3
  94. package/claude/skills/{claude-ui-test → ui-test}/SKILL.md +3 -3
  95. package/claude/skills/{claude-ux-audit → ux-audit}/REQUIREMENT.md +6 -6
  96. package/claude/skills/{claude-ux-audit → ux-audit}/SKILL.md +5 -5
  97. package/claude/skills/{claude-ux-measure → ux-measure}/REQUIREMENT.md +5 -5
  98. package/claude/skills/{claude-ux-measure → ux-measure}/SKILL.md +5 -5
  99. package/docs/agents/commands.md +4 -1
  100. package/docs/agents/install-and-sync.md +1 -1
  101. package/docs/agents/key-changes.md +3 -3
  102. package/docs/agents/markdown-audit.md +1 -1
  103. package/docs/agents/restated.md +1 -1
  104. package/docs/agents/review-classification.md +1 -1
  105. package/docs/agents/sessions.md +1 -1
  106. package/docs/agents/state-scoped-risk.md +1 -1
  107. package/docs/agents/targets.md +1 -1
  108. package/docs/agents/tasks.md +4 -4
  109. package/docs/agents/teach.md +1 -1
  110. package/docs/target-projects.md +28 -9
  111. package/docs/workflow/ai-workflow.md +84 -84
  112. package/docs/workflow/operating-model.md +17 -17
  113. package/docs/workflow/visual-design-workflow.md +6 -6
  114. package/governance/rules/core/045-memory.md +1 -1
  115. package/governance/rules/core/085-worktrees.md +1 -1
  116. package/package.json +1 -1
  117. package/scripts/core/regen-agent-fixture.sh +1 -1
  118. package/scripts/core/regen-hero.sh +7 -7
  119. package/snippets/claude/decision-memo.md +1 -1
  120. package/src/autoship/paths.ts +1 -1
  121. package/src/claude/cases/all.ts +2 -2
  122. package/src/claude/cases/{claude-workflow.ts → workflow.ts} +33 -33
  123. package/src/commands/migrate.ts +90 -13
  124. package/src/commands/sync.ts +3 -3
  125. package/src/design/components.ts +1157 -4
  126. package/src/design/css.ts +44 -17
  127. package/src/design/tokens.ts +1 -1
  128. package/src/gov/restated.ts +2 -2
  129. package/src/markdown/structure.ts +1 -1
  130. package/src/migrate/plan.ts +13 -5
  131. package/src/migrate/rename.ts +210 -94
  132. package/src/migrate/skill-names.ts +89 -0
  133. package/src/pr/bijection.ts +1 -1
  134. package/src/pr/paths.ts +2 -2
  135. package/src/shipped/references.ts +1 -1
  136. package/src/sync/seeds-report.ts +1 -1
  137. package/src/targets/pulls.ts +2 -2
  138. package/src/tasks/answers.ts +1 -1
  139. package/src/tasks/archive.ts +4 -4
  140. package/src/tasks/record.ts +2 -2
  141. package/src/tasks/validate.ts +1 -1
  142. package/src/teach/fonts.ts +28 -0
  143. package/src/teach/nav.ts +11 -1
  144. package/src/teach/workspace.ts +4 -1
  145. package/standards/groundwork.md +1 -1
  146. package/standards/snippets.md +1 -1
  147. package/standards/tasks.md +3 -3
  148. package/standards/teach.md +2 -2
  149. package/tooling/base/configs/.husky/post-merge +3 -3
  150. package/tooling/claude/reference.md +5 -5
  151. package/tooling/claude/seeds/.claude/hooks/pr-create-log.sh +2 -2
  152. /package/claude/skills/{claude-memory-review → memory-review}/references/receipt-format.md +0 -0
  153. /package/claude/skills/{claude-orchestrate → role-orchestrator}/scripts/watch.sh +0 -0
  154. /package/claude/skills/{claude-teach → teach-workspace}/references/lesson-craft.md +0 -0
  155. /package/claude/skills/{claude-teach → teach-workspace}/references/pedagogy.md +0 -0
  156. /package/claude/skills/{claude-teach → teach-workspace}/references/promotion.md +0 -0
@@ -51,12 +51,12 @@ One session works for most features. Prefer splitting across two sessions only w
51
51
 
52
52
  Work in Claude Code directly. It reads `CLAUDE.md` automatically and has full file access, no pasting needed.
53
53
 
54
- - When the input is a pile of findings rather than one feature, invoke `canon:claude-intake` first. It files the dump into `.canon/intake/<nn>-<slug>/`, one item per finding carrying a problem measured against the tree, a proposed fix, and a verdict, then names which items are plan-ready, which need measuring, and which are already settled.
55
- - When the current state is unmeasured and more than one approach is live, invoke `canon:claude-groundwork` first. It opens a track folder under `.canon/groundwork/<nn>-<slug>/` and ends in a decision, which may be to do nothing. Skip it when the approach is already settled.
56
- - Invoke `canon:claude-feature` to scan for code-level conflicts and ambiguities, confirm approach before proceeding
54
+ - When the input is a pile of findings rather than one feature, invoke `canon:plan-intake` first. It files the dump into `.canon/intake/<nn>-<slug>/`, one item per finding carrying a problem measured against the tree, a proposed fix, and a verdict, then names which items are plan-ready, which need measuring, and which are already settled.
55
+ - When the current state is unmeasured and more than one approach is live, invoke `canon:plan-groundwork` first. It opens a track folder under `.canon/groundwork/<nn>-<slug>/` and ends in a decision, which may be to do nothing. Skip it when the approach is already settled.
56
+ - Invoke `canon:plan-feature` to scan for code-level conflicts and ambiguities, confirm approach before proceeding
57
57
  - Implement the feature, then Claude Code runs the commands defined in `CLAUDE.md`, fixes failures, and iterates until all pass
58
- - For UI changes, invoke `canon:claude-ui-test` to generate and run Playwright e2e tests
59
- End the session once the feature works and tests pass. Invoke `canon:claude-docs` to capture any decisions made during implementation before closing.
58
+ - For UI changes, invoke `canon:ui-test` to generate and run Playwright e2e tests
59
+ End the session once the feature works and tests pass. Invoke `canon:docs-fold` to capture any decisions made during implementation before closing.
60
60
 
61
61
  The routing test is whether the repository can answer an item today. A session grepping handles the yes, and a groundwork track handles the no.
62
62
 
@@ -68,7 +68,7 @@ What a spike produces goes somewhere else again. An input the run reads is re-ru
68
68
 
69
69
  Start a fresh Claude Code session. The diff is sufficient context for both review and ship.
70
70
 
71
- - Invoke `canon:claude-review` to review all changes since main and output a findings report
71
+ - Invoke `canon:review-branch` to review all changes since main and output a findings report
72
72
  - Fix any valid findings
73
73
  - Invoke `canon:git-ship` to run the project's verify commands, sync docs, commit by concern, rename branch, and open PR
74
74
 
@@ -77,12 +77,12 @@ Start a fresh Claude Code session. The diff is sufficient context for both revie
77
77
  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.
78
78
 
79
79
  - Create a worktree per feature, then start a Claude Code session in each
80
- - Invoke `canon:claude-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.
81
- - Implement, verify, and review each feature independently. `claude-review` writes a per-branch report at the main worktree root (`review/branch/review-<slug>.md`), and `claude-ui-test` writes a per-branch checklist handoff there too (`tmp/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
80
+ - 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.
81
+ - Implement, verify, and review each feature independently. `review-branch` writes a per-branch report at the main worktree root (`review/branch/review-<slug>.md`), and `ui-test` writes a per-branch checklist handoff there too (`tmp/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
82
82
  - Ship each worktree separately with `canon:git-ship`
83
- - For full autonomy per worktree, invoke `canon:claude-autoship` 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 and is the operator's act.
83
+ - 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 and is the operator's act.
84
84
 
85
- To run several worktrees as a coordinated flow rather than ad hoc, assert the orchestrator role in one warm session with `canon:claude-orchestrate`. It holds the cross-feature call, plans each feature itself or dispatches a cold planner under `canon:claude-planner` to write the plan, refills the ready queue so a free worker never waits, and reviews each worker's PR with `canon:claude-pr-review`, then tells the session holding that branch to run `canon:claude-address-review` whenever the pass posted a finding at any severity, which is the same threshold `canon:claude-pr-review` states and posts its open heading under. The human launches workers and merges. See [operating model](operating-model.md) for the full loop.
85
+ 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`, 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.
86
86
 
87
87
  Execution order comes off `.canon/tasks/priority.md` and nothing sequences work into versions. Scope stays in `.claude/REQUIREMENTS.md` as a statement of what is wanted, and it reaches the board as discrete tasks the orchestrator orders by readiness.
88
88
 
@@ -110,9 +110,9 @@ A person points it at a private repository once and both verbs refuse until they
110
110
 
111
111
  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.
112
112
 
113
- A branch review report takes the other route and is swept rather than archived. `claude-review` writes it to `.canon/review/branch/`, the session addressing it reads it once, and the durable record of what a review found is the comment `claude-pr-review` posts on the pull request, so `claude-docs` 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.
113
+ A branch review report takes the other route and is swept rather than archived. `review-branch` writes it to `.canon/review/branch/`, the session addressing it reads it once, and the durable record of what a review found is the comment `review-pr` posts on the pull request, so `docs-fold` 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.
114
114
 
115
- `canon:claude-docs` decides which task closed by reading the diff rather than the conversation. 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. Requirements, architecture, and design stay session-sourced, because a diff cannot carry a judgment.
115
+ `canon:docs-fold` decides which task closed by reading the diff rather than the conversation. 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. Requirements, architecture, and design stay session-sourced, because a diff cannot carry a judgment.
116
116
 
117
117
  `.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.
118
118
 
@@ -122,19 +122,19 @@ A branch review report takes the other route and is swept rather than archived.
122
122
 
123
123
  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 no two rows marked ready touch the same file. 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. The collision check is the half a reader cannot run by eye, and it is what keeps two workers from being handed colliding work. 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.
124
124
 
125
- `canon:claude-tasks` owns the two operations that bracket a task's life. It creates the file, holding the filename convention and the frontmatter contract so a malformed write cannot break the index for every sibling, and it moves a shipped task 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.
125
+ `canon:task-board` owns the two operations that bracket a task's life. It creates the file, holding the filename convention and the frontmatter contract so a malformed write cannot break the index for every sibling, and it moves a shipped task 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.
126
126
 
127
127
  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.
128
128
 
129
- Nothing chained that archive until the `post-merge` git hook landed. Every earlier step fires from `canon:claude-autoship` 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 names the board's archive candidates and stays silent otherwise, including on a project with no board.
129
+ 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 names the board's archive candidates and stays silent otherwise, including on a project with no board.
130
130
 
131
- Candidates rather than closed tasks, because outcomes are marked on the branch. A task can read all `[x]` while its pull request is still open, so `canon:claude-tasks` confirms the work reached `main` before it moves anything, and the hook's own output says that check is still owed. A companion `post-rewrite` hook carries the same announcement for anyone pulling with rebase, which fires that event instead of `post-merge`.
131
+ Candidates rather than closed tasks, because outcomes are marked on the branch. A task can read all `[x]` while its pull request is still open, so `canon:task-board` confirms the work reached `main` before it moves anything, and the hook's own output says that check is still owed. A companion `post-rewrite` hook carries the same announcement for anyone pulling with rebase, which fires that event instead of `post-merge`.
132
132
 
133
- It announces and moves nothing, so `canon:claude-tasks` stays the only writer. A shell-side archive would change a gitignored board with no diff to review and no session watching, and `index.md` regenerates from a session hook that a shell `mv` never fires. Both hooks ship with the `base` tooling stack, so a target project running this workflow gets the same trigger.
133
+ It announces and moves nothing, so `canon:task-board` stays the only writer. A shell-side archive would change a gitignored board with no diff to review and no session watching, and `index.md` regenerates from a session hook that a shell `mv` never fires. Both hooks ship with the `base` tooling stack, so a target project running this workflow gets the same trigger.
134
134
 
135
135
  ### Autonomous ship
136
136
 
137
- For features on a mature stack, chain the post-plan pipeline in one session. Approve the plan, invoke `canon:claude-autoship`, and the skill runs implement → verify → review → ship sequentially.
137
+ For features on a mature stack, chain the post-plan pipeline in one session. Approve the plan, invoke `canon:auto-ship`, and the skill runs implement → verify → review → ship sequentially.
138
138
 
139
139
  - Use when the plan is tight and the stack has real verify commands and test coverage
140
140
  - Autoship stops on: verify failure after one fix attempt, UI manual checklist non-empty, an inherited review finding above minor, no diff baseline resolving against `main`, an empty changed-file list, or hook failure
@@ -147,7 +147,7 @@ Review findings split by origin before severity is read. One the branch inherite
147
147
 
148
148
  Review is skipped when the diff is prose that only informs: every changed file matches `*.md` or `*.txt`, and none sits under a behavior path. Behavior paths cover skills and rules in both the authoring and the installed spelling, so the list matches whether a repository authors those surfaces or consumed them from the toolkit. Standards, snippets, `internal/`, and `tooling/` carry the authoring spelling alone, since none of the four reaches a session through a `.claude/` copy, and root `CLAUDE.md` is named as a file because a path prefix reaches nothing sitting in no folder.
149
149
 
150
- Markdown under one states what an agent does, so a branch touching it reaches review while `docs/` and `wiki/` still skip and stay gated by `docs-sync`, `claude-standards-audit`, and pre-push hooks.
150
+ Markdown under one states what an agent does, so a branch touching it reaches review while `docs/` and `wiki/` still skip and stay gated by `docs-sync`, `standards-audit`, and pre-push hooks.
151
151
 
152
152
  An empty changed-file list stops the chain rather than counting as prose-only. The filename test passes vacuously on an empty set, which routed a branch past review instead of through it.
153
153
 
@@ -157,19 +157,19 @@ The list stays written in the skill body as the fallback for a target whose inst
157
157
 
158
158
  #### Memory in the chain
159
159
 
160
- `git-ship` runs its verify gate and then opens on `claude-memory-capture`, which sends what the session learned to the surface that owns it. `autoship` reaches the same step by invoking that skill at its Step 8 rather than restating the order. A fact about a domain carrying an entry in `.claude/context/index.md` is routed to that entry, and `claude-docs` folds it in on the next step, so it ships in the same pull request. Anything no entry owns stays a file in `.canon/memory/`.
160
+ `git-ship` runs its verify gate and then opens on `memory-capture`, which sends what the session learned to the surface that owns it. `autoship` reaches the same step by invoking that skill at its Step 8 rather than restating the order. A fact about a domain carrying an entry in `.claude/context/index.md` is routed to that entry, and `docs-fold` folds it in on the next step, so it ships in the same pull request. Anything no entry owns stays a file in `.canon/memory/`.
161
161
 
162
162
  Capture leads rather than trails because a routed fact edits a tracked file, which has to reach the branch before the commit steps run.
163
163
 
164
- If capture wrote at least one memory file, `claude-memory-review` then proposes a decision-ready fix scoped to those entries while context is fresh, otherwise it is skipped. It stops at Propose. Review the receipt and run Apply yourself, on its own commit separate from the feature.
164
+ If capture wrote at least one memory file, `memory-review` then proposes a decision-ready fix scoped to those entries while context is fresh, otherwise it is skipped. It stops at Propose. Review the receipt and run Apply yourself, on its own commit separate from the feature.
165
165
 
166
- Run `claude-memory-review` standalone to curate the whole pen. An entry it retires moves to `.canon/tmp/memory-archive/` rather than being deleted, since the folder is gitignored and a bulk pass has no undo.
166
+ Run `memory-review` standalone to curate the whole pen. An entry it retires moves to `.canon/tmp/memory-archive/` rather than being deleted, since the folder is gitignored and a bulk pass has no undo.
167
167
 
168
- The receipt is collected once every item on it has been decided, and it survives untouched while any item is still pending. Whichever runs first takes it: Apply collects the receipt it has resolved, and `claude-docs` scans the folder on every shipped branch for one an earlier session left behind. Before the file goes, each declined item is folded into the entry it was about, since a promotion survives in its target and in git while a decline is recorded nowhere else. `canon standards memory` states what a fold writes and which entry types take one.
168
+ The receipt is collected once every item on it has been decided, and it survives untouched while any item is still pending. Whichever runs first takes it: Apply collects the receipt it has resolved, and `docs-fold` scans the folder on every shipped branch for one an earlier session left behind. Before the file goes, each declined item is folded into the entry it was about, since a promotion survives in its target and in git while a decline is recorded nowhere else. `canon standards memory` states what a fold writes and which entry types take one.
169
169
 
170
170
  ### UI polish
171
171
 
172
- Verify the change manually in the browser. Invoke `canon:claude-ui-test` if you need e2e tests and a visual verification checklist for the session. For the fix itself, describe the change in Claude Code directly.
172
+ Verify the change manually in the browser. Invoke `canon:ui-test` if you need e2e tests and a visual verification checklist for the session. For the fix itself, describe the change in Claude Code directly.
173
173
 
174
174
  ### Quick fix
175
175
 
@@ -179,7 +179,7 @@ Verify the change manually in the browser. Invoke `canon:claude-ui-test` if you
179
179
 
180
180
  ### Review
181
181
 
182
- Invoke `canon:claude-review` at the start of session 2. It reads all changed files and outputs a findings report. Fix valid findings before invoking `canon:git-ship`. If nothing is valid, skip directly to ship.
182
+ Invoke `canon:review-branch` at the start of session 2. It reads all changed files and outputs a findings report. Fix valid findings before invoking `canon:git-ship`. If nothing is valid, skip directly to ship.
183
183
 
184
184
  ### UI-heavy project
185
185
 
@@ -193,92 +193,92 @@ This section is the corpus the coverage claim is measured against: every name `c
193
193
 
194
194
  ### Set up a project
195
195
 
196
- | Skill | When to use |
197
- | ----------------------------- | --------------------------------------------------------------------------------------------------------------- |
198
- | `canon:setup-init` | On a fresh scaffold, to detect the stack and run the whole install chain in one pass |
199
- | `canon:canon-operator` | On a project that already exists, to read what it carries before an install is picked |
200
- | `canon:setup-gov` | When the governance rules are wanted without the tooling chain |
201
- | `canon:setup-indexes` | When a markdown-heavy folder needs an `index.md` a session can browse |
202
- | `canon:setup-plugins` | On a new machine, to install the community and official plugins user-scoped |
203
- | `canon:setup-verify` | After the agent generates configs, to run the installed scripts and report pass or fail |
204
- | `canon:setup-smoke` | After `setup-verify` passes, to check the dev and preview servers, end-to-end tests, and the screenshot harness |
205
- | `canon:claude-design-extract` | Before the first UI feature, to draft `.claude/DESIGN.md` |
206
- | `canon:claude-diagram` | Once the architecture is written, to draft per-kind entries under `.canon/diagrams/` |
207
- | `canon:repo-metadata` | When the GitHub About text, homepage, or topics may have drifted, to reconcile them against the README |
196
+ | Skill | When to use |
197
+ | ---------------------- | --------------------------------------------------------------------------------------------------------------- |
198
+ | `canon:setup-init` | On a fresh scaffold, to detect the stack and run the whole install chain in one pass |
199
+ | `canon:canon-operator` | On a project that already exists, to read what it carries before an install is picked |
200
+ | `canon:setup-gov` | When the governance rules are wanted without the tooling chain |
201
+ | `canon:setup-indexes` | When a markdown-heavy folder needs an `index.md` a session can browse |
202
+ | `canon:setup-plugins` | On a new machine, to install the community and official plugins user-scoped |
203
+ | `canon:setup-verify` | After the agent generates configs, to run the installed scripts and report pass or fail |
204
+ | `canon:setup-smoke` | After `setup-verify` passes, to check the dev and preview servers, end-to-end tests, and the screenshot harness |
205
+ | `canon:design-extract` | Before the first UI feature, to draft `.claude/DESIGN.md` |
206
+ | `canon:draft-diagram` | Once the architecture is written, to draft per-kind entries under `.canon/diagrams/` |
207
+ | `canon:repo-metadata` | When the GitHub About text, homepage, or topics may have drifted, to reconcile them against the README |
208
208
 
209
209
  ### Decide what to build
210
210
 
211
- | Skill | When to use |
212
- | ---------------------------- | ------------------------------------------------------------------------------- |
213
- | `canon:claude-intake` | When the input is a pile of findings rather than one feature |
214
- | `canon:claude-intake-answer` | When an intake folder holds unread slots waiting on your decision |
215
- | `canon:claude-groundwork` | When the state is unmeasured and more than one approach is live |
216
- | `canon:decision-escalate` | When open decisions turn on your preference and want batching into one set |
217
- | `canon:draft-and-pick` | When the call is taste and wants several candidates rendered side by side |
218
- | `canon:claude-tasks` | When a decided item needs a file on the board, or a shipped one needs archiving |
219
- | `canon:claude-feature` | When the approach is settled and the next step is a plan |
211
+ | Skill | When to use |
212
+ | -------------------------- | ------------------------------------------------------------------------------- |
213
+ | `canon:plan-intake` | When the input is a pile of findings rather than one feature |
214
+ | `canon:plan-intake-answer` | When an intake folder holds unread slots waiting on your decision |
215
+ | `canon:plan-groundwork` | When the state is unmeasured and more than one approach is live |
216
+ | `canon:decision-escalate` | When open decisions turn on your preference and want batching into one set |
217
+ | `canon:draft-and-pick` | When the call is taste and wants several candidates rendered side by side |
218
+ | `canon:task-board` | When a decided item needs a file on the board, or a shipped one needs archiving |
219
+ | `canon:plan-feature` | When the approach is settled and the next step is a plan |
220
220
 
221
221
  ### Build the feature
222
222
 
223
223
  | Skill | When to use |
224
224
  | ---------------------------- | ------------------------------------------------------------------------- |
225
- | `canon:claude-worktree` | At the plan-to-execute boundary, to get an isolated tree and branch |
226
- | `canon:claude-autoship` | After plan approval, to chain implement, verify, review, draft PR |
225
+ | `canon:session-worktree` | At the plan-to-execute boundary, to get an isolated tree and branch |
226
+ | `canon:auto-ship` | After plan approval, to chain implement, verify, review, draft PR |
227
227
  | `canon:project-commands` | When the project's own command needs running |
228
228
  | `canon:test-first` | Before implementing a planned change, to write and run its test red first |
229
229
  | `canon:systematic-debugging` | When a test fails or a bug surfaces, to force root cause first |
230
- | `canon:claude-ui-test` | After a UI change, to generate e2e tests and a visual checklist |
230
+ | `canon:ui-test` | After a UI change, to generate e2e tests and a visual checklist |
231
231
 
232
232
  ### Check the work before it leaves the branch
233
233
 
234
- | Skill | When to use |
235
- | ------------------------------- | --------------------------------------------------------------------------------------- |
236
- | `canon:claude-review` | On the local branch diff, before anything is pushed |
237
- | `canon:claude-standards-audit` | When changed markdown has to answer to the authoring standards |
238
- | `canon:claude-markdown-propose` | When a markdown claim needs rewriting and the change should wait for an answer per file |
239
- | `canon:claude-ux-audit` | To read UI source for missing states, edge cases, and inconsistencies |
240
- | `canon:claude-ux-measure` | To start the interface and measure paint, processor, and layout cost |
234
+ | Skill | When to use |
235
+ | ------------------------ | --------------------------------------------------------------------------------------- |
236
+ | `canon:review-branch` | On the local branch diff, before anything is pushed |
237
+ | `canon:standards-audit` | When changed markdown has to answer to the authoring standards |
238
+ | `canon:markdown-propose` | When a markdown claim needs rewriting and the change should wait for an answer per file |
239
+ | `canon:ux-audit` | To read UI source for missing states, edge cases, and inconsistencies |
240
+ | `canon:ux-measure` | To start the interface and measure paint, processor, and layout cost |
241
241
 
242
242
  ### Ship it
243
243
 
244
- | Skill | When to use |
245
- | ----------------------------- | ------------------------------------------------------------------------------------- |
246
- | `canon:git-ship` | To run the whole post-feature chain from the verify gate through open PR |
247
- | `canon:claude-memory-capture` | First skill in that chain, to route what the session learned to the surface owning it |
248
- | `canon:claude-docs` | When decisions diverged from the plan, or a shipped task needs its outcomes marked |
249
- | `canon:docs-sync` | When a change since main left `README.md` or `docs/` stale |
250
- | `canon:git-stage` | When the staged set spans several concerns and wants one commit each |
251
- | `canon:git-commit` | When the staged set is one concern, or was staged hunk by hand |
252
- | `canon:git-branch` | When a branch name needs generating or renaming to conventional form |
253
- | `canon:git-pr` | When a pull request needs a title and body written from the diff |
254
- | `canon:claude-memory-review` | After capture writes an entry, to propose where each one belongs |
244
+ | Skill | When to use |
245
+ | ---------------------- | ------------------------------------------------------------------------------------- |
246
+ | `canon:git-ship` | To run the whole post-feature chain from the verify gate through open PR |
247
+ | `canon:memory-capture` | First skill in that chain, to route what the session learned to the surface owning it |
248
+ | `canon:docs-fold` | When decisions diverged from the plan, or a shipped task needs its outcomes marked |
249
+ | `canon:docs-sync` | When a change since main left `README.md` or `docs/` stale |
250
+ | `canon:git-stage` | When the staged set spans several concerns and wants one commit each |
251
+ | `canon:git-commit` | When the staged set is one concern, or was staged hunk by hand |
252
+ | `canon:git-branch` | When a branch name needs generating or renaming to conventional form |
253
+ | `canon:git-pr` | When a pull request needs a title and body written from the diff |
254
+ | `canon:memory-review` | After capture writes an entry, to propose where each one belongs |
255
255
 
256
256
  ### After the pull request opens
257
257
 
258
- | Skill | When to use |
259
- | ----------------------------- | -------------------------------------------------------------------- |
260
- | `canon:claude-pr-review` | From an independent session, to post findings on the PR itself |
261
- | `canon:claude-address-review` | On the worker's side, to fix posted findings and push a follow-up |
262
- | `canon:git-followup` | For a small self-review edit on a branch whose PR is already open |
263
- | `canon:git-split` | When a branch turns out to carry unrelated commits |
264
- | `canon:git-issue` | When something surfaced that belongs on the tracker rather than here |
265
- | `canon:git-worktree` | After a PR merges, to list worktrees and reclaim the slot |
258
+ | Skill | When to use |
259
+ | ---------------------- | -------------------------------------------------------------------- |
260
+ | `canon:review-pr` | From an independent session, to post findings on the PR itself |
261
+ | `canon:review-address` | On the worker's side, to fix posted findings and push a follow-up |
262
+ | `canon:git-followup` | For a small self-review edit on a branch whose PR is already open |
263
+ | `canon:git-split` | When a branch turns out to carry unrelated commits |
264
+ | `canon:git-issue` | When something surfaced that belongs on the tracker rather than here |
265
+ | `canon:git-worktree` | After a PR merges, to list worktrees and reclaim the slot |
266
266
 
267
267
  ### Run several tracks at once
268
268
 
269
- | Skill | When to use |
270
- | -------------------------- | ------------------------------------------------------------------------------- |
271
- | `canon:claude-orchestrate` | To assert the control session that owns the queue and reviews each worker's PR |
272
- | `canon:claude-planner` | To assert the planner role for a cold session writing one plan under one task |
273
- | `canon:claude-worker` | To assert the worker role for a cold session building one branch under one plan |
274
- | `canon:session-resume` | At the start of a session, to pick up what a previous one left |
275
- | `canon:session-map` | At the close of a session, to write the handoff a compaction would destroy |
269
+ | Skill | When to use |
270
+ | ------------------------- | ------------------------------------------------------------------------------- |
271
+ | `canon:role-orchestrator` | To assert the control session that owns the queue and reviews each worker's PR |
272
+ | `canon:role-planner` | To assert the planner role for a cold session writing one plan under one task |
273
+ | `canon:role-worker` | To assert the worker role for a cold session building one branch under one plan |
274
+ | `canon:session-resume` | At the start of a session, to pick up what a previous one left |
275
+ | `canon:session-map` | At the close of a session, to write the handoff a compaction would destroy |
276
276
 
277
277
  ### Keep the project current with the toolkit
278
278
 
279
279
  | Skill | When to use |
280
280
  | -------------------------------- | ---------------------------------------------------------------------------------- |
281
- | `canon:claude-seed-sync` | After a toolkit update, to reconcile installed seeds without losing customizations |
281
+ | `canon:seed-sync` | After a toolkit update, to reconcile installed seeds without losing customizations |
282
282
  | `canon:migration-claude-md` | When `CLAUDE.md` grew past what always-load context should carry |
283
283
  | `canon:migration-context` | When `docs/` holds agent-flavored files belonging in `.claude/context/` |
284
284
  | `canon:migration-superseded` | When a drift report names a `.claude/` file a folder has replaced |
@@ -315,13 +315,13 @@ This section is the corpus the coverage claim is measured against: every name `c
315
315
  | `canon:index-lookup` | To find where a topic is documented across the tracked `index.md` catalogs |
316
316
  | `canon:youtube-transcripts` | When a video transcript is wanted in the repo as context |
317
317
  | `canon:canon-frames-read` | To read a recorded demo back frame by frame and report what each one shows, with no verdict on whether the recording looks right |
318
- | `canon:claude-teach` | To learn a subject across sessions, in a workspace that holds the progress |
318
+ | `canon:teach-workspace` | To learn a subject across sessions, in a workspace that holds the progress |
319
319
  | `canon:write-human` | Before drafting or revising prose, for voice, rhythm, and density |
320
320
  | `canon:restate-plainly` | When an answer or a document has to be read again in plain words |
321
321
 
322
322
  Every row answers a question rather than marking a point in a project's life, so a phase above would send a reader to the wrong group.
323
323
 
324
- 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:claude-teach` to promote sorts each durable page by who owns its subject, sending an outside subject to the wiki, an internal one to the matching context entry, and consumer-facing material 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:claude-docs` folds in from a branch. A project with no wiki folder gets a refusal naming `canon wiki init` rather than a folder it never asked for.
324
+ 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 outside subject to the wiki, an internal one to the matching context entry, and consumer-facing material 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:docs-fold` folds in from a branch. A project with no wiki folder gets a refusal naming `canon wiki init` rather than a folder it never asked for.
325
325
 
326
326
  ## Feedback routing
327
327
 
@@ -25,10 +25,10 @@ The split is by vantage, not by capability. All three are Claude Code sessions.
25
25
  | Worker | One cold worktree session per feature | Implement, self-check, open PR, answer the orchestrator | Write the shared board, merge |
26
26
 
27
27
  Each role is asserted explicitly rather than inferred. The orchestrator loads
28
- `claude-orchestrate` at the start of its session, a worker loads `claude-worker`,
29
- which `claude-autoship` invokes at Step 0 so a dispatched build and a
28
+ `role-orchestrator` at the start of its session, a worker loads `role-worker`,
29
+ which `auto-ship` invokes at Step 0 so a dispatched build and a
30
30
  hand-launched one reach it on the same path, and a planner loads
31
- `claude-planner` from the launch that dispatches it. All three are framing and
31
+ `role-planner` from the launch that dispatches it. All three are framing and
32
32
  boundaries rather than logic.
33
33
 
34
34
  The planner is the one role the orchestrator also performs. Per-row planning
@@ -77,12 +77,12 @@ start, and only a count of the defect's extent decides how big it is.
77
77
 
78
78
  One feature travels this path end to end.
79
79
 
80
- 1. The next feature is planned with `claude-feature`, writing a plan to `.canon/plans/`. The orchestrator runs it warm when the row turns on a contract other features consume or a shared wiring seam, and dispatches a planner under `claude-planner` otherwise. A cold planner measures the row against the tree rather than trusting what the row claims, and it reads what is in flight by composing the live session roster with open pull requests. A bare branch or worktree is not evidence on its own, since this repository leaves both behind after a squash merge.
81
- 2. Orchestrator checks the plan waits on nobody, checks the branch is unclaimed, and checks the plan's file set is disjoint from every track in flight, then dispatches a background worker with `claude --bg` against the plan, naming the branch and the model on the launch rather than leaving the worker to derive either. No count caps how many run at once. The branch travels as the argument to the worker's own worktree call, which is the one place the name is read rather than inferred. It falls back to naming the invocation for a human to run through `claude-worktree` and `claude-autoship` when the plan still waits on an answer only the operator can give, the check refuses, the sets overlap, or a stated reason serializes the plan behind a track already in flight. Either way, the worker enters its own worktree, builds, self-checks, opens a PR, and stops at the PR boundary.
82
- 3. Orchestrator reviews the PR with `claude-pr-review` and posts findings to it.
83
- 4. Orchestrator tells the session holding that branch to run `claude-address-review` once the pass posted a finding at any severity, resolving the target then with `canon sessions list --branch` and reporting the invocation for the human when no live session holds it. The worker addresses the findings, rebases onto `origin/main` when a sibling landed first and left the branch unable to merge, then pushes a follow-up. A pass carrying only minor findings dispatches too, since the grade runs low often enough that a floor at should-fix loses fixes a worker would have made. `claude-pr-review` states that threshold and the heading follows it, so an open heading is itself the signal to send.
84
- 5. Orchestrator closes the review out with `claude-pr-review` again. The second pass reads only the commits the follow-up added, or the worker's response alone when the follow-up added none, and posts under `## Review` when it finds anything and under `## Review closed` when it finds nothing, so a reader learns from the heading whether work is still owed and takes the merge decision from the counts on the line under it. A pass finding nothing where a close-out already stands rewrites that comment to cover what it read rather than posting a second one, so the thread carries one live verdict. Repeat from step 4 until a pass closes the review.
85
- 6. The human reads the result and merges. The orchestrator tells any trailing worker whose branch shares a seam with the merged one to run `claude-address-review`, which rebases whether or not the review left anything open.
80
+ 1. The next feature is planned with `plan-feature`, writing a plan to `.canon/plans/`. The orchestrator runs it warm when the row turns on a contract other features consume or a shared wiring seam, and dispatches a planner under `role-planner` otherwise. A cold planner measures the row against the tree rather than trusting what the row claims, and it reads what is in flight by composing the live session roster with open pull requests. A bare branch or worktree is not evidence on its own, since this repository leaves both behind after a squash merge.
81
+ 2. Orchestrator checks the plan waits on nobody, checks the branch is unclaimed, and checks the plan's file set is disjoint from every track in flight, then dispatches a background worker with `claude --bg` against the plan, naming the branch and the model on the launch rather than leaving the worker to derive either. No count caps how many run at once. The branch travels as the argument to the worker's own worktree call, which is the one place the name is read rather than inferred. It falls back to naming the invocation for a human to run through `session-worktree` and `auto-ship` when the plan still waits on an answer only the operator can give, the check refuses, the sets overlap, or a stated reason serializes the plan behind a track already in flight. Either way, the worker enters its own worktree, builds, self-checks, opens a PR, and stops at the PR boundary.
82
+ 3. Orchestrator reviews the PR with `review-pr` and posts findings to it.
83
+ 4. Orchestrator tells the session holding that branch to run `review-address` once the pass posted a finding at any severity, resolving the target then with `canon sessions list --branch` and reporting the invocation for the human when no live session holds it. The worker addresses the findings, rebases onto `origin/main` when a sibling landed first and left the branch unable to merge, then pushes a follow-up. A pass carrying only minor findings dispatches too, since the grade runs low often enough that a floor at should-fix loses fixes a worker would have made. `review-pr` states that threshold and the heading follows it, so an open heading is itself the signal to send.
84
+ 5. Orchestrator closes the review out with `review-pr` again. The second pass reads only the commits the follow-up added, or the worker's response alone when the follow-up added none, and posts under `## Review` when it finds anything and under `## Review closed` when it finds nothing, so a reader learns from the heading whether work is still owed and takes the merge decision from the counts on the line under it. A pass finding nothing where a close-out already stands rewrites that comment to cover what it read rather than posting a second one, so the thread carries one live verdict. Repeat from step 4 until a pass closes the review.
85
+ 6. The human reads the result and merges. The orchestrator tells any trailing worker whose branch shares a seam with the merged one to run `review-address`, which rebases whether or not the review left anything open.
86
86
 
87
87
  There is no loop construct here. Each worker is a single build that halts at the
88
88
  PR. The merge stays a manual human gate. Reliability comes from the plan being
@@ -94,8 +94,8 @@ from merging promptly so the next PR does not rot against a moving main.
94
94
  The worker's self-review and the orchestrator's review are not the same pass run
95
95
  twice. They differ by vantage.
96
96
 
97
- - Worker self-review, inside `claude-autoship`: the session that wrote the code. Its job is "did I build the plan and does it pass?" Mechanical, and structurally blind to its own misreadings, because the same misreading wrote both the code and the review. This is the green gate that decides whether the PR opens.
98
- - Orchestrator review, via `claude-pr-review`: a fresh session with cross-feature context (the board, a sibling PR in flight, a downstream contract). Its job is "is this right and does it fit?" It can question the plan itself. This is the merge gate.
97
+ - Worker self-review, inside `auto-ship`: the session that wrote the code. Its job is "did I build the plan and does it pass?" Mechanical, and structurally blind to its own misreadings, because the same misreading wrote both the code and the review. This is the green gate that decides whether the PR opens.
98
+ - Orchestrator review, via `review-pr`: a fresh session with cross-feature context (the board, a sibling PR in flight, a downstream contract). Its job is "is this right and does it fit?" It can question the plan itself. This is the merge gate.
99
99
 
100
100
  They collide only if the worker also runs a deep pass. Keep the worker's review
101
101
  light and let the orchestrator own the deep, independent one. The human read at
@@ -111,9 +111,9 @@ the body rather than on a file. See
111
111
 
112
112
  ## The review channel
113
113
 
114
- Findings travel on the PR. `claude-pr-review` posts them there.
115
- `claude-address-review` reads them back, fixes each, replies or resolves the
116
- threads, and pushes a follow-up. `claude-pr-review` then runs again, reading only
114
+ Findings travel on the PR. `review-pr` posts them there.
115
+ `review-address` reads them back, fixes each, replies or resolves the
116
+ threads, and pushes a follow-up. `review-pr` then runs again, reading only
117
117
  what the follow-up added.
118
118
 
119
119
  Both halves of that loop key on a commit rather than on the pull request object,
@@ -175,18 +175,18 @@ a delta and names its body from that response instead of from a tree that did no
175
175
  change.
176
176
 
177
177
  A branch that stopped merging while the review was open is the worker's problem
178
- to close. `claude-address-review` rebases onto `origin/main` between the fixes
178
+ to close. `review-address` rebases onto `origin/main` between the fixes
179
179
  and the push, so one force-push carries both and the reviewer reads one delta.
180
180
  The staleness test sits ahead of the no-findings guard, so a branch whose review
181
181
  closed clean and then went stale still rebases when the skill is invoked. The
182
182
  re-read costs a full pass rather than a delta, since the prior reviewed commit no
183
- longer reaches the head, and `claude-pr-review` detects that itself.
183
+ longer reaches the head, and `review-pr` detects that itself.
184
184
 
185
185
  The heading carries the state rather than the pass number. A pass carrying
186
186
  anything owed takes `## Review` and a pass carrying nothing takes
187
187
  `## Review closed`, so a thread can be scanned for what still owes work without
188
188
  opening a comment. One threshold governs the heading and the dispatch alike, and
189
- `claude-pr-review` is where it is stated, so every other surface cites that skill
189
+ `review-pr` is where it is stated, so every other surface cites that skill
190
190
  rather than restating the grades.
191
191
 
192
192
  The merge decision comes off the counts on the summary line, since an open
@@ -22,7 +22,7 @@ Claude Code reads both and writes the implementation. Works for CLI tools, inter
22
22
 
23
23
  The toolkit seed in `tooling/claude/seeds/.claude/DESIGN.md` ships a token-table template with a starting set of roles, and `standards/design.md` carries the same tables under `## Template` with placeholder rows. The column headers are what the renderer parses, so they stay verbatim in either, while the rows and values are the project's own.
24
24
 
25
- The `canon:claude-design-extract` skill drafts the file, sourcing tokens from a project's existing prose and CLI UI surfaces, or proposing them from `.claude/REQUIREMENTS.md` and a `## Personality` paragraph when no UI code exists yet. `canon design render` writes an HTML plus CSS preview to `.canon/review/design/` for eyeballing the current system without leaving Claude Code. See `.claude/context/design.md`.
25
+ The `canon:design-extract` skill drafts the file, sourcing tokens from a project's existing prose and CLI UI surfaces, or proposing them from `.claude/REQUIREMENTS.md` and a `## Personality` paragraph when no UI code exists yet. `canon design render` writes an HTML plus CSS preview to `.canon/review/design/` for eyeballing the current system without leaving Claude Code. See `.claude/context/design.md`.
26
26
 
27
27
  A project wanting the toolkit's own values rather than its own runs `canon design install`, which copies one stylesheet to `.claude/design/base.css` carrying the token set as custom properties and two components built on them. 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 drafted by the extract skill is the project's own, and the installed stylesheet is the toolkit's.
28
28
 
@@ -31,14 +31,14 @@ A cell no source anchors ends in `? verify`, and the preview shows that marker b
31
31
  ### Tools
32
32
 
33
33
  - None beyond Claude Code itself
34
- - Playwright CLI optional for verifying form submissions and interactive surfaces. See [`claude-ui-test`](../../claude/skills/claude-ui-test/SKILL.md).
34
+ - Playwright CLI optional for verifying form submissions and interactive surfaces. See [`ui-test`](../../claude/skills/ui-test/SKILL.md).
35
35
 
36
36
  ### Skills
37
37
 
38
- - `canon:claude-design-extract` to draft `.claude/DESIGN.md`, from existing project signals or from requirements alone on day one
39
- - `canon:claude-ui-test` for e2e test generation after UI changes
40
- - `canon:claude-ux-audit` for UX gap detection on existing surfaces
41
- - `canon:claude-ux-measure` for what a running surface costs to paint, read against published thresholds
38
+ - `canon:design-extract` to draft `.claude/DESIGN.md`, from existing project signals or from requirements alone on day one
39
+ - `canon:ui-test` for e2e test generation after UI changes
40
+ - `canon:ux-audit` for UX gap detection on existing surfaces
41
+ - `canon:ux-measure` for what a running surface costs to paint, read against published thresholds
42
42
  - `canon:draft-and-pick` for a call settled by looking, drafting several candidates onto one page and taking your pick
43
43
  - `canon: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
44
44
  - Anthropic's `frontend-design` plugin optional for light visual steering
@@ -7,6 +7,6 @@ description: Keep memory writes scoped to .canon/memory/ and out of context-owne
7
7
  ## Writing memory
8
8
 
9
9
  - Write all memory files to `.canon/memory/`, not `~/.claude/projects/`
10
- - A fact about a domain goes to that domain's `.claude/context/` entry, not to memory. `canon:claude-memory-capture` routes it there and `canon:claude-docs` folds it in. Memory keeps only what no context entry owns. Report it rather than proceeding silently when either skill does not resolve. Both ship with the plugin and this rule ships with the CLI, so a project that installed governance alone does not have them.
10
+ - A fact about a domain goes to that domain's `.claude/context/` entry, not to memory. `canon:memory-capture` routes it there and `canon:docs-fold` folds it in. Memory keeps only what no context entry owns. Report it rather than proceeding silently when either skill does not resolve. Both ship with the plugin and this rule ships with the CLI, so a project that installed governance alone does not have them.
11
11
  - Never delete a memory entry. Retire one by moving it to `.canon/tmp/memory-archive/`. A bulk retire runs through the shell, where no file edit fires a path-scoped rule, and the folder is gitignored with nothing to recover from.
12
12
  - Follow the memory standard for the filename and type prefix, the frontmatter, the body shape each type carries, and the lifecycle. Read it with `canon standards memory`. Check every entry in the pen against that standard and fix what breaks it, since nothing keeps the folder conforming on its own.
@@ -6,7 +6,7 @@ description: Route tracked-file writes and shared session scratch correctly from
6
6
 
7
7
  ## Entering a worktree
8
8
 
9
- - Implementation work runs in a linked worktree. From the main worktree, enter one with `/claude-worktree` before editing tracked files for a feature.
9
+ - Implementation work runs in a linked worktree. From the main worktree, enter one with `/session-worktree` before editing tracked files for a feature.
10
10
 
11
11
  ## Shared session scratch
12
12
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/canon",
3
3
  "type": "module",
4
- "version": "4.66.0",
4
+ "version": "4.68.0",
5
5
  "description": "Infrastructure and quality tooling for developer workflows",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -57,7 +57,7 @@ OUT="$PROJECT_ROOT/web/src/fixtures/agent-view.json"
57
57
  # Re-transcribe this table against a fresh listing rather than editing the
58
58
  # generated file.
59
59
  #
60
- # A planner belongs in this table as much as a worker does. `claude-planner`
60
+ # A planner belongs in this table as much as a worker does. `role-planner`
61
61
  # forbids entering a worktree, so a planner registers on the default branch at
62
62
  # launch and stays there for its whole life, which is why the branch filter this
63
63
  # script used to carry dropped every one of them permanently rather than
@@ -180,13 +180,13 @@ const sample = (names) => {
180
180
  // reading as an all-`claude-` catalog, which is the failure the sampler above
181
181
  // was written against.
182
182
  const FEATURED_SKILLS = [
183
- "claude-feature",
184
- "claude-groundwork",
185
- "claude-intake",
186
- "claude-orchestrate",
187
- "claude-autoship",
188
- "claude-pr-review",
189
- "claude-tasks",
183
+ "plan-feature",
184
+ "plan-groundwork",
185
+ "plan-intake",
186
+ "role-orchestrator",
187
+ "auto-ship",
188
+ "review-pr",
189
+ "task-board",
190
190
  "git-ship",
191
191
  "setup-init",
192
192
  "systematic-debugging",
@@ -1,4 +1,4 @@
1
- Produce a decision memo for a research or should-we question. This is the decision-heavy counterpart to `claude-feature`, which plans a build. Write one file per independent concern under `.canon/plans/feature-<slug>.md`, or answer inline when the plan is small. Use the same plans folder as `claude-feature`.
1
+ Produce a decision memo for a research or should-we question. This is the decision-heavy counterpart to `plan-feature`, which plans a build. Write one file per independent concern under `.canon/plans/feature-<slug>.md`, or answer inline when the plan is small. Use the same plans folder as `plan-feature`.
2
2
 
3
3
  Read the current state from the code and docs before recommending. Do not assume it.
4
4
 
@@ -2,7 +2,7 @@
2
2
  * The surfaces where markdown states what an agent does, and the extensions
3
3
  * that read as prose, held as data one command parses.
4
4
  *
5
- * Lifted verbatim in content from the list `claude-autoship/SKILL.md` Step 5
5
+ * Lifted verbatim in content from the list `auto-ship/SKILL.md` Step 5
6
6
  * carried, which a session was asked to apply by hand. It failed that
7
7
  * application three times, so the set moved here and the body now calls a verb
8
8
  * that reads it. Being machine-parsed makes it permanently exempt from any
@@ -1,9 +1,9 @@
1
1
  import type { SkillCase } from '@/claude/skills-rank'
2
2
  import { AUTHORING_CASES } from '@/claude/cases/authoring'
3
- import { CLAUDE_WORKFLOW_CASES } from '@/claude/cases/claude-workflow'
4
3
  import { GIT_CASES } from '@/claude/cases/git'
5
4
  import { MISC_CASES } from '@/claude/cases/misc'
6
5
  import { SETUP_CASES } from '@/claude/cases/setup'
6
+ import { WORKFLOW_CASES } from '@/claude/cases/workflow'
7
7
 
8
8
  /**
9
9
  * The full routing case corpus, one file per domain so a description change
@@ -16,7 +16,7 @@ import { SETUP_CASES } from '@/claude/cases/setup'
16
16
  * for the extraction arm this corpus replaces as the shipped measure.
17
17
  */
18
18
  export const SKILL_CASES: readonly SkillCase[] = [
19
- ...CLAUDE_WORKFLOW_CASES,
19
+ ...WORKFLOW_CASES,
20
20
  ...GIT_CASES,
21
21
  ...SETUP_CASES,
22
22
  ...AUTHORING_CASES,