@erclx/canon 5.45.0 → 5.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/api-design/REQUIREMENT.md +15 -31
  3. package/claude/skills/auto-ship/REQUIREMENT.md +14 -25
  4. package/claude/skills/backlog-triage/REQUIREMENT.md +12 -23
  5. package/claude/skills/build-in-slices/REQUIREMENT.md +15 -25
  6. package/claude/skills/canon-cli/REQUIREMENT.md +15 -27
  7. package/claude/skills/canon-feedback/REQUIREMENT.md +10 -18
  8. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +10 -15
  9. package/claude/skills/canvas-board/REQUIREMENT.md +14 -28
  10. package/claude/skills/ci-workflow/REQUIREMENT.md +12 -21
  11. package/claude/skills/code-craft/REQUIREMENT.md +14 -28
  12. package/claude/skills/codebase-layout/REQUIREMENT.md +14 -31
  13. package/claude/skills/context-fold/REQUIREMENT.md +15 -39
  14. package/claude/skills/context-fold/references/context.md +3 -3
  15. package/claude/skills/create-rule/REQUIREMENT.md +10 -24
  16. package/claude/skills/create-rule/SKILL.md +3 -0
  17. package/claude/skills/create-skill/REQUIREMENT.md +10 -21
  18. package/claude/skills/decision-escalate/REQUIREMENT.md +12 -24
  19. package/claude/skills/deploy-app/REQUIREMENT.md +12 -22
  20. package/claude/skills/deprecation-migration/REQUIREMENT.md +14 -42
  21. package/claude/skills/design-identity/REQUIREMENT.md +14 -20
  22. package/claude/skills/design-taste/REQUIREMENT.md +16 -57
  23. package/claude/skills/docs-sync/REQUIREMENT.md +14 -23
  24. package/claude/skills/document-health/REQUIREMENT.md +15 -29
  25. package/claude/skills/document-health/SKILL.md +2 -2
  26. package/claude/skills/document-repair/REQUIREMENT.md +32 -0
  27. package/claude/skills/document-repair/SKILL.md +76 -0
  28. package/claude/skills/document-repair/references/batches.md +44 -0
  29. package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -3
  30. package/claude/skills/draft-doc/REQUIREMENT.md +4 -3
  31. package/claude/skills/draft-figure/REQUIREMENT.md +4 -3
  32. package/claude/skills/draft-identity/REQUIREMENT.md +4 -3
  33. package/claude/skills/draft-ready/REQUIREMENT.md +4 -3
  34. package/claude/skills/draft-screencast/REQUIREMENT.md +4 -3
  35. package/claude/skills/draft-slides/REQUIREMENT.md +4 -3
  36. package/claude/skills/draw-figure/REQUIREMENT.md +15 -39
  37. package/claude/skills/git-branch/REQUIREMENT.md +12 -26
  38. package/claude/skills/git-commit/REQUIREMENT.md +11 -15
  39. package/claude/skills/git-followup/REQUIREMENT.md +11 -22
  40. package/claude/skills/git-issue/REQUIREMENT.md +9 -15
  41. package/claude/skills/git-pr/REQUIREMENT.md +13 -32
  42. package/claude/skills/git-pr/SKILL.md +10 -2
  43. package/claude/skills/git-pr/references/closing-issues.md +47 -0
  44. package/claude/skills/git-pr/references/pr.md +4 -0
  45. package/claude/skills/git-ship/REQUIREMENT.md +13 -26
  46. package/claude/skills/git-split/REQUIREMENT.md +10 -17
  47. package/claude/skills/git-stage/REQUIREMENT.md +12 -18
  48. package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
  49. package/claude/skills/make-deck/REQUIREMENT.md +13 -21
  50. package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
  51. package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
  52. package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
  53. package/claude/skills/plan-groundwork/SKILL.md +5 -2
  54. package/claude/skills/plan-groundwork/references/output.md +47 -1
  55. package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
  56. package/claude/skills/plan-intake/references/intake.md +2 -2
  57. package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
  58. package/claude/skills/plan-intake-answer/SKILL.md +7 -1
  59. package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
  60. package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
  61. package/claude/skills/read-frames/REQUIREMENT.md +3 -8
  62. package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
  63. package/claude/skills/review-address/REQUIREMENT.md +14 -38
  64. package/claude/skills/review-craft/REQUIREMENT.md +14 -32
  65. package/claude/skills/review-pr/REQUIREMENT.md +15 -34
  66. package/claude/skills/review-ui/REQUIREMENT.md +14 -39
  67. package/claude/skills/role-orchestrator/REQUIREMENT.md +2 -2
  68. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
  69. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
  70. package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
  71. package/claude/skills/role-reviewer/SKILL.md +5 -1
  72. package/claude/skills/role-worker/REQUIREMENT.md +1 -1
  73. package/claude/skills/role-worker/SKILL.md +2 -0
  74. package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
  75. package/claude/skills/search-craft/REQUIREMENT.md +12 -36
  76. package/claude/skills/search-craft/SKILL.md +1 -1
  77. package/claude/skills/search-craft/references/adopted.md +2 -2
  78. package/claude/skills/session-compact/REQUIREMENT.md +13 -23
  79. package/claude/skills/session-map/REQUIREMENT.md +13 -29
  80. package/claude/skills/session-relay/REQUIREMENT.md +14 -58
  81. package/claude/skills/session-relay/SKILL.md +6 -0
  82. package/claude/skills/session-resume/REQUIREMENT.md +13 -27
  83. package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
  84. package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
  85. package/claude/skills/target-check/REQUIREMENT.md +16 -23
  86. package/claude/skills/target-setup/REQUIREMENT.md +11 -34
  87. package/claude/skills/task-board/REQUIREMENT.md +13 -22
  88. package/claude/skills/task-board/SKILL.md +7 -0
  89. package/claude/skills/task-board/references/tasks.md +1 -1
  90. package/claude/skills/task-complete/REQUIREMENT.md +11 -24
  91. package/claude/skills/task-complete/references/archive.md +1 -0
  92. package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
  93. package/claude/skills/test-craft/REQUIREMENT.md +15 -46
  94. package/claude/skills/test-first/REQUIREMENT.md +14 -20
  95. package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
  96. package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
  97. package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
  98. package/claude/skills/video-craft/REQUIREMENT.md +14 -27
  99. package/claude/skills/write-doc/REQUIREMENT.md +14 -24
  100. package/claude/skills/write-human/REQUIREMENT.md +15 -27
  101. package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
  102. package/docs/agents/context-audit.md +19 -12
  103. package/docs/agents/markdown-audit.md +15 -10
  104. package/docs/target/projects.md +2 -0
  105. package/docs/workflow/skill-map.md +6 -5
  106. package/governance/renames.toml +0 -2
  107. package/governance/rules/claude/output.md +5 -1
  108. package/governance/rules/code/routing.md +5 -1
  109. package/governance/stacks/base.toml +0 -1
  110. package/package.json +1 -1
  111. package/src/claude/cases/workflow.ts +12 -0
  112. package/src/commands/context.ts +57 -3
  113. package/src/commands/labels.ts +83 -3
  114. package/src/commands/markdown.ts +188 -21
  115. package/src/commands/sessions.ts +36 -3
  116. package/src/commands/tasks.ts +180 -0
  117. package/src/commands/worktrees.ts +2 -0
  118. package/src/context/coverage.ts +210 -0
  119. package/src/context/gate.ts +12 -3
  120. package/src/gate/stages.ts +1 -1
  121. package/src/init/steps.ts +45 -0
  122. package/src/intake/items.ts +14 -0
  123. package/src/labels/closing.ts +46 -0
  124. package/src/markdown/gated.ts +250 -0
  125. package/src/markdown/scope.ts +115 -2
  126. package/src/migrate/rename.ts +6 -0
  127. package/src/sessions/claim.ts +7 -0
  128. package/src/sessions/live.ts +53 -6
  129. package/src/sessions/registry.ts +11 -0
  130. package/src/sessions/resolve.ts +32 -5
  131. package/src/tasks/closes.ts +136 -0
  132. package/src/tasks/record.ts +1 -1
  133. package/src/worktrees/reclaim.ts +16 -1
  134. package/tooling/base/configs/scripts/verify.ts +1 -1
  135. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
  136. package/tooling/claude/seeds/CLAUDE.md +2 -2
  137. package/governance/rules/canon/task-scope.md +0 -12
