@erclx/canon 5.45.0 → 5.46.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 (137) 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-issue/REQUIREMENT.md +9 -15
  41. package/claude/skills/git-pr/REQUIREMENT.md +13 -32
  42. package/claude/skills/git-pr/SKILL.md +10 -2
  43. package/claude/skills/git-pr/references/closing-issues.md +47 -0
  44. package/claude/skills/git-pr/references/pr.md +4 -0
  45. package/claude/skills/git-ship/REQUIREMENT.md +13 -26
  46. package/claude/skills/git-split/REQUIREMENT.md +10 -17
  47. package/claude/skills/git-stage/REQUIREMENT.md +12 -18
  48. package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
  49. package/claude/skills/make-deck/REQUIREMENT.md +13 -21
  50. package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
  51. package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
  52. package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
  53. package/claude/skills/plan-groundwork/SKILL.md +5 -2
  54. package/claude/skills/plan-groundwork/references/output.md +47 -1
  55. package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
  56. package/claude/skills/plan-intake/references/intake.md +2 -2
  57. package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
  58. package/claude/skills/plan-intake-answer/SKILL.md +7 -1
  59. package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
  60. package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
  61. package/claude/skills/read-frames/REQUIREMENT.md +3 -8
  62. package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
  63. package/claude/skills/review-address/REQUIREMENT.md +14 -38
  64. package/claude/skills/review-craft/REQUIREMENT.md +14 -32
  65. package/claude/skills/review-pr/REQUIREMENT.md +15 -34
  66. package/claude/skills/review-ui/REQUIREMENT.md +14 -39
  67. package/claude/skills/role-orchestrator/REQUIREMENT.md +2 -2
  68. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
  69. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
  70. package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
  71. package/claude/skills/role-reviewer/SKILL.md +5 -1
  72. package/claude/skills/role-worker/REQUIREMENT.md +1 -1
  73. package/claude/skills/role-worker/SKILL.md +2 -0
  74. package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
  75. package/claude/skills/search-craft/REQUIREMENT.md +12 -36
  76. package/claude/skills/search-craft/SKILL.md +1 -1
  77. package/claude/skills/search-craft/references/adopted.md +2 -2
  78. package/claude/skills/session-compact/REQUIREMENT.md +13 -23
  79. package/claude/skills/session-map/REQUIREMENT.md +13 -29
  80. package/claude/skills/session-relay/REQUIREMENT.md +14 -58
  81. package/claude/skills/session-relay/SKILL.md +6 -0
  82. package/claude/skills/session-resume/REQUIREMENT.md +13 -27
  83. package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
  84. package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
  85. package/claude/skills/target-check/REQUIREMENT.md +16 -23
  86. package/claude/skills/target-setup/REQUIREMENT.md +11 -34
  87. package/claude/skills/task-board/REQUIREMENT.md +13 -22
  88. package/claude/skills/task-board/SKILL.md +7 -0
  89. package/claude/skills/task-board/references/tasks.md +1 -1
  90. package/claude/skills/task-complete/REQUIREMENT.md +11 -24
  91. package/claude/skills/task-complete/references/archive.md +1 -0
  92. package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
  93. package/claude/skills/test-craft/REQUIREMENT.md +15 -46
  94. package/claude/skills/test-first/REQUIREMENT.md +14 -20
  95. package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
  96. package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
  97. package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
  98. package/claude/skills/video-craft/REQUIREMENT.md +14 -27
  99. package/claude/skills/write-doc/REQUIREMENT.md +14 -24
  100. package/claude/skills/write-human/REQUIREMENT.md +15 -27
  101. package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
  102. package/docs/agents/context-audit.md +19 -12
  103. package/docs/agents/markdown-audit.md +15 -10
  104. package/docs/target/projects.md +2 -0
  105. package/docs/workflow/skill-map.md +6 -5
  106. package/governance/renames.toml +0 -2
  107. package/governance/rules/claude/output.md +5 -1
  108. package/governance/rules/code/routing.md +5 -1
  109. package/governance/stacks/base.toml +0 -1
  110. package/package.json +1 -1
  111. package/src/claude/cases/workflow.ts +12 -0
  112. package/src/commands/context.ts +57 -3
  113. package/src/commands/labels.ts +83 -3
  114. package/src/commands/markdown.ts +188 -21
  115. package/src/commands/sessions.ts +36 -3
  116. package/src/commands/tasks.ts +180 -0
  117. package/src/commands/worktrees.ts +2 -0
  118. package/src/context/coverage.ts +210 -0
  119. package/src/context/gate.ts +12 -3
  120. package/src/gate/stages.ts +1 -1
  121. package/src/init/steps.ts +45 -0
  122. package/src/intake/items.ts +14 -0
  123. package/src/labels/closing.ts +46 -0
  124. package/src/markdown/gated.ts +250 -0
  125. package/src/markdown/scope.ts +115 -2
  126. package/src/migrate/rename.ts +6 -0
  127. package/src/sessions/claim.ts +7 -0
  128. package/src/sessions/live.ts +53 -6
  129. package/src/sessions/registry.ts +11 -0
  130. package/src/sessions/resolve.ts +32 -5
  131. package/src/tasks/closes.ts +136 -0
  132. package/src/tasks/record.ts +1 -1
  133. package/src/worktrees/reclaim.ts +16 -1
  134. package/tooling/base/configs/scripts/verify.ts +1 -1
  135. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
  136. package/tooling/claude/seeds/CLAUDE.md +2 -2
  137. package/governance/rules/canon/task-scope.md +0 -12
