@erclx/canon 5.45.0 → 5.47.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 (158) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/api-design/REQUIREMENT.md +15 -31
  3. package/claude/skills/auto-ship/REQUIREMENT.md +14 -25
  4. package/claude/skills/backlog-triage/REQUIREMENT.md +12 -23
  5. package/claude/skills/build-in-slices/REQUIREMENT.md +15 -25
  6. package/claude/skills/canon-cli/REQUIREMENT.md +15 -27
  7. package/claude/skills/canon-feedback/REQUIREMENT.md +10 -18
  8. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +10 -15
  9. package/claude/skills/canvas-board/REQUIREMENT.md +14 -28
  10. package/claude/skills/ci-workflow/REQUIREMENT.md +12 -21
  11. package/claude/skills/code-craft/REQUIREMENT.md +14 -28
  12. package/claude/skills/codebase-layout/REQUIREMENT.md +14 -31
  13. package/claude/skills/context-fold/REQUIREMENT.md +15 -39
  14. package/claude/skills/context-fold/references/context.md +3 -3
  15. package/claude/skills/create-rule/REQUIREMENT.md +10 -24
  16. package/claude/skills/create-rule/SKILL.md +3 -0
  17. package/claude/skills/create-skill/REQUIREMENT.md +10 -21
  18. package/claude/skills/decision-escalate/REQUIREMENT.md +12 -24
  19. package/claude/skills/deploy-app/REQUIREMENT.md +12 -22
  20. package/claude/skills/deprecation-migration/REQUIREMENT.md +14 -42
  21. package/claude/skills/design-identity/REQUIREMENT.md +14 -20
  22. package/claude/skills/design-taste/REQUIREMENT.md +16 -57
  23. package/claude/skills/docs-sync/REQUIREMENT.md +14 -23
  24. package/claude/skills/document-health/REQUIREMENT.md +15 -29
  25. package/claude/skills/document-health/SKILL.md +2 -2
  26. package/claude/skills/document-repair/REQUIREMENT.md +32 -0
  27. package/claude/skills/document-repair/SKILL.md +76 -0
  28. package/claude/skills/document-repair/references/batches.md +44 -0
  29. package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -3
  30. package/claude/skills/draft-doc/REQUIREMENT.md +4 -3
  31. package/claude/skills/draft-figure/REQUIREMENT.md +4 -3
  32. package/claude/skills/draft-identity/REQUIREMENT.md +4 -3
  33. package/claude/skills/draft-ready/REQUIREMENT.md +4 -3
  34. package/claude/skills/draft-screencast/REQUIREMENT.md +4 -3
  35. package/claude/skills/draft-slides/REQUIREMENT.md +4 -3
  36. package/claude/skills/draw-figure/REQUIREMENT.md +15 -39
  37. package/claude/skills/git-branch/REQUIREMENT.md +12 -26
  38. package/claude/skills/git-commit/REQUIREMENT.md +11 -15
  39. package/claude/skills/git-followup/REQUIREMENT.md +11 -22
  40. package/claude/skills/git-followup/SKILL.md +1 -0
  41. package/claude/skills/git-issue/REQUIREMENT.md +9 -15
  42. package/claude/skills/git-pr/REQUIREMENT.md +13 -32
  43. package/claude/skills/git-pr/SKILL.md +11 -2
  44. package/claude/skills/git-pr/references/closing-issues.md +47 -0
  45. package/claude/skills/git-pr/references/pr.md +62 -7
  46. package/claude/skills/git-ship/REQUIREMENT.md +13 -26
  47. package/claude/skills/git-split/REQUIREMENT.md +10 -17
  48. package/claude/skills/git-stage/REQUIREMENT.md +12 -18
  49. package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
  50. package/claude/skills/make-deck/REQUIREMENT.md +13 -21
  51. package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
  52. package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
  53. package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
  54. package/claude/skills/plan-groundwork/SKILL.md +5 -2
  55. package/claude/skills/plan-groundwork/references/output.md +47 -1
  56. package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
  57. package/claude/skills/plan-intake/references/intake.md +2 -2
  58. package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
  59. package/claude/skills/plan-intake-answer/SKILL.md +7 -1
  60. package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
  61. package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
  62. package/claude/skills/read-frames/REQUIREMENT.md +3 -8
  63. package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
  64. package/claude/skills/review-address/REQUIREMENT.md +14 -38
  65. package/claude/skills/review-address/SKILL.md +18 -6
  66. package/claude/skills/review-address/references/post-review-findings.md +4 -1
  67. package/claude/skills/review-address/references/rebase-only.md +14 -2
  68. package/claude/skills/review-craft/REQUIREMENT.md +14 -32
  69. package/claude/skills/review-pr/REQUIREMENT.md +15 -34
  70. package/claude/skills/review-pr/SKILL.md +9 -2
  71. package/claude/skills/review-pr/references/body-variants.md +29 -8
  72. package/claude/skills/review-pr/references/post.md +29 -10
  73. package/claude/skills/review-ui/REQUIREMENT.md +14 -39
  74. package/claude/skills/review-ui/SKILL.md +1 -0
  75. package/claude/skills/review-ui/references/post.md +2 -0
  76. package/claude/skills/review-ui/references/tick.md +3 -0
  77. package/claude/skills/role-orchestrator/REQUIREMENT.md +2 -2
  78. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
  79. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
  80. package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
  81. package/claude/skills/role-reviewer/SKILL.md +8 -1
  82. package/claude/skills/role-worker/REQUIREMENT.md +2 -2
  83. package/claude/skills/role-worker/SKILL.md +3 -0
  84. package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
  85. package/claude/skills/search-craft/REQUIREMENT.md +12 -36
  86. package/claude/skills/search-craft/SKILL.md +1 -1
  87. package/claude/skills/search-craft/references/adopted.md +2 -2
  88. package/claude/skills/session-compact/REQUIREMENT.md +13 -23
  89. package/claude/skills/session-map/REQUIREMENT.md +13 -29
  90. package/claude/skills/session-relay/REQUIREMENT.md +14 -58
  91. package/claude/skills/session-relay/SKILL.md +6 -0
  92. package/claude/skills/session-resume/REQUIREMENT.md +13 -27
  93. package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
  94. package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
  95. package/claude/skills/target-check/REQUIREMENT.md +16 -23
  96. package/claude/skills/target-setup/REQUIREMENT.md +11 -34
  97. package/claude/skills/task-board/REQUIREMENT.md +13 -22
  98. package/claude/skills/task-board/SKILL.md +7 -0
  99. package/claude/skills/task-board/references/decline.md +2 -2
  100. package/claude/skills/task-board/references/tasks.md +1 -1
  101. package/claude/skills/task-complete/REQUIREMENT.md +11 -24
  102. package/claude/skills/task-complete/references/archive.md +4 -2
  103. package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
  104. package/claude/skills/test-craft/REQUIREMENT.md +15 -46
  105. package/claude/skills/test-first/REQUIREMENT.md +14 -20
  106. package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
  107. package/claude/skills/ui-checklist/SKILL.md +3 -3
  108. package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
  109. package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
  110. package/claude/skills/video-craft/REQUIREMENT.md +14 -27
  111. package/claude/skills/write-doc/REQUIREMENT.md +14 -24
  112. package/claude/skills/write-human/REQUIREMENT.md +15 -27
  113. package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
  114. package/docs/agents/context-audit.md +19 -12
  115. package/docs/agents/markdown-audit.md +15 -10
  116. package/docs/target/projects.md +2 -0
  117. package/docs/workflow/skill-map.md +6 -5
  118. package/docs/workflow/zshrc-aliases.md +3 -0
  119. package/governance/renames.toml +0 -2
  120. package/governance/rules/claude/output.md +5 -1
  121. package/governance/rules/code/routing.md +5 -1
  122. package/governance/stacks/base.toml +0 -1
  123. package/package.json +1 -1
  124. package/scripts/core/bootstrap.sh +1 -0
  125. package/src/claude/cases/workflow.ts +12 -0
  126. package/src/commands/context.ts +57 -3
  127. package/src/commands/labels.ts +149 -4
  128. package/src/commands/markdown.ts +188 -21
  129. package/src/commands/pr.ts +113 -4
  130. package/src/commands/sessions.ts +58 -11
  131. package/src/commands/tasks.ts +182 -0
  132. package/src/commands/worktrees.ts +2 -0
  133. package/src/context/coverage.ts +210 -0
  134. package/src/context/gate.ts +12 -3
  135. package/src/gate/stages.ts +1 -1
  136. package/src/init/steps.ts +45 -0
  137. package/src/intake/items.ts +14 -0
  138. package/src/labels/closing.ts +46 -0
  139. package/src/labels/density.ts +363 -0
  140. package/src/markdown/gated.ts +250 -0
  141. package/src/markdown/scope.ts +115 -2
  142. package/src/migrate/rename.ts +6 -0
  143. package/src/pr/evidence.ts +1 -1
  144. package/src/pr/rest.ts +2 -0
  145. package/src/pr/tick.ts +89 -0
  146. package/src/sessions/claim.ts +7 -0
  147. package/src/sessions/live.ts +79 -6
  148. package/src/sessions/registry.ts +11 -0
  149. package/src/sessions/resolve.ts +85 -7
  150. package/src/tasks/archive.ts +15 -4
  151. package/src/tasks/closes.ts +136 -0
  152. package/src/tasks/record.ts +1 -1
  153. package/src/worktrees/reclaim.ts +16 -1
  154. package/tooling/base/configs/scripts/verify.ts +1 -1
  155. package/tooling/base/seeds/.github/pull_request_template.md +1 -1
  156. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
  157. package/tooling/claude/seeds/CLAUDE.md +2 -2
  158. package/governance/rules/canon/task-scope.md +0 -12
