@erclx/canon 5.45.0 → 5.47.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/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/REQUIREMENT.md +15 -31
- package/claude/skills/auto-ship/REQUIREMENT.md +14 -25
- package/claude/skills/backlog-triage/REQUIREMENT.md +12 -23
- package/claude/skills/build-in-slices/REQUIREMENT.md +15 -25
- package/claude/skills/canon-cli/REQUIREMENT.md +15 -27
- package/claude/skills/canon-feedback/REQUIREMENT.md +10 -18
- package/claude/skills/canon-feedback-triage/REQUIREMENT.md +10 -15
- package/claude/skills/canvas-board/REQUIREMENT.md +14 -28
- package/claude/skills/ci-workflow/REQUIREMENT.md +12 -21
- package/claude/skills/code-craft/REQUIREMENT.md +14 -28
- package/claude/skills/codebase-layout/REQUIREMENT.md +14 -31
- package/claude/skills/context-fold/REQUIREMENT.md +15 -39
- package/claude/skills/context-fold/references/context.md +3 -3
- package/claude/skills/create-rule/REQUIREMENT.md +10 -24
- package/claude/skills/create-rule/SKILL.md +3 -0
- package/claude/skills/create-skill/REQUIREMENT.md +10 -21
- package/claude/skills/decision-escalate/REQUIREMENT.md +12 -24
- package/claude/skills/deploy-app/REQUIREMENT.md +12 -22
- package/claude/skills/deprecation-migration/REQUIREMENT.md +14 -42
- package/claude/skills/design-identity/REQUIREMENT.md +14 -20
- package/claude/skills/design-taste/REQUIREMENT.md +16 -57
- package/claude/skills/docs-sync/REQUIREMENT.md +14 -23
- package/claude/skills/document-health/REQUIREMENT.md +15 -29
- package/claude/skills/document-health/SKILL.md +2 -2
- package/claude/skills/document-repair/REQUIREMENT.md +32 -0
- package/claude/skills/document-repair/SKILL.md +76 -0
- package/claude/skills/document-repair/references/batches.md +44 -0
- package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -3
- package/claude/skills/draft-doc/REQUIREMENT.md +4 -3
- package/claude/skills/draft-figure/REQUIREMENT.md +4 -3
- package/claude/skills/draft-identity/REQUIREMENT.md +4 -3
- package/claude/skills/draft-ready/REQUIREMENT.md +4 -3
- package/claude/skills/draft-screencast/REQUIREMENT.md +4 -3
- package/claude/skills/draft-slides/REQUIREMENT.md +4 -3
- package/claude/skills/draw-figure/REQUIREMENT.md +15 -39
- package/claude/skills/git-branch/REQUIREMENT.md +12 -26
- package/claude/skills/git-commit/REQUIREMENT.md +11 -15
- package/claude/skills/git-followup/REQUIREMENT.md +11 -22
- package/claude/skills/git-followup/SKILL.md +1 -0
- package/claude/skills/git-issue/REQUIREMENT.md +9 -15
- package/claude/skills/git-pr/REQUIREMENT.md +13 -32
- package/claude/skills/git-pr/SKILL.md +11 -2
- package/claude/skills/git-pr/references/closing-issues.md +47 -0
- package/claude/skills/git-pr/references/pr.md +62 -7
- package/claude/skills/git-ship/REQUIREMENT.md +13 -26
- package/claude/skills/git-split/REQUIREMENT.md +10 -17
- package/claude/skills/git-stage/REQUIREMENT.md +12 -18
- package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
- package/claude/skills/make-deck/REQUIREMENT.md +13 -21
- package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
- package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
- package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
- package/claude/skills/plan-groundwork/SKILL.md +5 -2
- package/claude/skills/plan-groundwork/references/output.md +47 -1
- package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
- package/claude/skills/plan-intake/references/intake.md +2 -2
- package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
- package/claude/skills/plan-intake-answer/SKILL.md +7 -1
- package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
- package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
- package/claude/skills/read-frames/REQUIREMENT.md +3 -8
- package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
- package/claude/skills/review-address/REQUIREMENT.md +14 -38
- package/claude/skills/review-address/SKILL.md +18 -6
- package/claude/skills/review-address/references/post-review-findings.md +4 -1
- package/claude/skills/review-address/references/rebase-only.md +14 -2
- package/claude/skills/review-craft/REQUIREMENT.md +14 -32
- package/claude/skills/review-pr/REQUIREMENT.md +15 -34
- package/claude/skills/review-pr/SKILL.md +9 -2
- package/claude/skills/review-pr/references/body-variants.md +29 -8
- package/claude/skills/review-pr/references/post.md +29 -10
- package/claude/skills/review-ui/REQUIREMENT.md +14 -39
- package/claude/skills/review-ui/SKILL.md +1 -0
- package/claude/skills/review-ui/references/post.md +2 -0
- package/claude/skills/review-ui/references/tick.md +3 -0
- package/claude/skills/role-orchestrator/REQUIREMENT.md +2 -2
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
- package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
- package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
- package/claude/skills/role-reviewer/SKILL.md +8 -1
- package/claude/skills/role-worker/REQUIREMENT.md +2 -2
- package/claude/skills/role-worker/SKILL.md +3 -0
- package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
- package/claude/skills/search-craft/REQUIREMENT.md +12 -36
- package/claude/skills/search-craft/SKILL.md +1 -1
- package/claude/skills/search-craft/references/adopted.md +2 -2
- package/claude/skills/session-compact/REQUIREMENT.md +13 -23
- package/claude/skills/session-map/REQUIREMENT.md +13 -29
- package/claude/skills/session-relay/REQUIREMENT.md +14 -58
- package/claude/skills/session-relay/SKILL.md +6 -0
- package/claude/skills/session-resume/REQUIREMENT.md +13 -27
- package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
- package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
- package/claude/skills/target-check/REQUIREMENT.md +16 -23
- package/claude/skills/target-setup/REQUIREMENT.md +11 -34
- package/claude/skills/task-board/REQUIREMENT.md +13 -22
- package/claude/skills/task-board/SKILL.md +7 -0
- package/claude/skills/task-board/references/decline.md +2 -2
- package/claude/skills/task-board/references/tasks.md +1 -1
- package/claude/skills/task-complete/REQUIREMENT.md +11 -24
- package/claude/skills/task-complete/references/archive.md +4 -2
- package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
- package/claude/skills/test-craft/REQUIREMENT.md +15 -46
- package/claude/skills/test-first/REQUIREMENT.md +14 -20
- package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
- package/claude/skills/ui-checklist/SKILL.md +3 -3
- package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
- package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
- package/claude/skills/video-craft/REQUIREMENT.md +14 -27
- package/claude/skills/write-doc/REQUIREMENT.md +14 -24
- package/claude/skills/write-human/REQUIREMENT.md +15 -27
- package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
- package/docs/agents/context-audit.md +19 -12
- package/docs/agents/markdown-audit.md +15 -10
- package/docs/target/projects.md +2 -0
- package/docs/workflow/skill-map.md +6 -5
- package/docs/workflow/zshrc-aliases.md +3 -0
- package/governance/renames.toml +0 -2
- package/governance/rules/claude/output.md +5 -1
- package/governance/rules/code/routing.md +5 -1
- package/governance/stacks/base.toml +0 -1
- package/package.json +1 -1
- package/scripts/core/bootstrap.sh +1 -0
- package/src/claude/cases/workflow.ts +12 -0
- package/src/commands/context.ts +57 -3
- package/src/commands/labels.ts +149 -4
- package/src/commands/markdown.ts +188 -21
- package/src/commands/pr.ts +113 -4
- package/src/commands/sessions.ts +58 -11
- package/src/commands/tasks.ts +182 -0
- package/src/commands/worktrees.ts +2 -0
- package/src/context/coverage.ts +210 -0
- package/src/context/gate.ts +12 -3
- package/src/gate/stages.ts +1 -1
- package/src/init/steps.ts +45 -0
- package/src/intake/items.ts +14 -0
- package/src/labels/closing.ts +46 -0
- package/src/labels/density.ts +363 -0
- package/src/markdown/gated.ts +250 -0
- package/src/markdown/scope.ts +115 -2
- package/src/migrate/rename.ts +6 -0
- package/src/pr/evidence.ts +1 -1
- package/src/pr/rest.ts +2 -0
- package/src/pr/tick.ts +89 -0
- package/src/sessions/claim.ts +7 -0
- package/src/sessions/live.ts +79 -6
- package/src/sessions/registry.ts +11 -0
- package/src/sessions/resolve.ts +85 -7
- package/src/tasks/archive.ts +15 -4
- package/src/tasks/closes.ts +136 -0
- package/src/tasks/record.ts +1 -1
- package/src/worktrees/reclaim.ts +16 -1
- package/tooling/base/configs/scripts/verify.ts +1 -1
- package/tooling/base/seeds/.github/pull_request_template.md +1 -1
- package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
- package/tooling/claude/seeds/CLAUDE.md +2 -2
- 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
|
|
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
|
|
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
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
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
|
-
-
|
|
26
|
-
- Add a
|
|
27
|
-
- Modify `pick-by-eye`, `canon capture`, or `canon design render
|
|
28
|
-
-
|
|
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
|
-
-
|
|
38
|
-
-
|
|
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
|
|
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
|
|
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
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
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
|
|
54
|
-
-
|
|
55
|
-
- Restate the banned characters,
|
|
56
|
-
- Express intensity as a numeric scale
|
|
57
|
-
-
|
|
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,
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
21
|
-
- Resolve one merge base, prefer the remote ref over the local
|
|
22
|
-
- Say so in the output when the baseline degrades, rather than reporting a clean pass
|
|
23
|
-
- Discover the doc set by glob at run time
|
|
24
|
-
-
|
|
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
|
|
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
|
|
40
|
-
- The requirements record
|
|
41
|
-
- `CLAUDE.md` and the installed seed docs, which an operator reconciles by hand
|
|
42
|
-
- Changelog entries, which release tooling generates
|
|
43
|
-
- Whether the prose conforms to its standards
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
19
|
-
- Read length and placement through the verb
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
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
|
|
31
|
-
- Emit a verdict
|
|
32
|
-
-
|
|
33
|
-
-
|
|
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
|
|
45
|
-
- Banned tokens and structural checkpoints
|
|
46
|
-
- Rewriting a stale claim once
|
|
47
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
21
|
+
- Retire on a release number, which retires it on a date nothing measured
|
|
21
22
|
|
|
22
23
|
## Out of scope
|
|
23
24
|
|