@@ -7,34 +7,28 @@ description: Why the mark and the card are one pick rather than two, and where t
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session asked for a logo and a social card either invents shapes with nothing behind them, or drafts the mark and the card as two separate decisions that can land on shapes that do not compose, which is the failure the task filing this skill measured by hand on every project it touched. A search across every shipped skill and standard found zero hits for `logo`, `og:image`, `og-image`, or Open Graph, so nothing in the catalog reached either output.
10
+ Without this skill, a session asked for a logo and a social card invents shapes with nothing behind them, or drafts the mark and the card as two decisions that land on shapes that do not compose. Nothing else in the catalog reaches a logo or an Open Graph image.
11
11
 
12
- A session building this without a shared loop restates `pick-by-eye`'s render, hand-off, pick, and loop mechanics from scratch, which drifts from the shipped one with nothing comparing the two copies. It also guesses at the icon size sequence and the output folder rather than reading what the project already declares, and it produces one raster per size through a separate render call per size, which multiplies capture invocations for no reason `canon capture` cannot already batch.
12
+ A session building this alone restates the render-and-pick loop from scratch, where it drifts from the shipped one. It guesses the icon sizes and the output folder rather than reading what the project declares, and it renders each size through its own capture call.
13
13
 
14
14
  ## Must
15
15
 
16
- - Detect the icon size sequence from the project's own HTML head or manifest before falling back to the stated default set
17
- - Detect the write folder from the project's own static-asset convention before falling back to the project root, and announce which one decided it
18
- - Draft every arm already composed inside the card frame, so one pick settles the mark's shape and its composition together
19
- - Follow `pick-by-eye`'s Steps 2 through 5 for the render, hand-off, pick, and loop, rather than restating them
20
- - Write the final mark as its own SVG source, not baked into a raster only
21
- - Render every final size and the card in one capture call, by sharing one selector class across pages, each declared at half its target dimension to land on the literal size once the render engine's fixed 2x scale factor is applied
16
+ - The icon size sequence and the write folder come from the project's own head, manifest, or static-asset convention before a stated default, and the run names which one decided
17
+ - Every arm is drafted inside the card frame, so one pick settles the mark's shape and its composition together
18
+ - The render, hand-off, pick, and loop follow `pick-by-eye` rather than a copy of it
19
+ - The final mark lands as its own SVG source, not only baked into a raster
20
+ - Every final size and the card render in one capture call, each landing at its literal target size
22
21
 
23
22
  ## Must not
24
23
 
