@erclx/canon 5.40.0 → 5.42.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 (187) hide show
  1. package/README.md +34 -17
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/references/adopted.md +34 -14
  4. package/claude/skills/auto-ship/REQUIREMENT.md +2 -0
  5. package/claude/skills/auto-ship/SKILL.md +28 -2
  6. package/claude/skills/auto-ship/references/draft-mark.md +32 -6
  7. package/claude/skills/auto-ship/references/failure-recovery.md +15 -13
  8. package/claude/skills/auto-ship/references/fan-in.md +59 -0
  9. package/claude/skills/auto-ship/references/tier-failures.md +31 -10
  10. package/claude/skills/auto-ship/references/ui-checklist.md +9 -4
  11. package/claude/skills/auto-ship/references/worktree-name.md +9 -3
  12. package/claude/skills/build-in-slices/references/adopted.md +35 -21
  13. package/claude/skills/canvas-board/references/canvas.md +17 -6
  14. package/claude/skills/canvas-board/references/design.md +26 -7
  15. package/claude/skills/code-craft/references/adopted.md +58 -20
  16. package/claude/skills/codebase-layout/references/adopted.md +49 -16
  17. package/claude/skills/codebase-layout/references/frontend.md +11 -4
  18. package/claude/skills/codebase-layout/references/tests.md +4 -2
  19. package/claude/skills/context-fold/references/classify.md +10 -15
  20. package/claude/skills/context-fold/references/completion-report.md +11 -9
  21. package/claude/skills/context-fold/references/context-refresh.md +26 -9
  22. package/claude/skills/context-fold/references/unusable-baseline.md +5 -3
  23. package/claude/skills/create-rule/REQUIREMENT.md +5 -0
  24. package/claude/skills/create-rule/SKILL.md +9 -1
  25. package/claude/skills/create-rule/references/checklist.md +26 -0
  26. package/claude/skills/create-rule/references/rule.md +98 -20
  27. package/claude/skills/create-skill/SKILL.md +1 -0
  28. package/claude/skills/create-skill/references/skill-disclosure.md +10 -2
  29. package/claude/skills/create-skill/references/skill-frontmatter.md +43 -0
  30. package/claude/skills/create-skill/references/skill-paths.md +7 -4
  31. package/claude/skills/create-skill/references/skill-practice.md +6 -3
  32. package/claude/skills/create-skill/references/skill-requirement.md +4 -2
  33. package/claude/skills/create-skill/references/skill.md +67 -44
  34. package/claude/skills/decision-escalate/REQUIREMENT.md +1 -1
  35. package/claude/skills/decision-escalate/SKILL.md +1 -2
  36. package/claude/skills/deploy-app/references/vercel.md +2 -1
  37. package/claude/skills/deprecation-migration/references/adopted.md +44 -25
  38. package/claude/skills/design-taste/references/adopted.md +9 -1
  39. package/claude/skills/design-taste/references/craft.md +3 -1
  40. package/claude/skills/design-taste/references/kinds.md +8 -7
  41. package/claude/skills/design-taste/references/preflight.md +12 -0
  42. package/claude/skills/design-taste/references/systems.md +7 -6
  43. package/claude/skills/design-taste/references/tells.md +24 -25
  44. package/claude/skills/design-taste/references/vocabulary.md +7 -5
  45. package/claude/skills/document-health/references/axes.md +54 -30
  46. package/claude/skills/draft-and-pick/references/live-arms.md +2 -2
  47. package/claude/skills/draft-doc/references/context.md +4 -3
  48. package/claude/skills/draft-doc/references/docs.md +6 -3
  49. package/claude/skills/draft-doc/references/readme/agent-facing.md +6 -0
  50. package/claude/skills/draft-doc/references/readme/application.md +8 -2
  51. package/claude/skills/draft-doc/references/readme/cli.md +5 -1
  52. package/claude/skills/draft-doc/references/readme/library.md +4 -0
  53. package/claude/skills/draft-doc/references/readme/plugin.md +9 -1
  54. package/claude/skills/draft-doc/references/readme.md +30 -13
  55. package/claude/skills/draft-doc/references/requirements.md +17 -4
  56. package/claude/skills/draft-doc/references/wiki-kind.md +20 -10
  57. package/claude/skills/draft-figure/references/architecture-set.md +7 -3
  58. package/claude/skills/draft-figure/references/figures.md +8 -6
  59. package/claude/skills/draft-figure/references/hand-drawn.md +3 -1
  60. package/claude/skills/draft-figure/references/mermaid-path.md +19 -9
  61. package/claude/skills/draft-figure/references/mermaid.md +10 -5
  62. package/claude/skills/draft-ready/references/ready.md +22 -15
  63. package/claude/skills/git-branch/REQUIREMENT.md +17 -6
  64. package/claude/skills/git-branch/SKILL.md +63 -7
  65. package/claude/skills/git-branch/references/branch.md +11 -1
  66. package/claude/skills/git-branch/references/slug.md +17 -5
  67. package/claude/skills/git-commit/references/commit.md +8 -0
  68. package/claude/skills/git-commit/references/versioning.md +23 -17
  69. package/claude/skills/git-followup/REQUIREMENT.md +1 -1
  70. package/claude/skills/git-followup/SKILL.md +5 -6
  71. package/claude/skills/git-issue/references/issue.md +29 -16
  72. package/claude/skills/git-pr/REQUIREMENT.md +1 -5
  73. package/claude/skills/git-pr/SKILL.md +11 -22
  74. package/claude/skills/git-pr/references/final-command.md +21 -8
  75. package/claude/skills/git-pr/references/labels.md +45 -28
  76. package/claude/skills/git-pr/references/pr.md +28 -9
  77. package/claude/skills/git-pr/references/publish.md +42 -28
  78. package/claude/skills/git-pr/references/task-number.md +20 -8
  79. package/claude/skills/git-ship/SKILL.md +1 -1
  80. package/claude/skills/plan-feature/references/batches.md +48 -1
  81. package/claude/skills/plan-feature/references/plan-lifecycle.md +10 -3
  82. package/claude/skills/plan-feature/references/plan.md +59 -20
  83. package/claude/skills/plan-groundwork/references/groundwork-spikes.md +4 -1
  84. package/claude/skills/plan-groundwork/references/groundwork.md +14 -16
  85. package/claude/skills/plan-intake/references/intake.md +29 -24
  86. package/claude/skills/plan-intake-answer/REQUIREMENT.md +1 -1
  87. package/claude/skills/plan-intake-answer/SKILL.md +1 -2
  88. package/claude/skills/pr-evidence/REQUIREMENT.md +40 -0
  89. package/claude/skills/pr-evidence/SKILL.md +53 -0
  90. package/claude/skills/pr-evidence/references/evidence.md +150 -0
  91. package/claude/skills/review-address/references/post-review-findings.md +10 -3
  92. package/claude/skills/review-address/references/rebase-conflicts.md +22 -7
  93. package/claude/skills/review-address/references/rest-reads.md +3 -1
  94. package/claude/skills/review-craft/references/adopted.md +35 -18
  95. package/claude/skills/review-craft/references/security.md +42 -7
  96. package/claude/skills/review-craft/references/ui.md +23 -8
  97. package/claude/skills/review-pr/SKILL.md +6 -6
  98. package/claude/skills/review-pr/references/body-variants.md +29 -9
  99. package/claude/skills/review-pr/references/close-out.md +20 -5
  100. package/claude/skills/review-pr/references/key-changes.md +27 -3
  101. package/claude/skills/review-pr/references/post.md +83 -31
  102. package/claude/skills/review-pr/references/scope.md +54 -19
  103. package/claude/skills/review-ui/SKILL.md +2 -0
  104. package/claude/skills/review-ui/references/close-out.md +49 -0
  105. package/claude/skills/review-ui/references/driving.md +24 -4
  106. package/claude/skills/review-ui/references/post.md +43 -13
  107. package/claude/skills/role-orchestrator/references/orchestrator-cloud-launch.md +67 -17
  108. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +81 -40
  109. package/claude/skills/role-orchestrator/references/orchestrator-handback.md +52 -15
  110. package/claude/skills/role-orchestrator/references/orchestrator-handoff.md +48 -26
  111. package/claude/skills/role-orchestrator/references/orchestrator-inbound.md +12 -13
  112. package/claude/skills/role-orchestrator/references/orchestrator-launch.md +72 -36
  113. package/claude/skills/role-orchestrator/references/orchestrator-output.md +12 -4
  114. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +64 -24
  115. package/claude/skills/role-orchestrator/references/orchestrator-poll.md +80 -26
  116. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +41 -18
  117. package/claude/skills/role-orchestrator/references/orchestrator-resume.md +19 -7
  118. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +22 -12
  119. package/claude/skills/role-orchestrator/references/orchestrator-reviewer-launch.md +15 -6
  120. package/claude/skills/role-orchestrator/references/orchestrator-sweep.md +25 -7
  121. package/claude/skills/role-orchestrator/references/orchestrator-watch.md +34 -8
  122. package/claude/skills/role-orchestrator/scripts/poll.ts +16 -24
  123. package/claude/skills/role-worker/REQUIREMENT.md +2 -0
  124. package/claude/skills/role-worker/SKILL.md +17 -0
  125. package/claude/skills/search-craft/references/adopted.md +18 -6
  126. package/claude/skills/session-map/references/session.md +26 -7
  127. package/claude/skills/session-worktree/references/main-root-writes.md +25 -8
  128. package/claude/skills/systematic-debugging/references/adopted.md +30 -16
  129. package/claude/skills/target-check/references/domains.md +39 -11
  130. package/claude/skills/target-setup/references/detect.md +80 -65
  131. package/claude/skills/target-setup/references/indexes.md +8 -6
  132. package/claude/skills/task-board/references/board.md +86 -30
  133. package/claude/skills/task-board/references/decline.md +29 -13
  134. package/claude/skills/task-board/references/tasks-decline.md +12 -5
  135. package/claude/skills/task-board/references/tasks.md +65 -33
  136. package/claude/skills/task-complete/references/archive.md +41 -17
  137. package/claude/skills/task-complete/references/receipt-sweep.md +23 -9
  138. package/claude/skills/task-complete/references/unusable-baseline.md +10 -3
  139. package/claude/skills/teach-workspace/REQUIREMENT.md +1 -1
  140. package/claude/skills/teach-workspace/SKILL.md +1 -2
  141. package/claude/skills/teach-workspace/references/glossary.md +6 -2
  142. package/claude/skills/teach-workspace/references/lesson-build.md +44 -16
  143. package/claude/skills/teach-workspace/references/lesson-craft.md +12 -7
  144. package/claude/skills/teach-workspace/references/pedagogy.md +6 -3
  145. package/claude/skills/teach-workspace/references/promotion-fold.md +17 -11
  146. package/claude/skills/teach-workspace/references/promotion.md +31 -8
  147. package/claude/skills/teach-workspace/references/revisit.md +8 -2
  148. package/claude/skills/teach-workspace/references/teach.md +17 -9
  149. package/claude/skills/test-craft/references/adopted.md +48 -14
  150. package/claude/skills/test-craft/references/component.md +7 -4
  151. package/claude/skills/test-craft/references/e2e.md +25 -7
  152. package/claude/skills/test-craft/references/unit.md +3 -1
  153. package/claude/skills/test-first/references/adopted.md +12 -4
  154. package/claude/skills/ui-checklist/REQUIREMENT.md +1 -1
  155. package/claude/skills/ui-checklist/SKILL.md +1 -1
  156. package/claude/skills/video-craft/references/adopted.md +62 -18
  157. package/claude/skills/write-human/references/adopted.md +21 -8
  158. package/docs/workflow/parallel-features.md +2 -1
  159. package/docs/workflow/skill-map.md +2 -1
  160. package/package.json +1 -1
  161. package/src/claude/cases/git.ts +4 -0
  162. package/src/claude/cases/workflow.ts +5 -0
  163. package/src/commands/pr.ts +174 -37
  164. package/src/commands/records.ts +11 -3
  165. package/src/context/shape-gated.ts +1 -0
  166. package/src/markdown/scope.ts +150 -2
  167. package/src/pr/frames.ts +53 -9
  168. package/src/pr/lift.ts +6 -3
  169. package/src/pr/review-state.ts +182 -0
  170. package/src/records/validate.ts +1 -0
  171. package/src/tasks/answers.ts +79 -2
  172. package/src/tasks/fan-in.ts +176 -0
  173. package/src/tasks/stack.ts +1 -1
  174. package/tooling/astro/reference.md +80 -39
  175. package/tooling/base/reference.md +63 -32
  176. package/tooling/base/seeds/canon/context/ci.md +7 -15
  177. package/tooling/base/seeds/canon/context/development.md +14 -14
  178. package/tooling/claude/reference.md +40 -22
  179. package/tooling/cloudflare/reference.md +31 -12
  180. package/tooling/go/reference.md +47 -23
  181. package/tooling/nextjs/reference.md +52 -19
  182. package/tooling/php/reference.md +35 -16
  183. package/tooling/python/reference.md +47 -30
  184. package/tooling/shell/reference.md +6 -5
  185. package/tooling/vite-react/reference.md +49 -21
  186. package/tooling/web/reference.md +130 -70
  187. package/claude/skills/git-pr/references/evidence.md +0 -124
