@erclx/canon 5.42.0 → 5.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/auto-ship/SKILL.md +3 -3
  3. package/claude/skills/backlog-triage/references/apply.md +6 -6
  4. package/claude/skills/canon-cli/SKILL.md +4 -4
  5. package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
  6. package/claude/skills/canvas-board/SKILL.md +1 -1
  7. package/claude/skills/ci-workflow/REQUIREMENT.md +2 -1
  8. package/claude/skills/ci-workflow/SKILL.md +12 -2
  9. package/claude/skills/ci-workflow/references/workflows.md +12 -9
  10. package/claude/skills/context-fold/references/context.md +1 -1
  11. package/claude/skills/create-rule/SKILL.md +1 -0
  12. package/claude/skills/create-skill/REQUIREMENT.md +1 -1
  13. package/claude/skills/create-skill/SKILL.md +2 -2
  14. package/claude/skills/create-skill/references/skill-requirement.md +68 -9
  15. package/claude/skills/create-skill/references/skill.md +1 -1
  16. package/claude/skills/decision-escalate/SKILL.md +1 -2
  17. package/claude/skills/design-identity/REQUIREMENT.md +40 -0
  18. package/claude/skills/design-identity/SKILL.md +138 -0
  19. package/claude/skills/{draft-identity → design-identity}/references/card-route.md +2 -2
  20. package/claude/skills/design-taste/REQUIREMENT.md +4 -4
  21. package/claude/skills/design-taste/SKILL.md +2 -2
  22. package/claude/skills/design-taste/references/kinds.md +1 -1
  23. package/claude/skills/design-taste/references/preflight.md +1 -1
  24. package/claude/skills/document-health/references/axes.md +2 -1
  25. package/claude/skills/draft-and-pick/REQUIREMENT.md +8 -69
  26. package/claude/skills/draft-and-pick/SKILL.md +3 -153
  27. package/claude/skills/draft-doc/REQUIREMENT.md +9 -30
  28. package/claude/skills/draft-doc/SKILL.md +4 -76
  29. package/claude/skills/draft-figure/REQUIREMENT.md +8 -42
  30. package/claude/skills/draft-figure/SKILL.md +3 -77
  31. package/claude/skills/draft-identity/REQUIREMENT.md +8 -23
  32. package/claude/skills/draft-identity/SKILL.md +3 -130
  33. package/claude/skills/draft-ready/REQUIREMENT.md +8 -37
  34. package/claude/skills/draft-ready/SKILL.md +3 -128
  35. package/claude/skills/draft-screencast/REQUIREMENT.md +8 -23
  36. package/claude/skills/draft-screencast/SKILL.md +3 -62
  37. package/claude/skills/draft-slides/REQUIREMENT.md +8 -27
  38. package/claude/skills/draft-slides/SKILL.md +3 -72
  39. package/claude/skills/draw-figure/REQUIREMENT.md +59 -0
  40. package/claude/skills/draw-figure/SKILL.md +85 -0
  41. package/claude/skills/{draft-figure → draw-figure}/references/architecture-set.md +2 -2
  42. package/claude/skills/{draft-figure → draw-figure}/references/hand-drawn.md +2 -2
  43. package/claude/skills/{draft-figure → draw-figure}/references/mermaid-path.md +2 -2
  44. package/claude/skills/{draft-figure → draw-figure}/references/mermaid.md +1 -1
  45. package/claude/skills/git-commit/references/commit.md +1 -5
  46. package/claude/skills/git-pr/references/pr.md +1 -0
  47. package/claude/skills/make-deck/REQUIREMENT.md +44 -0
  48. package/claude/skills/make-deck/SKILL.md +80 -0
  49. package/claude/skills/markdown-craft/REQUIREMENT.md +1 -1
  50. package/claude/skills/markdown-craft/SKILL.md +2 -2
  51. package/claude/skills/pick-by-eye/REQUIREMENT.md +86 -0
  52. package/claude/skills/pick-by-eye/SKILL.md +161 -0
  53. package/claude/skills/plan-feature/SKILL.md +3 -2
  54. package/claude/skills/plan-feature/references/plan.md +25 -11
  55. package/claude/skills/plan-groundwork/SKILL.md +1 -1
  56. package/claude/skills/plan-intake/SKILL.md +1 -1
  57. package/claude/skills/plan-ready/REQUIREMENT.md +54 -0
  58. package/claude/skills/plan-ready/SKILL.md +136 -0
  59. package/claude/skills/{draft-ready → plan-ready}/references/assembly.md +1 -1
  60. package/claude/skills/{draft-ready → plan-ready}/references/ready.md +1 -1
  61. package/claude/skills/pr-evidence/references/evidence.md +1 -1
  62. package/claude/skills/record-screencast/REQUIREMENT.md +3 -3
  63. package/claude/skills/record-screencast/SKILL.md +2 -2
  64. package/claude/skills/role-orchestrator/REQUIREMENT.md +1 -1
  65. package/claude/skills/role-orchestrator/SKILL.md +2 -0
  66. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +5 -2
  67. package/claude/skills/role-orchestrator/references/orchestrator-output.md +4 -0
  68. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
  69. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +18 -13
  70. package/claude/skills/role-planner/REQUIREMENT.md +1 -1
  71. package/claude/skills/role-planner/SKILL.md +5 -4
  72. package/claude/skills/role-worker/REQUIREMENT.md +2 -0
  73. package/claude/skills/role-worker/SKILL.md +35 -2
  74. package/claude/skills/script-screencast/REQUIREMENT.md +40 -0
  75. package/claude/skills/script-screencast/SKILL.md +70 -0
  76. package/claude/skills/{draft-screencast → script-screencast}/references/beats-template.md +2 -2
  77. package/claude/skills/search-craft/REQUIREMENT.md +4 -4
  78. package/claude/skills/search-craft/SKILL.md +2 -2
  79. package/claude/skills/target-setup/SKILL.md +1 -0
  80. package/claude/skills/task-board/SKILL.md +11 -9
  81. package/claude/skills/task-board/references/board.md +15 -12
  82. package/claude/skills/teach-workspace/SKILL.md +1 -1
  83. package/claude/skills/teach-workspace/references/lesson-craft.md +2 -2
  84. package/claude/skills/ui-checklist/SKILL.md +2 -0
  85. package/claude/skills/write-doc/REQUIREMENT.md +46 -0
  86. package/claude/skills/write-doc/SKILL.md +83 -0
  87. package/claude/skills/{draft-doc → write-doc}/references/context.md +2 -2
  88. package/claude/skills/{draft-doc → write-doc}/references/docs.md +2 -2
  89. package/claude/skills/{draft-doc → write-doc}/references/readme.md +2 -2
  90. package/claude/skills/{draft-doc → write-doc}/references/wiki-kind.md +4 -4
  91. package/claude/skills/{draft-doc → write-doc}/references/wiki.md +1 -1
  92. package/docs/agents/audits.md +1 -0
  93. package/docs/agents/markdown-audit.md +4 -2
  94. package/docs/agents/migrate.md +13 -10
  95. package/docs/target/migrations.md +28 -4
  96. package/docs/target/projects.md +1 -1
  97. package/docs/workflow/parallel-features.md +3 -2
  98. package/docs/workflow/skill-map-on-request.md +18 -12
  99. package/docs/workflow/skill-map.md +13 -12
  100. package/docs/workflow/visual-design-workflow.md +2 -2
  101. package/governance/detect.toml +4 -0
  102. package/governance/ledger/framework/astro.md +73 -0
  103. package/governance/ledger/framework/fastapi.md +76 -0
  104. package/governance/ledger/framework/nextjs.md +86 -0
  105. package/governance/ledger/framework/react.md +83 -0
  106. package/governance/ledger/framework/shadcn.md +60 -0
  107. package/governance/ledger/framework/tailwind.md +55 -0
  108. package/governance/rules/canon/context.md +2 -1
  109. package/governance/rules/canon/plan.md +3 -5
  110. package/governance/rules/canon/scratch.md +3 -1
  111. package/governance/rules/canon/task-scope.md +2 -1
  112. package/governance/rules/canon/tasks.md +2 -1
  113. package/governance/rules/canon/worktrees.md +5 -2
  114. package/governance/rules/claude/output.md +7 -4
  115. package/governance/rules/claude/skill.md +6 -4
  116. package/governance/rules/framework/astro.md +12 -14
  117. package/governance/rules/framework/fastapi.md +20 -24
  118. package/governance/rules/framework/nextjs.md +19 -27
  119. package/governance/rules/framework/react.md +22 -33
  120. package/governance/rules/framework/shadcn.md +11 -15
  121. package/governance/rules/framework/tailwind.md +12 -14
  122. package/governance/rules/tooling/ci-workflow.md +6 -39
  123. package/governance/rules/ui/design-reference.md +37 -0
  124. package/governance/rules/writing/markdown.md +3 -2
  125. package/package.json +6 -6
  126. package/src/audits/catalog.ts +42 -0
  127. package/src/claude/cases/authoring.ts +15 -3
  128. package/src/claude/cases/misc.ts +12 -0
  129. package/src/claude/cases/workflow.ts +19 -1
  130. package/src/claude/settings.ts +8 -4
  131. package/src/claude/skills-audit.ts +113 -1
  132. package/src/commands/claude.ts +45 -12
  133. package/src/commands/demo.ts +1 -1
  134. package/src/commands/gov.ts +198 -0
  135. package/src/commands/markdown.ts +1 -1
  136. package/src/commands/migrate.ts +125 -2
  137. package/src/commands/pr.ts +34 -83
  138. package/src/commands/tasks.ts +383 -2
  139. package/src/commands/tooling.ts +3 -3
  140. package/src/commands/worktrees.ts +49 -0
  141. package/src/context/audit.ts +1 -1
  142. package/src/demo/beats.ts +1 -1
  143. package/src/gate/stages.ts +15 -0
  144. package/src/gov/audit.ts +441 -0
  145. package/src/listeners/belongs.ts +21 -0
  146. package/src/listeners/machine.ts +93 -0
  147. package/src/listeners/parse.ts +41 -0
  148. package/src/markdown/scope.ts +45 -35
  149. package/src/migrate/record-layout.ts +1 -1
  150. package/src/migrate/session-defaults.ts +138 -0
  151. package/src/migrate/skill-names.ts +68 -21
  152. package/src/pr/frames.ts +14 -3
  153. package/src/pr/local.ts +4 -69
  154. package/src/records/validate.ts +31 -0
  155. package/src/sync/check.ts +15 -0
  156. package/src/tasks/board.ts +854 -0
  157. package/src/tasks/record.ts +20 -1
  158. package/src/tasks/validate.ts +206 -9
  159. package/src/tooling/stamp.ts +56 -12
  160. package/src/worktrees/stop.ts +92 -0
  161. package/tooling/astro/configs/card-src/pages/og-card.astro +1 -1
  162. package/tooling/astro/reference.md +2 -2
  163. package/tooling/base/configs/.github/workflows/phase-label-gate.yml +6 -2
  164. package/tooling/base/configs/commitlint.config.js +0 -20
  165. package/tooling/base/reference.md +1 -1
  166. package/tooling/base/seeds/.github/workflows/verify.yml +4 -1
  167. package/tooling/claude/reference.md +13 -7
  168. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +65 -0
  169. package/tooling/claude/seeds/.claude/settings.json +8 -0
  170. package/tooling/claude/user/settings.template.json +0 -4
  171. package/tooling/cloudflare/configs/.github/workflows/deploy.yml +5 -5
  172. package/tooling/public/configs/.github/dependabot.yml +12 -0
  173. package/tooling/public/configs/.github/workflows/release-please.yml +30 -0
  174. package/tooling/public/manifest.toml +8 -0
  175. package/tooling/public/reference.md +53 -0
  176. package/tooling/public/seeds/.github/ISSUE_TEMPLATE/bug.yml +48 -0
  177. package/tooling/public/seeds/.github/ISSUE_TEMPLATE/config.yml +5 -0
  178. package/tooling/public/seeds/.github/ISSUE_TEMPLATE/feature.yml +16 -0
  179. package/tooling/public/seeds/.release-please-manifest.json +3 -0
  180. package/tooling/public/seeds/CONTRIBUTING.md +50 -0
  181. package/tooling/public/seeds/LICENSE +21 -0
  182. package/tooling/public/seeds/SECURITY.md +13 -0
  183. package/tooling/public/seeds/release-please-config.json +12 -0
  184. package/tooling/shell/configs/.github/workflows/shell.yml +4 -1
  185. package/tooling/web/configs/.github/workflows/readme-screenshot.yml +6 -3
  186. package/tooling/web/configs/.github/workflows/verify.yml +15 -12
  187. /package/claude/skills/{draft-figure → draw-figure}/references/figures.md +0 -0
  188. /package/claude/skills/{draft-slides → make-deck}/references/deck.md +0 -0
  189. /package/claude/skills/{draft-and-pick → pick-by-eye}/references/live-arms.md +0 -0
  190. /package/claude/skills/{draft-doc → write-doc}/references/readme/agent-facing.md +0 -0
  191. /package/claude/skills/{draft-doc → write-doc}/references/readme/application.md +0 -0
  192. /package/claude/skills/{draft-doc → write-doc}/references/readme/cli.md +0 -0
  193. /package/claude/skills/{draft-doc → write-doc}/references/readme/library.md +0 -0
  194. /package/claude/skills/{draft-doc → write-doc}/references/readme/plugin.md +0 -0
  195. /package/claude/skills/{draft-doc → write-doc}/references/requirements.md +0 -0