25
- - Restate `pick-by-eye`'s render, hand-off, pick, or loop mechanics
26
- - Add a `## Logo` section to `claude/skills/canvas-board/references/design.md`'s fixed section set. `src/design/parse.ts` reads a fixed key set, and no outcome behind this skill asks for a schema change.
27
- - Modify `pick-by-eye`, `canon capture`, or `canon design render`. This skill composes all three and extending any of them is a separate change.
28
- - Assume this skill's own invocation frequency needs no check. Whether anything reaches for it beyond an operator typing its name has no answer at creation time, so a review pass some months in should read that back rather than take it on faith.
29
-
30
- ## Guards
31
-
32
- - `canon` not on PATH: stop, since the render loop and the finalize step both need it
33
- - Fires on a direct request only. A run offering a logo to a project that never asked for one spends a render nobody wanted.
24
+ - Draft a mark the operator did not ask for, or mutate an existing logo file, which is a plain edit
25
+ - Add a logo section to the design document's fixed section set, which its parser reads as a fixed key set
26
+ - Modify `pick-by-eye`, `canon capture`, or `canon design render`, which this skill composes
27
+ - Be taken as reached by more than an operator typing its name, which a later review reads back rather than assumes
34
28
 
35
29
  ## Out of scope
36
30
 
37
- - Wiring the produced files into a project's own HTML head or manifest, which is a separate edit this skill leaves for the operator to make against their own markup
38
- - Recording the mark's construction rules in `claude/skills/canvas-board/references/design.md`, which the task's own constraint keeps out of the fixed section set
39
- - Mutating an existing logo file directly, which is a direct edit rather than a skill
31
+ - The render, hand-off, pick, and loop mechanics, which `pick-by-eye` owns
32
+ - Carrying a picked direction into the design document, which `canvas-board` owns
40
33
  - Auditing an implemented UI against its tokens, which `ux-audit` owns
34
+ - Wiring the produced files into the project's head or manifest, which the operator owns
@@ -7,70 +7,29 @@ description: Why a design round needs a stated layer ordering and a taste catalo
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a design round has no vocabulary to declare what it is varying and no standard of quality once it has. Both halves failed together and each is measured.
10
+ Without this skill, a design round cannot declare what it varies. Rounds change palette on a page whose defect sits at composition, and nothing visibly changes. An instruction to name the layer has no catalog behind it, so it gets skipped. Sections are judged alone, and a redesign renames what something outside depends on.
11
11
 
12
- The failure was measured on a real page. Four `pick-by-eye` rounds ran against one landing page in a single working session, and three changed nothing the operator could see. Each varied a property at Surface, being palette, figure treatment, heading separation and underline reach, against a page whose defect sat at composition.
13
-
14
- The instruction against that already existed. `pick-by-eye` Step 1 says to name the layer and Step 2 says a palette cannot be picked ahead of a composition. All four rounds skipped both, and nothing reported it. A session told to name a layer has no catalog to name from, so the rule had nothing behind it.
15
-
16
- The second half is the output itself. A model with no stated direction draws the population average of its training data, which produces interfaces that satisfy every craft rule and still read templated.
17
-
18
- Prose is already governed in two halves and design is governed in neither. The character bans ship as data a command reads, and the shapes no closed word set can match needed a skill of their own, because each is a pattern rather than a token. `claude/skills/canvas-board/references/design.md` governs the shape of a project's design document and is silent on whether its values are any good.
19
-
20
- Importing an external catalog wholesale fails on what those catalogs turn out to carry. The largest is 1,206 lines in one file, pinned to one framework, one styling library and one animation package, and it scopes itself out of dashboards, data tables and multi-step product UI. A second bans default fonts by name and prescribes a component library.
21
-
22
- A session handed either one unfiltered adopts a stack the project does not use, or silently ignores the item. No later reader can tell which happened, which is why the adopted-and-declined record exists.
12
+ The output has no standard of quality either. A model with no stated direction draws the population average, which satisfies every craft rule and still reads templated. The external catalogs are pinned to one stack, so a session handed one adopts a stack the project does not use or silently drops the item.
23
13
 
24
14
  ## Must
25
15
 
26
- - Require a declared read in the output before any candidate is authored, naming the kind, the audience, the overriding constraint and the layer, since a layer named privately is a layer nobody can check
27
- - Enumerate the layers in settle order, so an instruction to name one has a catalog behind it
28
- - State that a round varies one layer, and that a complaint is worked at the lowest layer it reaches rather than the cheapest one to change
29
- - Carry grey-boxing as the operational form of the ordering rule, since removing the higher layers from view is what makes a lower one judgeable
30
- - Cite the correctness floor rather than restating it. `copy`, `a11y`, `keyboard`, `forms` and `ux-completeness` already carry accessibility, keyboard, forms, states and rendered copy on the rendered paths, and a second copy here drifts with nothing comparing the two.
31
- - Hold in the body what every design moment pays for, being the read, the layers, the ordering, grey-boxing and the locks, and defer everything a single moment needs.
32
- - State what has to stay constant across a whole surface, since coherence is a property of the whole and each of those is broken one section at a time.
33
- - Detect the mode before reading anything when a surface already exists, and name what cannot change silently, since a slug, a field name or an analytics event breaks something outside the surface.
34
- - Carry a final filter the session runs against its own output, with every item tracing to a rule stated here, since an unenforced rule and an unchecked one fail the same way.
35
- - Name the machine defaults as a catalog of shapes with replacements, held behind a stated trigger so a round that needs none pays no read
36
- - Record which external patterns were adopted, which declined, and the measurement behind each, so a later session extends the position instead of re-deriving it
37
- - Stay general-purpose across kinds, naming what a kind optimizes for rather than which packages to install
38
- - Say when a read names a kind the references do not cover, rather than inventing guidance for it
39
-
40
- ## What earns a place
41
-
42
- A rule belongs in this skill only when all four hold. Three of the four reject most design advice, which is the point: a criterion admitting everything is not a criterion.
43
-
44
- 1. **An unguided model gets it wrong.** The model already knows a control needs padding, so writing that down costs a read and buys nothing. It does not know to avoid three equal cards. Only the second kind earns a line.
45
- 2. **Nothing else owns it.** A `ui` rule, a standard, or a sibling skill owning the topic makes this a pointer rather than a rule.
46
- 3. **It is judgment rather than a threshold.** A contrast ratio has a number and belongs to the floor. Whether a palette reads cheap has no number and belongs here.
47
- 4. **One line states it, and something could violate that line.** "Use whitespace intentionally" fails, since nothing could break it. "No three consecutive image-and-text splits" passes, since it can be counted.
48
-
49
- A rule failing any of the four is recorded as considered and declined rather than argued again, in `references/adopted.md`, under the reference where it would have gone.
16
+ - A declared read naming the kind, the audience, the constraint, the layer, and an existing surface's mode lands in the output before any candidate
17
+ - The layers settle in a stated order, a round varies one, a complaint is worked at the lowest layer it reaches, and grey-boxing is announced
18
+ - What stays constant across a whole surface is named, and so is what cannot change silently on one that already exists
19
+ - The machine defaults are a catalog of shapes with replacements, read on a stated trigger, and a final filter traces each item to a stated rule
20
+ - A record names which external patterns were adopted and which declined, and an uncovered kind gets the body's rules and a stated absence
50
21
 
