@erclx/canon 5.40.0 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -17
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/references/adopted.md +34 -14
- package/claude/skills/auto-ship/REQUIREMENT.md +2 -0
- package/claude/skills/auto-ship/SKILL.md +28 -2
- package/claude/skills/auto-ship/references/draft-mark.md +32 -6
- package/claude/skills/auto-ship/references/failure-recovery.md +15 -13
- package/claude/skills/auto-ship/references/fan-in.md +59 -0
- package/claude/skills/auto-ship/references/tier-failures.md +31 -10
- package/claude/skills/auto-ship/references/ui-checklist.md +9 -4
- package/claude/skills/auto-ship/references/worktree-name.md +9 -3
- package/claude/skills/build-in-slices/references/adopted.md +35 -21
- package/claude/skills/canvas-board/references/canvas.md +17 -6
- package/claude/skills/canvas-board/references/design.md +26 -7
- package/claude/skills/code-craft/references/adopted.md +58 -20
- package/claude/skills/codebase-layout/references/adopted.md +49 -16
- package/claude/skills/codebase-layout/references/frontend.md +11 -4
- package/claude/skills/codebase-layout/references/tests.md +4 -2
- package/claude/skills/context-fold/references/classify.md +10 -15
- package/claude/skills/context-fold/references/completion-report.md +11 -9
- package/claude/skills/context-fold/references/context-refresh.md +26 -9
- package/claude/skills/context-fold/references/unusable-baseline.md +5 -3
- package/claude/skills/create-rule/REQUIREMENT.md +5 -0
- package/claude/skills/create-rule/SKILL.md +9 -1
- package/claude/skills/create-rule/references/checklist.md +26 -0
- package/claude/skills/create-rule/references/rule.md +98 -20
- package/claude/skills/create-skill/SKILL.md +1 -0
- package/claude/skills/create-skill/references/skill-disclosure.md +10 -2
- package/claude/skills/create-skill/references/skill-frontmatter.md +43 -0
- package/claude/skills/create-skill/references/skill-paths.md +7 -4
- package/claude/skills/create-skill/references/skill-practice.md +6 -3
- package/claude/skills/create-skill/references/skill-requirement.md +4 -2
- package/claude/skills/create-skill/references/skill.md +67 -44
- package/claude/skills/decision-escalate/REQUIREMENT.md +1 -1
- package/claude/skills/decision-escalate/SKILL.md +1 -2
- package/claude/skills/deploy-app/references/vercel.md +2 -1
- package/claude/skills/deprecation-migration/references/adopted.md +44 -25
- package/claude/skills/design-taste/references/adopted.md +9 -1
- package/claude/skills/design-taste/references/craft.md +3 -1
- package/claude/skills/design-taste/references/kinds.md +8 -7
- package/claude/skills/design-taste/references/preflight.md +12 -0
- package/claude/skills/design-taste/references/systems.md +7 -6
- package/claude/skills/design-taste/references/tells.md +24 -25
- package/claude/skills/design-taste/references/vocabulary.md +7 -5
- package/claude/skills/document-health/references/axes.md +54 -30
- package/claude/skills/draft-and-pick/references/live-arms.md +2 -2
- package/claude/skills/draft-doc/references/context.md +4 -3
- package/claude/skills/draft-doc/references/docs.md +6 -3
- package/claude/skills/draft-doc/references/readme/agent-facing.md +6 -0
- package/claude/skills/draft-doc/references/readme/application.md +8 -2
- package/claude/skills/draft-doc/references/readme/cli.md +5 -1
- package/claude/skills/draft-doc/references/readme/library.md +4 -0
- package/claude/skills/draft-doc/references/readme/plugin.md +9 -1
- package/claude/skills/draft-doc/references/readme.md +30 -13
- package/claude/skills/draft-doc/references/requirements.md +17 -4
- package/claude/skills/draft-doc/references/wiki-kind.md +20 -10
- package/claude/skills/draft-figure/references/architecture-set.md +7 -3
- package/claude/skills/draft-figure/references/figures.md +8 -6
- package/claude/skills/draft-figure/references/hand-drawn.md +3 -1
- package/claude/skills/draft-figure/references/mermaid-path.md +19 -9
- package/claude/skills/draft-figure/references/mermaid.md +10 -5
- package/claude/skills/draft-ready/references/ready.md +22 -15
- package/claude/skills/git-branch/REQUIREMENT.md +17 -6
- package/claude/skills/git-branch/SKILL.md +63 -7
- package/claude/skills/git-branch/references/branch.md +11 -1
- package/claude/skills/git-branch/references/slug.md +17 -5
- package/claude/skills/git-commit/references/commit.md +8 -0
- package/claude/skills/git-commit/references/versioning.md +23 -17
- package/claude/skills/git-followup/REQUIREMENT.md +1 -1
- package/claude/skills/git-followup/SKILL.md +5 -6
- package/claude/skills/git-issue/references/issue.md +29 -16
- package/claude/skills/git-pr/REQUIREMENT.md +1 -5
- package/claude/skills/git-pr/SKILL.md +11 -22
- package/claude/skills/git-pr/references/final-command.md +21 -8
- package/claude/skills/git-pr/references/labels.md +45 -28
- package/claude/skills/git-pr/references/pr.md +28 -9
- package/claude/skills/git-pr/references/publish.md +42 -28
- package/claude/skills/git-pr/references/task-number.md +20 -8
- package/claude/skills/git-ship/SKILL.md +1 -1
- package/claude/skills/plan-feature/references/batches.md +48 -1
- package/claude/skills/plan-feature/references/plan-lifecycle.md +10 -3
- package/claude/skills/plan-feature/references/plan.md +59 -20
- package/claude/skills/plan-groundwork/references/groundwork-spikes.md +4 -1
- package/claude/skills/plan-groundwork/references/groundwork.md +14 -16
- package/claude/skills/plan-intake/references/intake.md +29 -24
- package/claude/skills/plan-intake-answer/REQUIREMENT.md +1 -1
- package/claude/skills/plan-intake-answer/SKILL.md +1 -2
- package/claude/skills/pr-evidence/REQUIREMENT.md +40 -0
- package/claude/skills/pr-evidence/SKILL.md +53 -0
- package/claude/skills/pr-evidence/references/evidence.md +150 -0
- package/claude/skills/review-address/references/post-review-findings.md +10 -3
- package/claude/skills/review-address/references/rebase-conflicts.md +22 -7
- package/claude/skills/review-address/references/rest-reads.md +3 -1
- package/claude/skills/review-craft/references/adopted.md +35 -18
- package/claude/skills/review-craft/references/security.md +42 -7
- package/claude/skills/review-craft/references/ui.md +23 -8
- package/claude/skills/review-pr/SKILL.md +6 -6
- package/claude/skills/review-pr/references/body-variants.md +29 -9
- package/claude/skills/review-pr/references/close-out.md +20 -5
- package/claude/skills/review-pr/references/key-changes.md +27 -3
- package/claude/skills/review-pr/references/post.md +83 -31
- package/claude/skills/review-pr/references/scope.md +54 -19
- package/claude/skills/review-ui/SKILL.md +2 -0
- package/claude/skills/review-ui/references/close-out.md +49 -0
- package/claude/skills/review-ui/references/driving.md +24 -4
- package/claude/skills/review-ui/references/post.md +43 -13
- package/claude/skills/role-orchestrator/references/orchestrator-cloud-launch.md +67 -17
- package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +81 -40
- package/claude/skills/role-orchestrator/references/orchestrator-handback.md +52 -15
- package/claude/skills/role-orchestrator/references/orchestrator-handoff.md +48 -26
- package/claude/skills/role-orchestrator/references/orchestrator-inbound.md +12 -13
- package/claude/skills/role-orchestrator/references/orchestrator-launch.md +72 -36
- package/claude/skills/role-orchestrator/references/orchestrator-output.md +12 -4
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +64 -24
- package/claude/skills/role-orchestrator/references/orchestrator-poll.md +80 -26
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +41 -18
- package/claude/skills/role-orchestrator/references/orchestrator-resume.md +19 -7
- package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +22 -12
- package/claude/skills/role-orchestrator/references/orchestrator-reviewer-launch.md +15 -6
- package/claude/skills/role-orchestrator/references/orchestrator-sweep.md +25 -7
- package/claude/skills/role-orchestrator/references/orchestrator-watch.md +34 -8
- package/claude/skills/role-orchestrator/scripts/poll.ts +16 -24
- package/claude/skills/role-worker/REQUIREMENT.md +2 -0
- package/claude/skills/role-worker/SKILL.md +17 -0
- package/claude/skills/search-craft/references/adopted.md +18 -6
- package/claude/skills/session-map/references/session.md +26 -7
- package/claude/skills/session-worktree/references/main-root-writes.md +25 -8
- package/claude/skills/systematic-debugging/references/adopted.md +30 -16
- package/claude/skills/target-check/references/domains.md +39 -11
- package/claude/skills/target-setup/references/detect.md +80 -65
- package/claude/skills/target-setup/references/indexes.md +8 -6
- package/claude/skills/task-board/references/board.md +86 -30
- package/claude/skills/task-board/references/decline.md +29 -13
- package/claude/skills/task-board/references/tasks-decline.md +12 -5
- package/claude/skills/task-board/references/tasks.md +65 -33
- package/claude/skills/task-complete/references/archive.md +41 -17
- package/claude/skills/task-complete/references/receipt-sweep.md +23 -9
- package/claude/skills/task-complete/references/unusable-baseline.md +10 -3
- package/claude/skills/teach-workspace/REQUIREMENT.md +1 -1
- package/claude/skills/teach-workspace/SKILL.md +1 -2
- package/claude/skills/teach-workspace/references/glossary.md +6 -2
- package/claude/skills/teach-workspace/references/lesson-build.md +44 -16
- package/claude/skills/teach-workspace/references/lesson-craft.md +12 -7
- package/claude/skills/teach-workspace/references/pedagogy.md +6 -3
- package/claude/skills/teach-workspace/references/promotion-fold.md +17 -11
- package/claude/skills/teach-workspace/references/promotion.md +31 -8
- package/claude/skills/teach-workspace/references/revisit.md +8 -2
- package/claude/skills/teach-workspace/references/teach.md +17 -9
- package/claude/skills/test-craft/references/adopted.md +48 -14
- package/claude/skills/test-craft/references/component.md +7 -4
- package/claude/skills/test-craft/references/e2e.md +25 -7
- package/claude/skills/test-craft/references/unit.md +3 -1
- package/claude/skills/test-first/references/adopted.md +12 -4
- package/claude/skills/ui-checklist/REQUIREMENT.md +1 -1
- package/claude/skills/ui-checklist/SKILL.md +1 -1
- package/claude/skills/video-craft/references/adopted.md +62 -18
- package/claude/skills/write-human/references/adopted.md +21 -8
- package/docs/workflow/parallel-features.md +2 -1
- package/docs/workflow/skill-map.md +2 -1
- package/package.json +1 -1
- package/src/claude/cases/git.ts +4 -0
- package/src/claude/cases/workflow.ts +5 -0
- package/src/commands/pr.ts +174 -37
- package/src/commands/records.ts +11 -3
- package/src/context/shape-gated.ts +1 -0
- package/src/markdown/scope.ts +150 -2
- package/src/pr/frames.ts +53 -9
- package/src/pr/lift.ts +6 -3
- package/src/pr/review-state.ts +182 -0
- package/src/records/validate.ts +1 -0
- package/src/tasks/answers.ts +79 -2
- package/src/tasks/fan-in.ts +176 -0
- package/src/tasks/stack.ts +1 -1
- package/tooling/astro/reference.md +80 -39
- package/tooling/base/reference.md +63 -32
- package/tooling/base/seeds/canon/context/ci.md +7 -15
- package/tooling/base/seeds/canon/context/development.md +14 -14
- package/tooling/claude/reference.md +40 -22
- package/tooling/cloudflare/reference.md +31 -12
- package/tooling/go/reference.md +47 -23
- package/tooling/nextjs/reference.md +52 -19
- package/tooling/php/reference.md +35 -16
- package/tooling/python/reference.md +47 -30
- package/tooling/shell/reference.md +6 -5
- package/tooling/vite-react/reference.md +49 -21
- package/tooling/web/reference.md +130 -70
- package/claude/skills/git-pr/references/evidence.md +0 -124
|
@@ -5,39 +5,38 @@ description: The visual defaults a model reaches for when nothing states a direc
|
|
|
5
5
|
|
|
6
6
|
# Machine tells in design
|
|
7
7
|
|
|
8
|
-
Each item below is a shape rather than a value, which is why no ban list of colors or fonts reaches any of them. Read this before handing over anything a model drafted
|
|
8
|
+
Each item below is a shape rather than a value, which is why no ban list of colors or fonts reaches any of them. Read this before handing over anything a model drafted, and skip it on a small change to a surface that already has a settled direction.
|
|
9
9
|
|
|
10
|
-
The skill body carries the ten most common of these
|
|
11
|
-
|
|
12
|
-
An item is a default to reach past, not a prohibition. A brief that explicitly asks for one gets it, and the point is that it was chosen rather than defaulted into.
|
|
10
|
+
The skill body carries the ten most common of these, and this is the same catalog at full length. An item is a default to reach past, not a prohibition, so a brief that explicitly asks for one gets it, chosen rather than defaulted into.
|
|
13
11
|
|
|
14
12
|
## Composition
|
|
15
13
|
|
|
16
|
-
- **The three equal cards.** Three identical boxes in a row under a heading
|
|
17
|
-
- **One section shape repeated down the page.**
|
|
14
|
+
- **The three equal cards.** Three identical boxes in a row under a heading. Reach for a two-column alternation, an asymmetric grid, a list with one item given weight, or a single worked example.
|
|
15
|
+
- **One section shape repeated down the page.** Every section a centered heading over a centered body reads flat whatever its palette. Vary alignment, container width and the ratio between sections.
|
|
18
16
|
- **The centered hero over a dark wash.** Centered headline, centered subhead, two buttons, gradient behind. Reach for an asymmetric split, a full-bleed artifact, or content that starts immediately.
|
|
19
|
-
- **Decoration standing in for structure.** Hairline grids, crosshairs, floating rules and corner marks added so a page feels designed.
|
|
20
|
-
- **The corner floater.** A large left-aligned
|
|
17
|
+
- **Decoration standing in for structure.** Hairline grids, crosshairs, floating rules and corner marks added so a page feels designed. Keep them only where they organize real content.
|
|
18
|
+
- **The corner floater.** A large left-aligned heading with a small paragraph floating top right, aligned to nothing. Put the sub-text under the heading or build a real two-column header.
|
|
21
19
|
|
|
22
20
|
## Content and labels
|
|
23
21
|
|
|
24
22
|
- **Enumerated eyebrows.** `001 / Capabilities`, `Phase 02`, `Step 1`, `Stage One`. The content is the label. Where progression genuinely matters, use the verb.
|
|
25
23
|
- **Poetic section labels.** "From the field", "On our desks", "Currently on the bench". Use the plain functional label or drop the label.
|
|
26
|
-
- **Atmospheric strips.** City, time zone, temperature, coordinates, build version, last-sync time, placed for texture
|
|
24
|
+
- **Atmospheric strips.** City, time zone, temperature, coordinates, build version, last-sync time, placed for texture. Keep one only where it carries real state a reader acts on.
|
|
27
25
|
- **Scroll cues.** "Scroll", an animated wheel, a downward arrow with a label. A reader looking at the top of a page knows what scrolling is.
|
|
28
|
-
- **Decorative status dots.** A
|
|
29
|
-
- **Filler verbs.** A verb chosen for
|
|
30
|
-
- **Placeholder that reads as placeholder.** Generic
|
|
31
|
-
- **Invented precision.** A figure like 4.1x or 48k
|
|
26
|
+
- **Decorative status dots.** A colored dot before every nav item, list row or badge. Keep it only where it reports genuine state, and then sparingly.
|
|
27
|
+
- **Filler verbs.** A verb chosen for warmth rather than for what it reports, such as `elevate`, `unleash`, `empower` or `next-generation`. Name the thing the surface does.
|
|
28
|
+
- **Placeholder that reads as placeholder.** Generic names, egg avatars, `Acme`-family companies, one portrait for several people, every item dated alike. Real collections are uneven and specific.
|
|
29
|
+
- **Invented precision.** A figure like 4.1x or 48k came from real data, is marked as sample, or does not appear. An invented number gets shipped, because it reads as confidence.
|
|
32
30
|
- **The fake screenshot built from boxes.** A product UI simulated out of styled rectangles inside a hero. Show the real thing, a real capture, or nothing.
|
|
33
|
-
- **Copy nobody re-read.** Read every visible string once as a reader rather than
|
|
31
|
+
- **Copy nobody re-read.** Read every visible string once as a reader rather than its author before handing over. Plain beats clever and wrong, which is what a model drafting copy produces by default.
|
|
32
|
+
- **What the re-read rewrites.** A string that is grammatically broken, carries a pronoun with no antecedent on the page, or reaches for charm it has not earned.
|
|
34
33
|
|
|
35
34
|
## Surface and palette
|
|
36
35
|
|
|
37
36
|
- **Glow as depth.** Outer glows and neon rims standing in for elevation. Use a border, a tint, or a real shadow with direction.
|
|
38
37
|
- **Pure black and pure white as grounds.** Both are harsher than nearly any surface wants. Move off the extreme.
|
|
39
|
-
- **Saturation everywhere.**
|
|
40
|
-
- **The gradient as a substitute for a decision.** A gradient
|
|
38
|
+
- **Saturation everywhere.** A full-saturation accent beside tinted neutrals leaves nothing to anchor on. Desaturate the neutrals and let one accent carry.
|
|
39
|
+
- **The gradient as a substitute for a decision.** A gradient over a section, a heading, or a button set because flat looked plain. Flat composition is fixed by composition, not gradient.
|
|
41
40
|
- **Uniform radius and uniform elevation.** Every card at the same radius with the same shadow flattens hierarchy. Let the thing that matters differ.
|
|
42
41
|
|
|
43
42
|
## Typography
|
|
@@ -49,28 +48,28 @@ An item is a default to reach past, not a prohibition. A brief that explicitly a
|
|
|
49
48
|
|
|
50
49
|
## Motion
|
|
51
50
|
|
|
52
|
-
- **Motion nobody can justify.** Before adding any animation,
|
|
51
|
+
- **Motion nobody can justify.** Before adding any animation, name the hierarchy, sequence, feedback, or changed state it communicates. A sentence that will not come means it goes.
|
|
53
52
|
- **The permanent loop.** Anything animating forever with no input. It costs attention on every frame and earns none back.
|
|
54
53
|
- **Motion on arrival for everything.** Every section fading up on scroll. Reserve entrance motion for what genuinely needs the eye.
|
|
55
|
-
- **Motion claimed but
|
|
56
|
-
- **Motion that ignores a reduced-motion preference.**
|
|
54
|
+
- **Motion claimed but absent, or present but unclaimed.** A "restrained" surface animating on every scroll, or a "fluid" one sitting still, has decided nothing. Ship the motion or drop the claim.
|
|
55
|
+
- **Motion that ignores a reduced-motion preference.** A correctness failure the `ui` governance rules own, not a taste one. It sits here so a motion pass does not read this catalog as all motion owes.
|
|
57
56
|
|
|
58
57
|
## The countable limits
|
|
59
58
|
|
|
60
|
-
These
|
|
59
|
+
These rules carry numbers, so they are checked by counting rather than by judging. Every one came out of production testing by people shipping model-drafted pages.
|
|
61
60
|
|
|
62
61
|
- **A layout family appears once.** Once a section uses a shape, no other section on the surface uses it. Eight sections need at least four distinct families.
|
|
63
|
-
- **Two consecutive splits, never three.** Alternating image
|
|
64
|
-
- **One small uppercase label per three sections.** The
|
|
62
|
+
- **Two consecutive splits, never three.** Alternating image sides reads as considered twice and as filler by the third. Break it with a full-width section, a vertical stack, or a grid.
|
|
63
|
+
- **One small uppercase label per three sections.** The most over-reached default in model output, with the count in `interface-casing`. Usually delete it, since position already says what a section is.
|
|
65
64
|
- **One marquee.** Two sliding strips on one surface read as filler rather than as a device.
|
|
66
65
|
- **Cells equal items.** A grid with a hole in it, or a blank tile at the end, means the grid was shaped before the content was counted. Reshape it.
|
|
67
|
-
- **Over five items wants a different component.**
|
|
66
|
+
- **Over five items wants a different component.** Group into clusters, split into columns, give each item a card, make them scrollable, or collapse the tail behind a disclosure.
|
|
68
67
|
|
|
69
68
|
## The first screen
|
|
70
69
|
|
|
71
|
-
- **It fits.** The point and the primary action are both visible without scrolling.
|
|
70
|
+
- **It fits.** The point and the primary action are both visible without scrolling. Copy that will not fit is too long or set too large, and the second is the more common cause.
|
|
72
71
|
- **At most four text elements.** A label or a brand strip, a headline, a short supporting line, and the actions. That is the whole budget.
|
|
73
|
-
- **Everything else moves down.** A
|
|
72
|
+
- **Everything else moves down.** A tagline under the actions, a trust strip, a pricing hint, a feature list, a row of faces. Each is a section of its own below, not a fifth element.
|
|
74
73
|
- **Plan the type scale against the asset.** A headline wrapping to four lines is a size error rather than a length error.
|
|
75
74
|
- **Logos go under it, never inside it.** A credibility row shares no space with the point.
|
|
76
75
|
|
|
@@ -7,9 +7,11 @@ description: The layer, property, pattern and process terms this skill uses, so
|
|
|
7
7
|
|
|
8
8
|
Terms used by `design-taste` and by the skills it is loaded alongside. It changes when a design round needs a name it cannot look up here.
|
|
9
9
|
|
|
10
|
-
This glossary departs from one rule in `glossary.md
|
|
10
|
+
This glossary departs from one rule in `glossary.md`, since an entry does not name where the term first appears. The material is five short files a reader can scan, so a location per entry costs more than it returns.
|
|
11
11
|
|
|
12
|
-
Every other rule there holds, and the one deciding membership holds strictly
|
|
12
|
+
- Every other rule there holds, and the one deciding membership holds strictly
|
|
13
|
+
- A term appears here once this skill's own material uses it, never ahead of that
|
|
14
|
+
- The last section records what was considered and left out
|
|
13
15
|
|
|
14
16
|
## Layers
|
|
15
17
|
|
|
@@ -28,7 +30,7 @@ Ordered by when each settles, not alphabetically, since the order is the content
|
|
|
28
30
|
## Properties
|
|
29
31
|
|
|
30
32
|
- **Casing**: whether text is set upper, lower, title or sentence case, treated as a hierarchy decision rather than a typing one.
|
|
31
|
-
- **Density**: how much information a given area carries.
|
|
33
|
+
- **Density**: how much information a given area carries. Correct in an application surface and clutter on a marketing one, so it belongs to the kind rather than to taste.
|
|
32
34
|
- **Hierarchy**: the order a reader takes things in, produced by weight, color, space and position together rather than by size alone.
|
|
33
35
|
- **Ground**: the surface a thing sits on, whether the page behind everything or the fill behind one element. Named apart from "background" because the relationship that matters is what sits against it.
|
|
34
36
|
- **Line height**: the vertical distance from one baseline to the next, set against size rather than fixed across a scale. Avoid "leading", which names the same thing.
|
|
@@ -52,9 +54,9 @@ Named compositions, carried so an operator can ask for one by name instead of de
|
|
|
52
54
|
|
|
53
55
|
How a draft is staged while unfinished.
|
|
54
56
|
|
|
55
|
-
- **FPO**: a placeholder held at the true final size and marked as
|
|
57
|
+
- **FPO**: a placeholder held at the true final size and marked as one, from the print term "for position only". Marking it is the point, since an unmarked stand-in gets read as a decision.
|
|
56
58
|
- **Greeking**: standing text in for copy that does not exist yet, of which lorem ipsum is the common form. Correct while judging space and wrong once an arm is judged on content.
|
|
57
|
-
- **Grey-box**: drawing every element as a flat neutral block
|
|
59
|
+
- **Grey-box**: drawing every element as a flat neutral block, removing the layers above the one under judgment from view. Avoid "wireframe", which reads as a deliverable rather than a stage.
|
|
58
60
|
|
|
59
61
|
## Terms this vocabulary deliberately does not carry
|
|
60
62
|
|
|
@@ -11,78 +11,102 @@ The skill body holds the order, the guards, and the report shape. This holds the
|
|
|
11
11
|
|
|
12
12
|
## Length
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
| Field | Value |
|
|
15
|
+
| -------------- | ------------------------------------------------------------------------------------------ |
|
|
16
|
+
| Measures | Whether a document, or a passage inside it, has grown past what a reader takes in one pass |
|
|
17
|
+
| Verb | `canon markdown audit --json` |
|
|
18
|
+
| Evidence class | `measured` |
|
|
15
19
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
**Evidence class:** `measured`.
|
|
19
|
-
|
|
20
|
-
The record carries the checkpoints it read against under `checkpoints` and the per-file weights under `entries`. Read both from the record rather than from a number stated here, since the CLI moves a checkpoint on its own cadence and a copy of one goes stale in place.
|
|
21
|
-
|
|
22
|
-
Four weights answer this axis, each naming a different shape of overgrowth:
|
|
20
|
+
The record carries the checkpoints it read against under `checkpoints` and the per-file weights under `entries`. Read both from the record rather than from a number stated here, since the CLI moves a checkpoint on its own cadence and a copy goes stale in place.
|
|
23
21
|
|
|
24
22
|
- `heavyBullets`: a top-level bullet past the character checkpoint, which is a paragraph wearing a dash
|
|
25
23
|
- `heavyParagraphs`: a paragraph past the sentence or character checkpoint
|
|
26
24
|
- `longestRun`, against `longestRunLine`: unbroken rendered lines between headings, which is the depth checkpoint
|
|
27
25
|
- `cadence`, carrying `measured`, `flat`, and `repeating`: sentence-length spread and repeated openers
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
### Reading a length finding
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
Weight is a judgment a reader settles rather than a defect, as the verb states for itself. A finding here argues for a split or a trim rather than naming a broken rule.
|
|
32
30
|
|
|
33
|
-
**
|
|
31
|
+
- **Routes to:** a split of the document, or a move of the overgrown passage to the surface that owns it
|
|
32
|
+
- **A project statement of what a document may hold** decides whether the passage belongs, and the finding routes there rather than to a trim
|
|
33
|
+
- **Caveat:** the cadence numbers are drawn from prose read straight through. Terse reference prose sits below that range correctly, so a flat paragraph in a table or bullet-heavy file is no finding.
|
|
34
34
|
|
|
35
35
|
## Placement
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
| Field | Value |
|
|
38
|
+
| -------------- | ------------------------------------------------------------------------------------------------------------------------ |
|
|
39
|
+
| Measures | Whether a document's content sits in the file that owns it, and whether the catalogs pointing at it resolve |
|
|
40
|
+
| Verbs | `canon context audit --json` for the structural half, `canon context classify sweep --json` for the per-section verdicts |
|
|
41
|
+
| Evidence class | `measured` for the audit's findings, `classified` for the sweep's verdicts |
|
|
38
42
|
|
|
39
|
-
|
|
43
|
+
The audit answers required sections, entry length, citation resolution, reference form, catalog tables, provenance, and index drift. Required sections reach context entries.
|
|
40
44
|
|
|
41
|
-
|
|
45
|
+
- A citation resolving to nothing is a fact and gates
|
|
46
|
+
- Entry length, reference form, table shape, and provenance are judgments under every flag
|
|
42
47
|
|
|
43
|
-
The
|
|
48
|
+
### The sweep's verdicts
|
|
44
49
|
|
|
45
|
-
The sweep classifies each section as keep, replace or rewrite, history, or move. A `move` verdict is the placement finding proper, naming content sitting in the wrong document.
|
|
50
|
+
The sweep classifies each section as keep, replace or rewrite, history, or move. A `move` verdict is the placement finding proper, naming content sitting in the wrong document.
|
|
46
51
|
|
|
47
|
-
|
|
52
|
+
- Each verdict carries its own confidence, which is why the class is `classified` rather than `measured`
|
|
53
|
+
- A low-confidence `move` is a prompt to look rather than an instruction to cut
|
|
54
|
+
- **Routes to:** the document the verdict names as the owner. Where the move crosses a tier rather than a file, the project's own content-ownership rules decide the destination.
|
|
48
55
|
|
|
49
|
-
|
|
56
|
+
### When a verb resolves nothing
|
|
50
57
|
|
|
51
|
-
|
|
58
|
+
Both verbs resolve their folders by surface root rather than by a path written into them, so a project laid out differently resolves nothing. The two degrade differently.
|
|
52
59
|
|
|
53
|
-
|
|
60
|
+
- The audit refuses with `reason: "no-folders"`, naming the folders it looked for. Report that refusal as an unread axis.
|
|
61
|
+
- The sweep with the model layer off answers from its regex layer alone, a narrower read rather than a refusal, so say which layer answered
|
|
54
62
|
|
|
55
|
-
|
|
63
|
+
## Staleness
|
|
56
64
|
|
|
57
|
-
|
|
65
|
+
| Field | Value |
|
|
66
|
+
| -------------- | ---------------------------------------------------------------- |
|
|
67
|
+
| Measures | Whether a document still describes the tree it was written about |
|
|
68
|
+
| Verb | None |
|
|
69
|
+
| Evidence class | `read` |
|
|
58
70
|
|
|
59
|
-
This is the axis the operator names first and the one nothing measures. A document goes stale by the tree moving under it
|
|
71
|
+
This is the axis the operator names first and the one nothing measures. A document goes stale by the tree moving under it, so no property of the file answers it and a timestamp answers a different question.
|
|
60
72
|
|
|
61
|
-
Read each document against the surfaces it names
|
|
73
|
+
A file untouched for a year beside code untouched for a year is current, and one edited yesterday against a refactor from this morning is stale. Read each document against the surfaces it names, testing four claim shapes without leaving the project.
|
|
62
74
|
|
|
63
75
|
- A file or folder path the document states, against whether it resolves
|
|
64
76
|
- A command or verb the document names, against whether it exists and carries the flags shown
|
|
65
77
|
- A count the document states over a tree, against the tree
|
|
66
78
|
- A cross-reference to another document, against what that document now says
|
|
67
79
|
|
|
68
|
-
A claim resting on none of the four is unverifiable from here. Report it as unread rather than as passing,
|
|
80
|
+
A claim resting on none of the four is unverifiable from here. Report it as unread rather than as passing, the same rule the measured axes take when a verb refuses.
|
|
69
81
|
|
|
70
82
|
### Identity drift in the requirements record
|
|
71
83
|
|
|
72
|
-
This record states what the project is and why
|
|
84
|
+
This record states what the project is and why, so it goes stale by the project changing direction as well as by the tree moving. Test these claim shapes beside the four above, each a `read`.
|
|
73
85
|
|
|
74
86
|
- A goal nobody pursues, read against the task board and the recent history
|
|
75
87
|
- A non-goal the project has since shipped
|
|
76
88
|
- A constraint the tree contradicts
|
|
77
89
|
|
|
78
|
-
|
|
90
|
+
### The review point
|
|
79
91
|
|
|
80
|
-
|
|
92
|
+
The review point beside them is `measured`. `canon records stale canonical --json` returns the `reviewed` date from the record's frontmatter and `releasesSince`, the release tags merged into HEAD after that day.
|
|
81
93
|
|
|
82
|
-
|
|
94
|
+
- A null `releasesSince` means the doc was never reviewed
|
|
95
|
+
- `tagged: false` means no release tag exists to count, so a zero there measured nothing
|
|
96
|
+
- The count is a reminder of how far the project has moved since someone last read the record whole, never a threshold
|
|
97
|
+
|
|
98
|
+
### Routing a staleness finding
|
|
99
|
+
|
|
100
|
+
A document health run reports and never repairs, so a stale claim routes to the skill that rewrites it against an answer rather than to a direct edit from here.
|
|
101
|
+
|
|
102
|
+
A reading is the weakest evidence in the report and the most consequential finding in it, which is the tension this axis ships with. Marking the class keeps the two facts together in the reader's hands.
|
|
83
103
|
|
|
84
104
|
## Why the three stay apart
|
|
85
105
|
|
|
86
|
-
The axes are not equally actionable and a report flattening them implies they are.
|
|
106
|
+
The axes are not equally actionable, and a report flattening them implies they are. Each is worth reporting and each is worth a different response, so the class travels beside the state on every row rather than once in a preamble a reader skims.
|
|
107
|
+
|
|
108
|
+
- A length finding is a number against a checkpoint
|
|
109
|
+
- A placement finding is a verdict carrying a confidence
|
|
110
|
+
- A staleness finding is a judgment with nothing behind it
|
|
87
111
|
|
|
88
112
|
Shipping staleness on weaker evidence than the other two is the trade taken deliberately. Cutting it would leave the report answering the two questions that were never the operator's complaint.
|
|
@@ -5,7 +5,7 @@ Read when the surface under decision is a running app rather than a static mocku
|
|
|
5
5
|
## Lift from the app
|
|
6
6
|
|
|
7
7
|
- Dump the rendered markup of the surface under decision from the built page, after it has loaded, into a scratch file the run reads from. Strip scripts from the dump.
|
|
8
|
-
- Copy the built stylesheet and
|
|
8
|
+
- Copy the built stylesheet and fonts to the canvas page folder at the path each frame links, since a frame resolves only its own page. Each arm then differs from the shipped page only in what it names.
|
|
9
9
|
- Trim a large dump to the part the decision needs, and keep the wrapper classes intact so layout rules keyed to them still resolve.
|
|
10
10
|
- Set each frame's `--width` to the content width the decision names rather than the window width, since a container query reads the frame.
|
|
11
11
|
- Write copy an arm introduces with `write-human`, and take every other word from the dump.
|
|
@@ -13,7 +13,7 @@ Read when the surface under decision is a running app rather than a static mocku
|
|
|
13
13
|
## The frames
|
|
14
14
|
|
|
15
15
|
- Generate the frames with a short script, one per round, so a shared change is one edit and a rerun.
|
|
16
|
-
- Leave the theme to the canvas toggle, which sets the app's own `data-theme` switch on every frame's root. Name the attribute the
|
|
16
|
+
- Leave the theme to the canvas toggle, which sets the app's own `data-theme` switch on every frame's root. Name the attribute the stylesheet reads where it differs, as the toggle sets that one alone.
|
|
17
17
|
- Print each frame's measurement under it from a script in the frame, so the numbers the operator reads are the browser's.
|
|
18
18
|
- Draw an arm that is a whole page or a route as one frame at that page's width, so it still sits beside the other arms on the round's page.
|
|
19
19
|
- Name anything the canvas cannot reproduce, such as an asset whose colors follow the browser rather than the frame's theme, rather than fixing the frame around it.
|
|
@@ -13,12 +13,13 @@ A project the surface move has not reached keeps its context folder under `.clau
|
|
|
13
13
|
|
|
14
14
|
## Guards
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Derive a kebab-case slug from the domain and check whether `<context-root>/<slug>.md` or `<context-root>/<slug>/index.md` already exists. Either resolving means the domain is covered under that exact name, so stop: `❌ <slug> already has a context entry. Use context-fold to refresh it instead.`
|
|
17
17
|
|
|
18
18
|
## Placement
|
|
19
19
|
|
|
20
|
-
- Read `<context-root>/index.md` and check every title and description it lists against the domain
|
|
21
|
-
-
|
|
20
|
+
- Read `<context-root>/index.md` and check every title and description it lists against the domain
|
|
21
|
+
- Stop on a match: `❌ <path> already covers this domain under a different name. Use context-fold to refresh it instead.`
|
|
22
|
+
- Default a brand-new entry to a flat file, `<context-root>/<slug>.md`, since the standard splits an entry into a folder only past the 300-line ceiling, which a fresh domain never reaches
|
|
22
23
|
|
|
23
24
|
## Draft
|
|
24
25
|
|
|
@@ -9,12 +9,15 @@ description: The guard, placement, draft additions, and regen folder for a brand
|
|
|
9
9
|
|
|
10
10
|
## Guards
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Derive a kebab-case slug from the topic and run `canon docs <slug>`. A resolved page means the topic is covered under that exact name, so stop: `❌ <slug> already resolves to an existing page. Run canon:docs-sync instead.`
|
|
13
|
+
|
|
14
|
+
This is a name match rather than a topic match, and Placement checks the wider case.
|
|
13
15
|
|
|
14
16
|
## Placement
|
|
15
17
|
|
|
16
|
-
- Read `docs/index.md` and its sub-catalogs for the closest existing `category`. <!-- canon-allow-reference:
|
|
17
|
-
- Check every page title and description that read surfaces against the topic
|
|
18
|
+
- Read `docs/index.md` and its sub-catalogs for the closest existing `category`. <!-- canon-allow-reference: the target project's own docs/ tree -->
|
|
19
|
+
- Check every page title and description that read surfaces against the topic
|
|
20
|
+
- Stop on a match: `❌ <path> already covers this topic under a different name. Run canon:docs-sync instead.`
|
|
18
21
|
- Reuse a matching `category` value verbatim. A near-miss spelling opens a second shelf holding one page, per the docs standard.
|
|
19
22
|
- Default to the `docs/` root with no `category` when nothing fits. A subfolder earns itself only once a shelf of pages already sits there, per the standard's splitting rule.
|
|
20
23
|
|
|
@@ -13,11 +13,15 @@
|
|
|
13
13
|
|
|
14
14
|
### Requirements
|
|
15
15
|
|
|
16
|
+
Install <what the machine needs> before setup.
|
|
17
|
+
|
|
16
18
|
- <Agent tool and minimum version>
|
|
17
19
|
- <Runtime the listing command needs>
|
|
18
20
|
|
|
19
21
|
### Set up
|
|
20
22
|
|
|
23
|
+
Run these from <where to run them>.
|
|
24
|
+
|
|
21
25
|
```bash
|
|
22
26
|
<clone command>
|
|
23
27
|
<setup command, when a session needs one>
|
|
@@ -31,6 +35,8 @@
|
|
|
31
35
|
|
|
32
36
|
### List what the project exposes
|
|
33
37
|
|
|
38
|
+
The listing shows <what it shows>.
|
|
39
|
+
|
|
34
40
|
```bash
|
|
35
41
|
<command that lists skills, rules, or commands>
|
|
36
42
|
```
|
|
@@ -22,11 +22,15 @@
|
|
|
22
22
|
|
|
23
23
|
### Requirements
|
|
24
24
|
|
|
25
|
+
Install <what the machine needs> before setup.
|
|
26
|
+
|
|
25
27
|
- <Runtime and version>
|
|
26
28
|
- <Service the app depends on>
|
|
27
29
|
|
|
28
30
|
### Set up
|
|
29
31
|
|
|
32
|
+
Run these from <where to run them>.
|
|
33
|
+
|
|
30
34
|
```bash
|
|
31
35
|
<clone command>
|
|
32
36
|
<dependency install command>
|
|
@@ -36,11 +40,13 @@
|
|
|
36
40
|
|
|
37
41
|
### Run locally
|
|
38
42
|
|
|
43
|
+
The dev server runs <what it runs>.
|
|
44
|
+
|
|
39
45
|
```bash
|
|
40
46
|
<dev server command>
|
|
41
47
|
```
|
|
42
48
|
|
|
43
|
-
|
|
49
|
+
It serves on <address>.
|
|
44
50
|
|
|
45
51
|
### Configuration
|
|
46
52
|
|
|
@@ -50,7 +56,7 @@
|
|
|
50
56
|
|
|
51
57
|
### Deploy
|
|
52
58
|
|
|
53
|
-
|
|
59
|
+
The app deploys to <where>, through <the command or workflow>.
|
|
54
60
|
|
|
55
61
|
## Support
|
|
56
62
|
|
|
@@ -27,12 +27,16 @@
|
|
|
27
27
|
|
|
28
28
|
### Run a command
|
|
29
29
|
|
|
30
|
+
The most common invocation is <what it does>.
|
|
31
|
+
|
|
30
32
|
```bash
|
|
31
33
|
<command> <argument>
|
|
32
34
|
```
|
|
33
35
|
|
|
34
36
|
### Flags
|
|
35
37
|
|
|
38
|
+
Most runs need <the flags a reader reaches for first>.
|
|
39
|
+
|
|
36
40
|
```bash
|
|
37
41
|
<command> --<flag> <value>
|
|
38
42
|
<command> --<flag>
|
|
@@ -44,7 +48,7 @@
|
|
|
44
48
|
|
|
45
49
|
### Exit codes
|
|
46
50
|
|
|
47
|
-
|
|
51
|
+
A non-zero exit means <what each code means>, when a script depends on it.
|
|
48
52
|
|
|
49
53
|
## Documentation
|
|
50
54
|
|
|
@@ -29,12 +29,16 @@
|
|
|
29
29
|
|
|
30
30
|
### Quickstart
|
|
31
31
|
|
|
32
|
+
The snippet shows <the core behavior>.
|
|
33
|
+
|
|
32
34
|
```<language>
|
|
33
35
|
<Import and one call that shows the core behavior>
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
### <Second common task>
|
|
37
39
|
|
|
40
|
+
Reach for this when <the reader's situation>.
|
|
41
|
+
|
|
38
42
|
```<language>
|
|
39
43
|
<Snippet for the task>
|
|
40
44
|
```
|
|
@@ -18,18 +18,24 @@
|
|
|
18
18
|
|
|
19
19
|
### <First channel name>
|
|
20
20
|
|
|
21
|
+
Install through this channel when <who it suits>.
|
|
22
|
+
|
|
21
23
|
```bash
|
|
22
24
|
<install command for this channel>
|
|
23
25
|
```
|
|
24
26
|
|
|
25
27
|
### <Second channel name>
|
|
26
28
|
|
|
29
|
+
Install through this channel when <who it suits>.
|
|
30
|
+
|
|
27
31
|
```bash
|
|
28
32
|
<install command for this channel>
|
|
29
33
|
```
|
|
30
34
|
|
|
31
35
|
### Update
|
|
32
36
|
|
|
37
|
+
Update when <the trigger>, which replaces <what it replaces>.
|
|
38
|
+
|
|
33
39
|
```bash
|
|
34
40
|
<update command>
|
|
35
41
|
```
|
|
@@ -38,6 +44,8 @@
|
|
|
38
44
|
|
|
39
45
|
### Invoke a skill
|
|
40
46
|
|
|
47
|
+
Type the command in <where the user types it>.
|
|
48
|
+
|
|
41
49
|
```text
|
|
42
50
|
/<plugin name>:<skill name> <argument>
|
|
43
51
|
```
|
|
@@ -50,7 +58,7 @@
|
|
|
50
58
|
|
|
51
59
|
### Configuration
|
|
52
60
|
|
|
53
|
-
<
|
|
61
|
+
Set <the setting the plugin reads> in <where the user sets it>, when one exists.
|
|
54
62
|
|
|
55
63
|
## Support
|
|
56
64
|
|
|
@@ -11,12 +11,21 @@ The readme standard claims the voice of a repository-root README. `write-human`
|
|
|
11
11
|
|
|
12
12
|
## Guards
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
Default the target to `README.md` at the repository root when no path is given. A caller naming a path under a folder, a harness, or an internal tool is drafting a nested README, which keeps the reference voice per the standard's `## Voice` section.
|
|
15
|
+
|
|
16
|
+
### Reading an existing target
|
|
17
|
+
|
|
18
|
+
Read the target if it exists, and branch on its headings.
|
|
19
|
+
|
|
20
|
+
| Target | Reading | Route |
|
|
21
|
+
| -------------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------- |
|
|
22
|
+
| Carries an H1 naming the project | Authored | Stop: `❌ <path> already exists and covers the project. Run canon:docs-sync instead.` |
|
|
23
|
+
| Carries no H1, or only headings restating the scaffolding tool | Generator output | Continue, drafting over it rather than syncing its sections |
|
|
24
|
+
| Does not exist | Nothing to read | Continue |
|
|
25
|
+
|
|
26
|
+
- On the authored branch, report rather than offering to overwrite it or to conform it, since the project's own citations into its README are invisible from here
|
|
27
|
+
- A hand-authored README opening with a badge block, or a title the H1 test misses, falls into the no-H1 branch the same as a scaffold page
|
|
28
|
+
- The Confirm step catches that case before the write, so it is load-bearing. Never skip it on the reasoning that the guard already decided.
|
|
20
29
|
|
|
21
30
|
## Placement
|
|
22
31
|
|
|
@@ -26,15 +35,18 @@ The target path is the placement. A README keeps no catalog, so there is no coll
|
|
|
26
35
|
|
|
27
36
|
Read the project's manifest (`package.json`, `pyproject.toml`, `Cargo.toml`, or equivalent) and the tree, then test each type on its own signal. Note every type that matches rather than stopping at the first, since a project is often several at once.
|
|
28
37
|
|
|
29
|
-
- Library: an installable package name, counted only when no application, CLI, or plugin signal matches, since a
|
|
38
|
+
- Library: an installable package name, counted only when no application, CLI, or plugin signal matches, since a site, a CLI, or a plugin also carries a named package
|
|
30
39
|
- CLI: a `bin` field, a `[project.scripts]` table in `pyproject.toml`, a `[[bin]]` table in `Cargo.toml`, or a CLI entry point.
|
|
31
40
|
- Application: a site framework dependency, a site config file, or an app entry point.
|
|
32
41
|
- Agent-facing: a `.claude/skills/` folder, or a file an agent loads such as `CLAUDE.md`.
|
|
33
42
|
- Plugin: a `plugin.json` or a marketplace manifest.
|
|
34
43
|
|
|
35
|
-
A match on no type falls back to the standard's generic template. Say so in the preview, and never force the nearest type.
|
|
44
|
+
An agent-facing match leaves the library type in place, so a library with a `CLAUDE.md` still gets its quickstart. A match on no type falls back to the standard's generic template. Say so in the preview, and never force the nearest type.
|
|
45
|
+
|
|
46
|
+
### Page, mark, and screenshot
|
|
47
|
+
|
|
48
|
+
A site framework dependency or a site config file in the manifest or the tree marks a project as having a page. Read a live URL separately, from a `homepage` field or a deploy config, since a project can have a page and no known URL.
|
|
36
49
|
|
|
37
|
-
- Check for a page. A dependency on a site framework or a site config file in the manifest or the tree marks a project as having one. Read a live URL separately, from a `homepage` field or a deploy config, since a project can have a page and no known URL.
|
|
38
50
|
- A monorepo can carry a page in one package and a CLI in another, so both signals may fire. Report each rather than picking one.
|
|
39
51
|
- Look for the mark and the screenshot among images the project already commits: scan the existing README for image references, then the asset and public folders.
|
|
40
52
|
|
|
@@ -61,13 +73,18 @@ Between agent-facing and plugin alone, a repository with no plugin manifest take
|
|
|
61
73
|
|
|
62
74
|
## Draft
|
|
63
75
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
76
|
+
Start from the picked or combined template. Draft the H1, a 2-3 sentence description in plain text, the required sections, then whichever optional sections and per-type content Detect found. A README takes no frontmatter.
|
|
77
|
+
|
|
78
|
+
- Open with the standard's header block, filled from Detect in order: mark, title, badges, a one-line claim from the manifest description, the live link, then the product screenshot
|
|
79
|
+
- Fill the screenshot slot only with an image the project already commits, with alt text naming what it depicts, since this kind cannot capture one
|
|
80
|
+
- With no such image, omit the slot and say so in the preview. Never write a placeholder path or invent a mark.
|
|
81
|
+
- Omit the link and the screenshot for a project with no page, and the mark for a project with none, with no note in the page
|
|
82
|
+
- A project with a page and no known URL gets the screenshot slot, and the Confirm step asks for the link
|
|
68
83
|
|
|
69
84
|
### Types and badges
|
|
70
85
|
|
|
86
|
+
A badge earns its place only once its rendered value is checked.
|
|
87
|
+
|
|
71
88
|
- Cover every applicable project type from the standard's `## Content` list rather than picking the closest one.
|
|
72
89
|
- Candidate badges: check for a published package (a registry field in the manifest), a CI workflow, and a `LICENSE` file.
|
|
73
90
|
- State each candidate's rendered value in the preview rather than trusting a fetch's status code, since a badge service answers 200 for a query it cannot satisfy.
|