@@ -7,7 +7,7 @@ description: Why compiling and running a screencast draft needs a routed skill r
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, `draft-screencast` writes a draft and names `canon demo compile` as the next step, and nothing after that routes a session there or to `canon demo run`. An operator has to know both verbs, type them in order, and read the compile record for unresolved fields by hand. A session that fills one in on its own reproduces the exact failure `canon demo run`'s `plan-unresolved` reason exists to catch, one layer up where nothing enforces it.
10
+ Without this skill, `script-screencast` writes a draft and names `canon demo compile` as the next step, and nothing after that routes a session there or to `canon demo run`. An operator has to know both verbs, type them in order, and read the compile record for unresolved fields by hand. A session that fills one in on its own reproduces the exact failure `canon demo run`'s `plan-unresolved` reason exists to catch, one layer up where nothing enforces it.
11
11
 
12
12
  ## Must
13
13
 
@@ -25,7 +25,7 @@ Without this skill, `draft-screencast` writes a draft and names `canon demo comp
25
25
  - Guess or fill a target, a URL, or any other unresolved field
26
26
  - Drive the application through anything other than `canon demo run`
27
27
  - Install HyperFrames, vendor it, or restate its composition rules, which its own skills own
28
- - Assume this skill's own invocation frequency needs no check. `draft-screencast`'s closing block names it by hand, but whether anything else reaches for it beyond that pointer or an operator typing its name has no answer at creation time, so a review pass some months in should read that back rather than take it on faith.
28
+ - Assume this skill's own invocation frequency needs no check. `script-screencast`'s closing block names it by hand, but whether anything else reaches for it beyond that pointer or an operator typing its name has no answer at creation time, so a review pass some months in should read that back rather than take it on faith.
29
29
 
30
30
  ## Guards
31
31
 
@@ -33,6 +33,6 @@ Without this skill, `draft-screencast` writes a draft and names `canon demo comp
33
33
 
