@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "canon",
3
3
  "description": "Runs your agent's work and keeps its code good, on one setup for every repo.",
4
- "version": "5.45.0",
4
+ "version": "5.46.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
@@ -7,44 +7,28 @@ description: Why a session changing what a caller can see needs stated rules on
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session changing a surface a caller depends on has nothing in front of it about what that caller can see or how a change lands without breaking it. It works for the one caller it opened, renames a field in place, returns whatever record it had in hand, and nothing in the toolkit answers before the change ships.
10
+ A session changing a surface a caller depends on has nothing in front of it about what that caller can see or how a change lands without breaking it. It works for the one caller it opened, renames a field in place, and returns whatever record it held.
11
11
 
12
- The absence is measured across the shipped corpus. No folder under `claude/skills/` matches `api`, `interface`, or `contract`, and no file across `claude/` and `governance/` carries `hyrum` or a form of `idempotent`. The only related lines are the two error bullets in the core code rule, which state that errors are structured and hide internals and say nothing about exposure, versioning, or retries.
13
-
14
- The one skill nearest the subject leaves the pointer open. `codebase-layout` excludes shaping "a module's interface and seams" in its description and names no skill to take it, so a session routed away from layout on that question lands nowhere.
15
-
16
- `review-craft` lists the consumers of a changed contract, but only once the change exists. A rename caught at review costs a second pass over a surface that was cheap to shape before its first caller.
12
+ No skill carries the subject, and the core code rule's two error bullets say nothing about exposure, versioning, or retries. `review-craft` lists a changed contract's consumers only once the change exists, when a rename costs a second pass over a surface that was cheap to shape before its first caller.
17
13
 
18
14
  ## Must
19
15
 
20
- - State Hyrum's Law as design rules a session can act on: decide what is observable, and expose no storage type, internal identifier, ordering, or timing by accident
21
- - Tell the session to write the contract, being the signature, flags, output shape, or schema, before the body
22
- - State one error shape per surface with a stable code a caller can branch on, and own the hidden-internals clause in the body, since no project rule carries it for every code stack
23
- - State validation at the boundary, once, with the value trusted inside
24
- - State additive change as the default: new fields and flags optional, nothing renamed or removed in place, no change of meaning under an existing name, and the One-Version Rule for a caller that cannot pin
25
- - State the four idempotency rules: store and honor a caller's key, claim it in one atomic step under a unique constraint, fail loudly on a reused key with a different body, and keep a key past the longest retry window
26
- - Record the external sources adopted and declined with the reason for each, so a later session extends the position instead of re-deriving it
27
- - Close with a table of the excuses a session gives for breaking a caller, each with its rebuttal, the red flags a session can see in its own diff, and a checklist each line of which answers yes or no against the surface the change produced
28
- - Exclude a visual interface by name in the description, since `design-taste` already routes on drafting or judging an interface
16
+ - State Hyrum's Law as design rules, deciding what is observable and exposing no storage type, internal identifier, ordering, or timing by accident
17
+ - Write the contract before the body, with one error shape per surface carrying a stable code, and validate once at the boundary
18
+ - Make change additive by default, with new fields optional and nothing renamed, removed, or redefined in place, and the One-Version Rule for a caller that cannot pin
19
+ - State four idempotency rules: honor a caller's key, claim it atomically, fail loudly on a reused key with a different body, and keep it past the retry window
20
+ - Close with excuses, red flags, a checklist, and the external sources adopted and declined with the reason for each, and exclude visual interfaces by name in the description
29
21
 
30
22
  ## Must not
31
23
 
32
- - Name a framework, a protocol style, or a language in the body. Status codes, verbs, pagination, and schema languages stay out, so the body holds for a function, a command, a file format, and an endpoint alike.
33
- - Restate the consumer-listing axis `review-craft` carries for a finished change
34
- - Cover interface depth or the internals behind a boundary, which govern what sits behind a surface rather than what crosses it
35
- - Import an external skill's tone, such as a law stated as absolute, or an excuse row rebutting an objection no session has raised
36
-
37
- ## Guards
38
-
39
- - A change that stays behind an existing boundary and alters nothing a caller observes skips the skill
40
- - A rename lands as an addition beside the old name, never in place, unless every caller lives in the same change and the change migrates each one
24
+ - Name a framework, a protocol style, or a language in the body
25
+ - Restate the consumer-listing axis `review-craft` carries, or cover the internals behind a boundary
26
+ - Land a rename in place unless every caller sits in the same change and the change migrates each one
41
27
 
42
28
  ## Out of scope
43
29
 