@@ -52,15 +52,30 @@ A body describes the new behavior and nothing the diff or the commits already sa
52
52
 
53
53
  ## Sections
54
54
 
55
- - `## Summary`: 1-2 sentences following `<Action Verb> <Direct Object> to <Result>`, expand for clarity if needed
56
- - `## Key changes`: name actual files, functions, or modules (e.g., `AuthService.verify()` not "auth handler"). Always use bullet points, never prose.
55
+ - `## Summary`: one paragraph following `<Action Verb> <Direct Object> to <Result>`, then the closing lines
56
+ - `## Key changes`: bullets only, one change each, naming actual files, functions, or modules (e.g., `AuthService.verify()` not "auth handler")
57
+ - Name every changed path in a Key changes bullet. A trim may cut a clause and never a path, since `canon pr key-changes` reports a path no bullet claims.
58
+
59
+ ### Key changes groups
60
+
61
+ Past 5 bullets, group Key changes under bold labels, 5 bullets a group at most.
62
+
63
+ - A label sits on its own line, names the area a reviewer opens together, and ends with no period
64
+ - Write a label in plain words, since a code span inside bold renders unbolded
65
+ - Open each group on a bullet, never on prose
66
+
67
+ ### Closing lines
68
+
69
+ The closing lines end `## Summary`, one `Closes #NNN` per issue and no trailing period. A task shipped in slices carries them on its last slice only. `closing-issues.md` states how the list is decided, and `canon labels scan --closes` fails a body that disagrees with it.
57
70
 
58
71
  ### Context section
59
72
 
60
- `## Technical context` is optional and carries 1-2 lines of architectural reasoning explaining why, not what.
73
+ `## Technical context` is optional and says why, naming the decisions the code can't show and any shortcoming of the approach.
61
74
 
62
75
  - Omit Technical context for docs, config, or trivial changes
63
- - Use bullet points for multiple reasons, one sentence for a single reason
76
+ - Take one form per section, never bullets and paragraphs mixed
77
+ - Use bullets when every reason fits one sentence under 200 characters
78
+ - Otherwise write one paragraph per decision, opening on a bold lead-in that ends with a period and runs into the paragraph
64
79
 
65
80
  ### Testing section
66
81
 
@@ -68,6 +83,7 @@ A body describes the new behavior and nothing the diff or the commits already sa
68
83
 