34
34
  ## Out of scope
35
35
 
36
- - Drafting the beats, which `draft-screencast` owns
36
+ - Drafting the beats, which `script-screencast` owns
37
37
  - Filling an existing plan's target or URL, which is the operator's own edit
38
38
  - Verifying a recording beyond its own caption, which nothing in the toolkit does yet
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: record-screencast
3
- description: Drives a screencast draft through to a recording. Compiles it with `canon demo compile` when no plan exists yet at the default path, skipping compile when one is already there, runs `canon demo run` once nothing is unresolved, then composes the take into a finished mp4 through HyperFrames when the draft's wrap section asks for anything. Reports every unresolved field from the compile or run record and stops rather than guessing one. Use when asked to "record the screencast", "run the demo", "compile and record this draft", or right after `draft-screencast` prints its next-step line. Do NOT use to draft the beats, which is `draft-screencast`, or to fill in a plan's target or URL, which is the operator's own edit.
3
+ description: Drives a screencast draft through to a recording. Compiles it with `canon demo compile` when no plan exists yet at the default path, skipping compile when one is already there, runs `canon demo run` once nothing is unresolved, then composes the take into a finished mp4 through HyperFrames when the draft's wrap section asks for anything. Reports every unresolved field from the compile or run record and stops rather than guessing one. Use when asked to "record the screencast", "run the demo", "compile and record this draft", or right after `script-screencast` prints its next-step line. Do NOT use to draft the beats, which is `script-screencast`, or to fill in a plan's target or URL, which is the operator's own edit.
4
4
  metadata:
5
5
  family: generate
6
6
  ---
@@ -9,7 +9,7 @@ metadata:
9
9
 
10
10
  ## Guards
11
11
 
12
- - If no draft path is given, stop: `❌ No draft path. Pass the path draft-screencast printed.`
12
+ - If no draft path is given, stop: `❌ No draft path. Pass the path script-screencast printed.`
13
13
  - Never guess or fill an unresolved field, a target, a URL, or anything else the compile or run record names. Report it and stop.
14
14
  - Filling one in reproduces the failure `canon demo run`'s `plan-unresolved` reason exists to catch, one layer up where nothing enforces it
15
15
  - Never pass `--force` to compile. A plan at the default output path may carry timing tuned by hand that the draft cannot reproduce.
@@ -79,7 +79,7 @@ Dispatch parts from what it checked in three ways. The gate and the worker each
79
79
  - Name each self-dispatched worker explicitly with the `worker-` prefix, since that is the role the name marks and a client-derived name is a fragment of the session's identifier
80
80
  - Carry the dispatcher's `sessionId` in the launch prompt, since a worker owed two messages has no property on the roster that resolves a controller and a name goes stale inside the window it builds in
81
81
  - Report each self-dispatch and the row it fired against loudly enough to follow, since a person no longer watches the launch step happen
82
- - Stop dispatching once `## Run now` is empty or every row in it reads claimed, rather than waking again to fire on a board nobody is clearing
82
+ - Stop dispatching once `## Up next` is empty or every row left in it is held, rather than waking again to fire on a board nobody is clearing
83
83
  - Launch a planner or worker the operator will talk with from the talk shape, with the `-talk` suffix and the brief sentence that tells it so, since a cold launch retires the session the moment its delivery lands while the operator still wants the conversation
84
84
  - Retire a talk session only on the operator's word and report it as held open until then, since its delivery says nothing about whether the conversation is over
85
85
  - Dispatch every non-release pull request's review to `role-reviewer`, leave each round's messages to it and the worker, and keep one cross-branch pass per wave here, since any pass or relay run here bills the context the wave shares
@@ -132,6 +132,8 @@ A worker is a separate process the controller can steer, and scope reaches it th
132
132
  - Do not edit tracked files from this session, at any size. The boundary offers no proportionality exception and nothing enforces it.
133
133
  - Do not hand a worker anything but a plan, which carries exact diffs only when already known and otherwise states scope and open questions
134
134
 
135
+ A late ask about a building row is a follow-up filed through `task-board`, with the ask as its origin and the running task cited in the intro. Amend the plan only on the operator's word, naming the re-review cost, and message the worker.
136
+
135
137
  The tracked-file boundary collides with `CLAUDE.md`, which says to handle a small edit immediately, and this rule wins wherever the two meet. A session that writes a change cannot review it independently afterwards, which is the separation `review-pr` exists to supply.
136
138
 
137
139
  ### Filing a row
@@ -3,7 +3,7 @@ title: Orchestrator dispatch runbook
3
3
  description: The plan-answer gate, the collision check before a self-dispatch, the conflict check against the tracks in flight and the evidence it rests on, the branch the launch names, the one model test applied to each role, the fallback to a human launch, and the loop's stopping condition
4
4
  ---
5
5
 
6
- Run this at loop step 4, for a `## Run now` row whose plan is verified, in place of handing the worktree to a human. The conflict check below is where that row is tested against every track in flight, and it is the one statement of what holds a row there.
6
+ Run this at loop step 4, for a `## Up next` row whose plan is verified, in place of handing the worktree to a human. The conflict check below is where that row is tested against every track in flight, and it is the one statement of what holds a row there.
7
7
 
8
8
  ## Contents
9
9
 
@@ -40,6 +40,7 @@ Never shorten a non-conforming slug here, since a rename parts the branch from t
40
40
 
41
41
  Run `canon tasks plan-answers <plan> --json` and read `launchable` off the record. Branch on `launchable` rather than on the exit code, which a wrapping shell function can flatten to zero and so read a held row as clear.
42
42
 
43
+ - Hold a row whose `Waiting on` has not cleared, which no other check reads
43
44
  - `launchable: true`: the plan answers itself, so proceed to the branch check.
44
45
  - `launchable: false`: report every entry in `open`, each with its question label and stated reason, and hand the row to the human-launch line below
45
46
  - Never fill the slot on the operator's behalf, the one move the plan standard forbids outright
@@ -152,6 +153,8 @@ A row qualifies for that pick when its plan carries no open question and touches
152
153
 
153
154
  Read `${CLAUDE_SKILL_DIR}/references/orchestrator-launch.md` once every check above clears, and launch from its build template, which sits beside the review-address and planning shapes that skip these checks. A cloud row launches from `${CLAUDE_SKILL_DIR}/references/orchestrator-cloud-launch.md`, since the VM shares no plugin or board.
154
155
 