@@ -5,19 +5,26 @@ description: How context-fold Step 3 folds diff-scoped rewrites into canon/conte
5
5
 
6
6
  # Refresh context entries
7
7
 
8
- Step 3 of `context-fold`, reached in order once `canon/context/index.md` lists at least one entry.
9
-
10
- The diff carries what the repository changed, and this step rewrites against it.
8
+ Step 3 of `context-fold`, reached in order once `canon/context/index.md` lists at least one entry. The diff carries what the repository changed, and this step rewrites against it.
11
9
 
12
10
  When the baseline is unusable, scope this step to the working tree and untracked files, and skip it only when that set is empty, reporting `⚠ No diff to scope against. Skipped the context refresh.`
13
11
 
14
- Reuse the diff from the baseline above, names and content both. For each domain listed in `canon/context/index.md`, read its own entry: a flat `canon/context/<domain>.md`, or, for a domain split into a folder, its `canon/context/<domain>/index.md` and every sibling file that index links. Follow the index rather than globbing the folder, since a folder can hold a file the index does not list yet.
12
+ ## Reading each entry
13
+
14
+ Reuse the diff from the baseline above, names and content both. For each domain listed in `canon/context/index.md`, read its own entry, following the index rather than globbing the folder, since a folder can hold a file the index does not list yet.
15
+
16
+ - A flat domain reads `canon/context/<domain>.md`
17
+ - A domain split into a folder reads its `canon/context/<domain>/index.md` and every sibling file that index links
18
+
19
+ ### What to rewrite
20
+
21
+ An entry is relevant only when the diff touches what it states, and the rewrite stays inside the part the trigger names.
15
22
 