69
84
  - Omit Testing for docs, config, or trivial sync changes
70
85
  - Use checkboxes, never prose. See Testing discipline for which box gets ticked.
86
+ - Write one box per command, pointing at a test file rather than listing its cases
71
87
 
72
88
  ### Reviewer section and visuals
73
89
 
@@ -86,6 +102,8 @@ A body describes the new behavior and nothing the diff or the commits already sa
86
102
  - A ticked box describes the tree as it stands. A later commit removing or replacing what it names makes the box false.
87
103
  - The branch that made that commit corrects the box in the same pass, as with any other stale claim in the body
88
104
 
105
+ Leave the `UI pass` line to `canon pr tick`, and carry it on a rewrite.
106
+
89
107
  ### Human-only boxes
90
108
 
91
109
  Leave a box unchecked only when a human is required, and name which human and why on the same line. The agent runs everything else.
@@ -106,6 +124,17 @@ A live agent session is never the human a box waits on.
106
124
  ## Formatting
107
125
 
108
126
  - End every bullet point with a period
127
+ - Carry no H3 or H4 anywhere in a body. GitHub draws an H3 one step under an H2, so stacked H3s compete with the sections.
128
+ - Group with a bold label or lead-in instead, in the forms the Sections rules above state
129
+
130
+ ### Density
131
+
132
+ `canon labels scan` reports each section's density under `density`, naming the section, the kind, and the line in the whole body. Its help lists every limit.
133
+
134
+ - Every section but Testing holds bullets to 200 characters and 5 in a row, and paragraphs to 350 characters and 2 in a row
135
+ - Any section reports a `subheading`, and Technical context reports a `mixed-form`
136
+ - A bold label alone on a line breaks a Key changes run, and a bold lead-in starts a new Technical context run
137
+ - Fix a finding by regrouping or splitting, never by cutting a path
109
138
 
110
139
  ## Examples
111
140
 
@@ -118,19 +147,29 @@ Every section a body may carry, in order.
118
147
 
119
148
  <Action Verb> <Direct Object> to <Result>.
120
149
 
150
+ Closes #<number>
151
+
121
152
  ## Key changes
122
153
 
154
+ **<Area a reviewer opens together>**
155
+
123
156
  - <Verb> <specific component/file/function> (<reason if non-obvious>)
124
157
  - <Verb> <specific component/file/function>
125
158
 
159
+ **<Next area>**
160
+
161
+ - <Verb> <specific component/file/function>
162
+
126
163
  ## Technical context
127
164
 
128
- - <Architectural reasoning explaining why, not what>
165
+ **<Decision in a few words>.** <Why this approach, what the code can't show, and any shortcoming>
166
+
167
+ **<Next decision>.** <Why>
129
168
 
130
169
  ## Testing
131
170
 
132
171
  - [x] <Command run> <observed result>
133
- - [x] <Edge case verified> <what was observed>
172
+ - [x] <Test file run> <observed result>
134
173
  - [ ] <Human-only check> (<which human, why>)
135
174
 
136
175
  ## For the reviewer
@@ -149,12 +188,20 @@ Update auth middleware to enforce jwt expiration checks. # imperative + direct o
149
188
 
150
189
  ## Key changes
151
190
 
191
+ **Validation** # bold label on its own line, no period
192
+
152
193
  - Add `verifyExpiration()` to `src/auth/validators.ts`. # specific function + file path
194
+ - Add the clock skew window to `src/auth/config.ts`. # one change per bullet
195
+
196
+ **Session handling** # one label per area a reviewer opens together
197
+
153
198
  - Refactor `AuthService.authenticate()` to handle 401 codes. # named component + clear change
154
199
 
155
200
  ## Technical context
156
201
 
157
- - Migration to stateless session management for horizontal scalability. # why, not what
202
+ **Stateless sessions.** Expiry lives in the token, so any instance can reject it without a shared store. # bold lead-in + why
203
+
204
+ **Clock skew.** A 30-second window absorbs drift between instances, so a token can outlive its expiry by that much. # decision + shortcoming
158
205
 
159
206
  ## Testing
160
207
 
@@ -178,9 +225,17 @@ This PR updates the authentication system to be more robust. # "This PR" opener
178
225
 
179
226
  ## Key changes
180
227
 
228
+ ### Middleware # H3 inside a body
229
+
181
230
  - Updated auth middleware files # vague, no specific component, no period
182
231
  - The old system used to check tokens differently # describes historical behavior
183
232
 
233
+ ## Technical context
234
+
235
+ - Tokens are stateless now. # a bullet
236
+
237
+ The skew window trades precision for no shared store. # mixed with a paragraph in one section
238
+
184
239
  ## Testing
185
240
 
186
241
  - Tested manually # no specific command or case
@@ -7,39 +7,26 @@ description: What the ship chain is for, the gaps it closes, and why it does not
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, the post-feature sequence runs from memory. Doc sync gets skipped, so the pull request ships with planning docs describing the previous scope, or it runs after staging has already closed and its output never reaches a commit. Chaining by hand is also where a session narrates between steps, which turns one flow into a conversation and invites a decision at every boundary.
10
+ Without this skill, the post-feature sequence runs from memory. Doc sync gets skipped, or runs after staging has closed so its output never reaches a commit. A session chaining by hand narrates between steps, which turns one flow into a conversation and invites a decision at every boundary.
11
11
 
12
- The sequence also reaches the remote on work nothing re-checked. This skill is the resume point `auto-ship` names at three of its stop points, including the one a failed verify takes, so the fix the user makes by hand after that stop is pushed with no suite run against it. Every branch shipped so far passed that verify on its first attempt, which is why the path has produced no instance rather than being closed.
12
+ The sequence also reaches the remote on work nothing re-checked. This skill is where an `auto-ship` stop resumes, so a fix the user makes by hand after a failed verify is pushed with no suite run against it. A chain that ends on its CI watch line, or never reads the evidence thread, reports done on a pull request still owed a result.
13
13
 
14
14
  ## Must
15
15
 