156
+ Once the launch succeeds, run `canon tasks promote <stem>`.
157
+
155
158
  ## Fall back to the human
156
159
 
157
160
  Hand the row to the human-launch line in step 4 instead of dispatching when any of these hold, and name which one. A shared file alone is not listed.
@@ -171,4 +174,4 @@ Hand the person one command, `/canon:auto-ship <plan>`, naming the row, the plan
171
174
 
172
175
  ## Stop the loop
173
176
 
174
- Wrapped in `/loop`, re-run the check against `## Run now` on each wake, and stop once the group is empty or every row reads `claimed: true`. Report that once, on the wake that finds it, rather than polling a board nobody is clearing, the reasoning `orchestrator-poll.md` carries for the review trigger.
177
+ Wrapped in `/loop`, re-run the check against `## Up next` on each wake, and stop once the group is empty or every row left in it is held. Report that once, on the wake that finds it, rather than polling a board nobody is clearing, the reasoning `orchestrator-poll.md` carries for the review trigger.
@@ -65,5 +65,9 @@ Keep the detail below the block and keep it skippable. A decision reached at the
65
65
 
66
66
  - Reuse the vocabulary above rather than inventing a second one
67
67
  - Keep a file set on the row claiming it, so the reader can check a hold or a shared-path claim instead of taking it
68
+ - Name a session by its launch name in any line sending the operator into it, such as `claude attach worker-frameboard-design-reference-set`, with the id in parentheses
69
+ - A bare id tells the operator nothing about which session it is
70
+ - A rename leaves the launch name matching nothing, so read the current name off `canon sessions list --json` when the line is written
71
+ - `claude rm` takes the id alone, so that line carries the id
68
72
 
69
73
  Write no shape for a correction. A correction is a sentence, and a format for admitting error invites ceremony where plainness is the whole value.
@@ -55,7 +55,7 @@ Every measurement this pass takes decides whether a row can start rather than ho
55
55
 
56
56
  Write the result into the row, since a re-test reported in chat is lost at the next compaction and measured again.
57
57
 
58
- - Rewrite a blocker cell whose test no longer holds, and move the row to the group its new state puts it in
58
+ - Rewrite a blocker cell whose test no longer holds through `canon tasks block <stem> "<blocker>"`, and move the row to the group its new state puts it in through `canon tasks place`
59
59
  - Record the measurement in the task's `## Findings` as a line labeled with this session and the date, per `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md`
60
60
  - `### Writing the board` in `role-orchestrator` owns the method, and `canon tasks validate` runs once the board is rewritten and before the report
61
61
 
@@ -69,7 +69,7 @@ A backlog row carries no blocker cell, since `${CLAUDE_SKILL_DIR}/../task-board/
69
69
 
70
70
  ### Moving a cleared row
71
71
 
72
- A cleared row moves out of `backlog.md` onto the bottom of `## Needs a plan`, with a `Waiting on` cell stating what changed and ending with the word `last`.
72
+ A cleared row moves out of `backlog.md` onto the bottom of `## Needs a plan` in one call, `canon tasks place <stem> --group needs-a-plan --bottom --waiting "<what changed>. Last"`.
73
73
 
74
74
  - `canon tasks validate`'s ordering check reads `last` as the ordinal the bottom placement claims
75
75
  - A cell stating only what changed matches neither the ordinal nor the rank reading, raising a finding against the pass's own row
@@ -25,7 +25,7 @@ The third trigger reaches a window the first two cannot. A session with three wo
25
25
  - Run `task-complete` to archive one the hook left in place
26
26
  - A task whose outcomes are standing policy never closes, so hand it to a worker to encode the policy where it is enforced, then cut the outcomes with the reason and archive once that branch merges
27
27
  - Encoding it from this session would write a tracked file, which `## Boundaries` in the skill body forbids
28
- 4. Read `.canon/tasks/priority.md` and count entries under its `## Run now` heading that carry a written plan. Keep one in reserve beyond what is running.
28
+ 4. Read `.canon/tasks/priority.md` and count the `## Up next` rows whose `Waiting on` has cleared, since a blocked row is no reserve. `## Run now` is what is running, so keep one in reserve beyond it.
29
29
  5. Promote from the top of `## Needs a plan`, where the last sweep recorded what to plan next.
30
30
  - Depart from that order when something changed under it and say what, since a position nobody honors is the ordering going stale
31
31
  - The order is set by whether a task establishes functionality, so prefer one that adds or proves a mechanism over one that trims, tidies, or audits
@@ -53,27 +53,32 @@ That block is the detail. Lead the reply with the three slots under `## Every la
53
53
 
54
54
  ## Writing the board
55
55
 
56
- Promoting, demoting, and archiving a row all write `.canon/tasks/priority.md`, and this session is the only writer apart from `canon tasks archive`. Moving a task between the board and `.canon/tasks/backlog.md` writes both files, and this session is that file's only writer.
56
+ Write `.canon/tasks/priority.md` through the `canon tasks` verbs alone, each reading the file once, rendering every table, and writing it once. Beside this session, `canon tasks archive` drops a shipped row and `plan-link` promotes a parked one.
57
57
 
58
- - Edit with the file-editing tool, which errors on a non-match, where a shell stream editor or an inline replace exits clean and leaves the board wrong
59
- - Write both halves of a move before reporting it, since a row on neither surface leaves a task file nothing names in a gitignored folder with no history
60
- - `canon tasks validate` reports that state, so run it after any move
61
- - Put the reason a row sits where it does in its Waiting on cell, since a row promoted with the cell left alone carries an order the next sweep cannot check
58
+ | Move | Verb |
59
+ | ----------------------------------------- | ---------------------------------------------------------- |
60
+ | A backlog row onto the board, or across | `canon tasks place <stem> --group <group> --waiting "..."` |
61
+ | A planned row to `## Run now` on dispatch | `canon tasks promote <stem>` |
62
+ | A row up or down inside its group | `canon tasks move <stem> --before <stem>` |
63
+ | What a row waits on, or why it sits there | `canon tasks block <stem> "<reason>"` |
64
+
65
+ - `place` removes the task's backlog line in the same call, so a row never sits on both surfaces or on neither
66
+ - Demoting a row to `backlog.md` has no verb yet. Add the backlog line first, then delete the row with the file-editing tool, which errors on a non-match.
67
+ - Put the reason a row sits where it does in its Waiting on cell through `block`, since a row promoted with the cell left alone carries an order the next sweep cannot check
68
+ - Run `canon tasks validate` after any move, which reports a hand edit the verbs would have refused
62
69
 
63
70
  ### Columns and read-back
64
71
 
65
- Each column carries a fact a later reader checks rather than reasons again.
72
+ The verbs derive the Task, Touches, and Plan cells from the task file and its live plans, so a later reader checks them rather than reasoning again.
66
73
 
67
- - Put a pointer in the Plan column, never prose, since `auto-ship` refuses at its guard when the column leads to no plan, spending a dispatch
68
- - `## Run now` claims a written plan covers every open outcome, which is what the pointer backs
69
- - Name the file set in the Touches column, which feeds the merge order and the shared paths a dispatch names, so step 6's hold call stays checkable later
70
- - Re-resolve every Plan pointer after anything archives a plan
71
- - Read the file back after writing it, since the row that lands is the row a worker acts on
74
+ - `place` and `promote` refuse a row the target group's test fails, so a Plan cell never leads `auto-ship` to no plan and spends a dispatch
75
+ - A Touches cell differing from its plan's list is `touches-stale`. Change the plan's list rather than the cell, and step 6's hold call reads the result.
76
+ - Read the board back after a write, since the row that lands is the row a worker acts on
72
77
 