51
22
  ## Must not
52
23
 
53
- - Name a framework, a styling library, an animation package, a component library or an icon set as a default. A rule that survives only inside one stack is not a taste rule.
54
- - Ship a frozen corpus of palettes, font pairings or product examples. A copy becomes a file some sync reconciles forever, and a traced reference is current by construction where a frozen one is not.
55
- - Restate the banned characters, which `markdown.md` states and `canon markdown audit` gates from package data
56
- - Express intensity as a numeric scale. A session picks a middle value and reports compliance, which satisfies the rule and decides nothing.
57
- - Claim the reported failure is closed. Nothing measures whether a round follows these rules, so this skill states them and the measurement is owed separately.
58
- - Duplicate a rule a surface already states for itself, such as slide layout or terminal color, where pointing at that surface is the whole of the correct answer
59
- - Be reached only by an author typing its name. `claude/skills/create-skill/references/skill.md` makes this a review criterion rather than a check, since nothing answers it before the skill has run. The intended non-author caller is the declared read in `pick-by-eye`'s output. A round producing no read, with this skill never loaded, is the evidence that the description's triggers are too weak.
60
-
61
- ## Guards
62
-
63
- - A kind with no per-kind guidance gets the body's rules and a stated absence, never invented guidance
64
- - A grey-boxed set is announced as grey-boxed, since an unannounced grey page reads as unfinished work rather than as the question being asked
65
- - Accessibility and the state set outrank an aesthetic preference wherever the two collide, rather than being traded against it
24
+ - Name a framework, a library, or an icon set as a default, or ship a frozen corpus of palettes, pairings, or examples
25
+ - Admit a rule an unguided model already gets right, another surface owns, a threshold settles, or no single line could violate
26
+ - Restate the correctness floor or the banned characters, or trade accessibility and the state set against an aesthetic preference
27
+ - Express intensity as a numeric scale, or claim a round follows these rules when nothing measures it
28
+ - Be reached only by an author typing its name, since `pick-by-eye`'s declared read is the intended caller
66
29
 
67
30
  ## Out of scope
68
31
 
69
- - Accessibility, ARIA and alt text, which `a11y` owns on every rendered path, and keyboard interaction, which `keyboard` owns
70
- - State coverage, empty and loading treatment, destructive confirmation and truncation, which `ux-completeness` owns
71
- - Validation timing, error placement and save blocking, which `forms` owns
72
- - Rendered copy casing, button labels and error wording, which `copy` owns
73
- - The candidate loop, the arm set, the render and the pick, which `pick-by-eye` owns and which this skill is loaded alongside rather than inside
74
- - The shape of the project's design document, its sections and its role tables, which `claude/skills/canvas-board/references/design.md` governs
75
- - Prose on the surface being designed, which `write-human` and `markdown.md` govern between them
76
- - Measuring whether finished output followed these rules, which needs a check this skill does not carry and which no command reaches while a render is an image rather than a parse
32
+ - Accessibility, keyboard interaction, state coverage, forms, and rendered copy, which the `a11y`, `keyboard`, `ux-completeness`, `forms`, and `copy` rules own
33
+ - The candidate loop and the pick, which `pick-by-eye` owns
34
+ - The shape of the project's design document, which `canvas-board`'s design reference governs
35
+ - Prose on the surface being designed, which `write-human` and `markdown-craft` own
@@ -7,37 +7,28 @@ description: Scope boundary for consumer-facing prose against the agent-facing d
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a rename or a dropped flag ships with the README still describing the old surface. Nothing fails, because no test reads prose, so the doc stays wrong until a person hits it.
10
+ A rename or a dropped flag ships with the README still describing the old surface, and no test reads prose. Rewriting whole files churns sections the change never reached. A doc edited earlier in the session passes file-level classification while a later change leaves a section stale.
11
11
 
12
- Three failures belong to the sync itself rather than to the drift. A session that syncs by rewriting whole files churns sections the change never reached, which costs the reviewer the ability to tell the sync from the feature. A doc edited earlier in the same session reads as current while a later change leaves one of its sections stale, so file-level classification passes where section-level would not. And a hardcoded doc list never checks the file someone added after the list was written.
13
-
14
- The trigger is a failure of its own. "Sync the docs" names either corpus to the person saying it, so a description claiming the bare phrase takes the request meant for the planning surface its sibling owns, and the run rewrites a README nobody asked about while the `.claude/` docs it was called for stay stale.
15
-
16
- The quiet one is the baseline. A diff resolved against a bare local ref equals HEAD on `main` and on a branch before its first commit, so every committed change drops out of the set. The skill then reports nothing to sync, which reads as a clean result rather than as an admission that it could not see the work.
12
+ "Sync the docs" names either corpus, so a bare description takes a request meant for its sibling. A diff resolved against a bare local ref equals HEAD on `main`, so the skill reports nothing to sync and reads as clean. A hardcoded doc list misses a file added later.
17
13
 