16
- - Run the project's verify commands before the sequence starts, and stop on a failure rather than fixing it
17
- - Say so and continue when the project names no verify command, since silence there reads as a suite that passed
18
- - Invoke each step through the Skill tool in the stated order and continue without waiting
19
- - Stage after the sync skills write, so what they produced reaches a commit
20
- - Reach the pull request on a branch whose work is already committed and whose sync steps wrote nothing, since `git-stage` stops on an empty index and a session building in slices leaves one
21
- - Emit no text between steps. The sequence is the unit and prose inside it reopens settled decisions.
22
- - Name the one point a wrapping caller may act at, so a chain built on this one is not left to pick a gap of its own
23
- - Name the condition under which the closing block is not emitted, since a caller that closes on its own block leaves two instructions about the last line and nothing deciding between them
24
- - Watch continuous integration to a terminal state in the background, so the session stays reachable while CI runs, and stop on a failure naming the check
25
- - Read the evidence thread with `canon pr evidence <number> --check --json` once CI passes, run what it reports owed, and report done only on `settled`, since a chain that never reads the thread ships a regenerated image with no comment and no preview and leaves the controller to repair it
16
+ - The project's verify commands run before the sequence and a failure stops it, and a project naming none is said so rather than read as passing
17
+ - Each step runs through the Skill tool in the stated order, with staging after the sync skills write, and the chain reaches the pull request on a branch already committed
18
+ - No text appears between steps beyond a stop report and the background watch line, and the body names the one point a wrapping caller may act at and when the closing block is not emitted
19
+ - CI is watched to a terminal state in the background, and a failure stops the chain naming the check
20
+ - Done is reported only once `canon pr evidence <number> --check --json` reads `settled`, re-read once after running what it owed, and a binary lacking `--check` reads as unread
26
21
 
27
22
  ## Must not
28
23
 
29
- - Auto-trigger. Shipping is a decision the user takes, and the tool permission dialog on the push and the pull request is the gate that holds it now that the frontmatter no longer disables model invocation.
30
- - Fix a failing check. The stop is the point, since a green pull request reached by auto-fix hides what broke.
31
- - Attempt a fix for a failing verify. The user is already making one, which is what brought the run back here.
32
- - Implement or review. This chain starts from work already believed done.
33
- - Report the chain done before the CI watch exits. A turn ending on the watch line leaves a pull request still waiting on CI, and a `✅ Shipped` there claims a result nothing has read.
34
-
35
- ## Guards
36
-
37
- - A failing verify stops the run before the sync skills write, so the tree is left as the user left it
38
- - A binary lacking `--check` reports the thread unread, never settled, since reading the absence as a pass repeats the failure the read exists to close
39
- - Re-read the thread once after running what was owed and stop on anything but `settled`, so a refused preview cannot loop the chain
40
- - A failing check stops the sequence. A stop report and the line announcing the background watch are the two places text is allowed between steps.
24
+ - Auto-trigger
25
+ - Fix a failing check or attempt a fix for a failing verify
26
+ - Implement or review
27
+ - Report the chain done before the CI watch exits
41
28
 
42
29
  ## Out of scope
43
30
 
44
- - Implementation and review, which `auto-ship` chains ahead of this same sequence. That skill is the full pipeline and this one is the resume point after a stop, which is why the two overlap by design. Verification is the one of the three that belongs on both, since a resume point that trusts the caller's verify trusts a run that stopped.
45
- - The behavior of each step, owned by the skill invoked. This skill owns the order and nothing else.
31
+ - Implementation and review, which `auto-ship` chains ahead of this same sequence
32
+ - The behavior of each step, which the skill it invokes owns
@@ -7,33 +7,26 @@ description: What branch splitting is for, the gaps it closes, and how it differ
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a branch carrying unrelated commits ships as one pull request, which a reviewer reads by skimming because no single concern holds it together. Split by hand, commits get cherry-picked in an order that leaves a branch missing something it depends on. Merge order is the sharpest failure: merging the wrong branch first lands every other branch's content on main and leaves the remaining pull requests empty after rebase, with no signal that anything went wrong. Every body it writes stages under `.canon/tmp/` and leaves through `gh`, neither of which the audit hook watches, so a banned character survives into a published pull request and has to be edited on the remote.
10
+ Without this skill, a branch carrying unrelated commits ships as one pull request, which a reviewer skims because no single concern holds it together. Split by hand, commits get cherry-picked in an order that leaves a branch missing something it depends on, and a dirty tree loses its uncommitted work across the checkouts.
11
+
12
+ Merging the wrong branch first lands every other branch's content on main and leaves the remaining pull requests empty after rebase, with no signal that anything went wrong. Every body leaves through `gh`, which the audit hook never watches, so a banned character survives into a published pull request.
11
13
 
12
14
  ## Must
13
15
 
14
- - Refuse a dirty tree, since cherry-picking across branches abandons uncommitted work with no record of it
15
- - Group by concern from both the commit messages and the file paths, preferring fewer branches over a branch per commit
16
- - Classify the groups as independent or stacked before generating any command, because the base of every branch follows from that one call
17
- - Account for every commit ahead of main in the preview
18
- - State the merge order and the reason behind it, since the order is not recoverable from reading the pull requests afterward
19
- - Carry the restack loop for stacked mode, where each branch is rebased onto main once the one below it merges
20
- - Scan every generated title and body for banned characters and internal phase labels as an explicit step before opening a pull request
16
+ - Groups follow concern from both commit messages and file paths, preferring fewer branches, and every commit ahead of main is accounted for in the preview
17
+ - Each group is classified independent or stacked before any command is generated, and stacked mode carries the restack loop
18
+ - The merge order and its reason are stated
19
+ - Every generated title and body is scanned for banned characters and phase labels before a pull request opens
21
20
 
22
21
  ## Must not
23
22
 
23
+ - Run on a dirty tree, on `main`, or with no commits ahead of main
24
24
  - Split when one concern already covers the branch
25
25
  - Rename a branch whose name already matches its concern