44
- - Where the file holding a surface sits on disk: `codebase-layout`
45
- - Interface depth, deep modules, and the internals behind a boundary: `code-craft`
46
- - Listing the consumers a finished change breaks, and the docs it made false: `review-craft`
47
- - A visual interface, its layout, and its look: `design-taste`
48
- - Retiring a surface and migrating its last consumers off it, beyond the additive rule stated here
49
- - Protocol-specific guidance such as verbs, status codes, and pagination
50
- - Whether the guidance changes what a session ships, which needs a measured with-and-without run rather than a rule here
30
+ - Where the file holding a surface sits on disk, which `codebase-layout` owns
31
+ - Interface depth and the internals behind a boundary, which `code-craft` owns
32
+ - Listing the consumers a finished change breaks, which `review-craft` owns
33
+ - A visual interface, its layout, and its look, which `design-taste` owns
34
+ - Retiring a surface and migrating its last consumers, which `deprecation-migration` owns
@@ -9,37 +9,26 @@ description: What the post-plan pipeline is for, the gaps it closes, and why eve
9
9
 
10
10
  Without this skill, the run from an approved plan to an open pull request is a conversation. A session implements, then asks what comes next, and the answer varies by session. A run that halts leaves no stated resume point, so the user reconstructs how far it got from the working tree.
11
11
 
12
+ A pull request opened ready stays mergeable through its CI run, and a draft mark typed against the wrong number holds someone else's release. Parallel batches sharing edge files conflict on each merge. A worker improvising the review wait polls issue comments and stalls with both reviewers idle.
13
+
12
14
  ## Must
13
15
 
14
- - Take the approved plan for the branch as the scope, and implement only what it describes
15
- - Load `build-in-slices` before implementing, so the build reaches history as tested slices rather than one uncommitted pass
16
- - Give every step a stop condition, and leave the code on the branch and the receipts on disk at each one
17
- - Check the branch's committed history for a test-order violation between verify and ship, and report any finding without gating on it, matching the verb's own contract
18
- - Delegate the ship sequence to `git-ship` rather than restating it, and name only what this chain adds to it
19
- - Open the pull request as a draft before the continuous integration watch begins, since a pull request marked after it is mergeable for the length of the run
20
- - Continue past a produced UI checklist rather than stopping on it, and report its unchecked boxes in the closing block, since the draft mark already holds the merge
21
- - Prove the draft target's head is the current branch and its state is open before marking it, and stop with nothing marked on a mismatch, since the number is retyped between steps and a draft mark on a release pull request holds that release
22
- - Stop a fan-in member after its verify and test order with a push and a done message rather than a pull request, and open an integrator's build by merging the member branches, since parallel batches sharing edge files put every open sibling into conflict on each merge
23
- - Wait for both review families through `canon pr review-state --wait` once CI passes on a launch that named a controller, which alone dispatches the reviewers, bounded at the lift's own default, and hand the record to the controller on a timeout, since a worker improvising the read polled issue comments, never saw a UI close posted as a review, and stalled with both reviewers idle
24
- - Name the recovery for the stop it took, since the value of stopping is that the user knows where to resume
16
+ - The approved plan is the scope, built in tested slices through `build-in-slices`, and every step stops with the code on the branch and the recovery for that stop named
17
+ - The ship sequence is delegated to `git-ship`, and the pull request is marked a draft before the CI watch, after proving its head is this branch and its state is open
18
+ - A test-order finding between verify and ship is reported without gating, and a produced UI checklist is reported in the closing block without stopping
19
+ - A fan-in member stops after verify with a push and a done message, and an integrator opens its build by merging the member branches
20
+ - On a launch naming a controller, both review families are awaited through `canon pr review-state --wait`, and a timeout hands the record to the controller
25
21
 
26
22
  ## Must not
27
23
 
28
24
  - Expand past the plan, refactor a neighbor, or touch a file outside it without reason
29
- - Loop on a failed verify. One fix attempt against the reported errors, then stop.
30
- - Fix a failing check. The stop is deliberate, since a green pull request reached by auto-fix hides what broke.
31
- - Restate the ship sequence. Two copies of one order drift with nothing comparing them, which is what the merge into `git-ship` closed.
32
- - Skip that skill's own verify for repeating this chain's. The gate exists for the resumed run, and a chain that suppresses it leaves the resumed run reaching nothing.
33
- - Stop the chain or rewrite a commit over a test-order finding. The verb reports and never gates, and a commit already in history is a different act from the work this run is building.
34
-
35
- ## Guards
36
-
37
- - Detached HEAD: stop, no slug resolves
38
- - No approved plan at the branch-derived plan path: stop, name the branch the slug came from, and say the invocation carried no argument, so a plan or a task path may be passed
39
- - Uncommitted changes unrelated to the plan: stop
25
+ - Loop on a failed verify or auto-fix a failing check, since a green pull request reached that way hides what broke
26
+ - Restate the ship sequence, or skip `git-ship`'s own verify for repeating this chain's
27
+ - Stop the chain or rewrite a commit over a test-order finding
28
+ - Run on a detached HEAD, a missing plan, or uncommitted changes unrelated to the plan
40
29
 
41
30
  ## Out of scope
42
31
 