18
14
  ## Must
19
15
 
20
- - Name the corpus in every trigger phrase, so a request naming neither reaches one skill of the pair rather than either
21
- - Resolve one merge base, prefer the remote ref over the local one, and reuse it everywhere the skill reads the diff
22
- - Say so in the output when the baseline degrades, rather than reporting a clean pass off a set it could not build
23
- - Discover the doc set by glob at run time
24
- - Classify and rewrite at section level, so a partly stale file is partly rewritten
25
- - Mark a section stale only when the diff changes what a caller sees, since a page rewritten on every internal change starts carrying the reasons behind it
26
- - Write immediately after the preview, since the tool permission dialog is the confirmation gate
16
+ - Name the corpus in every trigger phrase
17
+ - Resolve one merge base, prefer the remote ref over the local, and reuse it wherever the diff is read
18
+ - Say so in the output when the baseline degrades, rather than reporting a clean pass
19
+ - Discover the doc set by glob at run time, and classify and rewrite at section level
20
+ - Mark a section stale only when the diff changes what a caller sees, and write right after the preview
27
21
 
28
22
  ## Must not
29
23
 
30
24
  - Touch a section the change does not reach
31
- - Rewrite a doc to match the diff when the doc records an intent the diff departed from. That is a finding rather than a sync.
32
-
33
- ## Guards
34
-
35
- - No committed change and no working-tree change stops the skill before it reads any doc
25
+ - Rewrite a doc to match the diff when the doc records an intent the diff departed from
26
+ - Read docs when there is no committed or working-tree change
36
27
 
37
28
  ## Out of scope
38
29
 
39
- - The context entries: `context-fold`, which runs ahead of this skill in the ship chain and resolves the same baseline. The task board: `task-complete`, which runs between the two. The split is by audience, so a file's location decides which skill owns it rather than its subject.
40
- - The requirements record: `document-health` reads it when asked
41
- - `CLAUDE.md` and the installed seed docs, which an operator reconciles by hand against the toolkit source
42
- - Changelog entries, which release tooling generates from commit messages
43
- - Whether the prose conforms to its standards. `canon markdown audit` reports violations and fixes none, and this skill writes prose it does not audit.
30
+ - The context entries, which `context-fold` owns, and the task board, which `task-complete` owns
31
+ - The requirements record, which `document-health` owns
32
+ - `CLAUDE.md` and the installed seed docs, which an operator reconciles by hand
33
+ - Changelog entries, which release tooling generates
34
+ - Whether the prose conforms to its standards, which `canon markdown audit` reports
@@ -7,42 +7,28 @@ description: What the document health check is for, the gap it closes, and why i
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a project learns which documents are missing and never learns which have rotted. `target-check` reports per domain what a target holds against what the toolkit ships, and every one of its domains asks a structural question: does the file exist, does it hold the required sections, do the bytes match what shipped. A document that exists, holds every section, and describes a tree that moved six months ago passes every one of them.
10
+ A project learns which documents are missing and never which have rotted. `target-check` asks structural questions, and a document that exists, holds its sections, and matches what shipped can still describe a tree that moved long ago.
11
11
 
12
- The second half of the gap is the axes being read as one thing. Length, placement, and staleness answer to different evidence, and a run that reports them in one undifferentiated list hands the reader a judgment wearing the authority of a measurement. The operator's own complaint was staleness, which is the axis with nothing behind it, so the flattening runs in the direction that overstates the weakest finding.
13
-
14
- The third is silence on an unread axis. Both measured verbs resolve their folders by surface root, so a project whose layout differs resolves nothing and the verb refuses. A run reading that refusal as an empty finding set reports a healthy corpus for documents nothing looked at.
12
+ Length, placement, and staleness answer to different evidence, and one list hands the reader a judgment wearing a measurement's authority. A verb that refuses on an unfamiliar layout reads as an empty set, so a healthy corpus is reported for documents nothing looked at.
15
13
 
16
14
  ## Must
17
15
 
18
- - Report per document across three named axes, so a reader can tell which question a finding answers
19
- - Read length and placement through the verb that already owns each measurement, rather than re-deriving either by hand
20
- - Mark every finding with its evidence class, so a judgment is never read as a measurement
21
- - Ship the staleness axis, and mark it as a reading rather than cutting it for lacking a verb
22
- - Report a refusal, an absent key, and a missing subcommand as an unread axis, naming the cause
23
- - Say which layer answered the classifier sweep, since its model layer being off narrows the read without refusing it
24
- - Take every checkpoint from the record the verb returns rather than from a number written into the skill
25
- - Run standalone, and stay callable from the structural check rather than reachable only through it
26
- - Read the requirements record for identity drift when the scope reaches it, and print one reminder line from `canon records stale canonical`, since the fold never writes it, so nothing else reads it whole
16
+ - Report per document across the length, placement, and staleness axes, marking each finding with its evidence class
17
+ - Read length and placement through the verb owning each measurement, and take every checkpoint from the record the verb returns
18
+ - Ship the staleness axis as a reading rather than cutting it for lacking a verb
19
+ - Report a refusal, an absent key, or a missing subcommand as an unread axis naming the cause, and say which layer answered the classifier sweep
20
+ - Run standalone, read the requirements record for identity drift when the scope reaches it, and print the `canon records stale canonical` reminder
27
21
 