26
- - Leave a commit unaccounted for. A dropped commit is silent and the branch it came from may already be gone.
26
+ - Leave a commit unaccounted for
27
27
  - Merge the pull requests it opens
28
28
 
29
- ## Guards
30
-
31
- - Dirty working tree: stop and name both recoveries
32
- - On `main`: stop
33
- - No commits ahead of main: stop
34
-
35
29
  ## Out of scope
36
30
 
37
- - Partitioning a staged diff into commits, which `git-stage` owns. The two resemble each other and take different input: this one starts from commits that already exist and emits branches.
31
+ - Partitioning a staged diff into commits, which `git-stage` owns
38
32
  - The message on each commit, which `git-commit` owns
39
- - Merging, which stays the user's call. The skill states the order and stops.
@@ -7,33 +7,27 @@ description: What commit grouping is for, the gaps it closes, and how it differs
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a staged diff spanning several concerns lands as one commit, so a later revert takes unrelated work with it. A renamed file staged as two separate paths records an add and a delete, losing the rename git would otherwise detect. Commits also land in the order the files happened to be listed rather than the order they depend on, so a bisect stops on a commit that cannot build.
10
+ Without this skill, a staged diff spanning several concerns lands as one commit, so a later revert takes unrelated work with it. A renamed file staged as two paths records an add and a delete, and commits land in listing order rather than dependency order, so a bisect stops on a commit that cannot build.
11
11
 
12
- The routing failure sits on top of those. A description claiming every commit request pulls in the single-concern one this skill has no grouping to do on, and a staged set carrying a hunk-level selection reaches the unstage below and comes back widened to whole files, which is the one case the staged-set rule cannot hold.
12
+ The routing fails on top of that. A description claiming every commit request pulls in single-concern sets with nothing to group, and a hunk-level selection reaching the unstage comes back widened to whole files.
13
13
 
14
14
  ## Must
15
15
 
16
- - Read the commit format reference and the prose standard before generating
17
- - Decline the single-concern and the hunk-level staged set in the description, naming the sibling that takes each. The widening is a property of the unstage, so it cannot be fixed here and has to be routed around.
18
- - Derive the groups from the staged diff, with lockfiles excluded from the derivation context
19
- - Account for every staged file in the preview, so a dropped file is visible before execution
20
- - Order the commits so a dependency lands before the file that imports it
21
- - Keep a rename pair in one group and restage both paths together, so git still detects the rename at commit time
22
- - Unstage everything first, then restage per group, since the incoming staged set is one undifferentiated blob
23
- - Count each subject against the length limit and shorten before executing
16
+ - Each message follows the commit format reference, derived from the staged diff with lockfiles excluded, with each subject counted against the length limit before executing
17
+ - Every staged file is accounted for in the preview, and no file the user did not stage is committed
18
+ - Commits are ordered so a dependency lands before the file that imports it
19
+ - A rename pair stays in one group, so git still detects the rename
20
+ - The description declines single-concern and hunk-level staged sets and names `git-commit` for both
24
21
 
25
22
  ## Must not
26
23
 
27
- - Stage a file the user did not stage. The staged set is the input and widening it changes what ships.
24
+ - Stage a file the user did not stage
28
25
  - Split a rename pair across groups
29
- - Emit anything after the result line. This runs inside a longer flow and prose here buries the next step.
30
-
31
- ## Guards
32
-
33
- - Nothing staged: stop and name the command that stages
26
+ - Run when nothing is staged
27
+ - Emit anything after the result line
34
28
 
35
29
  ## Out of scope
36
30
 
37
- - Composing a single commit from the whole staged diff, which `git-commit` owns. That skill commits the staged set untouched, so a hunk-level selection belongs there and never here.
38
- - Splitting commits across branches, which `git-split` owns. The two partition different things: this one takes a staged diff and emits commits, that one takes commits and emits branches.
31
+ - Composing one commit from the whole staged diff, which `git-commit` owns
32
+ - Splitting commits across branches, which `git-split` owns
39
33
  - Pushing and opening the pull request, which `git-pr` owns
@@ -7,32 +7,28 @@ description: What worktree listing and cleanup is for, the gaps it closes, and w
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, linked worktrees accumulate past the point where any of them is remembered. Merge state does not appear in the worktree list, so a cleanup either removes a worktree still holding unmerged work or, lacking a way to tell, removes nothing. Removing a worktree also leaves its local branch behind, so the branch list keeps growing even when cleanup runs.
10
+ Without this skill, linked worktrees accumulate past the point where any of them is remembered. Merge state does not appear in the worktree list, so a cleanup either removes a worktree still holding unmerged work or removes nothing.
11
+
12
+ A plain ancestry read misses the whole set, since `git branch --merged` decorates every branch checked out in a worktree. Removing a worktree also leaves its local branch behind, so the branch list keeps growing even when cleanup runs.
11
13
 
12
14
  ## Must
13
15
 
14
- - Resolve merge state per branch from the pull request first, and fall back to local ancestry when no pull request exists
15
- - Match the ancestry fallback against the branch name alone. `git branch --merged` decorates the current branch and every branch checked out in a linked worktree, which is the whole set this skill enumerates.
16
- - Remove the worktree and its local branch together, since either one left alone is the state the skill exists to prevent
17
- - Exclude five kinds of row from the remove set: the main root, the current session's worktree, any dirty tree, any worktree registered from outside the path prefix `session-worktree` creates under, and any worktree a live session is occupying
18
- - Give every skipped row a one-word reason, so the skip is a decision the user can overturn rather than a silence
19
- - Pick exactly one mode. Listing and removing are different requests and inferring both from one invocation removes worktrees the user meant to read about.
16
+ - Merge state comes from the pull request first and from local ancestry matched on the branch name alone when no pull request exists
17
+ - A worktree and its local branch are removed together
18
+ - The main root, the current session's worktree, a dirty tree, a worktree outside the prefix `session-worktree` creates under, and one a live session occupies are never removed
19
+ - Every skipped row carries a one-word reason, and an empty remove set says why each row was held
20
+ - Each run is exactly one of listing or removing
20
21
 
21
22
  ## Must not
22
23
 