@@ -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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Groundwork output reference
3
- description: The chat output a groundwork run closes on, one template for open and resume and one for close
3
+ description: The chat output a groundwork run closes on, one template for open and resume, a retell for a fully leaned pass, and one for close
4
4
  ---
5
5
 
6
6
  # Groundwork output reference
@@ -26,6 +26,52 @@ Use `📂 Resumed` in place of `📂 Opened` on a resume pass.
26
26
  - Overturned by: <the finding that would change it>
27
27
  ```
28
28
 
29
+ ## Retell
30
+
31
+ Replaces the open and resume template once every open question carries a lean. It also answers an operator who asks for one, whatever the questions' state. Chat only, and the retell itself writes no file.
32
+
33
+ Use H2 only, one-line bold-label bullets, and numbers only where they settle something. Stay near 300 words.
34
+
35
+ - Keep the leans that decide the operator's call, five at most, and fold the rest into one line naming how many more there are and where they sit
36
+ - Label each reversal `Overturned by`, as `groundwork.md` does
37
+ - Drop the held and not held split when the operator gave no hunch to test
38
+ - Put a question marked `none, needs measuring` under `## More measuring` as a yes, since an asked-for retell has no lean to give it
39
+ - List a file the pass wrote or updated under `**Written:**` after the verdict, and omit the block when none was
40
+
41
+ ```plaintext
42
+ **<the verdict in one line>**
43
+
44
+ **Written:**
45
+
46
+ - `.canon/groundwork/<nn>-<slug>/<file>.md`
47
+
48
+ ## Problem
49
+
50
+ <one or two sentences>
51
+
52
+ ## What is true now
53
+
54
+ - **Held:** <the part of the operator's hunch the evidence supports>
55
+ - **Not held:** <the part it does not>
56
+
57
+ ## Leans
58
+
59
+ 1. <lean>
60
+ - **Overturned by:** <the finding that would change it>
61
+
62
+ ## More measuring
63
+
64
+ **<Yes or No>:** <its cost, and what it would decide>
65
+
66
+ ## Dropped
67
+
68
+ - <what was set aside>
69
+
70
+ ## Your call
71
+
72
+ <the single decision the operator owes>
73
+ ```
74
+
29
75
  ## Close
30
76
 
31
77
  Omit the uncited-claims block when the count is zero.