73
78
  ### Stale plan pointers
74
79
 
75
80
  A Plan pointer goes stale from a merge this board never sees. The `post-merge` hook moves a plan to `.canon/plans/archive/` through `canon tasks archive` and rewrites the citation in the archived task file alone.
76
81
 
77
- - A row for a task still on the board keeps pointing into `.canon/plans/` at a file that has moved
82
+ - A row for a task still on the board keeps pointing into `.canon/plans/` at a file that has moved, until the next verb call re-derives every Plan cell from the live plans
78
83
  - `task-complete` marks outcomes on each worker's branch and moves nothing, so the move lands at the merge
79
84
  - The board then reads as correct until a pointer is followed
@@ -61,7 +61,7 @@ four carried at least one, caught only because the planner ran
61
61
  - Owe an announcement when the record lands, carrying the path and what the row got wrong, since the controller cannot watch the read happen
62
62
  - Owe a message before a block becomes an interactive prompt, since a session already waiting on input never reaches the tool round an inbound message drains at
63
63
  - Keep correcting the dispatcher a first-class move carrying its evidence, since a trial corrected a brief's premise, planned every row anyway, and carried the consequence into a plan question
64
- - Carry a talk clause for a launch whose operator is in the session, putting each open question to them, recording a settled pick in place, and owing a close message when they end the conversation, since a cold planner's halting rules contradict a brief that asks it to talk
64
+ - Carry a talk clause for a launch whose operator is in the session, putting each open question to them, recording a settled pick in place, sending an ask about a row now building to the controller rather than the worker, and owing a close message when they end the conversation, since a cold planner's halting rules contradict a brief that asks it to talk
65
65
  - Point at each of the three skills for its record's shape and the steps that write it
66
66
  - Defer the addressee resolution to `session-relay` and keep only the last-rung inference, which discriminates differently here than it does for a worker because a session in this role holds no feature branch either
67
67
 
@@ -72,7 +72,8 @@ The plan standard fixes that block for a feature plan, and a groundwork or intak
72
72
 
73
73
  ## The board is read-only
74
74
 
75
- - Never write `.canon/tasks/priority.md` or `.canon/tasks/backlog.md`. Both are gitignored, so an overwrite drops a row with no history to recover it from.
75
+ - Never write `.canon/tasks/priority.md` or `.canon/tasks/backlog.md` by hand. Both are gitignored, so an overwrite drops a row with no history to recover it from.
76
+ - `canon tasks plan-link` is the one board write this role makes. It moves the row out of `## Needs a plan` once the plan is linked, in one read and one write a hand edit cannot match.
76
77
  - Never write the task file. The record is the whole output, and a row edited from here changes what the controller reads back as the board's state.
77
78
  - Report what the row got wrong rather than repairing it, such as a stale count or a dead path, in the record and the handback. The controller decides which carries the correction.
78
79
  - Leave the cross-feature call alone. `priority.md` shows enough to write a confident merge order off a partial picture, which is the failure this boundary prevents.
@@ -101,10 +102,10 @@ One rung stays here because it differs between roles. Inference takes the sessio
101
102
 
102
103
  A launch whose brief says it is a talk session puts the operator in this one. Everything above holds, and the clause below changes how questions are answered and when the role ends. A launch carrying no such sentence takes none of this.
103
104
 
104
- - Put each open question to the operator through the structured question surface before writing the record, and record a settled pick in place per the plan standard
105
- - Never fill an `- Answer:` slot the operator did not answer
105
+ - Put each open question to the operator through the structured question surface before writing the record
106
+ - Record each pick per `### Overrides and settled questions` in `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md`
106
107
  - Keep answering under `plan-feature`'s discussion rounds after the record lands, since the operator launched this session to keep talking.
107
- - Owe the landing announcement as usual, plus a close message when the operator ends the conversation.
108
+ - Owe the landing announcement as usual, plus a close message when the operator ends the conversation. Send an ask about a building row to the controller, never the worker.
108
109
  - Skip the before-prompt block message for a question put to the operator in the session. Keep it for a block the operator cannot answer, since a controller learns of a stall only from a message.
109
110
 
110
111
  The operator being present is an assumption the launch carries. A talk planner whose operator has walked away waits silently on its first question, so say what the session is waiting on in the turn it stops.
@@ -35,6 +35,8 @@ The draft mark fails from both ends. On 2026-08-31 four sessions re-drafted a pu
35
35
  - Keep refusing a dispatcher a first-class move carrying its evidence, since the halts measured so far were correct and the cost of each fell where it belonged
36
36
  - State that a held body may be older than the branch under it, since a plugin skill loads from the marketplace cache rather than from the working tree
37
37
  - Carry a talk clause for a launch whose operator is in the session, asking them at a judgment call and sending a close message when they end the conversation, since a cold worker's halt-toward-the-controller and merge-ends-the-role rules contradict a brief that asks it to talk