16
23
  - Treat an entry as relevant only when the diff adds, moves, or removes a folder its Layout lists, makes a folder's bullet untrue, or changes a trap it names
17
24
  - For each relevant entry, rewrite only the H3 or the gotcha the trigger names, and leave unrelated sections alone
18
25
  - Never rewrite a split domain's own `index.md`, which a regen overwrites, and rewrite the sibling file the section lives in instead
19
26
  - Edit the bullet that went untrue in place and never append one beside it, the same rule the body states.
20
- - Write a reference to another entry as the path that entry sits at, rather than as its bare filename. `${CLAUDE_SKILL_DIR}/references/context.md` states the form, and a bare name strands the reference once a domain splits into subfolders.
27
+ - Write a reference to another entry as the path that entry sits at, per `${CLAUDE_SKILL_DIR}/references/context.md`, since a bare filename strands it once a domain splits into subfolders
21
28
 
22
29
  ## When the diff removes a capability
23
30
 
@@ -25,15 +32,25 @@ The mapping above is scoped by file, and a removal invalidates claims that mappi
25
32
 
26
33
  Grep the tree for the name that went, rather than for the paths the diff carries. A capability removed by name is cited by that name, which reaches a file the diff never touched.
27
34
 
28
- - An entry this run already rewrote is read whole before it is left. A refresh that updates the top and leaves a contradicting claim below reads worse than an untouched entry, because the current opening lends authority to the stale remainder. This is the one case that overrides "do not touch unrelated sections", and it overrides it only inside an entry the run edited anyway.
29
- - A claim comparing two surfaces is checked even where its file is outside the diff. Such a claim holds only while both surfaces do, so moving one inverts it with nobody editing the file it sits in.
35
+ - Read an entry this run rewrote whole before leaving it. An updated top over a contradicting claim below reads worse than an untouched entry, since the opening lends authority to the stale rest.
36
+ - That is the one case overriding "do not touch unrelated sections", and only inside an entry the run edited anyway
37
+ - Check a claim comparing two surfaces even where its file is outside the diff. It holds only while both surfaces do, so moving one inverts it with nobody editing its file.
30
38
 
31
39
  Report each hit as an ordinary rewrite.
32
40
 
33
- Create a new entry only for a domain `canon/context/index.md` already lists but carries no file for, following `${CLAUDE_SKILL_DIR}/references/context.md` for its shape. Before treating a domain as carrying no file, confirm it holds no entry under either spelling, `canon/context/<domain>.md` or `canon/context/<domain>/index.md`, since a domain already split into a folder still passes a check that only looked for the flat file. A row in the catalog is the deliberate decision, taken by whoever added it. This step only fills in what that decision left open, and only until the next `canon indexes regen` pass, which rebuilds the catalog from each entry's own frontmatter plus every sibling's and drops a row whose file still does not exist. Create the file before that regen runs, or the row this bar exists to fill in is gone. A domain the catalog does not list at all is a different case: report it and stop, rather than creating an entry or a catalog row for it.
41
+ ## Creating an entry
42
+
43
+ Create a new entry only for a domain `canon/context/index.md` already lists but carries no file for, following `${CLAUDE_SKILL_DIR}/references/context.md` for its shape. A row in the catalog is the deliberate decision, taken by whoever added it, and this step only fills in what that decision left open.
44
+
45
+ - Confirm the domain holds no entry under either spelling, `canon/context/<domain>.md` or `canon/context/<domain>/index.md`, since a split domain passes a check for the flat file alone
46
+ - The next `canon indexes regen` rebuilds the catalog from each entry's frontmatter plus every sibling's, dropping a row whose file does not exist. Create the file before it runs.
47
+ - A domain the catalog does not list at all is a different case. Report it and stop, rather than creating an entry or a catalog row for it.
48
+
49
+ ## Writing and reporting
34
50
 
35
51
  Write each updated entry immediately. Output one line per file, naming the path this run actually wrote rather than always the flat template:
36
52
 
37
- `✅ Context: canon/context/<domain>.md` for a flat entry, or `✅ Context: canon/context/<domain>/<sub-area>.md` for the sibling file a nested edit landed in
53
+ - `✅ Context: canon/context/<domain>.md` for a flat entry
54
+ - `✅ Context: canon/context/<domain>/<sub-area>.md` for the sibling file a nested edit landed in
38
55
 