@@ -7,43 +7,28 @@ description: Why a brain dump gets a filed inventory rather than ten plans, and
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a brain dump reaches a session that has nowhere to put it. `plan-feature` answers with one plan per independent concern, so forty findings produce ten plan files before anything has been measured. `plan-groundwork` refuses a breadth pass outright, since its qualifying test asks whether the current state is unknown and most items are knowable by grep. What gets filed instead is a list of opinions, because nothing forces a count against the tree and a complaint reads the same whether it covers three sites or three hundred.
10
+ A brain dump reaches a session with nowhere to put it. One plan per concern turns forty findings into ten plans before anything is measured, and what gets filed instead is a list of opinions, because nothing forces a count against the tree.
11
11
 
12
- Two failure modes cost more than the rest. An operator's silence on an item reads as consent when the folder borrows the plan file's blank-means-accept contract, which ships changes nobody approved across a folder read over weeks. And a report naming only a path cannot distinguish three new items from one reworded sentence in a file that holds a dozen items, so every reader diffs it against memory to find out what moved.
13
-
14
- Four more are cheaper to name than to rediscover. A question filed without a pick comes back unresolved, measured across one folder's 19 open items, where every one carrying a suggestion resolved on a bare `ok` and the five carrying none did not.
15
-
16
- A session with no numbering convention re-decides the folder shape per dump, so no two intakes are readable the same way and the second one has to be learned from scratch. A question answerable both in the index and on its item resolves to whichever a reader opens first, with no rule saying which wins. And a pass with no write scope starts fixing what it files, which turns a triage into a branch nobody asked for and nobody reviewed.
12
+ An empty operator slot reads as consent under a blank-means-accept contract, which ships changes nobody approved. A report naming only a path hides what moved. A question filed without a pick comes back unresolved, and a pass with no write scope starts fixing what it files.
17
13
 
18
14
  ## Must
19
15
 
20
- - Route each item on whether the repository can answer it today, sending what needs an experiment or an outside source to the groundwork skill and what is already decided to the planning skill
21
- - Measure every problem line against the tree during this pass, carrying a number or a file path rather than a figure from recall
22
- - Close every item with a verdict, and pair every open question with a suggested pick
23
- - Treat an empty operator slot as unread rather than as agreement
24
- - Reserve the index number and carry the domain in every other filename, leaving the rest of the numbering as read order
25
- - Name a newly opened folder with a two-digit ordinal ahead of the slug, taken from the highest one already present across intake and groundwork
26
- - Keep answers on items alone, with the index pointing at them
27
- - Name the heading and the act beside every path the pass wrote
28
- - Confine writes to the intake folder
16
+ - Route each item on whether the repository can answer it today, sending experiments to `plan-groundwork` and decided work to `plan-feature`
17
+ - Measure every problem line against the tree, close every item with a verdict, and pair every open question with a suggested pick
18
+ - Treat an empty operator slot as unread, and keep answers on items with the index pointing at them
19
+ - Reserve the index number, carry the domain in every other filename, and number a new folder past the highest ordinal across intake and groundwork
20
+ - Confine writes to the intake folder and name the heading and the act beside every path written
29
21
 
30
22
  ## Must not
31
23
 
32
24
  - Write a plan, a task file, a standard, a rule, or a source change
33
- - Fill an operator's answer slot, or infer a disposition from an empty one
34
- - Replace a verdict with an overlap line, which drops the call on exactly the items where a live board task might be the thing that is wrong
35
- - Reserve mid-range numbers, which would force every future intake into one dump's shape
36
- - Date every file, since the first edit to one leaves the rest stale
37
- - Open a folder for a single question, which is either a groundwork track or a plan
38
-
39
- ## Guards
40
-
41
- - No dump given: stop rather than inferring one
42
- - One question rather than a set of findings: stop and route to the groundwork or planning skill
25
+ - Fill an operator's slot, or replace a verdict with an overlap line
26
+ - Reserve mid-range numbers or date every file
27
+ - Open a folder for a single question or for no dump
43
28
 
44
29
  ## Out of scope
45
30
 
46
31
  - Measuring one question in depth, which `plan-groundwork` owns
47
32
  - Planning a promoted item, which `plan-feature` owns
48
33
  - Promoting an item onto the board, which `task-board` owns
49
- - Enforcing any of this. The folder is gitignored, so no check reaches its contents and every rule holds only while a session reads it.
34
+ - Enforcing any of this, which no check does since the folder is gitignored
@@ -113,9 +113,9 @@ Where an item touches a task already on the board, say so in the index rather th
113
113
  - **You:**
