@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.
- package/README.md +34 -17
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/references/adopted.md +34 -14
- package/claude/skills/auto-ship/REQUIREMENT.md +2 -0
- package/claude/skills/auto-ship/SKILL.md +28 -2
- package/claude/skills/auto-ship/references/draft-mark.md +32 -6
- package/claude/skills/auto-ship/references/failure-recovery.md +15 -13
- package/claude/skills/auto-ship/references/fan-in.md +59 -0
- package/claude/skills/auto-ship/references/tier-failures.md +31 -10
- package/claude/skills/auto-ship/references/ui-checklist.md +9 -4
- package/claude/skills/auto-ship/references/worktree-name.md +9 -3
- package/claude/skills/build-in-slices/references/adopted.md +35 -21
- package/claude/skills/canvas-board/references/canvas.md +17 -6
- package/claude/skills/canvas-board/references/design.md +26 -7
- package/claude/skills/code-craft/references/adopted.md +58 -20
- package/claude/skills/codebase-layout/references/adopted.md +49 -16
- package/claude/skills/codebase-layout/references/frontend.md +11 -4
- package/claude/skills/codebase-layout/references/tests.md +4 -2
- package/claude/skills/context-fold/references/classify.md +10 -15
- package/claude/skills/context-fold/references/completion-report.md +11 -9
- package/claude/skills/context-fold/references/context-refresh.md +26 -9
- package/claude/skills/context-fold/references/unusable-baseline.md +5 -3
- package/claude/skills/create-rule/REQUIREMENT.md +5 -0
- package/claude/skills/create-rule/SKILL.md +9 -1
- package/claude/skills/create-rule/references/checklist.md +26 -0
- package/claude/skills/create-rule/references/rule.md +98 -20
- package/claude/skills/create-skill/SKILL.md +1 -0
- package/claude/skills/create-skill/references/skill-disclosure.md +10 -2
- package/claude/skills/create-skill/references/skill-frontmatter.md +43 -0
- package/claude/skills/create-skill/references/skill-paths.md +7 -4
- package/claude/skills/create-skill/references/skill-practice.md +6 -3
- package/claude/skills/create-skill/references/skill-requirement.md +4 -2
- package/claude/skills/create-skill/references/skill.md +67 -44
- package/claude/skills/decision-escalate/REQUIREMENT.md +1 -1
- package/claude/skills/decision-escalate/SKILL.md +1 -2
- package/claude/skills/deploy-app/references/vercel.md +2 -1
- package/claude/skills/deprecation-migration/references/adopted.md +44 -25
- package/claude/skills/design-taste/references/adopted.md +9 -1
- package/claude/skills/design-taste/references/craft.md +3 -1
- package/claude/skills/design-taste/references/kinds.md +8 -7
- package/claude/skills/design-taste/references/preflight.md +12 -0
- package/claude/skills/design-taste/references/systems.md +7 -6
- package/claude/skills/design-taste/references/tells.md +24 -25
- package/claude/skills/design-taste/references/vocabulary.md +7 -5
- package/claude/skills/document-health/references/axes.md +54 -30
- package/claude/skills/draft-and-pick/references/live-arms.md +2 -2
- package/claude/skills/draft-doc/references/context.md +4 -3
- package/claude/skills/draft-doc/references/docs.md +6 -3
- package/claude/skills/draft-doc/references/readme/agent-facing.md +6 -0
- package/claude/skills/draft-doc/references/readme/application.md +8 -2
- package/claude/skills/draft-doc/references/readme/cli.md +5 -1
- package/claude/skills/draft-doc/references/readme/library.md +4 -0
- package/claude/skills/draft-doc/references/readme/plugin.md +9 -1
- package/claude/skills/draft-doc/references/readme.md +30 -13
- package/claude/skills/draft-doc/references/requirements.md +17 -4
- package/claude/skills/draft-doc/references/wiki-kind.md +20 -10
- package/claude/skills/draft-figure/references/architecture-set.md +7 -3
- package/claude/skills/draft-figure/references/figures.md +8 -6
- package/claude/skills/draft-figure/references/hand-drawn.md +3 -1
- package/claude/skills/draft-figure/references/mermaid-path.md +19 -9
- package/claude/skills/draft-figure/references/mermaid.md +10 -5
- package/claude/skills/draft-ready/references/ready.md +22 -15
- package/claude/skills/git-branch/REQUIREMENT.md +17 -6
- package/claude/skills/git-branch/SKILL.md +63 -7
- package/claude/skills/git-branch/references/branch.md +11 -1
- package/claude/skills/git-branch/references/slug.md +17 -5
- package/claude/skills/git-commit/references/commit.md +8 -0
- package/claude/skills/git-commit/references/versioning.md +23 -17
- package/claude/skills/git-followup/REQUIREMENT.md +1 -1
- package/claude/skills/git-followup/SKILL.md +5 -6
- package/claude/skills/git-issue/references/issue.md +29 -16
- package/claude/skills/git-pr/REQUIREMENT.md +1 -5
- package/claude/skills/git-pr/SKILL.md +11 -22
- package/claude/skills/git-pr/references/final-command.md +21 -8
- package/claude/skills/git-pr/references/labels.md +45 -28
- package/claude/skills/git-pr/references/pr.md +28 -9
- package/claude/skills/git-pr/references/publish.md +42 -28
- package/claude/skills/git-pr/references/task-number.md +20 -8
- package/claude/skills/git-ship/SKILL.md +1 -1
- package/claude/skills/plan-feature/references/batches.md +48 -1
- package/claude/skills/plan-feature/references/plan-lifecycle.md +10 -3
- package/claude/skills/plan-feature/references/plan.md +59 -20
- package/claude/skills/plan-groundwork/references/groundwork-spikes.md +4 -1
- package/claude/skills/plan-groundwork/references/groundwork.md +14 -16
- package/claude/skills/plan-intake/references/intake.md +29 -24
- package/claude/skills/plan-intake-answer/REQUIREMENT.md +1 -1
- package/claude/skills/plan-intake-answer/SKILL.md +1 -2
- package/claude/skills/pr-evidence/REQUIREMENT.md +40 -0
- package/claude/skills/pr-evidence/SKILL.md +53 -0
- package/claude/skills/pr-evidence/references/evidence.md +150 -0
- package/claude/skills/review-address/references/post-review-findings.md +10 -3
- package/claude/skills/review-address/references/rebase-conflicts.md +22 -7
- package/claude/skills/review-address/references/rest-reads.md +3 -1
- package/claude/skills/review-craft/references/adopted.md +35 -18
- package/claude/skills/review-craft/references/security.md +42 -7
- package/claude/skills/review-craft/references/ui.md +23 -8
- package/claude/skills/review-pr/SKILL.md +6 -6
- package/claude/skills/review-pr/references/body-variants.md +29 -9
- package/claude/skills/review-pr/references/close-out.md +20 -5
- package/claude/skills/review-pr/references/key-changes.md +27 -3
- package/claude/skills/review-pr/references/post.md +83 -31
- package/claude/skills/review-pr/references/scope.md +54 -19
- package/claude/skills/review-ui/SKILL.md +2 -0
- package/claude/skills/review-ui/references/close-out.md +49 -0
- package/claude/skills/review-ui/references/driving.md +24 -4
- package/claude/skills/review-ui/references/post.md +43 -13
- package/claude/skills/role-orchestrator/references/orchestrator-cloud-launch.md +67 -17
- package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +81 -40
- package/claude/skills/role-orchestrator/references/orchestrator-handback.md +52 -15
- package/claude/skills/role-orchestrator/references/orchestrator-handoff.md +48 -26
- package/claude/skills/role-orchestrator/references/orchestrator-inbound.md +12 -13
- package/claude/skills/role-orchestrator/references/orchestrator-launch.md +72 -36
- package/claude/skills/role-orchestrator/references/orchestrator-output.md +12 -4
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +64 -24
- package/claude/skills/role-orchestrator/references/orchestrator-poll.md +80 -26
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +41 -18
- package/claude/skills/role-orchestrator/references/orchestrator-resume.md +19 -7
- package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +22 -12
- package/claude/skills/role-orchestrator/references/orchestrator-reviewer-launch.md +15 -6
- package/claude/skills/role-orchestrator/references/orchestrator-sweep.md +25 -7
- package/claude/skills/role-orchestrator/references/orchestrator-watch.md +34 -8
- package/claude/skills/role-orchestrator/scripts/poll.ts +16 -24
- package/claude/skills/role-worker/REQUIREMENT.md +2 -0
- package/claude/skills/role-worker/SKILL.md +17 -0
- package/claude/skills/search-craft/references/adopted.md +18 -6
- package/claude/skills/session-map/references/session.md +26 -7
- package/claude/skills/session-worktree/references/main-root-writes.md +25 -8
- package/claude/skills/systematic-debugging/references/adopted.md +30 -16
- package/claude/skills/target-check/references/domains.md +39 -11
- package/claude/skills/target-setup/references/detect.md +80 -65
- package/claude/skills/target-setup/references/indexes.md +8 -6
- package/claude/skills/task-board/references/board.md +86 -30
- package/claude/skills/task-board/references/decline.md +29 -13
- package/claude/skills/task-board/references/tasks-decline.md +12 -5
- package/claude/skills/task-board/references/tasks.md +65 -33
- package/claude/skills/task-complete/references/archive.md +41 -17
- package/claude/skills/task-complete/references/receipt-sweep.md +23 -9
- package/claude/skills/task-complete/references/unusable-baseline.md +10 -3
- package/claude/skills/teach-workspace/REQUIREMENT.md +1 -1
- package/claude/skills/teach-workspace/SKILL.md +1 -2
- package/claude/skills/teach-workspace/references/glossary.md +6 -2
- package/claude/skills/teach-workspace/references/lesson-build.md +44 -16
- package/claude/skills/teach-workspace/references/lesson-craft.md +12 -7
- package/claude/skills/teach-workspace/references/pedagogy.md +6 -3
- package/claude/skills/teach-workspace/references/promotion-fold.md +17 -11
- package/claude/skills/teach-workspace/references/promotion.md +31 -8
- package/claude/skills/teach-workspace/references/revisit.md +8 -2
- package/claude/skills/teach-workspace/references/teach.md +17 -9
- package/claude/skills/test-craft/references/adopted.md +48 -14
- package/claude/skills/test-craft/references/component.md +7 -4
- package/claude/skills/test-craft/references/e2e.md +25 -7
- package/claude/skills/test-craft/references/unit.md +3 -1
- package/claude/skills/test-first/references/adopted.md +12 -4
- package/claude/skills/ui-checklist/REQUIREMENT.md +1 -1
- package/claude/skills/ui-checklist/SKILL.md +1 -1
- package/claude/skills/video-craft/references/adopted.md +62 -18
- package/claude/skills/write-human/references/adopted.md +21 -8
- package/docs/workflow/parallel-features.md +2 -1
- package/docs/workflow/skill-map.md +2 -1
- package/package.json +1 -1
- package/src/claude/cases/git.ts +4 -0
- package/src/claude/cases/workflow.ts +5 -0
- package/src/commands/pr.ts +174 -37
- package/src/commands/records.ts +11 -3
- package/src/context/shape-gated.ts +1 -0
- package/src/markdown/scope.ts +150 -2
- package/src/pr/frames.ts +53 -9
- package/src/pr/lift.ts +6 -3
- package/src/pr/review-state.ts +182 -0
- package/src/records/validate.ts +1 -0
- package/src/tasks/answers.ts +79 -2
- package/src/tasks/fan-in.ts +176 -0
- package/src/tasks/stack.ts +1 -1
- package/tooling/astro/reference.md +80 -39
- package/tooling/base/reference.md +63 -32
- package/tooling/base/seeds/canon/context/ci.md +7 -15
- package/tooling/base/seeds/canon/context/development.md +14 -14
- package/tooling/claude/reference.md +40 -22
- package/tooling/cloudflare/reference.md +31 -12
- package/tooling/go/reference.md +47 -23
- package/tooling/nextjs/reference.md +52 -19
- package/tooling/php/reference.md +35 -16
- package/tooling/python/reference.md +47 -30
- package/tooling/shell/reference.md +6 -5
- package/tooling/vite-react/reference.md +49 -21
- package/tooling/web/reference.md +130 -70
- 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
|
-
|
|
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,
|
|
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
|
-
-
|
|
29
|
-
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
17
|
+
## Step 3 keeps the scoped set
|
|
18
18
|
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
90
|
+
### Checking the installed skills
|
|
42
91
|
|
|
43
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
175
|
+
description: Enforce migrations, bound queries, and transaction ownership for persistence code
|
|
104
176
|
paths:
|
|
105
177
|
- '**/*.ts'
|
|
106
178
|
---
|
|
107
179
|
|
|
108
|
-
#
|
|
180
|
+
# Persistence standards
|
|
109
181
|
|
|
110
|
-
##
|
|
182
|
+
## Schema changes
|
|
111
183
|
|
|
112
|
-
-
|
|
113
|
-
-
|
|
114
|
-
|
|
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
|
-
|
|
20
|
-
|
|
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
|
|
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
|
|
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
|
|
44
|
-
- State the path once per body, at the site that reads the reference. A later mention
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|