28
22
  ## Must not
29
23
 
30
- - Repair a finding, write a file in the project, or open a pull request. A check that repaired as it read leaves the reader unable to tell a finding from a fix.
31
- - Emit a verdict across the three axes, or a score across the documents. Two axes answer from verbs and one answers from a reading, so any roll-up is a figure that lies about the third.
32
- - Report a finding against a file nobody hand-authors. A generated index, a gitignored file, and a copied reference each name a file an author cannot fix.
33
- - Answer an axis by file inspection where a verb answers it. The verb is the surface under test and a hand-rolled read of the same files is not.
34
- - Trigger itself, or ask a hook, a gate stage, or CI to trigger the canonical review. The operator settled that it runs only when asked.
35
- - Read a document's modification time as its staleness. A file untouched beside code untouched is current, and the timestamp answers a different question.
36
-
37
- ## Guards
38
-
39
- - `canon` absent from the path: stop, since neither measured axis can be read
40
- - No tracked markdown under the working root: stop, since there is no corpus to read
24
+ - Repair a finding, write a file in the project, or open a pull request
25
+ - Emit a verdict or score across the axes, or report a finding against a generated, gitignored, or copied file
26
+ - Answer an axis by file inspection where a verb answers it, or read a modification time as staleness
27
+ - Trigger itself or ask a hook, gate stage, or CI to, and run without `canon` or tracked markdown
41
28
 
42
29
  ## Out of scope
43
30
 
44
- - Whether a document exists or holds its required sections, which is the structural question `target-check` answers across six domains
45
- - Banned tokens and structural checkpoints in markdown, which `canon markdown audit` measures from package data. This skill reads rot a ban set cannot state.
46
- - Rewriting a stale claim once this run has named it, which the operator or the owning skill does
47
- - Running the toolkit's own checks as one gating set over its own corpus, which is `canon audits run`. That set gates a push and this reports to a reader.
48
- - Repairing anything an axis names. Each routes to the command or skill that owns it.
31
+ - Whether a document exists or holds its sections, which `target-check` owns
32
+ - Banned tokens and structural checkpoints, which `canon markdown audit` owns
33
+ - Rewriting a stale claim once named, which the operator or the owning skill owns
34
+ - Gating the toolkit's own corpus as one set, which `canon audits run` owns
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: document-health
3
- description: Reports which of a project's documents have rotted, one section per document, across length, placement, and staleness. Reads each axis through the verb that owns it and marks the evidence class each answer carries. Use when asked to "check document health", "which docs have gone stale", "audit the docs for rot", "are these documents still accurate", "which docs are too long", or after a target check reports the structural side. Do NOT use to repair a finding, which the owning command or skill does, and do NOT use to check whether a document exists or holds the right sections, which is `target-check`.
3
+ description: Reports which of a project's documents have rotted, one section per document, across length, placement, and staleness. Reads each axis through the verb that owns it and marks the evidence class each answer carries. Use when asked to "check document health", "which docs have gone stale", "audit the docs for rot", "are these documents still accurate", "which docs are too long", or after a target check reports the structural side. Do NOT use to repair a finding, which the owning command or skill does, such as `document-repair` for a length finding, and do NOT use to check whether a document exists or holds the right sections, which is `target-check`.
4
4
  metadata:
5
5
  family: check
6
6
  ---
@@ -74,7 +74,7 @@ Nothing triggers this review but a request. A finished review hands the rewrite
74
74
 
75
75
  ## Step 4: report per document
76
76
 
77
- Give each document its three axes, and give each axis three things: the state, the evidence class, and the command or skill that repairs it. Naming the repair is not running it.
77
+ Give each document its three axes, and give each axis three things: the state, the evidence class, and the command or skill that repairs it. Naming the repair is not running it. A length finding names `document-repair`, which rewrites a folder to zero and gates it.
78
78
 
79
79
  The three classes are what keep the axes apart:
80
80
 
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: document-repair
3
+ description: What the repair skill is for, the drift it closes, and why it gates only through the CLI
4
+ ---
5
+
6
+ # Document repair requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, an older project fails the density limits on every file it has not edited since the limits landed, and nothing repairs it. `document-health` reports a length finding and stops, and the edit hook fires only on a file being touched, so an untouched folder stays over the limits.
11
+
12
+ A folder repaired by hand also drifts back, since a target gates nothing until a folder is listed, and a session listing one by hand can list a folder that still fails.
13
+
14
+ ## Must
15
+
16
+ - Each batch takes one folder and leaves it at zero findings or reports it ungated
17
+ - A folder gates only through `canon markdown gated add`, which refuses one with a finding left
18
+ - A rewrite keeps every stated reason, command, and path the original carried
19
+ - The body names the verbs and states no limit number
20
+ - A requirement gates by its own path, never through a folder prefix
21
+
22
+ ## Must not
23
+
24
+ - Edit `canon/config/markdown.toml` by hand
25
+ - Report a folder gated that the verb refused
26
+ - Change what a document claims to pass the audit
27
+ - Be reachable only by its name, since `document-health` names it for every length finding
28
+
29
+ ## Out of scope
30
+
31
+ - Reporting rot across length, placement, and staleness, which `document-health` owns
32
+ - Whether a document exists or holds its required sections, which `target-check` owns
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: document-repair
3
+ description: Rewrites a project's markdown to the density limits one failing folder at a time, re-audits each to zero, and gates it through `canon markdown gated add` so it cannot drift back. Use when asked to "repair the docs", "bring the docs under the limits", "fix the density findings", "gate this folder", or after `document-health` reports a length finding. Do NOT use to report rot without repairing it, which is `document-health`, or to fix a banned character or a dead link alone, which the audit names directly.
4
+ metadata:
5
+ family: upkeep
6
+ ---
7
+
8
+ # Document repair
9
+
10
+ Brings an older project's markdown under the density limits one folder at a time and gates each folder as it reaches zero. `document-health` names a length finding and stops, and the edit hook fires only on a file being touched, so a folder nobody edits stays over the limits forever. This skill closes that.
11
+
12
+ The CLI holds every number. `canon markdown audit` measures, and `canon markdown gated add` refuses a folder with any finding left, so this body names the verbs and restates no limit.
13
+
14
+ ## Guards
15
+
16
+ - `canon` absent from the path: stop. `❌ canon is not on PATH, so nothing can be measured or gated.`
17
+ - The audit refusing: stop and name its `reason`. A `malformed-config` refusal names the file to fix by hand, since the verb will not append to a file it cannot read.
18
+ - `gated add` refusing with `canon-checkout`: stop. Canon's own checkout gates through a constant in its source, which a code change edits.
19
+ - Run every command under `CANON_NON_INTERACTIVE=1`, and branch on each record's own fields rather than on an exit status a shell wrapper can flatten
20
+
21
+ ## Step 1: read the audit
22
+
23
+ Run the audit over the whole tree and take the density and reference shape findings from its record:
24
+
25
+ ```bash
26
+ CANON_NON_INTERACTIVE=1 canon markdown audit --json
27
+ ```
28
+
29
+ Take the candidate folders from the order table in `${CLAUDE_SKILL_DIR}/references/batches.md` rather than from the findings, since a clean folder carries no finding and would never be gated. Drop every folder `canon/config/markdown.toml` already lists, since a listed folder already gates.
30
+
31
+ Sort what is left in two. A candidate the findings never name needs no rewrite, so gate it through Step 4 before the first batch. Group the findings under the rest, which Steps 2 and 3 rewrite.
32
+
33
+ ## Step 2: pick one folder
34
+
35
+ Take one folder per batch, per `${CLAUDE_SKILL_DIR}/references/batches.md`, which holds the size, the order, and the stop rule. Say which folder this batch takes and how many findings it carries before editing anything.
36
+
37
+ ## Step 3: rewrite to zero
38
+
39
+ Load `markdown-craft` and `write-human`, then rewrite each failing block by its shape rather than by trimming characters. Split a long paragraph at its seam, put a heading or a table between paragraphs, give a long list H3s, and open each H3 with a sentence or a table.
40
+
41
+ Re-run the audit on the folder alone after each file:
42
+
43
+ ```bash
44
+ CANON_NON_INTERACTIVE=1 canon markdown audit <prefix> --json
45
+ ```
46
+
47
+ Read `${CLAUDE_SKILL_DIR}/references/batches.md` for what a rewrite may cut. A stated reason survives every rewrite, and the audit reaching zero cannot see one that went missing.
48
+
49
+ ## Step 4: gate the folder
50
+
51
+ ```bash
52
+ CANON_NON_INTERACTIVE=1 canon markdown gated add <prefix> --json
53
+ ```
54
+
55
+ Pass the prefix exactly as the batch named it: a folder with its one trailing slash, such as `docs/`, and a file by its bare path, such as `README.md`. The verb refuses a doubled slash and a slash after a file, since either matches nothing and would gate nothing.
56
+
57
+ Branch on the record. `action: appended` or `present` means the folder gates now. `reason: findings` means one is left, so return to Step 3 with the paths the record lists. Never edit the config by hand, since the verb is what holds the folder to zero.
58
+
59
+ ### Requirements
60
+
61
+ A skill's `REQUIREMENT.md` gates only on its own path, never through a folder prefix, so gating `.claude/skills/` leaves each requirement reporting. Gate each one that reaches zero by its path:
62
+
63
+ ```bash
64
+ CANON_NON_INTERACTIVE=1 canon markdown gated add .claude/skills/<name>/REQUIREMENT.md --json
65
+ ```
66
+
67
+ ## Output
68
+
69
+ One line per batch, then the folders left:
70
+
71
+ ```markdown
72
+ ✅ Gated `<prefix>`: <n> files rewritten, <m> findings cleared.
73
+ Left: `<prefix>` (<k> findings), `<prefix>` (<k> findings).
74
+ ```
75
+
76
+ Name a folder the batch stopped short on with the findings still open, rather than reporting it gated.
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: Repair batches
3
+ description: How document-repair sizes and orders a batch, when it stops, and what a rewrite may cut
4
+ ---
5
+
6
+ # Repair batches
7
+
8
+ `document-repair` reads this at Step 2 to pick a folder and at Step 3 before cutting anything.
9
+
10
+ ## Size
11
+
12
+ One batch is one folder, gated before the next starts. A folder is the unit `canon markdown gated add` takes, so a batch spanning two leaves one half rewritten and ungated when the session stops.
13
+
14
+ Split a folder with more findings than one session can rewrite with care into its subfolders, and gate each subfolder by its own prefix.
15
+
16
+ ## Order
17
+
18
+ Take the folder a reader opens most, then the folder with the fewest findings.
19
+
20
+ | Order | Folder | Why |
21
+ | ----- | ----------------- | ----------------------------------------------- |
22
+ | 1 | `README.md` | The first page anyone reads |
23
+ | 2 | `docs/` | Pages written for a reader rather than an agent |
24
+ | 3 | `canon/context/` | Read on every session that touches its domain |
25
+ | 4 | `.claude/skills/` | Loaded on request, so a long body costs a turn |
26
+ | 5 | The wiki folder | Orientation pages, read least often |
27
+
28
+ Within a tier, a folder close to zero goes first, since it gates the soonest and stops drift there.
29
+
30
+ ## Stop rule
31
+
32
+ Stop the batch, and report it ungated, when a rewrite would change what a document claims rather than how it says it. That call belongs to the document's owner, so name the file and the block.
33
+
34
+ Stop the run after the batch in hand when the session's context is running short. A half-rewritten folder is worse than an untouched one, since the next session cannot tell which files were read.
35
+
36
+ ## What a rewrite may cut
37
+
38
+ A rewrite changes shape and keeps substance.
39
+
40
+ - Keep every stated reason. A rule without its reason is the cut a reviewer cannot recover from the diff alone.
41
+ - Keep every command, path, and number the document states, unless the tree shows it wrong
42
+ - Cut a sentence restating the one above it, and a list item repeating its heading
43
+ - Move detail to a table or a linked page rather than deleting it
44
+ - Never cut a warning, a refusal condition, or a stated limit to pass the audit
@@ -7,17 +7,18 @@ description: Why a pointer answers under the old `draft-and-pick` name, and the
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a person typing the old name after the rename to `pick-by-eye` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
10
+ Without this skill, a person typing the old name after the rename to `pick-by-eye` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
11
11
 