114
114
  ```
115
115
 
116
- - `Problem:`, `Fix:`, `Worth it:`, and the empty `You:` slot ship on every item. The other two are conditional.
116
+ - `Problem:`, `Fix:`, `Worth it:`, and the empty `You:` slot ship on every item, each on one line since the reader takes nothing after it. The other two are conditional.
117
117
  - Number items per cluster file, giving a finding split later a letter suffix such as `3a` beside `3`, since renumbering moves every cited label
118
- - `Suggested:` is required whenever `Open:` is present, since `ok` against two defensible options carries no information
118
+ - `Open:` reads on its own, with no bare "it" or "this" for the Fix, and `Suggested:` is required beside it, since `ok` against two options carries no information
119
119
  - Where the answer is the operator's preference rather than a technical call, say so in that form rather than inventing a default
120
120
  - `Overlaps:` never replaces `Worth it:`, since an item a live board task might have wrong is the one whose verdict matters most
121
121
 
@@ -7,42 +7,27 @@ description: Scope boundary for answering a filed intake from chat, and the writ
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, an operator answers a filed intake by opening each cluster file and typing under each item, so a dump spanning six clusters is six files navigated in turn and the cost scales with how well the pass split the domains. The folders that go unanswered are the large ones, which are the ones a breadth pass exists to produce.
10
+ An operator answers a filed intake by opening each cluster file and typing under each item, so the largest folders go unanswered. A session asked to help reads an empty slot as agreement, answers in chat and never the file, or overwrites a slot already filled.
11
11
 
12
- A session asked to help with that fails in shapes the intake standard already names. It reads an empty slot as agreement and reports items decided that nobody reached. It writes an answer into the conversation and never into the file, so the record still reads as unread and the next session re-asks. It types the answer into `00-overview.md`, where retrieval walks item headings and finds nothing. It overwrites a slot the operator already filled, discarding a decision already made.
13
-
14
- The write itself fails a fourth way that no prose rule prevents. Every worker runs in a linked worktree where the file-editing tools refuse a main-root path, and a stream editor expands an unescaped ampersand in the replacement to the whole match and exits zero when it matches nothing. A body instructing either route reports success and loses the answer.
15
-
16
- The batching fails a fifth way. A folder holding thirty unread items put as thirty questions is unanswerable, and put as one flat batch it hides which cluster the operator is in and leaves a file half answered when attention runs out.
12
+ The write fails where no prose rule catches it. A worker's file-editing tools refuse a main-root path from a linked worktree, and a stream editor exits zero on no match, so the answer is lost behind a success report. Thirty items in one flat batch leave a file half answered.
17
13
 
18
14
  ## Must
19
15
 
20
- - Offer every item carrying an empty answer slot, not only the ones carrying an open question, since the standard's one-token accept exists for a verdict with no question attached
21
- - Batch by cluster in the folder's own numbering, so the operator has a stopping point that leaves whole clusters unread rather than a file half answered
22
- - Cap a batch at four items, which is what a structured question tool takes
23
- - Rank the item's own suggestion or verdict first and give every option what it costs, since the pass already made a recommendation and burying it asks the operator to re-derive it
24
- - Land every selection through a verb that resolves the root in-process and rewrites the whole line, which is the only route that works from a linked worktree
25
- - Write one cluster per call, since concurrent calls against one file race on the read and keep only the last answer
26
- - Carry the cluster and the label together, because items are labeled per file and a label alone names an item in every cluster at once
27
- - Pass a label exactly as its heading spells it, letter suffix included, since a pass that splits a finding after the fact labels the halves rather than renumbering the file
28
- - Report what stays unread by count after each cluster
16
+ - Offer every item with an empty slot, batched by cluster in the folder's numbering and capped at four items, so a stop leaves whole clusters unread
17
+ - Open each question with a lead-in an operator who has not opened the file can follow, then rank the item's own suggestion first and give every option its cost
18
+ - Land each selection through a verb that resolves the root in-process and rewrites the whole line, one cluster per call
19
+ - Pass the cluster and the label exactly as the heading spells them, letter suffix included
20
+ - Report what stays unread by count after each cluster, and stop when there is no folder or no unread item
29
21
 
30
22
  ## Must not
31
23
 
32
- - Fill a slot the operator did not answer, including the remainder of a batch they abandoned
33
- - Infer an answer from the conversation having happened, which is the inversion the intake standard states against the plan standard
34
- - Overwrite a slot already carrying an answer, which is a decision already made
35
- - Write anywhere in the folder but an item's answer slot, and never into the index, which carries none
36
-
37
- ## Guards
38
-
39
- - No intake folder at all, stop and name the skill that files one
40
- - The named folder carrying no unread item, stop rather than re-asking answered items
24
+ - Fill a slot the operator did not answer, or infer an answer from the conversation having happened
25
+ - Overwrite a slot already carrying an answer
26
+ - Write anywhere but an item's answer slot, the index included
41
27
 
42
28
  ## Out of scope
43
29
 
44
- - Filing a dump and writing the items, which is `plan-intake` and owns every other write into the folder
45
- - Promoting an answered item onto the board, which is `task-board` and runs after the answers land
46
- - The item format, the answer contract, and retrieval, which the `plan-intake` skill's `references/intake.md` owns and this skill cites
47
- - The comparable answer slots in groundwork and feature plans, which carry their own contracts and are a separate measurement
48
- - Deciding when to fire. The description states `Do NOT auto-trigger`, so answering is the operator's call rather than a description match.
30
+ - Filing a dump and writing the items, which `plan-intake` owns
31
+ - Promoting an answered item onto the board, which `task-board` owns
32
+ - The item format, the answer contract, and retrieval, which `plan-intake` owns in its `references/intake.md`
33
+ - Deciding when to fire, which the operator owns since the skill never auto-triggers
@@ -31,7 +31,7 @@ Never guess from the topic of the conversation. A session resuming against the w
31
31
 
32
32
  ## Step 2: collect one cluster
33
33
 
34
- Run `canon intake list <slug> --unread --json`. It returns the unread items grouped by the cluster file holding them, each carrying its label, title, open question, and suggestion.
34
+ Run `canon intake list <slug> --unread --json`. It returns the unread items grouped by the cluster file holding them, each carrying its label, title, `problem`, `fix`, open question, and suggestion. The `problem` and `fix` fields are absent on an item that lacks the line, so write the lead-in from whichever are present.
35
35
 
36
36
  Work one cluster at a time, in the order the folder numbers them. A dump of six clusters holding five items each is thirty questions, and a surface putting all of them at once is unusable. The cluster boundary is also where an operator who runs out of attention stops cleanly, leaving whole clusters unread rather than one file half answered.
37
37
 
@@ -47,6 +47,12 @@ Offer every item with an empty slot, not only the ones carrying an open question
47
47
  | `Open:` | That question, with its `Suggested:` line ranked first and marked as suggestion |
48
48
  | No `Open:` | Its verdict, with `ok` ranked first and alternatives from what it could be |
49
49
 
50
+ Open every question with a lead-in of one to three plain sentences, written fresh from `problem`, `fix`, and `open` for an operator who has not opened the file. It says what is wrong today, what the fix is, and what the call is, condensing a long `problem` rather than pasting it.
51
+
52
+ - An item with no `fix` still states the problem and the call, and one with no `Open:` says what the verdict accepts
53
+ - As filed, "which hooks take it" means nothing lifted out of the Fix line it was written under
54
+ - With a lead-in: "Claude Code 2.1.295 lets a hook fail closed. A crashed `scratch-guard.sh` lets writes through, and the fix sets `onFailure: "block"`. Should `unattended-agent-guard.sh` get it too?"
55
+
50
56
  Give every option what it means and what it costs. An option with no stated cost is not an option, since the operator picks it without knowing what the other one buys.
51
57
 
52
58
  Send the whole batch in one turn. When the session runs on a surface carrying a structured question tool, such as `AskUserQuestion` in Claude Code, send it through one call with one entry per item. Otherwise write it as a numbered list in one message with the suggestion marked.