39
56
  The base lint-staged config runs `canon indexes regen` on every committed `*.md`, so `canon/context/index.md` refreshes automatically on commit. No manual step needed.
@@ -14,8 +14,10 @@ The baseline is unusable in two cases:
14
14
 
15
15
  An unusable baseline costs only the committed half. `git diff <base> HEAD` is empty by definition once the base equals HEAD, while `git diff HEAD` and `git ls-files --others --exclude-standard` still report uncommitted and untracked work at correct scope.
16
16
 
17
- **Step 3 keeps the scoped set.** Run it on the working tree and untracked files alone, and skip only when that set comes out empty, reporting the warning its own reference names.
17
+ ## Step 3 keeps the scoped set
18
18
 
19
- Never substitute the whole tree for a missing baseline, and do not widen to `git log -p -1` for coverage. On a fresh `git init` project the last commit is the scaffold commit, so that read is the whole tree by another route, and Step 3 writes, so the same set rewrites every context entry that tree touches. `task-complete` takes the widened read for its marking step, which only reads and matches conservatively against outcomes already on the board.
19
+ Run Step 3 on the working tree and untracked files alone, and skip only when that set comes out empty, reporting the warning its own reference names. Widening what a step reads is safe, and widening what a step writes is not.
20
20
 
21
- Widening what a step reads is safe. Widening what a step writes is not.
21
+ - Never substitute the whole tree for a missing baseline, and do not widen to `git log -p -1` for coverage
22
+ - On a fresh `git init` project the last commit is the scaffold, so that read is the whole tree by another route. Step 3 writes, so it would rewrite every context entry that tree touches.
23
+ - `task-complete` takes the widened read for its marking step, which only reads and matches conservatively against outcomes already on the board
@@ -18,6 +18,11 @@ The subdir gets picked by feel, so a UI copy rule lands in the always-on folder
18
18
  - Write under `.claude/rules/project/`, the subfolder the sync engine reads as project-authored by location
19
19
  - Take a slug no rule in the chosen project subdir uses and that equals no subdir name
20
20
  - Read the rule standard before writing the body
21
+ - Hold the body to the rule standard's shape limits on words, bullets, sections, and bullet length
22
+ - Apply the content test, leaving out what Claude already knows, what the toolchain enforces, and what changes often
23
+ - Check the installed skills for one already covering the topic and point the rule at it, skipping the check when none are listed
24
+ - Run every written bullet through the checklist and fix what fails before reporting
25
+ - Tell the user to cite a source in the commit that adds a rule claiming outside practice
21
26
  - Emit the path scope for a path-scoped rule and omit the key entirely for an always-on one
22
27
  - Preview the resolved path, subdir, slug, and frontmatter, then write without pausing
23
28
  - Say when the rule loads, since path-scoped and always-on rules behave differently
@@ -22,6 +22,7 @@ Resolve both from the request, and ask only for what is missing. Attach a propos
22
22
 
23
23
  - What the rule enforces: one topic, phrased as a standard (`<topic> conventions`).
24
24
  - Scope: a path glob relative to the project root (`<dir>/**/*.<ext>`) for a path-scoped rule, or always-on when the rule states a global principle with no file scope.
25
+ - An installed skill already covering the topic, found per `### Checking the installed skills` in `${CLAUDE_SKILL_DIR}/references/rule.md`. Point the rule at it rather than restating it.
25
26
 
26
27
  ## Step 2: resolve the subdir
27
28
 
@@ -74,6 +75,13 @@ paths:
74
75
 
75
76
  Title casing is sentence case, with proper nouns keeping their own casing (`# TypeScript standards`). `${CLAUDE_SKILL_DIR}/references/rule.md` owns the rest of the body shape.
76
77
 
78
+ ## Step 5: check each bullet
79
+
80
+ Read `${CLAUDE_SKILL_DIR}/references/checklist.md` and run every bullet of the written rule through it, along with the shape limits and the content test in `rule.md`.
81
+
82
+ - Rewrite a bullet marked revise and cut one marked drop, then run the checklist again over what changed
83
+ - Report the verdict counts with the path, and name any bullet kept against a criterion with the reason
84
+
77
85
  ## After writing
78
86
 
79
- Emit the full path on its own line: `.claude/rules/project/<subdir>/<slug>.md`. Remind the user that Claude Code loads path-scoped rules when it reads or writes a matching file, and always-on rules every session.
87
+ Emit the full path on its own line: `.claude/rules/project/<subdir>/<slug>.md`. Remind the user that Claude Code loads path-scoped rules when it reads or writes a matching file, and always-on rules every session. When a bullet claims outside practice, tell them to cite its source in the commit that adds the rule.
@@ -0,0 +1,26 @@
1
+ ---
2
+ title: Rule bullet checklist
3
+ description: Criteria a session runs over each bullet of a rule it just wrote or revised, and the verdict shape it returns
4
+ ---
5
+
6
+ # Rule bullet checklist
7
+
8
+ A session reads this after writing or revising a rule, once the body holds its bullets. `rule.md` sets the shape before writing, and this list judges each bullet after.
9
+
10
+ For each bullet in the rule under audit, return `✅ keep`, `⚠️ revise`, or `❌ drop` with a one-line reason.
11
+
12
+ ## Criteria
13
+
14
+ 1. **Concrete enough to verify.** A reviewer can read a line of code and say whether it complies. "Prefer `pathlib.Path` over `os.path`" passes, since it names both sides.
15
+ 2. **Catches a real footgun or a project convention.** A violation produces a bug class, such as blocking I/O in async, or departs from a convention the content test admits. Drop it otherwise.
16
+ 3. **Not redundant with the toolchain.** Skip anything the project's formatter, linter, type checker, or spell checker already enforces. Rules cover what tools cannot.
17
+ 4. **Uncontested.** When the community is split, drop the bullet or pick a side with a short reason tied to the stack.
18
+ 5. **Inside the shape.** At most 200 characters and 2 sentences, one directive plus at most one exception, condition, or short reason, per `## Shape` in `rule.md`.
19
+ 6. **Passes the content test.** Claude could not guess it, and it is not a standard convention or information that changes often, per `## Content` in `rule.md`.
20
+ 7. **Frontmatter integrity.** `description` names one concern in one line, and a path-scoped rule carries one `paths:` entry per glob.
21
+ 8. **Retired keys and names.** An always-on rule omits `paths:`, and no rule carries `globs:`, `alwaysApply:`, or `priority:`. The basename names no folder.
22
+ 9. **Template precedent.** H1 and H2 in sentence case and imperative bullets, matching `## Body` in `rule.md`.
23
+
24
+ ## Output shape
25
+
26
+ Group findings by file. Lead each file block with the per-file verdict count.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Governance rule reference
3
- description: Rule frontmatter, body shape, and voice for .claude/rules files
3
+ description: Rule frontmatter, shape limits, content test, sources, body shape, and voice for .claude/rules files
4
4
  ---