23
- - Enter or create a worktree. The description states the boundary so the model routes entry elsewhere rather than discovering it here.
24
- - Remove a worktree with uncommitted work, whatever its merge state
25
- - Remove a worktree a live session is occupying, whatever its merge state
26
- - Remove the worktree the session is currently running in
24
+ - Enter or create a worktree
25
+ - Remove a dirty or occupied worktree, whatever its merge state
26
+ - Remove the worktree the session runs in
27
+ - Run outside a git repository
27
28
  - Emit anything after the result line
28
29
 
29
- ## Guards
30
-
31
- - Not a git repository: stop
32
- - Remove set is empty: stop and say why every row was held back
33
-
34
30
  ## Out of scope
35
31
 
36
- - Entering a worktree, which `session-worktree` owns. That skill derives the name and aligns the branch, and this one never creates.
37
- - Deciding which features can run in parallel, which is a planning call rather than a git operation
38
- - The pull request lifecycle, which `git-pr` and `git-followup` own. This skill reads pull request state and never writes it.
32
+ - Entering a worktree, which `session-worktree` owns
33
+ - Writing pull request state, which `git-pr` and `git-followup` own
34
+ - Deciding which features can run in parallel, which the planning skills own
@@ -7,38 +7,30 @@ description: Why the skill draws a deck as HTML in the project's tokens inside i
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a deck request turns into hand-built output. The session writes a deck into whatever path occurs to it, so a second deck overwrites the first and nothing lists either. It writes pptxgenjs code or hex colors per deck, so the deck takes neither the project's design nor any other deck's, and it invents attributes the converter does not read, so a section, a chart, or an entrance silently goes missing. Every slide comes out as a title over bullets, which is the shape that needs no decision and reads as a document rather than a deck.
10
+ Without this skill, a session writes a deck into whatever path occurs to it, so a second deck overwrites the first and nothing lists either. It writes pptxgenjs code or hex colors, so the deck ignores the project's design. Every slide comes out as a title over bullets, which reads as a document rather than a deck.
11
11
 
12
- A first render shipped unread hands the audience the overlap, the overflow, and every element the converter fell back to a picture for, since markup that looks correct says nothing about the file it produces.
12
+ It invents attributes the converter does not read, so a section, a chart, or an entrance silently goes missing. A first render shipped unread hands the audience the overlap, the overflow, and every element the converter fell back to a picture for.
13
13
 
14
14
  ## Must
15
15
 
16
- - Read the existing decks and the slide format from the CLI before drawing, and pick a deck name no listed deck carries unless the request names one
17
- - Write each deck into its own folder under the slides record folder, one HTML file per slide in filename order
18
- - Draw with the project's custom properties so the deck takes the project's design
19
- - Vary the composition across the deck rather than repeating one shape
20
- - Size content to fit the slide frame, keeping titles short and lines tight
21
- - Shell out to the render command for the deck itself
22
- - Read every fallback and refusal the render reports, run one QA pass over the rendered images, and fix what both report
16
+ - The existing decks and the slide format are read from the CLI before drawing, and a new deck takes a name no listed deck carries unless the request names one
17
+ - Each deck lands in its own folder under the slides record folder, one HTML file per slide in filename order, drawn with the project's custom properties
18
+ - The composition varies across the deck, and content fits the slide frame with short titles and tight lines
19
+ - The render command produces the deck itself
20
+ - Every fallback and refusal the render reports is read, one QA pass runs over the rendered images, and what both report is fixed once
23
21
 
24
22
  ## Must not
25
23
 
26
- - Hardcode a deck name, an attribute, or a chart type, which goes stale the moment the CLI changes
27
- - Reimplement the conversion, the master, or the packaging, which the CLI owns
24
+ - Hardcode a deck name, an attribute, or a chart type, or reimplement the conversion, the master, or the packaging the CLI owns
28
25
  - Write a deck into the shared layouts folder, which is never listed as a deck
29
- - Invent token values when the project has no token stylesheet
26
+ - Invent token values when the project has no token stylesheet, rather than saying the deck renders unstyled
30
27
  - Write centered body text or content that overflows a slide
31
- - Loop on aesthetics past a single fix pass
32
-
33
- ## Guards
34
-
35
- - No token stylesheet: draw the deck anyway and say it renders unstyled.
36
- - Image conversion tools missing: skip the image pass and say so. Do not fail the render over a verification step.
28
+ - Loop on aesthetics past a single fix pass, or fail the render when the image tools for the QA pass are missing
37
29
 
38
30
  ## Out of scope
39
31
 
40
32
  - Converting HTML to PowerPoint, which the CLI owns end to end
41
- - The project's palette and faces, which live in its token stylesheet rather than in the slides
42
- - Writing the content the deck is about, which the caller brings
43
- - Drafting a deck as a canvas page, which waits on a measurement of that authoring surface
33
+ - The project's palette and faces, which its token stylesheet owns
34
+ - Writing the content the deck is about, which the caller owns
35
+ - Drafting a deck as a canvas page, which no skill owns until that authoring surface is measured
44
36
  - Recording a demo, which `script-screencast` owns
@@ -7,9 +7,9 @@ description: Why the markdown format rules travel in a skill, and where the boun
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, the markdown format rules sat in a standard that a session opened only when a rule told it to. The banned characters and the structure rules are facts a scan settles, yet a session wrote the whole document from memory and learned the result only from the audit's exit.
10
+ Without this skill, the markdown format rules sit in a standard that a session opens only when a rule tells it to. The banned characters and the structure rules are facts a scan settles, yet a session writes the whole document from memory and learns the result only from the audit's exit.
11
11
 
12
- The rules also had three carriers, a standard, a generated rule pointing at it, and a second hand-written rule routing voice. Each stated one routing and each drifted from the others.
12
+ The rules also have three carriers, a standard, a generated rule pointing at it, and a hand-written rule routing voice. Each states one routing and each drifts from the others.
13
13
 
14
14
  ## Must
15
15
 
@@ -20,4 +20,10 @@ The rules also had three carriers, a standard, a generated rule pointing at it,
20
20
  ## Must not