43
- - Writing the plan, which `plan-feature` owns. This chain starts from one already approved.
44
- - The behavior of each step, owned by the skill invoked. This skill owns the order and the stop conditions.
45
- - The ship sequence and the resume path after a stop, both of which `git-ship` owns. That skill is the tail of this chain, invoked at Step 6 rather than copied into it, so the overlap is one body reached two ways rather than two bodies stating one order.
32
+ - Writing the plan, which `plan-feature` owns
33
+ - The behavior of each step, which the skill that step invokes owns
34
+ - The ship sequence and the resume path after its stops, which `git-ship` owns
@@ -7,41 +7,30 @@ description: Why the backlog gets a measured verdict per row with a lean toward
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, the backlog only grows. `task-board` declines one named task and `task-complete` archives one, and nothing reads the backlog as a whole, so a row stays until somebody happens to remember it and decides by hand. The orchestrator's backlog re-test only clears a row upward onto the board, so no sweep ever takes one off. A backlog past fifty rows had no surface that could say which of them still mattered.
10
+ Without this skill, the backlog only grows. `task-board` declines one named task and `task-complete` archives one, but nothing reads the backlog as a whole, and the orchestrator's re-test only clears a row upward. A long backlog has no surface that can say which rows still matter.
11
11
 
12
- Four failure modes cost more than the rest. A pass that judges a row by what its task file says rather than by the tree keeps every row, since a task file reads as live the day it was written and every day after. A pass that applies its own verdicts decides rows on silence, which ships a decline nobody approved on a board with no history to restore it from. A keep that carries no measurement is the default nobody argues with, so a triage without a lean toward decline ends with the same backlog it started with. And a keep that measures only that the defect still exists keeps nearly everything, since a row filed against the tree almost always still reproduces. One pass suggested keeping 24 of 27 rows that way, where the operator kept 6 and promoted 1.
12
+ Judged by its own task file, every row reads live and stays. Applied without the operator, verdicts decline rows on silence, on a board with no history to restore them. Measuring only that a defect still exists keeps nearly everything, since a row filed against the tree almost always reproduces.
13
13
 
14
14
  ## Must
15
15
 
16
- - Measure every row against the tree and the log during the pass, carrying a count, a path, or a commit rather than the task file's own claim
17
- - Suggest keep or promote only for a row that names a cost, being a wrong result the pass observed or a case someone hit, including a user asking for a feature or working around its absence, or a reach, being a defect on a path the project ships that changes what its users or targets receive, hit or not, and suggest decline for a row whose defect merely still exists
18
- - Name the commit or pull request per outcome position before suggesting archive
19
- - File into an ordinary intake folder, so the intake list and answer verbs read and write it unchanged
20
- - Carry the verdict in the suggestion line and the task stem in the item heading, rather than in new fields
21
- - Split filing from applying by the operator's answer, so filing writes only inside the intake folder and applying writes only what was approved
22
- - Apply through the existing decline, outcome, and archive verbs
23
- - Leave the folder slug on every task a verdict touched, so a re-run writes nothing twice
24
- - Refuse to apply under a planner or worker session, and hand a promote to a live orchestrator rather than writing the ordering file beside it
16
+ - Every row is measured against the tree and the log, carrying a count, a path, or a commit rather than the task file's claim
17
+ - Keep or promote is suggested only for a row naming a cost someone hit or a reach into what the project ships, and decline for a row whose defect merely still exists
18
+ - Verdicts are filed into an ordinary intake folder, in the suggestion line and item heading, so the intake verbs read them unchanged
19
+ - Applying writes only what the operator approved, through the existing decline, outcome, and archive verbs, and archive names the commit or pull request per outcome position
20
+ - Every task a verdict touched carries the folder slug, so a re-run writes nothing twice
25
21
 
26
22
  ## Must not
27
23
 
28
- - Fill an operator's answer slot, or infer a verdict from an empty one or from a free-text answer
29
- - Read a suggestion carrying no verdict token as keep
24
+ - Fill an answer slot, or read a verdict from an empty answer, a free-text answer, or a suggestion with no verdict token
30
25
  - Treat age as evidence for or against a row
31
26
  - Retry an archive with guessed outcome positions after a refusal
27
+ - Apply under a planner or worker session, or write the ordering file beside a live orchestrator rather than handing it the promote
32
28
  - Change the intake standard, the intake skills, or the task verbs to fit triage
33
29
 
34
- ## Guards
35
-
36
- - No backlog file: stop
37
- - Unread items in the newest triage folder: stop and name the answer skill
38
- - An item carrying no answer slot: stop and name the folder to repair
39
- - Apply under a session named for the planner or worker role: stop before writing
40
-
41
30
  ## Out of scope
42
31
 
43
32
  - Filing a brain dump, which `plan-intake` owns
44
33
  - Answering the filed items, which `plan-intake-answer` owns