12
12
  ## Must
13
13
 
14
14
  - Name `pick-by-eye` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
- - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request `pick-by-eye` owns
16
+ - Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
16
17
 
17
18
  ## Must not
18
19
 
19
20
  - Carry any part of the draft and pick loop, which would give one behavior two bodies that drift apart
20
- - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
21
+ - Retire on a release number, which retires it on a date nothing measured
21
22
 
22
23
  ## Out of scope
23
24
 
@@ -7,17 +7,18 @@ description: Why a pointer answers under the old `draft-doc` name, and the test
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a person typing the old name after the rename to `write-doc` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
10
+ Without this skill, a person typing the old name after the rename to `write-doc` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
11
11
 
12
12
  ## Must
13
13
 
14
14
  - Name `write-doc` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
- - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request `write-doc` owns
16
+ - Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
16
17
 
17
18
  ## Must not
18
19
 
19
20
  - Carry any part of the document draft, which would give one behavior two bodies that drift apart
20
- - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
21
+ - Retire on a release number, which retires it on a date nothing measured
21
22
 
22
23
  ## Out of scope
23
24
 
@@ -7,17 +7,18 @@ description: Why a pointer answers under the old `draft-figure` name, and the te
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a person typing the old name after the rename to `draw-figure` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
10
+ Without this skill, a person typing the old name after the rename to `draw-figure` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
11
11
 
12
12
  ## Must
13
13
 
14
14
  - Name `draw-figure` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
- - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request `draw-figure` owns
16
+ - Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
16
17
 
17
18
  ## Must not
18
19
 
19
20
  - Carry any part of the figure draft, which would give one behavior two bodies that drift apart
20
- - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
21
+ - Retire on a release number, which retires it on a date nothing measured
21
22
 
22
23
  ## Out of scope
23
24
 
@@ -7,17 +7,18 @@ description: Why a pointer answers under the old `draft-identity` name, and the
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a person typing the old name after the rename to `design-identity` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
10
+ Without this skill, a person typing the old name after the rename to `design-identity` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
11
11
 
12
12
  ## Must
13
13
 
14
14
  - Name `design-identity` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
- - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request `design-identity` owns
16
+ - Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
16
17
 
17
18
  ## Must not
18
19
 
19
20
  - Carry any part of the logo and social card draft, which would give one behavior two bodies that drift apart
20
- - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
21
+ - Retire on a release number, which retires it on a date nothing measured
21
22
 
22
23
  ## Out of scope
23
24
 
@@ -7,17 +7,18 @@ description: Why a pointer answers under the old `draft-ready` name, and the tes
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a person typing the old name after the rename to `plan-ready` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
10
+ Without this skill, a person typing the old name after the rename to `plan-ready` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
11
11
 
12
12
  ## Must
13
13
 
14
14
  - Name `plan-ready` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
- - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request `plan-ready` owns
16
+ - Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
16
17
 
17
18
  ## Must not
18
19
 
19
20
  - Carry any part of the ready folder packaging, which would give one behavior two bodies that drift apart
20
- - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
21
+ - Retire on a release number, which retires it on a date nothing measured
21
22
 
22
23
  ## Out of scope
23
24
 
@@ -7,17 +7,18 @@ description: Why a pointer answers under the old `draft-screencast` name, and th
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a person typing the old name after the rename to `script-screencast` meets an unknown command with nothing naming where the skill went. A target that has not run `canon migrate skill-names` still holds files telling someone to type it, and a live gitignored record written before the rename still names it, since the sweep reads the tracked listing only.
10
+ Without this skill, a person typing the old name after the rename to `script-screencast` meets an unknown command that names no successor. A target that has not run `canon migrate skill-names` still tells people to type it, and so does a live gitignored record, which the sweep never reads.
11
11
 
12
12
  ## Must
13
13
 
14
14
  - Name `script-screencast` as the skill to run, so a typed invocation of the old name reaches the new one in one step
15
- - Carry `disable-model-invocation: true`, so routing never matches the old description against a request the new skill owns
15
+ - Carry `disable-model-invocation: true`, so routing never matches the old description against a request `script-screencast` owns
16
+ - Retire once `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name
16
17
 
17
18
  ## Must not
18
19
 
19
20
  - Carry any part of the screencast script draft, which would give one behavior two bodies that drift apart
20
- - Retire on a release number. Retire it when `canon migrate skill-names --json` reports zero citations in every target the rollout reaches and no live `.canon/` record names the old name, since a release number retires it on a date nothing measured.
21
+ - Retire on a release number, which retires it on a date nothing measured
21
22
 
22
23
  ## Out of scope
23
24