38
+ - Freeze the plan's scope at dispatch, sorting a late ask into a defect to fix, a follow-up row to report, or an addition the operator's word admits with its re-review cost stated, since intake 155 measured about four UI review rounds on one pull request from late asks, each re-running both reviews
39
+ - Own the local preview server for a painted diff, started as a tracked background command before the pull request opens, since a `no-server` read leaves the evidence comment and the UI reviewer without an address on the one path nobody watched being built (erclx/frameboard#1 and erclx/frameboard#4)
38
40
  - Point at `session-worktree`, `auto-ship`, and `review-address` for the steps each already owns
39
41
 
40
42
  ## Must not
@@ -36,9 +36,41 @@ A ready folder and the draft mark each carry work another session already did, s
36
36
 
37
37
  ### Overriding a plan question
38
38
 
39
- Rewrite an unanswered question's `- Suggested:` line as `overridden at execution to <pick>,` plus the measurement when this build decides against it, leaving `- Answer:` blank, per `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md`.
39
+ Follow `### Overrides and settled questions` in `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md` when this build decides against a suggestion.
40
40
 
41
- Put the same deviation in one line under the open task's `## Findings`, opening with the bold source-and-date label `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md` fixes.
41
+ Open the task's `## Findings` line for an override with the bold source-and-date label `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md` fixes.
42
+
43
+ ### The preview server
44
+
45
+ A painted pull request needs a server in this worktree for `canon pr local` to find, and this session is the one with a lifetime to own it. `auto-ship` Step 5 decides whether the diff is painted, so this body restates no file test.
46
+
47
+ - Run `canon pr local --json` first and start nothing when `reason` reads `ok`
48
+ - Otherwise start the stack's `dev` script as a background command from the worktree root before the pull request step. `dev` follows the worktree, so a `review-address` fix shows on the same link.
49
+ - Wait up to 60 seconds for the verb to read `ok`, then ship either way. A stack with no `dev` script gets no start, and `pr-evidence` reports `no-server`.
50
+ - Never detach it with `nohup`, `setsid`, or `disown`, since the owning session is the stop. `canon worktrees reclaim` ends any listener left in a worktree it removes.
51
+
52
+ A hand-run `git-ship` or `git-pr` starts no server, since only a worker has a lifetime to own one.
53
+
54
+ ### Building against a design reference
55
+
56
+ A plan carrying a `**Design references:**` section names the accepted design for the surface it changes. Open it before building, since the build matches it and a worker that reads the dark image alone ships a light theme nobody saw.
57
+
58
+ - Open each cited folder's light and dark images and its frame HTML before the first edit to that surface
59
+ - Take sizes, spacing, and colors from the frame HTML rather than from the image
60
+ - Report a reference that does not resolve in the working tree, naming the path, rather than building without it
61
+ - Leave `None identified.` as it stands and build without a reference
62
+
63
+ ## Scope after dispatch
64
+
65
+ The plan is the scope from the dispatch on. A late ask restarts both reviews, and one pull request took about four UI review rounds from asks that arrived mid-build.
66
+
67
+ Sort each ask that arrives after dispatch three ways:
68
+
69
+ - A defect is a failed outcome or a regression in what the plan builds. Fix it in this build, and take every review finding on the pull request through `review-address` the same way.
70
+ - Anything else is a follow-up row. Do not build it. Reply with the follow-up wording, and report the row to the controller with its title, origin, and surface.
71
+ - Add it to this pull request only on the operator's word, never a bare controller or planner message without an amended plan. Before the commit, say that both reviews run again.
72
+
73
+ When the operator approves an addition through the controller, the controller amends the plan in place and sends the pointer, so the added scope stays checkable against the diff. Fall back to `session-relay`'s copyable block when no controller is live, and never drop the row.
42
74
 
43
75
  ## The board is read-only
44
76
 
@@ -107,6 +139,7 @@ A launch whose brief says it is a talk session puts the operator in this one. Ev
107
139
 
108
140
  - Ask the operator in the session through the structured question surface at a judgment call, rather than halting toward the controller
109
141
  - Put a plan question written as needing the operator's call to them directly
142
+ - Sort a late ask from the operator in place under the scope rule above, and send the controller the follow-up row rather than relaying the ask
110
143
  - Send the controller a close message when the operator ends the conversation, beside the announcements the channel above owes.
111
144
  - Keep the before-prompt block message for a block the operator cannot answer. A question put to the operator who is in the session needs none.
112
145
 
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: script-screencast
3
+ description: Why a recording script ships pre-seeded rather than blank, what the four discovery questions buy, and why the draft stays stack-agnostic
4
+ ---
5
+
6
+ # Script screencast requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a recording plan arrives as a wall of blank fields, so the user fills a template instead of editing a draft and the work the skill was meant to do lands back on them. The opposite failure costs more. A session that skips discovery guesses the audience, the length, and the hero moment, then writes five beats for a video nobody asked for, and every one of them has to be thrown away rather than edited.
11
+
12
+ A draft that names the recording software, the editing software, or the window manager pins the script to one machine and one person's setup, so it stops being reusable the moment anyone else records. And re-invoking to refine silently overwrites the edits the user made in the file, which is the one failure that destroys work rather than wasting it.
13
+
14
+ ## Must
15
+
16
+ - Read project context and recent commits before proposing, since what shipped recently is usually the subject
17
+ - Ask exactly four discovery questions, each carrying a default derived from that context
18
+ - Wait for answers rather than reading silence as acceptance
19
+ - Pre-seed every section with concrete content so the draft is shippable as written and the user edits down
20
+ - Derive the slug from the topic and the discovery answers
21
+ - Write to `demos/<slug>/beats.md` at the project root, the committed folder the rest of the demo lives in, and print that path on its own line
22
+ - Seed a wrap section naming intro, outro, and music with a default each, so the choice of what surrounds the take is made at draft time rather than discovered at compose time
23
+
24
+ ## Must not
25
+
26
+ - Name recording software, editing software, fonts, or window managers
27
+ - Record, edit video, or generate captions
28
+ - Re-run against an existing draft to refine it, since re-running overwrites
29
+ - Infer the hero moment without asking, which is the beat the whole script is built around
30
+
31
+ ## Guards
32
+
33
+ - No topic provided: stop rather than guessing what is being recorded
34
+
35
+ ## Out of scope
36
+
37
+ - Producing the recording, which `record-screencast` owns
38
+ - Refining an existing draft, which is a direct edit of the file
39
+ - Slide decks, which `make-deck` owns
40
+ - Where the recording ships, which the draft lists and the user decides
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: script-screencast
3
+ description: Drafts a screencast script with pre-seeded beats, defaults, and decisions to `demos/<slug>/beats.md`. Reads project context, asks four discovery questions with proposed defaults, then writes a shippable draft. Use when asked to "draft a screencast", "write a recording script", "plan a demo video", or "scaffold a screencast for X". Do NOT re-invoke to refine an existing draft. Re-running overwrites. Edit the draft file directly.
4
+ metadata:
5
+ family: generate
6
+ ---
7
+
8
+ # Script screencast
9
+
10
+ ## Guards
11
+
12
+ - If no topic is provided, stop: `❌ No screencast topic. Describe what you are recording.`
13
+ - Draft, then hand off. Do not edit video, generate captions, or drive the application, since a recording is `record-screencast`'s job. Name it as the next step and stop.
14
+ - Stack-agnostic in the draft. Never name a recording tool, an editing tool, a font, or a window manager.
15
+ - Keep selectors, URLs, wait conditions, and timings out of the beats, since the compiler adds those four in a plan of its own and a beat carrying them stops being readable
16
+
17
+ ## Step 1: read the project context
18
+
19
+ Read these in parallel from the project root, skipping any that do not exist:
20
+
21
+ - `CLAUDE.md`: behavior rules and project pitch
22
+ - `canon/REQUIREMENTS.md`: feature scope, non-goals, audience hints
23
+ - `.canon/tasks/index.md`: current scope
24
+ - Recent commits via `git log --oneline -20 2>/dev/null || echo "FALLBACK"`: what shipped recently is usually the recording subject.
25
+
26
+ ## Step 2: discovery with proposed defaults
27
+
28
+ Ask exactly four questions in chat. Each carries a proposed default derived from Step 1. The user confirms, overrides, or says "use defaults" to accept all.
29
+
30
+ ```markdown
31
+ **Discovery:**
32
+
33
+ 1. Audience: proposing technical peers. Override?
34
+ 2. Length: proposing 75-90s. Override?
35
+ 3. Hero moment: proposing <best guess from context, or "the single thing that has to land">. Override?
36
+ 4. What to cut: proposing <best guess, or "anything that is not the hero moment">. Override?
37
+ ```
38
+
39
+ Wait for answers before drafting. Do not infer silence as acceptance.
40
+
41
+ ## Step 3: derive the slug
42
+
43
+ Build a 2-to-4-word kebab-case slug from the topic and discovery answers. Examples: `auth-flow-redesign`, `cli-onboarding`, `inline-edit-launch`.
44
+
45
+ ## Step 4: write the draft
46
+
47
+ Create `demos/<slug>/beats.md` at the project root, creating the folder if it does not exist. The file is committed with the rest of the demo's sources, so a recording can be rebuilt from the folder alone.
48
+
49
+ ### Fill the template
50
+
51
+ Write all nine sections from `${CLAUDE_SKILL_DIR}/references/beats-template.md`, read on reaching this step. Pre-seed every section with concrete content so the draft ships as-is, and the user edits down rather than fills blanks. A run stopped at discovery skips it.
52
+
53
+ Load `canon:video-craft` for every zoom and caption value the draft names, and report it rather than proceeding silently when it does not resolve.
54
+
55
+ ## Step 5: output
56
+
57
+ Print the file path on its own line and a one-line summary. Do not paraphrase the path into prose.
58
+
59
+ ```markdown
60
+ 📝 Wrote demos/<slug>/beats.md
61
+
62
+ Draft has 5 beats and pre-seeded defaults. Edit the beats, the resolved decisions, and the wrap.
63
+
64
+ To record it rather than shoot it by hand:
65
+ record-screencast demos/<slug>/beats.md
66
+ ```
67
+
68
+ Name the skill and stop there. Do not compile the draft, do not run it, and do not generate captions. The operator edits the beats first, and the compiler reports which selectors and URLs they still owe it.
69
+
70
+ Say so plainly if `canon demo compile` is not available, rather than driving the application some other way. The command ships with the CLI and the skills ship with the plugin, so a project carrying one and not the other is a real state.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  title: Beats template
3
- description: The nine-section template draft-screencast writes to demos/<slug>/beats.md, pre-seeded so the draft ships as-is
3
+ description: The nine-section template script-screencast writes to demos/<slug>/beats.md, pre-seeded so the draft ships as-is
4
4
  ---
5
5
 
6
6
  # Beats template
7
7
 
8
- Applies to the draft `draft-screencast` Step 4 writes. Fill every placeholder from the project context and the discovery answers. The template states no zoom or caption value, since each traces to a source `canon:video-craft` records.
8
+ Applies to the draft `script-screencast` Step 4 writes. Fill every placeholder from the project context and the discovery answers. The template states no zoom or caption value, since each traces to a source `canon:video-craft` records.
9
9
 
10
10
  ## Template
11
11
 
@@ -7,7 +7,7 @@ description: Why a session needs a thinking step before an outside search, deriv
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session reaching outside the project runs one generic `WebSearch` and takes what ranks highest. Nothing in the toolkit says how to search, and the two procedures that require an outside source, `plan-groundwork` and `draft-doc`'s wiki kind, give no route to one.
10
+ Without this skill, a session reaching outside the project runs one generic `WebSearch` and takes what ranks highest. Nothing in the toolkit says how to search, and the two procedures that require an outside source, `plan-groundwork` and `write-doc`'s wiki kind, give no route to one.
11
11
 
12
12
  The miss is measured. On 2026-10-02 two queries ran twice each with identical text, once open and once with `allowed_domains` set to authorities the session derived itself with no list to consult.
13
13
 
@@ -30,7 +30,7 @@ Access is a second gap a session cannot derive. Probed on 2026-10-02, Reddit ref
30
30
  - Prefer a public API over a fetched and summarized page where one exists, since the API returns the dates, authors, and identifiers a citation needs
31
31
  - Carry a dated access note grown only from a failure a session hit, and stop to ask the operator before any paid or logged-in route
32
32
  - Close with the practice skill's excuses, red flags, and closing checklist, answering "the model already knows the good sites" and "one search was enough"
33
- - Be loaded from the sourcing steps of `plan-groundwork` and `draft-doc`'s wiki kind, each reporting when the skill does not resolve
33
+ - Be loaded from the sourcing steps of `plan-groundwork` and `write-doc`'s wiki kind, each reporting when the skill does not resolve
34
34
 
35
35
  ## Must not
36
36
 
@@ -42,7 +42,7 @@ Access is a second gap a session cannot derive. Probed on 2026-10-02, Reddit ref
42
42
  ## Out of scope
43
43
 
44
44
  - The form a citation takes: the procedure or standard writing it
45
- - A Claude Code subject: the `claude-code-guide` agent, which `draft-doc`'s wiki sourcing step already routes to
45
+ - A Claude Code subject: a direct fetch of `https://code.claude.com/docs/llms.txt` and the `.md` page it names, as `write-doc`'s wiki sourcing step already does
46
46
  - Image generation, which makes a picture rather than finding a source
47
47
  - Loading on every web search rather than on a research-shaped request: a hook matching `WebSearch`, planned on its own
48
48
  - Whether a session already scopes searches without the skill, which only a run on a fresh research request without it would show
@@ -54,4 +54,4 @@ Access is a second gap a session cannot derive. Probed on 2026-10-02, Reddit ref
54
54
  - No `Skill` call fired, so the description did not route a plain research request to the body.
55
55
  - The run searched four times with no domain filter, naming authors and journals from recall, then fetched the papers' own pages. It never named the field, so the scenario's field pattern failed and the arm went red on one of its assertions.
56
56
 
57
- The arm shows the trigger is the gap rather than the body: a session that never loads the skill cannot follow it. The pointers from `plan-groundwork` and `draft-doc`'s wiki kind reach only those procedures, and the hook matching `WebSearch` is the route for every other search. One run on one model shows the miss exists and does not size it.
57
+ The arm shows the trigger is the gap rather than the body: a session that never loads the skill cannot follow it. The pointers from `plan-groundwork` and `write-doc`'s wiki kind reach only those procedures, and the hook matching `WebSearch` is the route for every other search. One run on one model shows the miss exists and does not size it.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: search-craft
3
- description: Carries the thinking step a session takes before it searches outside the project, naming the field, deriving who that field treats as authoritative, and running a search scoped to those sources beside an open one, plus a dated note on which sites refuse access. Use before any outside search for evidence, papers, documentation, statistics, or opinion, when a procedure loads it at its sourcing step, or when asked "find me the strongest evidence on X", "where should I look for this", "what does the research say", "find papers on", "look up the docs for", or "what are people saying about". Do NOT use to format a citation, which belongs to the surface writing it, to source a Claude Code subject, which is the `claude-code-guide` agent, or to generate an image, which is not search.
3
+ description: Carries the thinking step a session takes before it searches outside the project, naming the field, deriving who that field treats as authoritative, and running a search scoped to those sources beside an open one, plus a dated note on which sites refuse access. Use before any outside search for evidence, papers, documentation, statistics, or opinion, when a procedure loads it at its sourcing step, or when asked "find me the strongest evidence on X", "where should I look for this", "what does the research say", "find papers on", "look up the docs for", or "what are people saying about". Do NOT use to format a citation, which belongs to the surface writing it, to source a Claude Code subject, which is a direct fetch of Anthropic's docs index, or to generate an image, which is not search.
4
4
  metadata:
5
5
  family: build
6
6
  ---
@@ -87,6 +87,6 @@ These flags fire after the search has run.
87
87
  ## What this delegates
88
88
 
89
89
  - The form a citation takes: the surface writing it, such as the standard the procedure writes to
90
- - A Claude Code subject: the `claude-code-guide` agent, which `draft-doc`'s wiki sourcing step routes to
90
+ - A Claude Code subject: a direct fetch of `https://code.claude.com/docs/llms.txt` and the `.md` page it names, as `write-doc`'s wiki sourcing step does
91
91
  - Generating an image: whatever draws the surface, since making one is not search
92
92
  - Access code a session needs repeatedly: a `canon` verb, never a script in this skill
@@ -183,6 +183,7 @@ After the chain, report as well:
183
183
  - Any domains or scripts that failed
184
184
  - Any detection gaps surfaced during resolve
185
185
  - Claude Code plugins as an onboarding step this chain does not cover, so a clean result does not read as onboarding complete
186
+ - `/canon:write-doc README.md` when the root `README.md` is missing or carries no H1 naming the project, and nothing when it is authored
186
187
 
187
188
  A resolved name and a fallback read alike once written, so the preview marks the
188
189
  fallback rather than this report. The preview is the last point before the first
@@ -67,10 +67,12 @@ Write `.canon/tasks/vXX.Y-<slug>.md` under the claimed label, reading the file f
67
67
 
68
68
  A task file with no row is a dropped task, so name its surface in the same pass that creates it. The test and both file shapes are in `${CLAUDE_SKILL_DIR}/references/board.md`.
69
69
 
70
- | Task | Surface |
71
- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
72
- | Plausibly planned within the next few waves | A row under `## Needs a plan` in `.canon/tasks/priority.md`, positioned against the rows there, with the reason in `Waiting on` |
73
- | Anything else | A line in `.canon/tasks/backlog.md`, which is unordered |
70
+ | Task | Surface |
71
+ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
72
+ | Plausibly planned within the next few waves | A row under `## Needs a plan` in `.canon/tasks/priority.md`, through `canon tasks place <stem> --group needs-a-plan --waiting "<reason>"` |
73
+ | Anything else | A line in `.canon/tasks/backlog.md`, which is unordered |
74
+
75
+ Position the row against its siblings with `--before <stem>` or `--after <stem>`, and state what it ranks against in the reason.
74
76
 
75
77
  ### Check for a live orchestrator
76
78
 
@@ -80,11 +82,11 @@ Check the roster before writing either file. Read `canon sessions list --self --
80
82
  - Its `name` starts with `orchestrator-`, the convention every hand-launched controller here uses, which excludes every `worker-` and `planner-` session
81
83
  - Treat a refusal from either call the same as a roster read that failed
82
84
 
83
- | Roster read | Act |
84
- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
85
- | **Found** | Write neither file. Report the surface and reason, and message that session so it places the row itself |
86
- | **Not found**, and this session's name starts with `worker-` or `planner-` | Write neither file, since both role bodies ban a board write. Report the row and its surface. |
87
- | **Not found otherwise**, or the read fails | Write the row directly, through the same heredoc route as the file. A failed read looks like a solo project. |
85
+ | Roster read | Act |
86
+ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
87
+ | **Found** | Write neither file. Report the surface and reason, and message that session so it places the row itself |
88
+ | **Not found**, and this session's name starts with `worker-` or `planner-` | Write neither file, since both role bodies ban a board write. Report the row and its surface. |
89
+ | **Not found otherwise**, or the read fails | Place the row through `canon tasks place`. A failed read looks like a solo project. |
88
90
 
89
91
  Say which branch fired and why in the report. A placement with no stated reason is one the next sweep re-derives from nothing.
90
92
 
@@ -70,28 +70,31 @@ Group tasks by readiness rather than by status, one row per task, under the colu
70
70
 
71
71
  Readiness is three groups under fixed headings, `## Run now`, `## Up next`, and `## Needs a plan`, in that order. A task belongs to exactly one, and the tests are read in order.
72
72
 
73
- | Group | Test |
74
- | ----------------- | -------------------------------------------------------------------------------------- |
75
- | `## Run now` | A written plan covers every open outcome, and nothing stated keeps the task from start |
76
- | `## Up next` | A written plan exists, and the `Waiting on` column names why the task cannot start |
77
- | `## Needs a plan` | Everything else. No plan, or a plan that no longer describes the work |
73
+ | Group | Test |
74
+ | ----------------- | ------------------------------------------------------------------------------------ |
75
+ | `## Run now` | A worker was dispatched on it, under a written plan covering every open outcome |
76
+ | `## Up next` | A written plan exists and no worker holds it yet, and `Waiting on` names what is due |
77
+ | `## Needs a plan` | Everything else. No plan, or a plan that no longer describes the work |
78
78
 
79
79
  The names are the contract. A board grouped by readiness under names of its own reads as empty to anything counting rows under a heading, so add no fourth group.
80
80
 
81
+ ### Writing the board
82
+
83
+ Every write goes through `canon tasks place`, `promote`, `move`, or `block`, each reading the file once, rendering the columns the template fixes, and writing it once. `plan-link` promotes a parked row the same way. Only `Waiting on` is typed, since every other cell derives from the task and its live plans.
84
+
81
85
  ### What blocks a run
82
86
 
83
87
  A collision with running work blocks a task only where no merge settles it, being a contract, a relocation, or a sweep. A shared file alone is none, since the branch merging second rebases.
84
88
 
85
- - A worker is handed a task from `## Run now` alone, and its `Touches` column states the set to read
86
- - Each group's columns follow from its test. Neither half of the `## Run now` test is checkable without the file set and the plan beside the task.
89
+ - A dispatcher picks from `## Up next` and runs `canon tasks promote` once the launch succeeds
90
+ - Each group's columns follow from its test. Neither half of the `## Up next` test is checkable without the file set and the plan beside the task.
87
91
 
88
92
  ### The `Touches` cell
89
93
 
90
- A `Touches` cell is copied from its plan's list, so it states what the branch sets out to write rather than a bound on it. A branch outgrows it while the row still reads as it did at dispatch.
94
+ A `Touches` cell is the first three paths of its plan's `**Files to touch:**` and a count of the rest, the union in line order for a sliced task. It states what the branch sets out to write, and a running branch outgrows it.
91
95
 
92
- - Once a branch runs, correct the cell from the diff rather than the plan, which is the prediction that already went stale
93
- - `canon tasks plan-reach <plan>` reads that diff against every live plan and every cell in the group
94
- - The row's owner writes the correction. A worker never edits this board.
96
+ - `canon tasks plan-reach <plan>` reads the current reach off the branch's diff
97
+ - Change the plan's list to change the cell. A worker never edits this board.
95
98
 
96
99
  ### Cell width
97
100
 
@@ -118,7 +121,7 @@ The `Waiting on` column under `## Up next` carries the reason in one of three fo
118
121
  | Sibling task | That task |
119
122
  | External condition | The condition and what would satisfy it |
120
123
 
121
- Naming what would satisfy a condition separates a blocked row from one nobody examined, so a condition with no way out fails the test. The header text is the contract, since a reader resolves the column by header rather than position.
124
+ Naming what would satisfy a condition separates a blocked row from one nobody examined, so a condition with no way out fails the test. The header text is the contract, since a reader resolves the column by header rather than position. A cell renders at most 120 characters, a link counting as its label alone, and the verbs refuse a longer one.
122
125
 
123
126
  ### The needs-a-plan cell
124
127
 
@@ -183,7 +183,7 @@ Read `${CLAUDE_SKILL_DIR}/references/promotion-fold.md` for how each block lands
183
183
  Lesson: .canon/teach/<nn>-<topic>/lessons/<nnnn>-<slug>.html
184
184
  Reference: .canon/teach/<nn>-<topic>/reference/<slug>.md
185
185
  Record: .canon/teach/<nn>-<topic>/learning-records/<nnnn>-<slug>.md
186
- Figure: <drawn through draft-figure, or the one-line reason prose carries it>
186
+ Figure: <drawn through draw-figure, or the one-line reason prose carries it>
187
187
  Progress: <n> of <m> success lines met
188
188
  Open: [<the url the serve verb reported>](<the same url>)
189
189
  ```