45
- - Creating or declining one named task outside a triage, which `task-board` owns, and archiving one, which `task-complete` owns
46
- - Ordering the rows a promote lands under `## Needs a plan`, which the orchestrator's refill sweep owns
47
- - Skipping rows kept at a recent triage, which waits on a second triage measuring the re-read cost
34
+ - Creating or declining one named task outside a triage, which `task-board` owns
35
+ - Archiving one named task outside a triage, which `task-complete` owns
36
+ - Ordering the rows a promote lands under `## Needs a plan`, which `role-orchestrator` owns
@@ -7,39 +7,29 @@ description: Why a building session needs stated rules for working through a pla
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, nothing in the toolkit says how a session works through a plan once it starts building. `test-first` loops per behavior and stops at refactor, and `auto-ship` Step 2 says to implement only what the plan describes and nothing about how. No skill asks for a commit per slice, for a build left passing between slices, or for a defect noticed outside the plan to be written down rather than fixed.
10
+ Nothing says how a session works through a plan once it starts building. `test-first` loops per behavior and stops at refactor, and `auto-ship` says to implement only what the plan describes. No skill asks for a commit per slice, a build left passing between slices, or a noticed defect written down rather than fixed.
11
11
 
12
- The ship chain assumed the work arrives uncommitted. `git-ship` ran `git-stage` unconditionally, and that skill stops on an empty index, so a session that committed as it went never reached the pull request whenever the sync steps wrote nothing.
12
+ Without those, a session builds in one pass and tests at the end, so the diff outgrows what anyone can read and a late failure could come from any change. A defect found on the way gets fixed in the same diff, and the review reads two changes as one.
13
13
 
14
14
  ## Must
15
15
 
16
- - State the cycle per slice: implement, run the slice's tests and the checks its change could affect, commit through `git-commit`, then move on from the committed state
17
- - State how the next slice is chosen: one path end to end, the riskiest piece first, and the contract first when two sides are written against it
18
- - Keep each commit safe to revert on its own: one logical change, a test committed with or ahead of its code, and never a delete and its replacement in one commit
19
- - Route a defect noticed outside the plan to the open task's `## Findings`, or to the handover where no task exists, and leave its file unchanged
20
- - Limit the rule against re-running a check on unchanged code to the session's own repeats, so it never reads as permission to skip a verify step a chain runs
21
- - Record the external sources adopted and declined with the reason for each, so a later session extends the position instead of re-deriving it
22
- - Close with a table of the excuses a session gives for skipping a slice commit or widening scope, each with its rebuttal, the red flags a session can see in its own work mid-task, and a checklist each line of which answers yes or no against the branch the build produced
16
+ - Work each slice as implement, run its tests and the checks its change could affect, commit through `git-commit`, then move on from the committed state
17
+ - Choose the next slice as one path end to end, the riskiest piece first, and the contract first when two sides are written against it
18
+ - Keep each commit safe to revert alone, with one logical change, a test committed with or ahead of its code, and no delete sharing a commit with its replacement
19
+ - Route a defect noticed outside the plan to the open task's findings or the handover, and leave its file unchanged
20
+ - Re-run a check only after an edit it could see, never to skip a chain's verify step, then close with excuses, red flags, a checklist, and the sources adopted and declined with the reason for each
23
21
 
24
22
  ## Must not
25
23
 
26
- - Restate the scope floors of minimal edits and no unrequested features, which a scope call the skill makes already holds
27
- - Carry simplicity or abstraction rules, which `code-craft` owns
28
- - Name a feature flag pattern, since the slices of one branch merge as one pull request rather than reaching trunk one at a time
29
- - Name a framework, a test runner, or a line-count threshold, none of which holds across stacks
24
+ - Restate the scope floors of minimal edits and no unrequested features
25
+ - Carry simplicity or abstraction rules, a feature flag pattern, a framework, or a line-count threshold
30
26
  - Describe a raw `git commit` recipe in place of `git-commit`
31
-
32
- ## Guards
33
-
34
- - A change that is already one behavior in one place skips the skill
35
- - A defect outside the plan is fixed on the branch only when the plan's own change cannot pass without it, and the commit says so
27
+ - Fix an outside defect on the branch unless the plan's own change cannot pass without it, and then say so in the commit
36
28
 
37
29
  ## Out of scope
38
30
 
39
- - The red, green, refactor loop inside one behavior: `test-first`
40
- - Which layer a test belongs at: `test-craft`
41
- - The shape of a function, class, or module a slice writes: `code-craft`
42
- - What a building session may write, the board it may not, and the messages it owes: `role-worker`
43
- - The message format of a commit: `git-commit`
44
- - Safe defaults for a new interface, which belong to the skill shaping what a caller sees
45
- - Whether the guidance changes what a session ships, which needs a measured with-and-without run rather than a rule here
31
+ - The red, green, refactor loop inside one behavior, which `test-first` owns
32
+ - Which layer a test belongs at, which `test-craft` owns
33
+ - The shape of a function, class, or module a slice writes, which `code-craft` owns
34
+ - What a building session may write and whom it reports to, which `role-worker` owns
35
+ - The message format of a commit, which `git-commit` owns
@@ -7,40 +7,28 @@ description: Why a session is routed from a job to its canon verb from one place
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session guesses at a verb from its name and runs a `canon` sync to find out afterward what it did. The command names give nothing away. `install` and `sync` differ per domain, some surfaces overwrite unconditionally, some merge, some are written once and never touched again, and none of that is visible from the command line the user typed.
10
+ Without this skill, a session guesses at a verb from its name. It learns afterward what the verb did, because `install` and `sync` differ per domain, with some surfaces overwriting, some merging, and some written once and never again. Golden configs and edited rules get replaced unwarned. A copy-once seed waits on a sync that never rewrites it.
11
11
 
