@erclx/canon 5.35.0 → 5.37.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 +11 -11
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/SKILL.md +6 -0
- package/claude/skills/backlog-triage/SKILL.md +7 -7
- package/claude/skills/build-in-slices/SKILL.md +6 -0
- package/claude/skills/build-in-slices/references/adopted.md +3 -0
- package/claude/skills/canon-cli/REQUIREMENT.md +2 -2
- package/claude/skills/canon-cli/SKILL.md +5 -1
- package/claude/skills/canon-feedback/SKILL.md +5 -0
- package/claude/skills/canon-feedback-triage/SKILL.md +3 -0
- package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
- package/claude/skills/canvas-board/SKILL.md +5 -2
- package/claude/skills/canvas-board/references/canvas.md +12 -0
- package/claude/skills/canvas-board/references/design.md +53 -36
- package/claude/skills/ci-workflow/SKILL.md +5 -0
- package/claude/skills/code-craft/SKILL.md +6 -0
- package/claude/skills/codebase-layout/REQUIREMENT.md +1 -1
- package/claude/skills/codebase-layout/SKILL.md +2 -2
- package/claude/skills/context-fold/references/context.md +48 -34
- package/claude/skills/create-rule/REQUIREMENT.md +6 -8
- package/claude/skills/create-rule/SKILL.md +19 -17
- package/claude/skills/create-rule/references/rule.md +17 -23
- package/claude/skills/create-skill/SKILL.md +11 -2
- package/claude/skills/create-skill/references/skill-disclosure.md +26 -0
- package/claude/skills/create-skill/references/skill-paths.md +3 -0
- package/claude/skills/create-skill/references/skill-reference.md +12 -0
- package/claude/skills/create-skill/references/skill.md +26 -25
- package/claude/skills/deprecation-migration/SKILL.md +6 -0
- package/claude/skills/deprecation-migration/references/adopted.md +3 -0
- package/claude/skills/design-taste/REQUIREMENT.md +6 -6
- package/claude/skills/design-taste/SKILL.md +8 -2
- package/claude/skills/design-taste/references/craft.md +4 -1
- package/claude/skills/design-taste/references/preflight.md +18 -2
- package/claude/skills/design-taste/references/tells.md +1 -1
- package/claude/skills/docs-sync/references/docs.md +6 -0
- package/claude/skills/docs-sync/references/readme.md +15 -0
- package/claude/skills/draft-and-pick/SKILL.md +12 -0
- package/claude/skills/draft-doc/references/context.md +1 -1
- package/claude/skills/draft-doc/references/readme.md +3 -0
- package/claude/skills/draft-figure/references/mermaid.md +6 -0
- package/claude/skills/draft-identity/SKILL.md +3 -2
- package/claude/skills/draft-slides/SKILL.md +3 -0
- package/claude/skills/git-branch/references/branch.md +16 -11
- package/claude/skills/git-commit/references/commit.md +19 -11
- package/claude/skills/git-commit/references/versioning.md +9 -0
- package/claude/skills/git-issue/references/issue.md +12 -9
- package/claude/skills/git-pr/SKILL.md +5 -0
- package/claude/skills/git-pr/references/pr.md +24 -6
- package/claude/skills/git-ship/SKILL.md +3 -0
- package/claude/skills/git-split/SKILL.md +6 -0
- package/claude/skills/git-stage/SKILL.md +3 -0
- package/claude/skills/git-worktree/SKILL.md +6 -6
- package/claude/skills/markdown-craft/references/markdown.md +27 -8
- package/claude/skills/plan-feature/SKILL.md +10 -1
- package/claude/skills/plan-feature/references/plan.md +20 -8
- package/claude/skills/plan-groundwork/SKILL.md +6 -0
- package/claude/skills/plan-groundwork/references/groundwork.md +10 -7
- package/claude/skills/plan-intake/references/intake.md +6 -6
- package/claude/skills/read-frames/SKILL.md +3 -0
- package/claude/skills/review-craft/SKILL.md +3 -0
- package/claude/skills/review-craft/references/ui.md +1 -1
- package/claude/skills/review-ui/SKILL.md +6 -3
- package/claude/skills/role-orchestrator/SKILL.md +3 -0
- package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +7 -4
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +3 -0
- package/claude/skills/role-planner/SKILL.md +3 -0
- package/claude/skills/role-worker/SKILL.md +12 -0
- package/claude/skills/search-craft/SKILL.md +3 -0
- package/claude/skills/systematic-debugging/SKILL.md +6 -0
- package/claude/skills/target-check/references/domains.md +5 -0
- package/claude/skills/target-setup/SKILL.md +5 -0
- package/claude/skills/task-board/references/tasks.md +9 -6
- package/claude/skills/task-complete/references/archive.md +3 -0
- package/claude/skills/teach-workspace/SKILL.md +3 -0
- package/claude/skills/teach-workspace/references/glossary.md +3 -0
- package/claude/skills/teach-workspace/references/lesson-build.md +3 -0
- package/claude/skills/teach-workspace/references/lesson-craft.md +3 -0
- package/claude/skills/teach-workspace/references/teach.md +8 -8
- package/claude/skills/test-craft/SKILL.md +7 -2
- package/claude/skills/ux-audit/REQUIREMENT.md +1 -1
- package/claude/skills/ux-audit/SKILL.md +2 -2
- package/claude/skills/ux-measure/REQUIREMENT.md +1 -1
- package/claude/skills/video-craft/SKILL.md +6 -0
- package/claude/skills/write-human/SKILL.md +9 -0
- package/claude/skills/write-human/references/machine-tells.md +12 -0
- package/docs/agents/capture.md +2 -0
- package/docs/agents/commands.md +59 -56
- package/docs/agents/comments.md +1 -1
- package/docs/agents/context-audit-checks.md +6 -0
- package/docs/agents/context-audit.md +8 -8
- package/docs/agents/context-classify.md +2 -0
- package/docs/agents/drift-surfaces.md +5 -5
- package/docs/agents/gate.md +6 -7
- package/docs/agents/gov-detect.md +1 -1
- package/docs/agents/index.md +2 -2
- package/docs/agents/install-and-sync.md +6 -6
- package/docs/agents/markdown-audit-weight.md +11 -3
- package/docs/agents/markdown-audit.md +14 -2
- package/docs/agents/output-shape.md +1 -1
- package/docs/agents/overview.md +2 -2
- package/docs/agents/pr-frames.md +17 -3
- package/docs/agents/rule-citations.md +5 -10
- package/docs/agents/scripting.md +1 -1
- package/docs/agents/sessions-transfer.md +8 -6
- package/docs/agents/skills-audit.md +9 -1
- package/docs/target/projects.md +2 -2
- package/docs/target/scenarios.md +5 -5
- package/docs/target/standards-moved.md +20 -18
- package/docs/workflow/ai-workflow.md +4 -1
- package/docs/workflow/visual-design-workflow.md +8 -3
- package/governance/detect.toml +32 -32
- package/governance/renames.toml +44 -0
- package/governance/rules/lib/{305-e2e-reliability.md → e2e-reliability.md} +1 -1
- package/governance/rules/lib/{306-test-scope.md → test-scope.md} +2 -2
- package/governance/rules/ui/{410-a11y.md → a11y.md} +1 -1
- package/governance/rules/ui/{440-surface-capture.md → surface-capture.md} +3 -3
- package/governance/stacks/base.toml +6 -6
- package/governance/stacks/go.toml +1 -1
- package/governance/stacks/node.toml +1 -1
- package/governance/stacks/php.toml +1 -1
- package/governance/stacks/python.toml +1 -1
- package/package.json +2 -2
- package/scripts/core/install-check.sh +2 -7
- package/src/capture/frame-values.ts +3 -6
- package/src/cli/help-all.ts +96 -0
- package/src/cli/help.ts +28 -27
- package/src/cli.ts +8 -1
- package/src/commands/claude.ts +29 -0
- package/src/commands/context.ts +29 -4
- package/src/commands/design.ts +22 -1
- package/src/commands/gate.ts +1 -8
- package/src/commands/gov.ts +25 -3
- package/src/commands/init.ts +10 -1
- package/src/commands/markdown.ts +148 -3
- package/src/commands/pr.ts +17 -10
- package/src/commands/records.ts +1 -1
- package/src/commands/sync.ts +11 -0
- package/src/commands/tooling.ts +8 -0
- package/src/context/audit.ts +83 -0
- package/src/context/classify/prompts.ts +6 -1
- package/src/context/gate.ts +6 -3
- package/src/design/budget.ts +14 -10
- package/src/design/document.ts +5 -5
- package/src/design/parse.ts +21 -4
- package/src/design/render.ts +3 -3
- package/src/gate/measures.ts +187 -2
- package/src/gate/sequencer.ts +0 -4
- package/src/gate/stages.ts +32 -27
- package/src/git/files.ts +30 -0
- package/src/gov/adapter.ts +2 -2
- package/src/gov/citations.ts +10 -33
- package/src/gov/install.ts +2 -2
- package/src/gov/list.ts +1 -1
- package/src/gov/payload.ts +1 -1
- package/src/gov/stacks.ts +4 -4
- package/src/inventory/subjects.ts +1 -1
- package/src/markdown/ceiling.ts +6 -1
- package/src/markdown/colons.ts +86 -0
- package/src/markdown/gate.ts +25 -0
- package/src/markdown/growth.ts +43 -0
- package/src/markdown/heading-case.ts +74 -0
- package/src/markdown/stacks.ts +74 -0
- package/src/markdown/structure.ts +72 -4
- package/src/migrate/rule-layout.ts +12 -12
- package/src/pr/frames.ts +66 -1
- package/src/shipped/references.ts +14 -14
- package/src/sync/check.ts +23 -23
- package/src/sync/copy.ts +4 -5
- package/tooling/astro/configs/tsconfig.json +1 -1
- package/tooling/astro/manifest.toml +0 -1
- package/tooling/astro/reference.md +2 -10
- package/tooling/base/configs/scripts/verify.json +1 -1
- package/tooling/base/configs/scripts/verify.ts +23 -13
- package/tooling/base/manifest.toml +6 -5
- package/tooling/base/reference.md +15 -22
- package/tooling/base/seeds/.github/workflows/verify.yml +0 -6
- package/tooling/base/seeds/.lintstagedrc +1 -2
- package/tooling/base/seeds/canon/context/ci.md +7 -8
- package/tooling/base/seeds/canon/context/development.md +10 -10
- package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +9 -1
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +27 -2
- package/tooling/claude/seeds/CLAUDE.md +1 -1
- package/tooling/claude/seeds/canon/DESIGN.md +24 -37
- package/tooling/shell/configs/.github/workflows/shell.yml +30 -0
- package/tooling/shell/manifest.toml +12 -0
- package/tooling/shell/reference.md +46 -0
- package/tooling/vite-react/configs/tsconfig.json +1 -1
- package/tooling/vite-react/configs/vitest.config.ts +1 -1
- package/tooling/vite-react/manifest.toml +0 -1
- package/tooling/vite-react/reference.md +2 -10
- package/tooling/web/configs/.github/workflows/readme-screenshot.yml +3 -5
- package/tooling/web/configs/.github/workflows/verify.yml +0 -6
- package/tooling/web/configs/src/test/setup.ts +1 -1
- package/tooling/web/manifest.toml +4 -4
- package/tooling/web/reference.md +4 -4
- package/tooling/base/configs/scripts/verify.sh +0 -2
- /package/governance/rules/canon/{606-git.md → git.md} +0 -0
- /package/governance/rules/canon/{611-indexes.md → indexes.md} +0 -0
- /package/governance/rules/canon/{604-scratch.md → scratch.md} +0 -0
- /package/governance/rules/canon/{602-tasks.md → task-scope.md} +0 -0
- /package/governance/rules/canon/{605-worktrees.md → worktrees.md} +0 -0
- /package/governance/rules/claude/{566-output.md → output.md} +0 -0
- /package/governance/rules/code/{000-code.md → routing.md} +0 -0
- /package/governance/rules/code/{010-testing.md → testing.md} +0 -0
- /package/governance/rules/framework/{210-astro.md → astro.md} +0 -0
- /package/governance/rules/framework/{220-fastapi.md → fastapi.md} +0 -0
- /package/governance/rules/framework/{230-nextjs.md → nextjs.md} +0 -0
- /package/governance/rules/framework/{200-react.md → react.md} +0 -0
- /package/governance/rules/framework/{260-shadcn.md → shadcn.md} +0 -0
- /package/governance/rules/framework/{250-tailwind.md → tailwind.md} +0 -0
- /package/governance/rules/lang/{130-go.md → go.md} +0 -0
- /package/governance/rules/lang/{140-php.md → php.md} +0 -0
- /package/governance/rules/lang/{110-python.md → python.md} +0 -0
- /package/governance/rules/lang/{100-typescript.md → typescript.md} +0 -0
- /package/governance/rules/lib/{370-database.md → database.md} +0 -0
- /package/governance/rules/lib/{340-pydantic.md → pydantic.md} +0 -0
- /package/governance/rules/lib/{360-security-server.md → security-server.md} +0 -0
- /package/governance/rules/lib/{350-security-web.md → security-web.md} +0 -0
- /package/governance/rules/lib/{320-tanstack-query.md → tanstack-query.md} +0 -0
- /package/governance/rules/lib/{335-testing-go.md → testing-go.md} +0 -0
- /package/governance/rules/lib/{336-testing-php.md → testing-php.md} +0 -0
- /package/governance/rules/lib/{330-testing-py.md → testing-py.md} +0 -0
- /package/governance/rules/lib/{300-testing-ts.md → testing-ts.md} +0 -0
- /package/governance/rules/lib/{310-zod.md → zod.md} +0 -0
- /package/governance/rules/tooling/{700-ci-workflow.md → ci-workflow.md} +0 -0
- /package/governance/rules/tooling/{790-code-comments.md → code-comments.md} +0 -0
- /package/governance/rules/tooling/{780-config-comments.md → config-comments.md} +0 -0
- /package/governance/rules/tooling/{775-dependencies.md → dependencies.md} +0 -0
- /package/governance/rules/ui/{480-canvas.md → canvas.md} +0 -0
- /package/governance/rules/ui/{400-ui.md → copy.md} +0 -0
- /package/governance/rules/ui/{460-design-taste.md → design-taste.md} +0 -0
- /package/governance/rules/ui/{420-forms.md → forms.md} +0 -0
- /package/governance/rules/ui/{465-interface-casing.md → interface-casing.md} +0 -0
- /package/governance/rules/ui/{450-link-behavior.md → link-behavior.md} +0 -0
- /package/governance/rules/ui/{470-motion.md → motion.md} +0 -0
- /package/governance/rules/ui/{430-ux-completeness.md → ux-completeness.md} +0 -0
- /package/tooling/{base → shell}/configs/.editorconfig +0 -0
- /package/tooling/{base → shell}/configs/.shellcheckrc +0 -0
|
@@ -14,6 +14,9 @@ Mechanics rather than judgment. `lesson-craft.md` covers what a lesson should be
|
|
|
14
14
|
- `{"type":"heading","level":1|2,"text":"<text>"}`: an `<h1>` or `<h2>`.
|
|
15
15
|
- `{"type":"paragraph","text":"<text>","lede":true,"cites":[1]}`: a `<p>`, marked `lede` for the dek that opens the lesson. `cites` adds a footnote marker per reference number after the text, and a lede takes none.
|
|
16
16
|
- `{"type":"list","items":["<text>", ...],"ordered":true}`: a `<ul>` or, with `ordered`, an `<ol>`.
|
|
17
|
+
|
|
18
|
+
### Reference, code, and raw blocks
|
|
19
|
+
|
|
17
20
|
- `{"type":"refs","items":[{"title":"<name>","url":"<https URL>","note":"<text>"}, ...]}`: the lesson's one reference list, numbered from 1 in item order. `url` and `note` are optional, and a `url` must be http or https.
|
|
18
21
|
- `{"type":"code","lang":"ts","text":"<source>"}`: a code sample, highlighted at render time with no script. `lang` is optional and takes a highlight.js name or alias. One the renderer does not register renders as plain escaped code.
|
|
19
22
|
- `{"type":"raw","html":"<markup>"}`: the escape hatch, passed through unescaped.
|
|
@@ -84,6 +84,9 @@ The quiz shape is a contract rather than a convention. `canon teach nav` splices
|
|
|
84
84
|
- Give every option in one question the same `name`, and a different `name` per question. Options sharing a name across two questions let one answer clear another.
|
|
85
85
|
- Mark the correct option with `data-a="1"` and leave the others without the attribute
|
|
86
86
|
- Carry `data-k` on the `label`, since the workspace stylesheet renders the key letter from it
|
|
87
|
+
|
|
88
|
+
#### Structure and the legacy button
|
|
89
|
+
|
|
87
90
|
- Keep `.fb` the last child of its `.q`. The stepper reveals it as a direct child, and a feedback block nested deeper stays hidden.
|
|
88
91
|
- Put the option text in a `<span>` inside the label rather than bare beside the input, so the workspace can lay the two out
|
|
89
92
|
- Never write a `<button class="opt">` in a new lesson. That is the shape written before the stepper, and it is kept working by an injected script the presence of a button is what still triggers.
|
|
@@ -32,14 +32,14 @@ Governs a learning workspace under `.canon/teach/<nn>-<topic>/`: folder layout,
|
|
|
32
32
|
|
|
33
33
|
Does not govern:
|
|
34
34
|
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
- A dump of many findings filed by domain, each carrying its own verdict
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
35
|
+
- **the `teach-workspace` skill**: the frontmatter, entry shape, and ordering of the glossary the workspace holds, which that skill's reference carries
|
|
36
|
+
- **the surface driving the workspace**: what a lesson teaches, how it sequences difficulty, and what makes one worth returning to
|
|
37
|
+
- **the routing test the destination surface states**: where a durable page goes once it leaves the workspace
|
|
38
|
+
- **`groundwork.md`**: one question measured in depth before anyone can plan against it
|
|
39
|
+
- **`intake.md`**: A dump of many findings filed by domain, each carrying its own verdict
|
|
40
|
+
- **the `write-human` skill**: voice, rhythm, and sentence construction
|
|
41
|
+
- **`markdown.md`**: headings, punctuation, word choice, and file references
|
|
42
|
+
- **the surface driving it**: when a workspace opens at all, and the procedure that runs one
|
|
43
43
|
|
|
44
44
|
## What a working workspace looks like
|
|
45
45
|
|
|
@@ -57,6 +57,11 @@ Every test carries these, at any layer and in any runner:
|
|
|
57
57
|
- Verify one behavior per test.
|
|
58
58
|
- Keep conditional logic and loops out of a test body. A table of cases is one test per row, never a branch inside one.
|
|
59
59
|
- Set no coverage percentage as a target. Cover the behaviors and their edges.
|
|
60
|
+
|
|
61
|
+
### Isolation and assertions
|
|
62
|
+
|
|
63
|
+
Every test carries these too:
|
|
64
|
+
|
|
60
65
|
- Group related tests with the framework's nesting mechanism, and keep it to two levels deep.
|
|
61
66
|
- Keep tests independent with no shared side effects. Clean up and restore state after each one.
|
|
62
67
|
- Await every async operation. Never leave a promise fire-and-forget in a test.
|
|
@@ -105,5 +110,5 @@ Run the final filter over every test written this session, checking each line. A
|
|
|
105
110
|
|
|
106
111
|
- The red, green, refactor procedure and its order: `test-first`, which loads this skill at its first step
|
|
107
112
|
- Reproducing a failure with no known cause: `systematic-debugging`
|
|
108
|
-
- Runner, file suffix, placement, and query conventions per language: `
|
|
109
|
-
- Settle, guard, and run-scope rules inside an end to end file: `
|
|
113
|
+
- Runner, file suffix, placement, and query conventions per language: `testing-ts`, `testing-py`, `testing-go`, and `testing-php`
|
|
114
|
+
- Settle, guard, and run-scope rules inside an end to end file: `e2e-reliability` and `test-scope`
|
|
@@ -37,4 +37,4 @@ The pass slides into fixing what it finds, and then the audit and the change lan
|
|
|
37
37
|
- Feature planning, which `plan-feature` owns
|
|
38
38
|
- Verifying one specific change, which `ui-checklist` owns
|
|
39
39
|
- Defining the intent it audits against, which the design document owns
|
|
40
|
-
- Measuring what a running interface costs to paint, block, or shift, which `ux-measure` owns. Contrast stays here rather than going with it, being computable from two color values this skill already reads off the
|
|
40
|
+
- Measuring what a running interface costs to paint, block, or shift, which `ux-measure` owns. Contrast stays here rather than going with it, being computable from two color values this skill already reads off the stylesheet's custom properties.
|
|
@@ -10,14 +10,14 @@ metadata:
|
|
|
10
10
|
## Guards
|
|
11
11
|
|
|
12
12
|
- If no UI files exist in the project (no JSX, TSX, Vue, Svelte, or HTML under `src/`), stop: `❌ No UI surfaces found to audit.`
|
|
13
|
-
- If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `ux-measure`. This skill reads source and reaches no number a browser produces. Contrast is the exception and stays here, since it is computable from
|
|
13
|
+
- If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `ux-measure`. This skill reads source and reaches no number a browser produces. Contrast is the exception and stays here, since it is computable from two color values in the stylesheet's custom properties, which the design document's lead names.
|
|
14
14
|
|
|
15
15
|
## Step 1: read context
|
|
16
16
|
|
|
17
17
|
Read these in parallel from the project root, skipping any that do not exist:
|
|
18
18
|
|
|
19
19
|
- `CLAUDE.md`: project type and conventions
|
|
20
|
-
- `canon/DESIGN.md`: visual intent,
|
|
20
|
+
- `canon/DESIGN.md`: visual intent, typography, and spacing rules, plus the stylesheet its lead names for the values
|
|
21
21
|
- `canon/REQUIREMENTS.md`: feature scope and non-goals
|
|
22
22
|
- A committed capture beside the surface's own source, when the project has one. A rendered surface reads differently composed than it reads written, and a capture is the only artifact here that shows the composed result rather than the markup. Absent one, note that this audit reads source only, and keep going. This is a stated fallback, not a stop: a project with no capture yet, or a capture mid-rebuild, still gets a source-only audit rather than losing the skill entirely.
|
|
23
23
|
|
|
@@ -43,7 +43,7 @@ A session that does start one picks a runner on the spot. The reading then comes
|
|
|
43
43
|
## Out of scope
|
|
44
44
|
|
|
45
45
|
- Judging the interface against stated intent, which `ux-audit` owns
|
|
46
|
-
- Contrast, which is computable from two color values in the
|
|
46
|
+
- Contrast, which is computable from two color values in the stylesheet `ux-audit` already reads. A contrast failure from a color computed at runtime stays invisible to that reader, and the cost is accepted rather than overlooked.
|
|
47
47
|
- Network waterfall, bundle size, and accessibility, which no version of this measures
|
|
48
48
|
- Writing behavioral tests against the interface, which `test-first` and `test-craft` own
|
|
49
49
|
- Fixing what the reading found
|
|
@@ -60,6 +60,9 @@ The guidance covers landscape 16:9 video. Vertical 9:16 framing is not covered y
|
|
|
60
60
|
- Every move in the composition shares one duration.
|
|
61
61
|
- A caption is centered on screen and covers the element the step acts on.
|
|
62
62
|
- A caption names a step the frame is not showing.
|
|
63
|
+
|
|
64
|
+
### Timing and checks
|
|
65
|
+
|
|
63
66
|
- The zoom's start time was added up by hand while a timeline file sits beside the take.
|
|
64
67
|
- Two pointers appear on one frame.
|
|
65
68
|
- A checker finding was dismissed and no frame was opened.
|
|
@@ -77,6 +80,9 @@ The guidance covers landscape 16:9 video. Vertical 9:16 framing is not covered y
|
|
|
77
80
|
- Easing, speed variety, anchoring, click timing, and every other general motion rule: `hyperframes-animation` and `hyperframes-creative`
|
|
78
81
|
- Title-safe margins and timeline layout: `hyperframes-studio`
|
|
79
82
|
- The carve that sits music under a voice: `hyperframes-audio`
|
|
83
|
+
|
|
84
|
+
### Media, capture, and reading
|
|
85
|
+
|
|
80
86
|
- Fetching or generating music, effects, voice, and imagery: `media-use`
|
|
81
87
|
- Recording the take and writing its timeline: `record-screencast` through `canon demo run`
|
|
82
88
|
- Reading a render frame by frame: `read-frames`
|
|
@@ -24,9 +24,15 @@ The banned characters sit in `${CLAUDE_SKILL_DIR}/../markdown-craft/references/m
|
|
|
24
24
|
- Write for a developer who is scanning rather than studying. Every sentence has to land on first read.
|
|
25
25
|
- Use active voice, and present tense unless past or future is factually correct.
|
|
26
26
|
- Name the actor in a sentence that has one. Passive voice with an unnamed actor hides who acts and reads as evasion.
|
|
27
|
+
|
|
28
|
+
### Word choice
|
|
29
|
+
|
|
27
30
|
- Prefer direct verbs and plain words. Write `use` over `utilize`, `help` over `facilitate`, `is` over `serves as`.
|
|
28
31
|
- Drop marketing words: `seamless`, `robust`, `powerful`, `revolutionary`, `enhanced`, `allows`, and `leverage`. Each claims a quality without showing it, so state what the thing does and let the reader judge it.
|
|
29
32
|
- Drop vague qualifiers: `simply`, `just`, `easily`, `quickly`, `very`, and `really`. Cut the word where the sentence stands without it, and give the measurement where the degree matters.
|
|
33
|
+
|
|
34
|
+
### Stance and density
|
|
35
|
+
|
|
30
36
|
- Be direct on an established fact. Hedge on a genuinely uncertain claim and say which it is.
|
|
31
37
|
- Assume developer-level knowledge. Skip the explanation the reader already carries.
|
|
32
38
|
- Front-load the key information in a paragraph, and give every sentence something the reader did not have.
|
|
@@ -38,6 +44,9 @@ Uniform cadence is the tell that survives the cleanest ban scan. Measure it rath
|
|
|
38
44
|
- Read the paragraph as one block. Uniformity is audible and close to invisible line by line.
|
|
39
45
|
- Compare the longest and shortest sentence in a paragraph. Within roughly five words of each other means the paragraph has one cadence and needs a short sentence or a long one added.
|
|
40
46
|
- Count the opening word of each sentence. Two alike is coincidence and three is a pattern to break.
|
|
47
|
+
|
|
48
|
+
### Variety
|
|
49
|
+
|
|
41
50
|
- Vary the grammatical shape of the opening, not the word alone. Three sentences opening on three different subjects still share one shape.
|
|
42
51
|
- Never buy variety with a fragment. A verbless clause standing as a sentence trades one uniformity for another and is the failure these rules exist against.
|
|
43
52
|
- Use a substantive connective where the flow needs one, and never add a word for rhythm alone.
|
|
@@ -21,6 +21,7 @@ Work top down. The first three account for most of what a reader calls machine-w
|
|
|
21
21
|
- [Question as transition](#question-as-transition)
|
|
22
22
|
- [Escalating parallel clauses](#escalating-parallel-clauses)
|
|
23
23
|
- [Empty superlative frames](#empty-superlative-frames)
|
|
24
|
+
- [A colon or comma where the dash was](#a-colon-or-comma-where-the-dash-was)
|
|
24
25
|
|
|
25
26
|
## Rule of three
|
|
26
27
|
|
|
@@ -118,3 +119,14 @@ Fix by writing the two claims as two sentences, or by cutting the one that repea
|
|
|
118
119
|
`one of the most important`, `a critical piece of`, `at the heart of`. The frame ranks a thing against a set the sentence never names.
|
|
119
120
|
|
|
120
121
|
Fix by stating what the thing does. A ranking survives only where the set is named and the position is measured.
|
|
122
|
+
|
|
123
|
+
## A colon or comma where the dash was
|
|
124
|
+
|
|
125
|
+
An agent told to remove an em dash swaps in a colon or a comma and leaves the sentence as it was. The join is the same and so is the pause the dash made, which is the habit the ban was written against.
|
|
126
|
+
|
|
127
|
+
```markdown
|
|
128
|
+
Bad: The hook fires on every edit: it reads the record the verb wrote.
|
|
129
|
+
Good: The hook fires on every edit and reads the record the verb wrote.
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Fix by splitting the sentence in two, or by cutting the clause that only restates the first. A colon after a label or before a list is not this tell.
|
package/docs/agents/capture.md
CHANGED
|
@@ -46,6 +46,8 @@ Each source renders at `deviceScaleFactor` 2 with a transparent background, and
|
|
|
46
46
|
|
|
47
47
|
What is asserted is the font. The command reads the first family of each rendered element holding text inside the captured element, and fails when the browser did not resolve one of them, because a fallback face rewraps the block and silently changes the output. A generic keyword as the first family, such as `monospace` or `system-ui`, also fails with its own reason, since it resolves to a different font on each machine, though a quoted `"monospace"` is a family name and goes through the probe. An element holding no text skips the check, since there is nothing to rewrap. Sources therefore name a real font rather than relying on `monospace`. A source that cannot render reports its own line and exits 1 without dropping the rest of the batch.
|
|
48
48
|
|
|
49
|
+
The user agent sets `monospace` on `pre`, `code`, `kbd`, and `samp` and does not inherit the `body` font into them, so each needs its own `font-family`.
|
|
50
|
+
|
|
49
51
|
A run refuses before it reads anything else when `--selector` is absent, naming the flag and pointing at `--help`. Ordering it first is what keeps the message about the invocation: the source defaults to `assets`, so checking that first would answer `assets not found` from whatever directory the caller happened to be in and say nothing about the flag that was actually missing. That source default is a deliberate choice rather than one inherited from some general convention: a missing folder still refuses loud, naming the argument, once the flag check passes, where the selector's dropped default cropped the wrong region in silence.
|
|
50
52
|
|
|
51
53
|
The browser binary installs separately from the package. A first run does `bunx playwright install chromium` once, and a run that cannot launch one reports the engine's own remediation inside the frame and exits 1 rather than escaping as a stack trace.
|
package/docs/agents/commands.md
CHANGED
|
@@ -5,7 +5,9 @@ description: Every top-level command with its purpose, each domain's subcommands
|
|
|
5
5
|
|
|
6
6
|
# Command catalog
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Bare `canon --help` lists every top-level command under five headings, Project, Domains, Author and render, Session and ship, and Repo reports, with descriptions cut at 80 columns. A pipe gets the same text without the frame glyphs. Behavior notes for the install and sync verbs live in `install-and-sync.md`.
|
|
9
|
+
|
|
10
|
+
`canon <command> --help` lists subcommands, and `canon <command> <subcommand> --help` a leaf's flags, exit codes, and examples. `canon <command> --help --all` prints both. An unknown subcommand exits 1 under a group taking no operand.
|
|
9
11
|
|
|
10
12
|
## Project-level
|
|
11
13
|
|
|
@@ -78,65 +80,66 @@ query = "button, a[href], input, select, textarea, [tabindex]"
|
|
|
78
80
|
|
|
79
81
|
## Domain commands
|
|
80
82
|
|
|
81
|
-
Each domain exposes a consistent shape where applicable: `list`, `install`, `sync`, `create`. The page named beside a domain carries its flags, records, and refusals, and `canon <domain> --help`
|
|
82
|
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
88
|
-
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
100
|
-
-
|
|
101
|
-
-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
110
|
-
-
|
|
111
|
-
-
|
|
112
|
-
-
|
|
83
|
+
Each domain exposes a consistent shape where applicable: `list`, `install`, `sync`, `create`. The page named beside a domain carries its flags, records, and refusals, and `canon <domain> --help --all` prints every subcommand's flags.
|
|
84
|
+
|
|
85
|
+
- **`migrate`**, in `migrate.md`: `rename`, `skill-names`, `records`, `surface-roots`, `record-tree`, `rule-layout`, `scratch-evidence`, `record-layout`
|
|
86
|
+
- **`targets`**, in `targets.md`: `list`, `pulls`
|
|
87
|
+
- **`gov`**, in `install-and-sync.md`: `list`, `install`, `sync`, `build`, `regen`, `detect` (in `gov-detect.md`), `test-order`, `counts`, `superseded`, `citations`, `restated`
|
|
88
|
+
- **`tooling`**, in `install-and-sync.md`: `list`, `sync`, `diff`, `reference`, `verify`, `inject`, `prune-gitignore`
|
|
89
|
+
- **`claude`**, in `skills-audit.md`: `init`, `sync`, `setup`, `routing`, `plugin-update`, `seeds list`, `skills list`, `skills audit`, `skills drift`, `skills reach`, `skills rank`
|
|
90
|
+
- **`wiki`**, in `scripting.md`: `init`
|
|
91
|
+
- **`indexes`**, in `indexes.md`: `regen`, `list`
|
|
92
|
+
- **`docs`**, in `docs.md`: `list`, `<topic>`
|
|
93
|
+
- **`design`**, in `install-and-sync.md` for `install`, `sync`, and `fonts`, and below for the rest: `render`, `regen`, `css`, `install`, `sync`, `fonts`
|
|
94
|
+
- **`slides`**, described below: `render`, `list`
|
|
95
|
+
- **`demo`**, in `demo.md`: `compile`, `run`, `frames`
|
|
96
|
+
- **`inventory`**, described above: `run`
|
|
97
|
+
- **`teach`**, in `teach.md`: `list`, `up`, `open`, `resource`, `glossary`, `lesson`, `stylesheet`, `nav`, `render`
|
|
98
|
+
- **`canvas`**, described below: `serve`, `list`, `page add`, `page rename`, `frame add`, `frame move`, `frame resize`, `fit`, `arrange`, `selection`, `edit`, `editing`, `capture`
|
|
99
|
+
- **`sandbox`**, in `sandbox.md`: `run`, `equivalence`, `reset`, `clean`, `check`, `coverage`
|
|
100
|
+
- **`tasks`**, in `tasks.md`: `next-label`, `archive`, `decline`, `plan-citations`, `plan-answers`, `plan-branch`, `plan-reach`, `plan-link`, `pull-request`, `outcome`, `list`, `validate`
|
|
101
|
+
- **`intake`**, in `intake.md`: `list`, `answer`
|
|
102
|
+
- **`records`**, in `records.md`: `validate`, `ordinal`, `size`, `stale`, `prune-tmp`, `push`, `pull`
|
|
103
|
+
- **`sessions`**, in `sessions.md`: `list`, `export`, `import`
|
|
104
|
+
- **`worktrees`**, in `worktrees.md`: `list`, `reclaim`, `repair-bare-flag` (hidden)
|
|
105
|
+
- **`hooks`**, in `hooks.md`: `post-merge`
|
|
106
|
+
- **`pr`**, in `pr-reads.md`: `key-changes`, `head`, `checks`, `review-state`, `evidence`, `preview`, `local`, `frames`, `lift` (in `pr-lift.md`), `tick` (in `pr-tick.md`)
|
|
107
|
+
- **`upstream`**, in `upstream.md`: `fetch`, `catalog`, `due`, `advance`
|
|
108
|
+
- **`audits`**, in `audits.md`: `run`, `list`
|
|
109
|
+
- **`gate`**, in `gate.md`: `run`
|
|
110
|
+
- **`secrets`**, in `state-scoped-risk.md`: `scan`
|
|
111
|
+
- **`deps`**, in `state-scoped-risk.md`: `audit`
|
|
112
|
+
- **`labels`**, in `label-coverage.md`: `audit`, `apply`, `scan`
|
|
113
|
+
- **`comments`**, in `comments.md`: `scan`
|
|
114
|
+
- **`context`**, in `context-audit.md`: `audit`, `classify diff`, `classify sweep`, `classifier show`, `classifier set`
|
|
115
|
+
- **`markdown`**, in `markdown-audit.md`: `audit`
|
|
113
116
|
|
|
114
117
|
Common patterns:
|
|
115
118
|
|
|
116
|
-
-
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
-
|
|
119
|
+
- **`list --json`** → machine-readable catalog on stdout.
|
|
120
|
+
- **`install <name> <path>`** → install a specific entry into a target project.
|
|
121
|
+
- **`sync <path>`** → reapply all installed entries in a target project.
|
|
122
|
+
- **`create [name]`** → scaffold a new authoring entry in this repo.
|
|
120
123
|
|
|
121
124
|
Subcommands no other page describes:
|
|
122
125
|
|
|
123
|
-
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
-
|
|
131
|
-
-
|
|
126
|
+
- **`claude plugin-update`** matches the installed marketplace plugin against `claude/.claude-plugin/plugin.json`'s own name and runs `claude plugin update` on it, reading the version back off `claude plugin list --json`, since the update call reports none of its own (`--json`).
|
|
127
|
+
- **`claude skills rank`** scores either skill corpus's descriptions against a case corpus by TF-IDF cosine similarity, reporting rank-one and top-three (`--cases <path>`).
|
|
128
|
+
- **`design regen`** rewrites this repository's `canon/DESIGN.md` from `src/design/tokens.ts` and `src/design/base.css` from `src/design/neutral.ts`. `design css` emits the tokens and components as CSS on stdout, with `--no-components` for properties alone, and `design render` declares each vendored face the typography table names under `--embed-fonts`.
|
|
129
|
+
- **`slides list --json`** emits one row per deck under `.canon/slides/`, carrying `name`, `title`, `slides`, and `path`.
|
|
130
|
+
- **`slides render [deck]`** takes a deck name or a folder, defaulting to the only deck, and lays out each `.html` file in filename order in Chromium at 1280 by 720 and rebuilds it as editable shapes. Each element drawn as a picture prints one `✗` line on stderr naming the slide, the selector, and the properties that forced it. A link left out, being a `#slide-N` past the deck's end or any target that is neither that nor an absolute URL, prints one too, and the exit stays 0.
|
|
131
|
+
- **`slides.md`** describes a deck folder's `deck.json` and the faces it embeds, its per-slide `<body>` attributes, transitions and entrances, speaker notes, and charts.
|
|
132
|
+
- **`canvas`**, with its verbs, content format, and write routes, is described in `canvas.md`.
|
|
133
|
+
- **`labels apply <number>`** adds the labels this branch earns to its open pull request, refusing a pull request whose head is not the current branch or that is not open, and never creating a label the remote lacks or removing one a person added (`--check` writes nothing and exits 2 when labels are owed, `--base`, `--json`).
|
|
134
|
+
- **`labels scan`** fails a pull request or a posted review whose title, body, or review comment carries a phase label, a label a code span quotes, a gitignored record path, a session link, a banned character, a body heading outside the closed section list or a missing `## Summary` or `## Key changes`, or a title breaking `claude/skills/git-pr/references/pr.md`'s format, casing, or length rule (`--event`, `--body-file`, `--json`).
|
|
132
135
|
|
|
133
136
|
## Version skew
|
|
134
137
|
|
|
135
|
-
`canon sync --check` and `canon claude skills drift` are the two moments a
|
|
136
|
-
already stops to reconcile with the toolkit, so each reports the
|
|
137
|
-
version against the newest published one. No other command performs
|
|
138
|
-
which keeps a registry round trip out of the catalog reads an agent
|
|
139
|
-
loop.
|
|
138
|
+
`canon sync --check` and `canon claude skills drift` are the two moments a
|
|
139
|
+
target already stops to reconcile with the toolkit, so each reports the
|
|
140
|
+
installed version against the newest published one. No other command performs
|
|
141
|
+
the lookup, which keeps a registry round trip out of the catalog reads an agent
|
|
142
|
+
runs in a loop.
|
|
140
143
|
|
|
141
144
|
The report carries three states and never changes an exit code. `behind` names
|
|
142
145
|
`canon upgrade` as the remedy, `current` says so, and `unknown` carries the
|
|
@@ -144,8 +147,8 @@ reason the registry could not be reached. Branch on the `skew.state` field in
|
|
|
144
147
|
the JSON record rather than on the exit, since an offline machine has to read as
|
|
145
148
|
unmeasured rather than as a failing check.
|
|
146
149
|
|
|
147
|
-
`canon upgrade --json` carries one further state, `pending`, that the skew
|
|
148
|
-
does not: the working directory's checkout holds a release npm does not
|
|
149
|
-
yet, so there is nothing to install. The record names it in `checkout`
|
|
150
|
-
`latest`, exits 0, and its `message` starts `CLI stays at`. Outside a
|
|
151
|
-
checkout it never reads `pending`.
|
|
150
|
+
`canon upgrade --json` carries one further state, `pending`, that the skew
|
|
151
|
+
report does not: the working directory's checkout holds a release npm does not
|
|
152
|
+
serve yet, so there is nothing to install. The record names it in `checkout`
|
|
153
|
+
beside `latest`, exits 0, and its `message` starts `CLI stays at`. Outside a
|
|
154
|
+
canon checkout it never reads `pending`.
|
package/docs/agents/comments.md
CHANGED
|
@@ -29,6 +29,6 @@ This works only because density is a pure function of a tree. Which author or se
|
|
|
29
29
|
|
|
30
30
|
## Degradation sweep
|
|
31
31
|
|
|
32
|
-
The degradation sweep reads its vocabulary from whichever rule publishes a `## Degradation vocabulary` heading, preferring `.claude/rules/` over `governance/rules/`, so one definition serves the toolkit and every target. Discovery anchors on the heading rather than a filename, because a
|
|
32
|
+
The degradation sweep reads its vocabulary from whichever rule publishes a `## Degradation vocabulary` heading, preferring `.claude/rules/` over `governance/rules/`, so one definition serves the toolkit and every target. Discovery anchors on the heading rather than a filename, because a renamed rule would otherwise empty the vocabulary while the sweep still reported clean. With no such rule the sweep reports **skipped** rather than zero hits, since finding nothing and looking for nothing mean opposite things.
|
|
33
33
|
|
|
34
34
|
`090-code-comments` is the rule that publishes the list, and it ships on the `base` stack. A project that installs or syncs governance for the first time after that rule landed gets a sweep that previously reported skipped, so hits appear where the command used to stay quiet. Edit the backticked terms in the installed copy to change what that project sweeps for. The sweep matches comment text, so a comment naming a term as an example is a hit, and a hit is a prompt to read the line rather than a verdict on it.
|
|
@@ -17,6 +17,12 @@ It reports rather than gates by default, the closer call because a missing secti
|
|
|
17
17
|
|
|
18
18
|
`--gate` promotes the finding to a failing exit code, which the seed stage runs and no other caller does. That mode needs an answer to the sanctioned omission above, so a file declaring `stub: true` in its frontmatter is dropped before the check and reported nowhere. Both are described in `context-audit.md`.
|
|
19
19
|
|
|
20
|
+
### The closed set
|
|
21
|
+
|
|
22
|
+
The same section also reports an H2 outside the folder's closed set. A context entry allows `Overview`, `Layout`, `Decisions`, and `Gotchas` and no other H2, so a topic of the domain's own sits one level down as an H3. The finding is per entry rather than per folder, since an extra heading is a fact about the file carrying it. Fenced blocks are skipped, a stub seed is skipped, and only H2 is read, so where an H3 sits is not audited. It gates under `--gate` alone, like a missing section.
|
|
23
|
+
|
|
24
|
+
The record carries it as a top-level `extraSections` array of `{ rel, headings }`, and the set itself as `checkpoints.allowedSectionsByFolder`, keyed on the folder name the way `requiredSectionsByFolder` is. Both are additive.
|
|
25
|
+
|
|
20
26
|
## Reference form
|
|
21
27
|
|
|
22
28
|
The reference-form check reports an entry naming a sibling entry by bare filename where `claude/skills/context-fold/references/context.md` asks for the path it sits at. A bare name resolves against whichever folder its reader is already in, so a domain that splits into subfolders strands every inbound reference and the break surfaces nowhere. A path is checkable, which is what makes the form rule worth measuring at all: once a reference spells its path, the citation gate resolves it and a split that moves the file fails the push.
|
|
@@ -18,12 +18,12 @@ canon context audit --folder docs
|
|
|
18
18
|
canon context audit tooling/base/seeds --gate
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
| Option | Behavior
|
|
22
|
-
| ------------------ |
|
|
23
|
-
| `--json` | Add a machine-readable record on stdout, keeping the frame
|
|
24
|
-
| `--folder <list>` | Comma-separated folder names (default: the three below)
|
|
25
|
-
| `--citations-only` | Run the gating citation check alone, printing nothing when it passes
|
|
26
|
-
| `--gate` | Fail on a missing required section or index drift as well
|
|
21
|
+
| Option | Behavior |
|
|
22
|
+
| ------------------ | ------------------------------------------------------------------------- |
|
|
23
|
+
| `--json` | Add a machine-readable record on stdout, keeping the frame |
|
|
24
|
+
| `--folder <list>` | Comma-separated folder names (default: the three below) |
|
|
25
|
+
| `--citations-only` | Run the gating citation check alone, printing nothing when it passes |
|
|
26
|
+
| `--gate` | Fail on a missing required section, an off-set H2, or index drift as well |
|
|
27
27
|
|
|
28
28
|
`--citations-only` and `--gate` refuse together. The first runs the citation check alone, so the two findings the second adds are never measured, and a run honoring both would exit clean on a file short a required section.
|
|
29
29
|
|
|
@@ -39,11 +39,11 @@ A run where no requested name resolves refuses, whichever list it read. Naming t
|
|
|
39
39
|
|
|
40
40
|
Exit codes are `0` for a clean run, `1` for a refusal, and `2` for a gating finding. An unresolved citation gates under every mode. A requirements record stating a word cap gates past it, on any run that measures it, which is every mode except `--citations-only`. A record stating none is reported and never gated.
|
|
41
41
|
|
|
42
|
-
`bun run check` in the toolkit repository reads every one of these rules through its own Canonical records stage
|
|
42
|
+
`bun run check` in the toolkit repository reads every one of these rules through its own Canonical records stage as well as through this verb, whose gating stage there runs `--gate`.
|
|
43
43
|
|
|
44
44
|
Entry length, reference form, table, provenance, the record's claim classification, and every word figure no record caps print and return `0` under every mode, because each is a judgment or a weight read alongside one, and failing a push on either would make the check something to route around.
|
|
45
45
|
|
|
46
|
-
Required-section and index findings sit between the two. Both are answerable from the file rather than weighed, so `--gate` promotes them to failing codes while a bare run leaves them advisory. The toolkit runs the bare form against itself and the widened form against the seed tree, described below.
|
|
46
|
+
Required-section, off-set H2, and index findings sit between the two. Both are answerable from the file rather than weighed, so `--gate` promotes them to failing codes while a bare run leaves them advisory. The toolkit runs the bare form against itself and the widened form against the seed tree, described below.
|
|
47
47
|
|
|
48
48
|
## The seed gate
|
|
49
49
|
|
|
@@ -31,6 +31,8 @@ The regex layer always runs. It is free, needs nothing installed, and catches na
|
|
|
31
31
|
|
|
32
32
|
The local Ollama layer runs only when configured, through `canon context classifier`. When it runs, its call is one chunk or section per request, never batched: the groundwork measurement behind this verb found that batching 16 hunks into one call returned KEEP for every one of them. Thinking is always off, since it was measured to catch nothing thinking-off missed while running roughly five times slower and, in sweep mode, losing three real flags by reasoning past them.
|
|
33
33
|
|
|
34
|
+
Sweep mode reads decision rationale as current. A reason naming why an alternative was left out, what an earlier approach got wrong, what a measurement caught, or what a past run cost is KEEP even told in the past tense. Only a superseded figure kept beside its replacement, a "now" or "no longer" marking a change, branch or PR narration, or rounds of candidates is REWRITE.
|
|
35
|
+
|
|
34
36
|
A finding carries both layers' readings when the model ran. The `verdict` field takes the model's reading when it ran and parsed, and falls back to the regex reading otherwise, since the model catches shapes the regex layer cannot reach structurally. `decidedBy` names which one won.
|
|
35
37
|
|
|
36
38
|
A configured-but-unreachable backend warns on stderr and falls back to the regex layer alone. The run still exits clean: the record's `modelLayer` field names why the model layer did not run (`off`, `skipped-no-model`, `skipped-unreachable`, or `ran`), so a clean regex-only report never reads as a clean model pass.
|
|
@@ -101,7 +101,7 @@ rule on the far side of a window a later sync moved past it. The per-file
|
|
|
101
101
|
rule the chain lists reaches both surfaces the same way.
|
|
102
102
|
|
|
103
103
|
A target stamped before governance recorded a chain falls back to the older
|
|
104
|
-
|
|
104
|
+
rule-folder-inference read below. The measurement there anchors on governance's own
|
|
105
105
|
stamp rather than on the oldest anchor across domains, since rules are
|
|
106
106
|
domain-scoped and a shared anchor would let another domain's sync move the
|
|
107
107
|
revision rules are measured from. A target carrying no chain and no governance anchor
|
|
@@ -124,16 +124,16 @@ their own language and testing rules, and every other rule is opt-in, so an
|
|
|
124
124
|
unfiltered list would tell a base consumer about rules it can never receive and
|
|
125
125
|
train the reader to skip the section.
|
|
126
126
|
|
|
127
|
-
The filter accepts a
|
|
127
|
+
The filter accepts a rule folder on either of two grounds. A folder holding a rule the
|
|
128
128
|
base stack resolves to is entitled to every target, read through the stack file so
|
|
129
|
-
a rule added to base later needs no code change. Every other
|
|
129
|
+
a rule added to base later needs no code change. Every other rule folder is read off the folders the
|
|
130
130
|
target already carries, which is the fallback's only evidence of what a target
|
|
131
|
-
was entitled to before it recorded a chain. One
|
|
131
|
+
was entitled to before it recorded a chain. One rule folder can be reached by more than
|
|
132
132
|
one stack, so the test over-reports inside a folder the target holds, which
|
|
133
133
|
costs a line where under-reporting would cost the section its point.
|
|
134
134
|
|
|
135
135
|
A rule the target already holds is dropped by name. That is what keeps a rule the
|
|
136
|
-
toolkit moved between
|
|
136
|
+
toolkit moved between rule folders out of the list, since a rename reaches this
|
|
137
137
|
read as an addition and only the name tells the two apart.
|
|
138
138
|
|
|
139
139
|
This closes the dangling-citation case as a side effect rather than checking for
|
package/docs/agents/gate.md
CHANGED
|
@@ -9,16 +9,15 @@ description: Running the gate this repository verifies a branch with, what the s
|
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
canon gate run
|
|
12
|
-
canon gate run --all
|
|
12
|
+
canon gate run --all
|
|
13
13
|
canon gate run --json
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
| Option
|
|
17
|
-
|
|
|
18
|
-
| `--all`
|
|
19
|
-
| `--
|
|
20
|
-
| `--
|
|
21
|
-
| `--json` | Add a machine-readable record on stdout |
|
|
16
|
+
| Option | Behavior |
|
|
17
|
+
| ---------- | ----------------------------------------------------------------------------- |
|
|
18
|
+
| `--all` | Run every stage instead of scoping shell, types, and tests to the changed set |
|
|
19
|
+
| `--nested` | Suppress the outer frame when a calling script has already opened one |
|
|
20
|
+
| `--json` | Add a machine-readable record on stdout |
|
|
22
21
|
|
|
23
22
|
## What the command owns and what it runs
|
|
24
23
|
|
package/docs/agents/index.md
CHANGED
|
@@ -30,7 +30,7 @@ CLI catalog and invocation rules for agents, split by command domain. Start with
|
|
|
30
30
|
- [Intake](intake.md): Reading intake folder counts and items, the three read states an item can be in, landing a batch of selections in one cluster, the refusal reasons, and why a call is scoped to one file
|
|
31
31
|
- [Key changes bijection](key-changes.md): Comparing the files a pull request body's Key changes names against its own diff, the two directions and the split inside each that decides what is worth raising, the span rules the extractor was measured into, and the three refusals that separate a clean pass from a read that produced nothing
|
|
32
32
|
- [Label coverage](label-coverage.md): Reading a changed set against the pull request label map, the two tables it matches, how a gap is separated from a decision, and why an absent map is an answer
|
|
33
|
-
- [Markdown audit weight](markdown-audit-weight.md): The structural half of the markdown audit, being bullet and paragraph weight, run depth, the two cadence numbers, and the length ceiling, with the samples behind each checkpoint and why none of them gates
|
|
33
|
+
- [Markdown audit weight](markdown-audit-weight.md): The structural half of the markdown audit, being bullet and paragraph weight, bullet stacks, run depth, the two cadence numbers, and the length ceiling, with the samples behind each checkpoint and why none of them gates
|
|
34
34
|
- [Markdown audit](markdown-audit.md): Running the audit over any markdown path, where its bans and checkpoints are read from, what each check reports, and why the ban half gates while the structural half reports
|
|
35
35
|
- [Migrate](migrate.md): What each canon migrate verb moves and rewrites, what it refuses, the markers that keep an old spelling, and the idempotence check a second run gives
|
|
36
36
|
- [Output shape](output-shape.md): Two framed shapes every command renders into, how JSON and --names modes keep stdout clean, and the exit discipline that lets piped output drain
|
|
@@ -49,7 +49,7 @@ CLI catalog and invocation rules for agents, split by command domain. Start with
|
|
|
49
49
|
- [Records](records.md): The two roots a record folder resolves at, claiming the ordinal intake and groundwork share, reading each folder's size and growth, pruning stale scratch, and where validation, the canonical review count, and the private-remote backup are described
|
|
50
50
|
- [Restated instructions](restated.md): Counting the instructions the always-loaded file and every path-scoped rule share with the seed, the skill bodies, and each other, how a match is decided, the three classes, which surface a later edit starts from, and why the sweep reports rather than gates
|
|
51
51
|
- [Routing report](routing.md): Reading per CLAUDE.md section how many bullets name a path, what counts as naming one, when a rule counts as covering it, the two refusals, and why the verb reports rather than gates
|
|
52
|
-
- [Rule citations](rule-citations.md): Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the
|
|
52
|
+
- [Rule citations](rule-citations.md): Resolving every path a governance rule cites and every frontmatter glob the internal corpus declares, the one form a citation is written in, the shapes that look like citations and are not, the two classes where an absent path is correct, why the glob half reads one corpus, and why this one gates
|
|
53
53
|
- [Sandbox](sandbox.md): Scenario routing, the expectation scoring surface, and the coverage census over scenarios and skills
|
|
54
54
|
- [Scripting](scripting.md): The runtime catalogs that replace hardcoded names, what each carries, and a headless invocation per domain
|
|
55
55
|
- [Sessions transfer](sessions-transfer.md): Moving a session to another machine, the export bundle and its manifest, placing it with import, the refusal reasons, and what a resume on the target depends on
|
|
@@ -19,7 +19,7 @@ removes a stale `.claude/GOV.md` from the retired build. Use
|
|
|
19
19
|
|
|
20
20
|
Everything under `.claude/rules/canon/` belongs to the toolkit, so a rule
|
|
21
21
|
there that the toolkit no longer ships is deleted on sync, edited or not. That
|
|
22
|
-
is how a retired rule stops loading in a target. A renamed
|
|
22
|
+
is how a retired rule stops loading in a target. A renamed rule
|
|
23
23
|
the toolkit declares in `governance/renames.toml` moves instead: the sync
|
|
24
24
|
installs the rule under its new name and deletes the old file, whether or not
|
|
25
25
|
the target's stamp records a stack. Local edits to the old file are not
|
|
@@ -34,9 +34,9 @@ groundwork, intake, session, design, readme, and rule copies are deleted as
|
|
|
34
34
|
retired. The markdown rule is hand-written at `writing/markdown.md` and names
|
|
35
35
|
the `markdown-craft` skill, and `800-prose` retires.
|
|
36
36
|
|
|
37
|
-
A project's own rules belong under `.claude/rules/project/`, where
|
|
38
|
-
the
|
|
39
|
-
|
|
37
|
+
A project's own rules belong under `.claude/rules/project/`, where a slug
|
|
38
|
+
the toolkit also ships collides with nothing, and a rule placed under `canon/`
|
|
39
|
+
instead is lost on the next sync.
|
|
40
40
|
|
|
41
41
|
A sync never deletes a rule that a newer canon release installed. The stamp
|
|
42
42
|
records the newest release that synced governance, and an older binary holds
|
|
@@ -84,7 +84,7 @@ postdates a rule joining its stack still see that rule: the report reads the
|
|
|
84
84
|
target's current entitlement against its current tree rather than diffing
|
|
85
85
|
from an anchor a later sync could advance past the rule's own commit. A
|
|
86
86
|
target whose install predates the recorded chain falls back to the same
|
|
87
|
-
|
|
87
|
+
rule-folder-inference `newRules` uses in `canon sync --check`.
|
|
88
88
|
|
|
89
89
|
## Tooling diff and sync
|
|
90
90
|
|
|
@@ -137,7 +137,7 @@ since a target has no rule source of its own that ships nowhere.
|
|
|
137
137
|
It takes `--root <path>` and defaults to the toolkit root, prints nothing on success, and
|
|
138
138
|
reports the reason on stderr with exit 1 when the record names a stack or rule
|
|
139
139
|
that does not resolve. The Consumed copies stage of `bun run check` calls it and
|
|
140
|
-
asserts both the generated
|
|
140
|
+
asserts both the generated rule folders and the consumed copy are committed.
|
|
141
141
|
|
|
142
142
|
## Whole-project sync
|
|
143
143
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Markdown audit weight
|
|
3
|
-
description: The structural half of the markdown audit, being bullet and paragraph weight, run depth, the two cadence numbers, and the length ceiling, with the samples behind each checkpoint and why none of them gates
|
|
3
|
+
description: The structural half of the markdown audit, being bullet and paragraph weight, bullet stacks, run depth, the two cadence numbers, and the length ceiling, with the samples behind each checkpoint and why none of them gates
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Markdown audit weight
|
|
7
7
|
|
|
8
8
|
## Bullets, paragraphs, and depth
|
|
9
9
|
|
|
10
|
-
Bullet weight and depth are the checks that moved off `canon context audit`, carrying what they measured at the time. A top-level bullet reports past roughly
|
|
10
|
+
Bullet weight and depth are the checks that moved off `canon context audit`, carrying what they measured at the time. A top-level bullet reports past roughly 250 characters with continuation lines folded in and nested items left out. A run reports past roughly 40 rendered lines, measured at 80 columns, where a heading breaks one and so does a bold section marker taking the whole line at column zero, either ending in a colon, or holding one whole code span at any width, or running to 20 characters or fewer, skipping fenced blocks and exempting a flat peer list averaging under 130 characters a bullet and a run that is entirely table rows. Each file reports its longest run alone, so a second run past the checkpoint in the same file is never named.
|
|
11
11
|
|
|
12
12
|
Every weight and depth measure counts the text a reader is shown. A link reduces to its anchor text and an autolink drops whole, since no reader is shown either destination. A backticked path stays counted, which is where these measures part from the ban scan `markdown-audit.md` describes: that one blanks a code span so a standard quoting its own banned character does not report itself, and discounting the same span here would under-report a paragraph carrying several. One file holds both span sets and each answers its own question.
|
|
13
13
|
|
|
@@ -17,7 +17,7 @@ The paragraph check measures both halves of one rule. `markdown.md` caps a parag
|
|
|
17
17
|
|
|
18
18
|
A sentence boundary closes on terminal punctuation ahead of a capital or a code span. The capital is what keeps a version pin and a decimal from each reading as two sentences, and the code span is admitted beside it because a command name opening a sentence carries no capital to find.
|
|
19
19
|
|
|
20
|
-
The paragraph weight sits at 700 and the bullet weight at
|
|
20
|
+
The paragraph weight sits at 700 and the bullet weight at 250. Both shipped at 400, and the bullet number moved to 250 so the audit's warning and the `paragraph-growth` gate stage, which fails a bullet a branch adds or grows past it in a context entry, read one number. The paragraph number was borrowed from the bullet rule when the two checks landed together, and each has since been read against a sample of its own. They are separate checkpoints in the standard and separate patterns in the parser, so a read that moves one leaves the other where it is.
|
|
21
21
|
|
|
22
22
|
### The sample behind the paragraph number
|
|
23
23
|
|
|
@@ -46,6 +46,14 @@ That re-sample ran once the scan stopped counting link syntax as prose. Findings
|
|
|
46
46
|
|
|
47
47
|
A bullet, a heading, a table row, a blockquote, a blank line, and a fence each end a paragraph, so a heavy bullet is reported by the bullet check alone and never counted twice.
|
|
48
48
|
|
|
49
|
+
## Bullet stacks
|
|
50
|
+
|
|
51
|
+
A run of consecutive top-level bullets reports past 5. A blank line, an indented continuation, and a nested item do not break the run, and a paragraph, a heading, or any other column-zero line does. A fenced line is skipped without breaking it. The count is of items rather than weight, so it catches a catalog of short bullets the 250-character checkpoint above passes.
|
|
52
|
+
|
|
53
|
+
Two shapes are exempt. A run whose every item opens with a bold label or a link names its own subject per item and reads as a table of entries, and a numbered list states an order, so numbered items never count. `CHANGELOG.md` is exempt by name. Governance rules and `REQUIREMENT.md` sit outside the gate stage's scope rather than being exempted here, since a rule is one imperative per bullet.
|
|
54
|
+
|
|
55
|
+
The audit reports a stack and never fails on one. The `bullet-stacks` stage in `canon gate run` fails the push, for the reason the length ceiling does: the audit also runs on plans and groundwork records kept out of version control.
|
|
56
|
+
|
|
49
57
|
## Cadence
|
|
50
58
|
|
|
51
59
|
Uniform cadence is the failure a ban list cannot express. A ban set states negatives, and fragments, verbless clauses, and sentences that all run one length are each the absence of something, so no word added to a ban list reaches any of them. The shape layer already measured a bullet, a paragraph, and a run, and stopped one level above where that failure lives.
|