@erclx/canon 5.39.0 → 5.41.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 (162) hide show
  1. package/README.md +39 -22
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/auto-ship/REQUIREMENT.md +1 -0
  4. package/claude/skills/auto-ship/SKILL.md +6 -0
  5. package/claude/skills/auto-ship/references/fan-in.md +59 -0
  6. package/claude/skills/canvas-board/SKILL.md +1 -1
  7. package/claude/skills/create-skill/references/skill.md +1 -1
  8. package/claude/skills/decision-escalate/REQUIREMENT.md +1 -1
  9. package/claude/skills/decision-escalate/SKILL.md +1 -2
  10. package/claude/skills/draft-slides/SKILL.md +2 -3
  11. package/claude/skills/draft-slides/references/deck.md +183 -0
  12. package/claude/skills/git-branch/REQUIREMENT.md +17 -6
  13. package/claude/skills/git-branch/SKILL.md +63 -7
  14. package/claude/skills/git-pr/references/evidence.md +2 -2
  15. package/claude/skills/git-pr/references/final-command.md +1 -1
  16. package/claude/skills/git-pr/references/labels.md +1 -1
  17. package/claude/skills/git-pr/references/publish.md +1 -1
  18. package/claude/skills/plan-feature/references/batches.md +48 -1
  19. package/claude/skills/plan-feature/references/plan.md +2 -0
  20. package/claude/skills/plan-intake-answer/REQUIREMENT.md +1 -1
  21. package/claude/skills/plan-intake-answer/SKILL.md +1 -2
  22. package/claude/skills/review-address/references/rebase-conflicts.md +7 -0
  23. package/claude/skills/review-ui/SKILL.md +3 -0
  24. package/claude/skills/review-ui/references/close-out.md +47 -0
  25. package/claude/skills/review-ui/references/post.md +3 -1
  26. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +1 -0
  27. package/claude/skills/role-orchestrator/references/orchestrator-handback.md +1 -1
  28. package/claude/skills/role-worker/REQUIREMENT.md +1 -0
  29. package/claude/skills/role-worker/SKILL.md +9 -0
  30. package/claude/skills/task-board/references/board.md +1 -1
  31. package/claude/skills/task-board/references/tasks.md +1 -1
  32. package/claude/skills/teach-workspace/REQUIREMENT.md +1 -1
  33. package/claude/skills/teach-workspace/SKILL.md +1 -2
  34. package/claude/skills/ux-measure/SKILL.md +1 -1
  35. package/docs/agents/audits.md +61 -60
  36. package/docs/agents/context-audit.md +40 -58
  37. package/docs/agents/index.md +5 -51
  38. package/docs/agents/install-and-sync.md +1 -0
  39. package/docs/agents/markdown-audit.md +53 -99
  40. package/docs/agents/records.md +37 -79
  41. package/docs/agents/sessions-transfer.md +26 -70
  42. package/docs/target/index.md +0 -1
  43. package/docs/target/migrations.md +57 -66
  44. package/docs/target/projects.md +36 -78
  45. package/docs/target/scenarios.md +9 -19
  46. package/docs/target/sync.md +27 -68
  47. package/docs/workflow/ai-workflow.md +22 -68
  48. package/docs/workflow/operating-model.md +32 -186
  49. package/docs/workflow/parallel-features.md +30 -66
  50. package/docs/workflow/skill-map-on-request.md +22 -24
  51. package/docs/workflow/skill-map.md +72 -76
  52. package/docs/workflow/visual-design-workflow.md +25 -118
  53. package/docs/workflow/zshrc-aliases.md +18 -37
  54. package/package.json +1 -1
  55. package/src/canvas/client/inspector/fields.css +4 -0
  56. package/src/canvas/index.html +6 -0
  57. package/src/claude/cases/git.ts +4 -0
  58. package/src/claude/skills-reach.ts +2 -2
  59. package/src/cli/ui.ts +3 -1
  60. package/src/commands/canvas.ts +23 -0
  61. package/src/commands/capture.ts +14 -0
  62. package/src/commands/claude.ts +13 -0
  63. package/src/commands/demo.ts +22 -0
  64. package/src/commands/deps.ts +6 -0
  65. package/src/commands/driver.ts +28 -2
  66. package/src/commands/gov.ts +52 -18
  67. package/src/commands/intake.ts +17 -0
  68. package/src/commands/labels.ts +38 -5
  69. package/src/commands/pr.ts +192 -52
  70. package/src/commands/records.ts +19 -3
  71. package/src/commands/secrets.ts +6 -0
  72. package/src/commands/sessions.ts +8 -0
  73. package/src/commands/tasks.ts +52 -0
  74. package/src/commands/teach.ts +13 -0
  75. package/src/commands/upstream.ts +25 -1
  76. package/src/commands/worktrees.ts +5 -0
  77. package/src/context/audit.ts +22 -4
  78. package/src/context/folders.ts +1 -1
  79. package/src/context/shape-gated.ts +5 -2
  80. package/src/counts/scan.ts +1 -1
  81. package/src/design/components.ts +1 -1
  82. package/src/design/document.ts +1 -1
  83. package/src/design/tokens.ts +1 -1
  84. package/src/gate/boundaries.ts +4 -1
  85. package/src/gate/measures.ts +1 -1
  86. package/src/gate/stages.ts +7 -7
  87. package/src/git/env.ts +6 -0
  88. package/src/markdown/scope.ts +11 -19
  89. package/src/pr/frames.ts +53 -9
  90. package/src/pr/lift.ts +153 -19
  91. package/src/pr/painted.ts +87 -0
  92. package/src/records/validate.ts +1 -0
  93. package/src/roots/record.ts +18 -1
  94. package/src/sandbox/census.ts +1 -1
  95. package/src/sandbox/headless/run.ts +3 -2
  96. package/src/sandbox/headless/watch.ts +3 -4
  97. package/src/slides/convert/master.ts +3 -0
  98. package/src/sync/format.ts +46 -0
  99. package/src/sync/stamp.ts +6 -0
  100. package/src/tasks/answers.ts +79 -2
  101. package/src/tasks/fan-in.ts +176 -0
  102. package/src/tasks/stack.ts +1 -1
  103. package/tooling/astro/reference.md +80 -39
  104. package/tooling/base/reference.md +63 -32
  105. package/tooling/base/seeds/canon/context/ci.md +7 -15
  106. package/tooling/base/seeds/canon/context/development.md +14 -14
  107. package/tooling/claude/reference.md +40 -22
  108. package/tooling/cloudflare/reference.md +31 -12
  109. package/tooling/go/reference.md +47 -23
  110. package/tooling/nextjs/reference.md +52 -19
  111. package/tooling/php/reference.md +35 -16
  112. package/tooling/python/reference.md +47 -30
  113. package/tooling/shell/reference.md +6 -5
  114. package/tooling/vite-react/reference.md +49 -21
  115. package/tooling/web/reference.md +131 -71
  116. package/docs/agents/canvas.md +0 -86
  117. package/docs/agents/capture.md +0 -65
  118. package/docs/agents/census.md +0 -23
  119. package/docs/agents/comments.md +0 -34
  120. package/docs/agents/context-audit-checks.md +0 -108
  121. package/docs/agents/context-classify.md +0 -101
  122. package/docs/agents/counts.md +0 -74
  123. package/docs/agents/demo.md +0 -140
  124. package/docs/agents/driver.md +0 -103
  125. package/docs/agents/gate.md +0 -90
  126. package/docs/agents/hooks.md +0 -78
  127. package/docs/agents/intake.md +0 -81
  128. package/docs/agents/key-changes.md +0 -116
  129. package/docs/agents/label-coverage.md +0 -86
  130. package/docs/agents/markdown-audit-density.md +0 -39
  131. package/docs/agents/markdown-audit-weight.md +0 -83
  132. package/docs/agents/pr-evidence-layout.md +0 -70
  133. package/docs/agents/pr-evidence.md +0 -273
  134. package/docs/agents/pr-frames.md +0 -131
  135. package/docs/agents/pr-lift.md +0 -132
  136. package/docs/agents/pr-local.md +0 -111
  137. package/docs/agents/pr-preview.md +0 -155
  138. package/docs/agents/pr-reads.md +0 -111
  139. package/docs/agents/pr-tick.md +0 -72
  140. package/docs/agents/records-push.md +0 -61
  141. package/docs/agents/records-stale.md +0 -40
  142. package/docs/agents/records-validate.md +0 -57
  143. package/docs/agents/restated.md +0 -83
  144. package/docs/agents/routing.md +0 -61
  145. package/docs/agents/rule-citations.md +0 -90
  146. package/docs/agents/sandbox.md +0 -126
  147. package/docs/agents/sessions.md +0 -128
  148. package/docs/agents/skills-audit.md +0 -120
  149. package/docs/agents/skills-reach.md +0 -64
  150. package/docs/agents/slides.md +0 -176
  151. package/docs/agents/state-scoped-risk.md +0 -105
  152. package/docs/agents/superseded.md +0 -85
  153. package/docs/agents/tasks-archive.md +0 -83
  154. package/docs/agents/tasks-plans.md +0 -152
  155. package/docs/agents/tasks-validate.md +0 -133
  156. package/docs/agents/tasks.md +0 -123
  157. package/docs/agents/teach-authoring.md +0 -118
  158. package/docs/agents/teach.md +0 -157
  159. package/docs/agents/test-order.md +0 -58
  160. package/docs/agents/upstream.md +0 -94
  161. package/docs/agents/worktrees.md +0 -118
  162. package/docs/target/standards-moved.md +0 -34