12
- The damage lands on the files a project owns. A golden config carrying local edits is replaced without a warning anyone saw, and a governance sync takes back a rule the project had edited. The user learns which category a file was in by losing the edit.
13
-
14
- The inverse failure is quieter. A session that assumes a sync will pick up a change edits a seed and waits for an update that never comes, because the seed is copy-once and no sync command writes it again. Both failures are one missing fact available before the command runs.
15
-
16
- A third gap is the route itself. `canon --help` lists every top-level verb by a one-line description, and a session with a job in hand pays a `--help` read per candidate to find the one that does it, or picks by name and lands on the wrong one. The job-to-verb mapping is the fact the session needs and no verb answers.
17
-
18
- Being reachable is a separate problem from being right. This is a pure reference whose moment happens inside another skill's run, so nothing brings it up unless a body names it. A route lives in a body or it does not exist, and a mention in a sibling's requirement file is not one.
12
+ The route is missing too. `canon --help` lists each verb in one line, so a session with a job pays a read per candidate or picks by name. The job-to-verb mapping is the fact it needs, and nothing brings it up unless a body names it.
19
13
 
20
14
  ## Must
21
15
 
22
- - Name each target-usable top-level verb by its job, never its subcommands or flags
23
- - Route an author-and-render verb to the skill that owns it rather than describing it
24
- - Warn about a verb that can lose the project's edits before it runs, naming what it replaces
25
- - Point each destructive verb at `canon docs install-and-sync`, which owns the overwrite detail
26
- - Point to `canon <verb> --help --all` and `canon docs agents` for subcommands, flags, and the invocation contract, and have the session read that help before running a verb no skill body spells out, a verb a skill pins in full being exempt
27
- - Defer to `canon docs install-and-sync` when it and this summary disagree, since the summary is a copy and the doc is the source
16
+ - Name each target-usable top-level verb by its job, never its subcommands or flags, and route an author-and-render verb to the skill that owns it
17
+ - Warn before a verb that can lose the project's edits runs, naming what it replaces, and defer to `canon docs install-and-sync` where the summary disagrees
18
+ - Point to `canon <verb> --help --all` and `canon docs agents` for subcommands, flags, and the invocation contract, and have the session read that help before running a verb no skill body spells out
19
+ - Route a verb or surface the skill does not cover to `canon docs` rather than to an inference from a similar row
20
+ - Fail a coverage test naming each top-level verb that the body neither carries nor exempts, and each exemption naming something no longer a verb
28
21
 
29
22
  ## Must not
30
23
 
31
- - Run, or send the session to run, a `canon` command that writes or installs. The skill is read before acting on a sync.
32
- - List a subcommand, a flag, or a JSON shape. That restates the docs and is the drift the one-name-per-verb rule removes.
33
- - List a verb that only works inside the toolkit repository. A named exemption set in the coverage test holds that boundary.
34
- - Take a mention in a sibling's requirement file as an inbound route. The pointer lives in the body that needs it.
35
-
36
- ## Guards
37
-
38
- - A test fails naming each top-level verb in `COMMAND_GROUPS` that the body neither carries as `canon <verb>` nor exempts, and fails again when an exemption names something that is no longer a verb
39
- - A verb or surface the skill does not cover routes to `canon docs` rather than to an inference from a similar row
24
+ - Run, or send the session to run, a `canon` command that writes or installs
25
+ - List a subcommand, a flag, or a JSON shape, which restates the docs
26
+ - List a verb that only works inside the toolkit repository
27
+ - Take a mention in a sibling's requirement file as an inbound route, since the pointer lives in the body that needs it
40
28
 
41
29
  ## Out of scope
42
30
 
43
- - Executing the sync, which the user runs
44
- - Reconciling a customized seed section by section, which an operator does by hand
45
- - Deciding which stack, rule, or standard a project should install, which the setup skills resolve from live catalogs
46
- - Diagnosing what a project is behind on: `target-check`
31
+ - Executing the sync, which the user owns
32
+ - Reconciling a customized seed section by section, which an operator owns
33
+ - Deciding which stack, rule, or standard a project installs, which `target-setup` owns
34
+ - Diagnosing what a project is behind on, which `target-check` owns
@@ -7,36 +7,28 @@ description: Why a toolkit defect is reported from session context alone, and wh
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a toolkit defect noticed inside a target project dies with the session. The user is told to mention it in the toolkit repository later, which means retyping a report they no longer have the context to write, so the defect is either reported badly or not at all.
10
+ Without this skill, a toolkit defect noticed in a target project dies with the session. The user retypes a report later without the context, so it is reported badly or not at all. A block printed in chat needs a copy-paste into another repository, which gets skipped under time pressure, and a report naming no surface cannot be routed.
11
11
 