21
21
 
22
22
  - Restate the banned characters in the body
23
- - Carry voice, rhythm, or word guidance, which `write-human` owns
23
+ - Carry voice, rhythm, or word guidance
24
+
25
+ ## Out of scope
26
+
27
+ - Voice, rhythm, and word choice, which `write-human` owns
28
+ - A Mermaid fence or a figure, which `draw-figure` owns
29
+ - The banned-character scan itself, which `canon markdown audit` owns
@@ -7,37 +7,28 @@ description: What feature planning is for, the gaps it closes, and why it stops
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, implementation starts before anyone knows what it touches. A session reads no project context and rediscovers a settled constraint halfway through, the file list emerges as the work goes rather than before it, and the ambiguities that needed a decision get resolved silently in whichever direction the first edit happened to go. A constraint naming a surface to leave alone forbids two different acts at once, so the executing session picks one and the branch either grows an excluded concern or ships a reference to a file the change deleted.
10
+ Implementation starts before anyone knows what it touches. A session rediscovers a settled constraint halfway through, and an ambiguity gets resolved silently in whichever direction the first edit went. A feature stacked into pull requests over the same files pays the review cost once per slice.
11
+
12
+ A constraint naming a surface to leave alone forbids two acts at once, conforming it and retargeting a pointer into it. A vague ask reaches the plan with no checkable criterion, and a decision rests on a practice recalled from memory.
11
13
 
12
14
  ## Must
13
15
 
14
- - Read the project's own Claude setup before scanning source, so the plan inherits decisions already made instead of reopening them
15
- - Reframe a vague ask as observable, checkable success criteria before listing any file, and carry each criterion into the plan's verification, so a plan never ships a check with nothing measurable to prove
16
- - Slice batches by a user-visible path rather than by layer, and sequence the riskiest batch first while a sweep stays last, so the batch most likely to change the plan lands while later ones can still move, and fold a stacked batch that shares most of its files into its parent unless the plan writes down why the two are judged apart, since a canvas inspector built as five stacked pull requests over 26 files paid the full review, rebase, and merge cost five times
17
- - Predict the operator's answers to the next three questions about the ask's success criteria, proceed on the ones it can predict, and ask when it can predict none, since a plan built on a guessed goal proves the wrong thing
18
- - Fetch the outside source a decision rests on, quote the passage relied on in the plan's `**Sources:**` section, and mark a source it could not fetch as unverified, since a planner that paraphrases a practice from model memory ships an unaudited claim. A measured planner run fetched its sources only after a follow-up message asked, and the `search-craft` measured run shows a plain research request never loaded that skill unprompted
19
- - Name every file the work touches with the reason it is touched
20
- - Place each new path against the layout guidance with a one-clause reason, loading that guidance only when the plan creates a file or folder, since the planner decides placement and the worker copies whatever path it is given
21
- - Name how each outcome is proven and which input or state would break the change, so the executing session has a check to run and the reviewer has a place to look
22
- - Surface each unresolved ambiguity as a numbered question carrying a suggested answer and an empty answer slot, so the plan is decision-ready in one pass
23
- - State which act a constraint forbids when it names a surface to leave alone, since conforming that surface and retargeting a pointer into it are different acts and only one is out of scope
24
- - Scale the output to the work. A two-file change with nothing to decide should not produce a plan file.
25
- - Stop at the plan and wait to be told to continue
16
+ - Read the project's Claude setup before scanning source, and name every file the work touches with the reason it is touched
17
+ - Reframe a vague ask as observable success criteria, carry each into the plan's verification, and ask when none can be predicted
18
+ - Slice by user-visible path with the riskiest batch first, and fold a stacked batch sharing most of its files into its parent unless the plan says why they differ
19
+ - Quote the fetched passage behind each outside source, mark an unfetched one unverified, and place each new path against the layout guidance with a one-clause reason
20
+ - Surface each ambiguity as a numbered question with a suggested answer and an empty slot, and stop at the plan
26
21
 
27
22
  ## Must not
28
23
 
29
24
  - Implement, or edit any file the plan describes
30
- - Read directories speculatively. Context spent on files the feature does not touch is context the plan does not get.
31
- - Bundle independent concerns into one plan, since a plan covering two things gets executed as neither
32
- - Restate the plan in chat during follow-up rounds. The file is the source of truth and a chat copy of it goes stale immediately.
33
-
34
- ## Guards
35
-
36
- - No feature description: stop and ask for one
37
- - No predictable success criterion: ask before planning rather than guessing the goal
25
+ - Read directories speculatively, since context spent on files the feature does not touch is context the plan does not get
26
+ - Bundle independent concerns into one plan
27
+ - Restate the plan in chat during follow-up rounds, since the file is the source of truth
38
28
 
39
29
  ## Out of scope
40
30
 
41
- - Executing the plan, which is the ship pipeline
42
- - Task-board state, which `task-board` owns. A plan links to its task and does not create one.
43
- - Reconciling the context entries after the work lands, which `context-fold` owns, and marking the board, which `task-complete` owns
31
+ - Executing the plan, which `auto-ship` owns
32
+ - Creating a task for the plan, which `task-board` owns
33
+ - Reconciling the context entries after the work lands, which `context-fold` owns
34
+ - Marking the board, which `task-complete` owns
@@ -7,43 +7,27 @@ description: Why a question that has not been measured gets a disposable folder
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a question nobody has measured is answered with a plan. The session commits to an approach before the current state is known, and the reasoning that produced it lives in a conversation that compacts away. A research pass that does run spreads its findings across chat, so the next session re-measures what this one already counted, or worse carries a figure from recall and states it as current.
10
+ A question nobody has measured is answered with a plan. The session commits before the current state is known, and its reasoning compacts away with the conversation, so the next session re-measures what this one counted or states a figure from recall as current.
11
11
 