5
5
 
6
6
  # Governance rule reference
@@ -9,7 +9,10 @@ description: Rule frontmatter, body shape, and voice for .claude/rules files
9
9
 
10
10
  - [Overview](#overview)
11
11
  - [Scope](#scope)
12
+ - [Shape](#shape)
13
+ - [Content](#content)
12
14
  - [Whether a skill belongs behind the rule](#whether-a-skill-belongs-behind-the-rule)
15
+ - [Sources](#sources)
13
16
  - [Location](#location)
14
17
  - [Names](#names)
15
18
  - [Frontmatter](#frontmatter)
@@ -18,29 +21,84 @@ description: Rule frontmatter, body shape, and voice for .claude/rules files
18
21
 
19
22
  ## Overview
20
23
 
21
- Rules give Claude Code coding constraints scoped to file paths. Claude Code discovers `.claude/rules/**/*.md` at session start.
24
+ Rules give Claude Code coding constraints scoped to file paths. Claude Code discovers `.claude/rules/**/*.md` at session start, and a rule in `~/.claude/rules/` applies to every project on the machine.
22
25
 
23
26
  A rule with no `paths:` field always applies, at the same priority as `CLAUDE.md`. A rule with `paths:` applies when Claude reads or writes a file matching the glob. Author one rule per topic so the scope stays precise.
24
27
 
25
- A rule with `paths:` loads on a read or a write of a matching file, inside a linked worktree as in the main one. A session creating the first matching file gets the rule only after that write lands, so a rule meant to shape new files also belongs in the skill or the always-on rule a session reads before it writes. Revisit when Claude Code loads a path-scoped rule before a write to a matching path. Re-measure with two headless `claude -p` runs in a linked worktree, one reading a matching file and one reading a file that does not match, each asking whether the rule's content is in context.
28
+ ### When a path-scoped rule loads
29
+
30
+ A rule with `paths:` loads on a read or a write of a matching file, inside a linked worktree as in the main one. A session creating the first matching file gets the rule only after that write lands.
31
+
32
+ - The first write's floor therefore belongs to the skill that creates the file, per `## Whether a skill belongs behind the rule`
33
+ - Measured again on Claude Code 2.1.302, when the rule attached after the first write to a new file and before the second
34
+ - Revisit when Claude Code loads a path-scoped rule before a write to a matching path
35
+ - Re-measure with two headless `claude -p` runs, one writing a new matching file and one reading a matching file first, each read for when the rule attached
26
36
 
27
37
  ## Scope
28
38
 
29
- Governs governance rules under `.claude/rules/`: their location, names, frontmatter, and body shape.
39
+ Governs governance rules under `.claude/rules/`, being their shape, content, sources, location, names, frontmatter, and body.
30
40
 
31
41
  Does not govern:
32
42
 
33
43
  - Authoring conventions for a document type, which are standards rather than rules. A rule points at the standard that owns one and never restates it.
34
44
  - Skill folders and skill frontmatter: `skill.md`
35
45
  - Cross-domain behavior rules, which live in `CLAUDE.md` at the project root
46
+ - Judging each bullet after writing, which is `checklist.md`
47
+
48
+ ## Shape
49
+
50
+ Every limit is a count a reviewer can take, so a rule passes or fails it without judgment.
51
+
52
+ | Limit | Value |
53
+ | -------------------- | --------------------------------------------------------------- |
54
+ | Words in the body | 300 |
55
+ | Bullets per file | 15 |
56
+ | H2s per file | 6 |
57
+ | Bullets per H2 | 7 |
58
+ | Bullet length | 200 characters |
59
+ | Sentences per bullet | 2, one directive plus one exception, condition, or short reason |
60
+
61
+ - Name one concern in `description`. A rule needing a seventh H2 holds two concerns and splits into two files.
62
+ - Keep a reason to the why of its directive, never a paragraph of background
63
+
64
+ ## Content
65
+
66
+ A bullet loads on every matching edit, so it earns its place only when removing it would cause a mistake.
67
+
68
+ | Put in a rule | Leave out |
69
+ | ------------------------------------------ | -------------------------------------------------------- |
70
+ | What Claude cannot guess | Standard language conventions Claude already knows |
71
+ | A convention that differs from the default | Anything the linter, formatter, or type checker enforces |
72
+ | A footgun that ships silently | Information that changes often |
73
+
74
+ - Write every bullet concrete enough to verify against a line of code. "Prefer `pathlib.Path` over `os.path`" passes, since it names both sides.
75
+ - Pair a ban with the alternative to take, unless the ban or a neighbor bullet already names it
76
+ - Use no emphasis words such as "CRITICAL" or "You MUST", which newer models overtrigger on
36
77
 
37
78
  ## Whether a skill belongs behind the rule
38
79
 
39
- A rule fires on a path match with no decision from the session, which is what makes it a floor. Every bullet is one directive and nothing else, so an invariant needing procedure, worked cases, or a branch on project state has no room in the body.
80
+ A rule fires on a path match with no decision from the session, which is what makes it a floor. Procedure, worked cases, and a branch on project state have no room in its bullets, so they belong to a skill.
81
+
82
+ Each invariant has one copy, in either the rule or the skill. `skill.md` carries the same test for a session arriving from the other side.
83
+
84
+ - A skill that creates the file the rule globs owns the floor, since the rule loads only after the first write. The rule keeps the edit-time bullets and a pointer.
85
+ - A skill that edits existing files points at the rule, and the rule owns the floor
86
+ - A pointer bullet earns its load only when the skill's description does not already fire on the same edit
87
+ - Keep at most five directives beside a pointer
88
+ - A rule that grows a procedure has become a skill body wearing rule frontmatter
40
89
 
41
- Run the two-part test in reverse before calling the rule finished. The rule already holds what fires on a path edit and ships silently when violated. Ask what a session still needs past the directive, and give that to a skill the rule points at, because a rule that grows a procedure has become a skill body wearing rule frontmatter.
90
+ ### Checking the installed skills
42
91
 
43
- Write both when both apply. A rule stating the directive and a skill stating how to carry it out are one invariant at two depths rather than two copies of it, and `skill.md` carries the same checkpoint for a session arriving from the other side. Nothing checks either one.
92
+ Before writing, read the descriptions of the skills in the session's listing and stop at one that names the topic. Point the rule at that skill rather than restating it, and skip the check when the listing holds no skills.
93
+
94
+ ## Sources
95
+
96
+ A bullet claiming outside practice, such as a language idiom or a library's correct use, rests on a primary source. Unsourced practice drifts, and the bullet goes on loading after it turns wrong.
97
+
98
+ - Cite the source in the commit that adds the rule, naming a primary page or the bug class the bullet prevents
99
+ - Cut a bullet that has neither a source nor a bug class behind it
100
+ - The toolkit holds its outside-practice rules to a source ledger kept outside the installed tree, so the citation costs no load
101
+ - A bullet resting on how Claude Code behaves ends with a `Revisit when` sentence, per `### Phrasing`
44
102
 
45
103
  ## Location
46
104
 
@@ -56,14 +114,20 @@ A rule's filename is its slug, with no number in front. Nothing orders rules at
56
114
 
57
115
  - Keep every basename unique across a rule set, internal rules included, since `canon gov` resolves a stack entry and a rename by basename alone.
58
116
  - Never name a rule after a subdirectory. A stack entry naming that word expands to the whole folder, so the rule becomes unreachable on its own.
59
- - A project-authored rule needs its slug free only inside its own subdirectory under `.claude/rules/project/`. A slug the toolkit ships collides with nothing there, since `canon/` and `project/` install side by side.
117
+ - A project-authored rule needs its slug free only inside its own subdirectory under `.claude/rules/project/`, since `canon/` and `project/` install side by side
60
118
 
61
- `canon gov sync` walks only `.claude/rules/canon/`, so `.claude/rules/project/` sits outside the walk by location and is never matched, read, or reported on. A file under `.claude/rules/canon/` itself that no toolkit source names is still reported orphaned, but with no destination offered: the toolkit cannot tell a rule the project dropped there from one it shipped and later renamed, and a destination nested inside `canon/` would be wrong for the first case regardless, since that folder is toolkit-owned and replaced on sync. Nothing is moved either way, since a rule's installed path is one the project's own rules, skills, and docs may cite.
119
+ ### What sync reads
120
+
121
+ `canon gov sync` walks only `.claude/rules/canon/`, so `.claude/rules/project/` is never matched, read, or reported on. A file under `.claude/rules/canon/` that no toolkit source names is reported orphaned, with no destination offered.
122
+
123
+ - The toolkit cannot tell a rule the project dropped there from one it shipped and later renamed
124
+ - A destination inside `canon/` would be wrong for the first case anyway, since that folder is toolkit-owned and replaced on sync
125
+ - Nothing is moved either way, since the project's own rules, skills, and docs may cite a rule's installed path
62
126
 
63
127
  ## Frontmatter
64
128
 
65
- - `description` (required): one line naming what the rule enforces and where
66
- - `paths` (optional): one glob per entry, for a rule scoped to a file set
129
+ - `description` (required): one line naming what the rule enforces and where. It is canon's own field, read by `canon gov list`.
130
+ - `paths` (optional): one glob per entry, for a rule scoped to a file set. It is the only field Claude Code reads.
67
131
  - Omit `paths` for an always-on rule that states a global principle with no file scope
68
132
  - Do not emit the legacy Cursor keys `globs`, `alwaysApply`, or `priority`. They are not read.
69
133
 
@@ -75,47 +139,61 @@ paths:
75
139
  ---
76
140
  ```
77
141
 
142
+ Frontmatter that fails to parse loads the rule as if it had no `paths`, so a broken glob turns a scoped rule always-on. Quote every glob that opens with `*` or `{`.
143
+
78
144
  ## Body
79
145
 
80
146
  - Open with an H1 `# <Topic> standards` in sentence case, then group rules under H2 sections. Proper nouns keep their casing (`# TypeScript standards`, `# Next.js standards`).
81
147
  - Use imperative voice for every rule (`Prefix booleans with is`, not `Booleans should be prefixed`)
82
148
  - State one rule per bullet as a single directive line
83
- - State what to do and what not to do. Do not explain the reasoning behind a rule.
149
+ - State what to do and what not to do. Add one short reason when the why is not obvious, inside the limits in `## Shape`.
84
150
 
85
151
  ### Phrasing
86
152
 
87
- - End the directive line of a ban asserting how the model or a tool behaves with one `Revisit when <finding>.` sentence, which states a condition rather than the reasoning. A style, safety, or consistency ban takes none.
153
+ A ban asserting how the model or a tool behaves ends its directive line with one `Revisit when <finding>.` sentence, which states a condition rather than the reasoning. A style, safety, or consistency ban takes none.
154
+
88
155
  - Phrase a rule as a ban on the forbidden shape when it could otherwise enumerate allowed options, so it stays stable as categories grow
89
156
  - Cut any rule that resists crisp one-line phrasing. Vague guidance is worse than none.
90
157
 
91
158
  ### Scope of a rule file
92
159
 
160
+ A rule file holds one topic in its current shape.
161
+
93
162
  - Keep the file to one topic. A second topic is a second rule file.
94
163
  - Do not restate a rule that a sibling rule or `CLAUDE.md` already owns. Point once, never duplicate.
95
- - Name the current layout only, in a glob and in the body alike. A layout change ships a migration verb, as `canon migrate surface-roots` and `canon migrate records` did, rather than a rule line or a glob that keeps the old spelling loading.
164
+ - Name the current layout only, in a glob and in the body alike
165
+ - A layout change ships a migration verb, such as `canon migrate records`, rather than a line or a glob that keeps the old spelling loading
96
166
 
97
167
  ## Examples
98
168
 
99
169
  ### Correct
100
170
 
171
+ A scoped description, a `paths` list, and one directive per bullet, one of them carrying a short reason.
172
+
101
173
  ```markdown
102
174
  ---
103
- description: Enforce naming conventions for functions, booleans, and collections
175
+ description: Enforce migrations, bound queries, and transaction ownership for persistence code
104
176
  paths:
105
177
  - '**/*.ts'
106
178
  ---
107
179
 
108
- # Naming standards
180
+ # Persistence standards
109
181
 
110
- ## Semantics
182
+ ## Schema changes
111
183
 
112
- - Prefix booleans with `is`, `has`, `should`, or `can`
113
- - Name functions as actions describing what they do
114
- - Name collections as plurals and items as singulars
184
+ - Express every schema change as a migration file committed to version control.
185
+ - Never edit a migration that has run in a shared environment. Add a new one.
186
+
187
+ ## Query construction
188
+
189
+ - Pass every runtime value as a bound parameter.
190
+ - Map a table name or sort direction through an allow-list, since neither can be bound.
115
191
  ```
116
192
 
117
193
  ### Incorrect
118
194
 
195
+ A vague description, legacy Cursor keys, and a paragraph of reasoning in place of directives.
196
+
119
197
  ```markdown
120
198
  ---
121
199
  description: Naming
@@ -13,6 +13,7 @@ Read these files in parallel:
13
13
  - `${CLAUDE_SKILL_DIR}/references/skill-requirement.md`: what `REQUIREMENT.md` must answer, its sections, and its template
14
14
  - `${CLAUDE_SKILL_DIR}/references/skill-paths.md`: which root a path in the body resolves against, and how the body cites another skill's reference
15
15
  - `${CLAUDE_SKILL_DIR}/references/skill-disclosure.md`: where each reference is named, the contents block, the trigger and guard that stay in the body, and what moves to `references/`
16
+ - `${CLAUDE_SKILL_DIR}/references/skill-frontmatter.md`: the frontmatter fields, their limits, and which keys an upload accepts
16
17
 
17
18
  ### Writing standards
18
19
 
@@ -5,22 +5,30 @@ description: Keeping a skill body and its references under the ceiling, what mov
5
5
 
6
6
  # Skill disclosure reference
7
7
 
8
+ Checked against the [skill authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices) page on `2026-10-18`.
9
+
8
10
  Applies to the size and split of every `SKILL.md` and every file under a skill's `references/`.
9
11
 
10
12
  ## Rules
11
13
 
12
14
  - Keep `SKILL.md` and each file under `references/` at or under the 300 rendered line ceiling `markdown.md` sets for a whole document. The ceiling binds procedure as much as reference material.
15
+ - Treat the 300 as canon's own choice, stricter than the 500 lines Anthropic sets for a `SKILL.md`.
13
16
  - Look at a body once it passes 150 lines. That number prompts a look and gates nothing.
14
17
  - Move a catalog, a table of cases, or a format spec running past roughly 15 lines to `references/` at any body length.
15
18
  - Below the ceiling, name the branch that skips a block before moving it. A block every run dereferences costs a read and saves nothing.
16
19
 
17
20
  ### Moving a step
18
21
 
19
- - Past the ceiling, move a whole step to a reference, preferring a step a named branch skips. Keep the step heading in the body with one line naming the file to read on reaching it, so the body still shows every step in order.
20
- - Name every file under `references/` in the body at the point a session reads it, since an unnamed reference is never loaded.
22
+ Past the ceiling, move a whole step to a reference, preferring a step a named branch skips.
23
+
24
+ - Keep the step heading in the body with one line naming the file to read on reaching it, so the body still shows every step in order
25
+ - Name every file under `references/` in the body at the point a session reads it, since an unnamed reference is never loaded
21
26
 
22
27
  ### Contents, triggers, and citations
23
28
 
29
+ A reference is read from the top, and only when the body sends a session to it.
30
+
24
31
  - Open a file under `references/` running over 100 lines with a `## Contents` H2 of anchor links after its H1 and intro, so a session that reads only the top of the file still sees everything it holds.
25
32
  - Keep the trigger, the skip condition, and the guard in the body. A run that never reaches the block has to decide that without opening the reference.
33
+ - Keep references one level deep from `SKILL.md`. A file linked from a reference gets a partial read.
26
34
  - Point one skill at a sibling skill's reference by the form `skill-paths.md` states, `${CLAUDE_SKILL_DIR}/../<skill>/references/<name>.md`, and name the owner rather than copying the file.
@@ -0,0 +1,43 @@
1
+ ---
2
+ title: Skill frontmatter reference
3
+ description: The frontmatter fields a skill carries, their limits, and which keys a claude.ai upload accepts
4
+ ---
5
+
6
+ # Skill frontmatter reference
7
+
8
+ Checked against the [Claude Code skills](https://code.claude.com/docs/en/skills) and [skill authoring best practices](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices) pages on `2026-10-18`.
9
+
10
+ ## Fields
11
+
12
+ - **`name`** (required): kebab-case, matches folder name, no spaces or capitals, and at most 64 characters
13
+ - **Reserved words**: an upload to claude.ai or the API rejects `anthropic` and `claude` in a name, and Claude Code does not.
14
+ - **`description`** (required): what it does + when to use it, under 1024 chars, no XML tags. That is the portable maximum.
15
+ - **Listing cap**: Claude Code truncates `description` plus `when_to_use` at 1,536 characters in its skill listing, so put the key use case first.
16
+ - **`disable-model-invocation: true`**: Claude will not auto-trigger, and the `Skill` tool also refuses the operator's request made in words. Set it only on a skill run by slash command alone.
17
+ - **`allowed-tools`**: tools Claude can use without asking permission during the turn that invokes the skill, cleared at the next message. It grants and never limits the tool set.
18
+ - **`metadata`**: optional key-value pairs (`author`, `version`, `mcp-server`)
19
+ - **`metadata.family`** (required under `claude/skills/`): the skill map group, as one key from `families` in `canon claude skills list --json`. A skill under `.claude/skills/` takes none.
20
+
21
+ Outside Claude Code, only `name`, `description`, `license`, `compatibility`, `metadata`, and `allowed-tools` pass an upload, and any other key is a hard error. Keys nested under `metadata` pass, which is why `family` nests there.
22
+
23
+ ### Optional fields
24
+
25
+ Claude Code documents more optional fields. The skills page holds the detail, so this table keeps one line each.
26
+
27
+ | Field | Effect |
28
+ | -------------------------- | ----------------------------------------- |
29
+ | `when_to_use` | Trigger phrases appended to `description` |
30
+ | `argument-hint` | Autocomplete hint for arguments |
31
+ | `arguments` | Named positional arguments |
32
+ | `user-invocable` | `false` leaves it to Claude alone |
33
+ | `disallowed-tools` | Tools removed while it is active |
34
+ | `model`, `effort` | Override both for the turn |
35
+ | `context` | `fork` runs it in a subagent |
36
+ | `agent` | Subagent type for `context: fork` |
37
+ | `background` | Whether a fork runs in the background |
38
+ | `hooks` | Hooks registered for the session |
39
+ | `paths` | Globs limiting automatic loading |
40
+ | `shell` | `bash` or `powershell` |
41
+ | `license`, `compatibility` | Accepted, never acted on |
42
+
43
+ A skill wanting only the no-auto-trigger effect writes `Do NOT auto-trigger` in its description rather than setting `disable-model-invocation`.
@@ -32,20 +32,23 @@ A body failing any of these is non-conforming even when every path resolves in t
32
32
 
33
33
  Know which root a file lives under before referencing it.
34
34
 
35
- - Bundled skill assets (`references/`, `scripts/`, `assets/`) resolve against the skill's own directory. Reference them with `${CLAUDE_SKILL_DIR}/<path>`, never a bare relative path, which resolves against the session cwd and fails when a plugin skill runs from another project.
35
+ - Bundled skill assets (`references/`, `scripts/`, `assets/`) resolve against the skill's own directory, so reference them with `${CLAUDE_SKILL_DIR}/<path>`
36
+ - Never use a bare relative path for one, which resolves against the session cwd and fails when a plugin skill runs from another project
36
37
  - Installed shared docs (`.claude/rules/`, `canon/context/`) resolve against the target project cwd, where install placed them. Reference them by that path.
37
- - Do not hand-copy another skill's reference into a skill. If a skill must carry its own copy, generate it from the single source and reference it through `${CLAUDE_SKILL_DIR}`, so one owner keeps every copy in sync.
38
+ - Do not hand-copy another skill's reference. A skill that must carry its own copy generates it from the single source and reads it through `${CLAUDE_SKILL_DIR}`.
38
39
 
39
40
  ## Citing another skill's reference
40
41
 
41
42
  A reference shared across skills lives in the `references/` of the skill that owns it, so a body cites it by the sibling path.
42
43
 
43
- - Cite another skill's reference as `${CLAUDE_SKILL_DIR}/../<skill>/references/<name>.md`. The plugin ships the skills side by side, so the sibling path resolves in every install. Name the owner skill rather than copying the file.
44
- - State the path once per body, at the site that reads the reference. A later mention of a reference the body already read stays bare, since repeating the path at every mention is noise rather than instruction.
44
+ - Cite another skill's reference as `${CLAUDE_SKILL_DIR}/../<skill>/references/<name>.md`, naming the owner. The plugin ships the skills side by side, so the sibling path resolves in every install.
45
+ - State the path once per body, at the site that reads the reference. A later mention stays bare, since repeating the path at every mention is noise.
45
46
  - A guard on a reference's presence names the file rather than the folder holding it, since a folder test answers for a sibling that happens to be there.
46
47
 
47
48
  ### Form and ownership
48
49
 
50
+ One variable expands reliably, and one owner holds each procedure.
51
+
49
52
  - Use `${CLAUDE_SKILL_DIR}`, never a bare `../../` and never `${CLAUDE_PLUGIN_ROOT}`, since only the first expands before the body reaches the model.
50
53
  - Cite a shared procedure, never restate it. A procedure two or more skills execute gets one definition in its owner's reference and a citation in each body.
51
54
  - Keep the trigger in the body and the procedure in the reference. The citing skill states when the procedure runs and what it runs against, since that varies per skill and the reference cannot know it.
@@ -31,9 +31,11 @@ A practice skill failing any of these is non-conforming even when every heading
31
31
 
32
32
  ## Closing sections
33
33
 
34
- - Follow every concern group with three H2s in this order: `## Excuses and rebuttals`, `## Red flags`, and `## Before handing over`. A section naming what the skill delegates comes after the three, and nothing else does.
34
+ Follow every concern group with `## Excuses and rebuttals`, `## Red flags`, and `## Before handing over`, in that order. Only a section naming what the skill delegates comes after.
35
+
35
36
  - Spell each heading exactly. An H3, or a heading carrying more words such as `## Red flags that mean start over`, reads as missing.
36
- - Write `## Excuses and rebuttals` as a two-column table pairing a reason a session gives to skip or shortcut the practice with the answer to it. Never write a row rebutting an objection nobody raised, since that row is ceremony. Revisit when a practice skill's table is observed failing to stop an excuse it names.
37
+ - Write `## Excuses and rebuttals` as a two-column table pairing a reason a session gives to skip or shortcut the practice with the answer to it
38
+ - Never write a row rebutting an objection nobody raised, since that row is ceremony. Revisit when a table is observed failing to stop an excuse it names.
37
39
  - Write `## Red flags` as bullets naming signs a session can observe in its own work mid-task, never a restatement of a rule above.
38
40
  - Write `## Before handing over` as the exit checklist, each line a check against what the session produced.
39
41
 
@@ -47,6 +49,7 @@ A practice skill failing any of these is non-conforming even when every heading
47
49
  ## Which skills are practice skills
48
50
 
49
51
  - `canon claude skills audit` keeps the list of practice skills and checks each listed one for the three closing sections and the ledger.
50
- - It keeps a wider ledger list beside it, holding every practice skill plus the skills that teach a craft drawn from outside sources without a practice's closing shape. A skill on the wider list alone owes the ledger and none of the three sections.
52
+ - It keeps a wider ledger list beside it, adding the skills that teach a craft drawn from outside sources without a practice's closing shape
53
+ - A skill on the wider list alone owes the ledger and none of the three sections
51
54
  - Never mark a skill as a practice skill in its own frontmatter, since a self-declared kind lets a skill exempt itself.
52
55
  - Both lists name this toolkit's shipped skills alone, so a project's own practice skill takes this shape with no check behind it.
@@ -29,9 +29,11 @@ A requirement that leaves any of the three open is non-conforming regardless of
29
29
 
30
30
  ## Purpose
31
31
 
32
- - Treat the file as the compressed statement of what the skill is for. A skill body is procedural by design, so its purpose sits spread across its steps, and a reader gets this file before opening the body whether or not the skill's scope is contested.
32
+ - Treat the file as the compressed statement of what the skill is for. A body is procedural by design, so its purpose sits spread across its steps.
33
+ - A reader gets this file before opening the body, whether or not the skill's scope is contested
33
34
  - Read it before editing the skill. When a change closes no gap the requirement states, change the requirement first or drop the change.
34
- - Write the gaps from what the skill is for, then compare the body against them. A requirement derived from the body records the body's accidents as the requirement, and misinforms a reader who reads it in place of the body.
35
+ - Write the gaps from what the skill is for, then compare the body against them
36
+ - A requirement derived from the body records the body's accidents as the requirement, and misinforms a reader who reads it in place of the body
35
37
 
36
38
  ## Content
37
39