12
- The report itself fails two ways. A block printed in chat needs a copy-paste into another repository, and a step that manual is skipped under any time pressure. A report that names no surface cannot be routed, because the toolkit acts on a plugin skill, a CLI command, and a seed through different paths, and the difference is not recoverable from the symptom.
13
-
14
- The last failure is the session's own effort. Asked to report, a session starts diagnosing instead, searching the toolkit and reading its surfaces to find the cause. That spends the context the report was meant to capture cheaply, and it produces a diagnosis from a project that cannot see the toolkit's current source.
12
+ Asked to report, a session also starts diagnosing, which spends the context the report was meant to capture and yields a diagnosis from a project that cannot see the toolkit's source.
15
13
 
16
14
  ## Must
17
15
 
18
- - Build the report from what the session already holds
19
- - Name the surface and its type, since the toolkit routes on that rather than on the symptom
20
- - Write the stated fallback for a field the session cannot fill, so an empty field reads as absent rather than as unreported
21
- - Open a GitHub issue on the toolkit repo through the CLI so the report lands where triage reads it, and print the returned URL on its own line
22
- - Surface the block and the reason when the issue call fails, since a failure that prints nothing leaves the report where nothing reads it
23
- - Carry the whole request in the issue body alone, since a comment is easy to miss and a body and a comment that differ leave triage choosing
16
+ - Build the report from what the session already holds, name the surface and its type, and write the stated fallback for a field it cannot fill
17
+ - Carry the whole request in the issue body alone, since a body and a comment that differ leave triage choosing
18
+ - Open a GitHub issue on the toolkit repository through the CLI and print the returned URL on its own line
19
+ - Surface the block and the reason when the issue call fails or the CLI is absent, so the report still exists
24
20
  - Hold a report the operator marks sensitive, since the issue is public
25
- - Fall back to printing the block when the CLI is absent, so the report still exists
26
21
 
27
22
  ## Must not
28
23
 
29
24
  - Probe the project, list files, grep, or read toolkit surfaces to enrich the report
30
- - Guess the surface type when the session is ambiguous. Ask one line.
25
+ - Guess the surface type when the session is ambiguous
31
26
  - Diagnose or fix, which needs the toolkit's source rather than the target's
32
-
33
- ## Guards
34
-
35
- - Nothing in session context pointing at a toolkit issue stops, since a report assembled from nothing wastes the triage it reaches
27
+ - Report from a session holding nothing that points at a toolkit issue
36
28
 
37
29
  ## Out of scope
38
30
 
39
31
  - Fixing the defect, which happens in the toolkit repository against its own source
40
- - Draining the queue this fills: `canon-feedback-triage`
41
- - Filing an issue against the current project, which `git-issue` does and this skill cannot delegate to, since that skill targets the current repository
32
+ - Draining the queue this fills, which `canon-feedback-triage` owns
33
+ - Filing an issue against the current project, which `git-issue` owns
42
34
  - Complaints about tooling the toolkit does not own
@@ -7,33 +7,28 @@ description: Why the feedback queue is read from GitHub rather than local scratc
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, the feedback queue fills and nothing drains it. Reports arrive from projects the toolkit never sees, and a queue nobody reads on a schedule is the same as no queue. A local folder looks like the right place to read, and it is the wrong one, because that content is per-machine session scratch that any cleanup removes.
10
+ Without this skill, the feedback queue fills and nothing drains it. A local folder looks like the place to read and is the wrong one, since that scratch is per-machine and any cleanup removes it.
11
11
 
12
- Triage fails three ways once it starts. An issue gets routed straight to a fix from a paragraph of description, which skips the step where scope is argued and the operator's call. An issue whose report contradicts itself gets a guess rather than a question, so the fix addresses a defect nobody confirmed. And the same issue gets filed twice, because two passes cannot see that the board already carries it.
12
+ Triage then fails three ways. An issue routes to a fix from a paragraph, which skips the scope argument. A self-contradicting report gets a guess instead of a question. The same issue gets filed twice because two passes cannot see the board carries it.
13
13
 
14
14
  ## Must
15
15
 
16
- - Read the durable queue rather than local session scratch
17
- - File one measured item per open issue into an intake folder, headed so an answer finds its issue
18
- - File every open issue the board does not already carry, and name each skipped issue with its carrier
16
+ - Read the durable queue through the `gh` CLI rather than local session scratch, and stop when it is absent or unauthenticated
17
+ - File one measured item per open issue into an intake folder, headed so an answer finds its issue, and name each skipped issue with its carrier
19
18
  - Measure each claim against the tree rather than carrying the issue's figures forward