12
- Two failure modes cost more than the rest. A track that fans out to subagents returns findings without the reasoning that makes the folder worth keeping, which turns a conversation into a search result. And an experiment fixture written under the project root loads that project's own instruction files through the ancestor chain, so the arm measures the repository instead of the question, and the result reads as evidence either way.
13
-
14
- A track that closes with several separable findings writes only one task, and the rest have no stated route out of the folder. Without one, a finding sits until the operator asks whether filing it elsewhere is the next step, which is how a track that measured everything correctly still lost work between sessions.
12
+ A track fanning out to subagents returns findings without their reasoning. Under the project root, a fixture loads its instruction files, so the arm measures the repository instead of the question. When a closing track holds several findings, one task is written and the rest have no route out.
15
13
 
16
14
  ## Must
17
15
 
18
- - Detect open, resume, and close from the folder itself, matching the topic against tracks already there before deriving a slug
19
- - Name a newly opened folder with a two-digit ordinal ahead of the slug, taken from the highest one already present across groundwork and intake
20
- - Apply the qualifying test in open mode alone, so a track already measured is not refused by the test that admitted it
21
- - Measure the current state now rather than carrying a figure from a previous session
22
- - Carry a lean and the finding that would overturn it on every open question, or admit that a measurement is missing
23
- - Confine writes to the track folder, with the close-time task file, the experiment fixture, and the intake routing below as the only exceptions
24
- - Route a closing-track finding the required task does not cover through `plan-intake`, rather than leaving it to be asked about. The route runs in the same session, so it is a write outside the folder rather than a handoff to a later one.
25
- - Place the closing task's row through `task-board` Step 4 rather than writing `priority.md` or `backlog.md` directly
26
- - Link every claim about a source outside the project, and list an unread source as a lead rather than citing it
27
- - Put a fixture a headless run is pointed at outside the repository
28
- - Write the next-session file self-contained, since backing the folder through `canon records push` and `canon records pull` holds only where a records remote is configured, protects only against the machine being lost even there, and never against a compaction dropping this session's reasoning before it has pushed
16
+ - Detect open, resume, and close from the folder itself, matching the topic against existing tracks first, and number a new folder past the highest ordinal across groundwork and intake
17
+ - Measure the current state now, carry a lean and the finding that would overturn it on every open question, link every outside claim, and end a pass with every question leaned on a plain retell
18
+ - Confine writes to the track folder, plus the close-time task file, the experiment fixture, and the intake routing
19
+ - Route a closing finding the task does not cover through `plan-intake` in the same session, and place the closing task's row through `task-board`
20
+ - Put a fixture a headless run is pointed at outside the repository, and write the next-session file self-contained
29
21
 
30
22
  ## Must not
31
23
 
32
24
  - Write a feature plan, a source change, a standard, a rule, or a reference doc
33
- - Dispatch subagents. A search too large to run inline is a finding that the question is too broad.
34
- - Close while an open question quietly fails an outcome, rather than resolving it or recording it as knowingly accepted
35
- - Spawn more than three billed headless runs without asking
36
- - Match a topic against the shared scratch directory, which holds folders that were never tracks
37
- - Pause for approval between steps, which the write scope is what makes safe
38
-
39
- ## Guards
40
-
41
- - No topic given: stop rather than inferring one
42
- - Fewer than two of the three qualifying conditions hold in open mode: stop and route to the planning skill, because the decision is already made
43
- - Resume and close are exempt from that test by definition
25
+ - Dispatch subagents, since a search too large to run inline is a finding that the question is too broad
26
+ - Close while an open question quietly fails an outcome, or spawn more than three billed headless runs without asking
27
+ - Pause for approval between steps, or open a track with no topic or fewer than two of the three qualifying conditions
44
28
 
45
29
  ## Out of scope
46
30
 
47
31
  - Writing the plan the track concludes toward, which `plan-feature` owns
48
- - Implementing anything the track recommends
49
- - Persisting the folder. It is gitignored and disposable, which is what makes it the right container for an unanswered question.
32
+ - Filing a breadth dump, which `plan-intake` owns
33
+ - Placing a task row, which `task-board` owns
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: plan-groundwork
3
- description: Opens and runs a numbered groundwork folder under `.canon/groundwork/<nn>-<slug>/` for a topic that has to be measured before it can be planned. Detects open, resume, and close from the folder itself. Use when asked to "research X", "dig into X", "work out what we should do about X", "measure this before we commit", or "open a groundwork folder". Do NOT use to write a feature plan or to implement. That is `plan-feature`.
3
+ description: Opens and runs a numbered groundwork folder under `.canon/groundwork/<nn>-<slug>/` for a topic that has to be measured before it can be planned. Detects open, resume, and close from the folder itself. Use when asked to "research X", "dig into X", "work out what we should do about X", "measure this before we commit", "open a groundwork folder", or "retell the groundwork". Do NOT use to write a feature plan or to implement. That is `plan-feature`.
4
4
  metadata:
5
5
  family: decide
6
6
  ---
@@ -88,6 +88,7 @@ A matched folder routes on its own `<nn>-<slug>/`. Detect the mode from the fold
88
88
 
89
89
  - Present without `06-decision.md`: resume
90
90
  - Present and the user judges it ready: close
91
+ - Present and the user asks for a retell: read the track and end on the retell, measuring and writing nothing
91
92
 
92
93
  ## Step 2: orient
93
94
 
@@ -135,4 +136,6 @@ Aside from an experiment fixture, Steps 4 and 5 are the only ways close mode rea
135
136
 
136
137
  ## Output
137
138
 
138
- Emit the full relative path from the project root for every file written or updated, since a bare filename names a file the reader cannot open. Read `${CLAUDE_SKILL_DIR}/references/output.md` on reaching this step for the open and resume template and the close template. A run that stops on a guard skips it.
139
+ Emit the full relative path from the project root for every file written or updated, since a bare filename names a file the reader cannot open. Read `${CLAUDE_SKILL_DIR}/references/output.md` on reaching this step for the open and resume template, the retell, and the close template. A run that stops on a guard skips it.
140
+
141
+ End on the retell in place of the open and resume template once every open question carries a lean. A question marked `none, needs measuring` keeps the open and resume template, unless the operator asks for a retell, which answers whatever the state. The retell lists written files under `**Written:**`, and close keeps its one-line report.