@@ -6,93 +6,57 @@ 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. `canon:context-fold` reads the same diff and rewrites a context entry only where a folder moved or a bullet or gotcha went untrue, and the pull request records each decision. 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.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
+ - **Fan-in.** Batches of one change sharing edge files ship as one pull request, opened by an integrator that merges each member branch. See `claude/skills/plan-feature/references/batches.md`.
45
+ - **Merge order.** Merge the smallest hotspot footprint first, and a branch touching `CLAUDE.md` or a context entry last.
46
+ - **Rebase.** The branch merging second runs `/review-address`, which trial-merges against `origin/main` and rebases. Push, then merge.
47
+ - **Clean up.** Run `/git-worktree cleanup` to remove merged worktrees. To start fresh, `ExitWorktree(action: "keep")`, then `/session-worktree <new-name>`.
48
+ - **Wrong call.** If a rebase needs a decision the tree does not carry, land one branch before starting the next.
79
49
 
80
50
  ## The task board
81
51
 
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.
52
+ `.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
53
 
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.
54
+ `canon tasks validate` reports and never writes:
93
55
 
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.
56
+ - A row's cell count must match its header, and a `## Needs a plan` row stating its position is checked against where it sits
57
+ - Every plan pointer resolves, every task file is named once, and every ready row names its files
58
+ - A parked row is reported when its cited task reached the trunk
95
59
 
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`.
60
+ `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
61
 
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.
62
+ `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 the diff moved a folder or left a context entry's bullet or gotcha untrue |
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 needs creating, naming, 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 |