20
19
  - Claim the folder through the CLI rather than picking an ordinal by hand
20
+ - Report an empty queue as nothing open rather than widening the label to find work
21
21
 
22
22
  ## Must not
23
23
 
24
24
  - Post to the remote, whether a comment, a close, or a label
25
- - Implement a fix or write a plan, which the answered item routes to
25
+ - Implement a fix or write a plan
26
26
  - Fill an answer slot, or read an empty one as agreement
27
27
  - Write outside the folder it claimed
28
28
 
29
- ## Guards
30
-
31
- - The `gh` CLI absent or unauthenticated stops, since the queue is unreachable
32
- - An empty queue reports nothing open rather than widening the label to find work
33
-
34
29
  ## Out of scope
35
30
 
36
- - Filing new feedback: `canon-feedback`
37
- - Answering the filed items: `plan-intake-answer`
38
- - Writing the plan a plan-worthy item needs: `plan-feature`
39
- - Triage of issues carrying any other label, which surface here by design only under the feedback label
31
+ - Filing new feedback, which `canon-feedback` owns
32
+ - Answering the filed items, which `plan-intake-answer` owns
33
+ - Writing the plan a plan-worthy item needs, which `plan-feature` owns
34
+ - Issues carrying any other label, which no skill here owns
@@ -7,42 +7,28 @@ description: Scope boundary for driving the local design canvas, and the line be
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session asked to draw on the canvas writes frames into a folder nothing is serving, so the operator sees nothing and the session reports the frames as drawn. When the server is running, the session trusts a passing capture as proof the canvas works. Captures go through the frame route, so a shell that answers its address with an empty page passes every capture while the operator looks at a blank tab.
10
+ Without this skill, a session asked to draw on the canvas writes frames nothing is serving and reports them drawn. It trusts a passing capture, though a blank shell passes every capture while the operator sees an empty tab. From a linked worktree it writes a copy the canvas never serves, and it captures after every edit.
11
11
 
12
- It reads "this one" from the conversation rather than from the operator's selection, and when it does read the selection it acts on an element index recorded against an earlier version of the file, which lands the edit on a different element. It restyles through a class while the operator's inspector edit sits on the element as inline style, so the change never shows and the session reports it as made.
13
-
14
- It writes frames from a linked worktree with the file tools, which refuse the main-root path and offer a worktree copy the canvas never serves. It captures after every edit, filling session scratch with images of drafts nobody picked.
15
-
16
- When the operator picks a frame, the session leaves the decision on the canvas and cites the frame as the design, so the project's design document never learns it and a gitignored file becomes the only record.
12
+ It reads "this one" from the conversation rather than the operator's selection, or acts on a stale element pick and edits the wrong element. It restyles through a class while the operator's inspector edit sits inline, so the change never shows. A picked frame stays on the canvas as the only record, and the design document never learns it.
17
13
 
18
14
  ## Must
19
15
 
20
- - Start the canvas when it is not serving, before writing any frame
21
- - Confirm the live shell loads at the address the server reported, rather than trusting a capture
22
- - Read the address off the server's record rather than composing one
23
- - Make pages and frames through the verbs, so a box and the operator's drags share one locked writer
24
- - Name the main-root write route for a frame written from a linked worktree
25
- - Read the operator's selection when they point at something, and treat a stale element pick as unknown
26
- - Read a frame's inline styles before restyling it, and say which operator edits were kept and which dropped
27
- - Capture once per finished frame or page rather than after every edit
28
- - Carry a picked value into the project's stylesheet and its intent into the design document, and leave a picked layout on the canvas for the plan that builds it
16
+ - The canvas is serving and its live shell loads at the address the server reported before any frame is written, and a refusal or a blank shell is reported rather than drawn into
17
+ - Pages and frames go through the verbs, so the session and the operator's drags share one writer, and a frame from a linked worktree takes the main-root route
18
+ - The operator's selection decides what "this one" means, and a stale element pick reads as unknown
19
+ - A frame's inline styles are read before a restyle, the run names which operator edits it kept and dropped, and capture runs once per finished frame or page
20
+ - A picked value lands in the project's stylesheet and its intent in the design document, while a picked layout stays on the canvas for the plan that builds it
29
21
 
30
22
  ## Must not
31
23
 
32
- - Present the canvas as the project's source of truth for design
33
- - Promise the canvas survives a lost checkout
24
+ - Present the canvas as the project's source of truth for design, or promise it survives a lost checkout
25
+ - Write frames when `canon` or its canvas command is missing
34
26
  - Name any third-party design tool, or the canvas's predecessor surface
35
- - Be invoked only by the author typing its name. A request to draw, select, or capture on the canvas should reach it by description, and a run where it never fires on such a request is a defect in the description
36
-
37
- ## Guards
38
-
39
- - No `canon` on PATH, or an installed CLI with no canvas command, stop rather than writing files nothing serves
40
- - A server that refuses to start, or a shell that answers blank, stop and report it rather than drawing into it
27
+ - Be reached only by the author typing its name, since a request to draw, select, or capture on the canvas should reach it by description
41
28
 
42
29
  ## Out of scope
43
30
 
44
- - What the canvas verbs do internally, which is the CLI's own contract
45
- - The content format a frame and a layout take, which the canvas standard fixes
46
- - Drafting candidates for a taste decision and taking the pick, which `pick-by-eye` runs on this canvas through the same verbs
47
- - Tracing reference images into design values or writing the design document from code, which no skill owns now
48
- - Backing up the canvas folder off one disk
31
+ - Drafting candidates for a taste decision and taking the pick, which `pick-by-eye` owns
32
+ - What the canvas verbs do internally, which the CLI's own contract owns
33
+ - The content format a frame and a layout take, which the canvas standard owns
34
+ - Tracing reference images into design values, writing the design document from code, and backing up the canvas folder, which no skill owns
@@ -7,34 +7,25 @@ description: Scope boundary for pipeline structure against job contents, and the
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session writes a pipeline whose jobs run in sequence because `needs` was used to express the order a person reads them in rather than a data dependency. The pipeline then costs the sum of its jobs where it could have cost the longest one, and the waste compounds on every push.
10
+ Without this skill, a session chains jobs with `needs` to express reading order rather than a data dependency, so the pipeline costs the sum of its jobs. The same session splits a one-minute gate into parallel jobs, each repaying checkout, install, and toolchain setup, so the gate gets slower while reporting no earlier.
11
11
 
12
- The same session splits a gate that finishes in a minute into three parallel jobs, which fails in the other direction. Each job repays checkout, dependency install, and toolchain setup before it reaches a stage, so the gate gets slower while reporting no earlier, and the roster reads as a design decision rather than as a cost nobody measured.
13
-
14
- The rest are reproducibility failures that surface as flakes. An action pinned to a moving ref changes under the project, so a run that passed yesterday fails today with no commit behind it and the diff explains nothing.
15
-
16
- A cache keyed on a static string serves a stale browser or toolchain after a version bump, and the failure reads as a broken test rather than a stale cache. Artifacts upload on every run and never expire, so storage grows with the commit count while the ones worth reading are the failures. And a workflow with no manual trigger can only be reproduced by pushing a commit, which is the wrong instrument for a run that failed for an environmental reason.
12
+ The rest surface as flakes. An action pinned to a moving ref changes under the project, a cache keyed on a static string serves a stale toolchain after a bump, artifacts upload on every run and never expire, a broad default token grants writes nobody needed, and a workflow with no manual trigger reproduces only by pushing a commit.
17
13
 
18
14
  ## Must
19
15
 
20
- - Gate a job only on a data dependency or on a cost that justifies the wait, and leave every other job parallel
21
- - Start the checks that share setup in one job and split them only once a run log puts the gate past roughly two minutes
22
- - Pin every action to a tag that cannot cross a major version
23
- - Key a cache on the version string of the thing it caches
24
- - Give every workflow a manual trigger beside its primary one, except one that commits back, where a manual run has no branch to land on
25
- - Default the token to read-only and grant a write scope only on the job that needs it
26
- - Bound artifact upload to failures and set an expiry on it
16
+ - A job is gated only on a data dependency or a cost that justifies the wait, and checks sharing setup stay in one job until a run log puts the gate past roughly two minutes
17
+ - Every action is pinned to a tag that cannot cross a major version, and every cache is keyed on the version of what it caches
18
+ - Every workflow carries a manual trigger beside its primary one, except one that commits back
19
+ - The token defaults to read-only, with a write scope granted only on the job that needs it
20
+ - Artifact upload is bounded to failures and expires
27
21
 
28
22
  ## Must not
29
23
 
30
- - Own what runs inside a job. The build, test, and deploy commands come from the project, and a workflow asserting its own is a second copy of the project's scripts.
31
- - Enumerate the job set as a fixed list. Projects add and remove jobs, and what has to survive that is the parallel and gated structure rather than the roster.
32
-
33
- ## Guards
34
-
35
- - A request for a deploy, publish, or release step stops at the gate. The job's contents carry credentials and an environment this skill cannot see, so it emits the `needs` wiring and names what the caller has to fill in rather than guessing a deploy command.
24
+ - Own what runs inside a job, or guess a deploy command. A deploy, publish, or release step gets its `needs` wiring and the inputs the caller fills in.
25
+ - Enumerate the job set as a fixed list
36
26
 
37
27
  ## Out of scope
38
28
 
39
- - Secrets, environments, and deploy targets, which live in the repository settings rather than in the workflow this skill writes
40
- - CI systems other than GitHub Actions. The structure rules generalize and the file format does not, so a different system is a different skill rather than a flag on this one.
29
+ - Secrets, environments, and deploy targets, which live in the repository settings
30
+ - The deploy setup on a host, which `deploy-app` owns
31
+ - CI systems other than GitHub Actions, which a separate skill would own