@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
package/README.md
CHANGED
|
@@ -61,17 +61,17 @@ bun install --global @erclx/canon
|
|
|
61
61
|
|
|
62
62
|
Each domain has a canonical source in this repo and a thin install or sync CLI on your side. The domains split on one line: some are copied into your project and become yours to edit, and some are never copied at all.
|
|
63
63
|
|
|
64
|
-
| Domain | What it is
|
|
65
|
-
| -------------- |
|
|
66
|
-
| Plugin skills | Skills that plan a feature, review a diff, sync the planning docs, and run the ship chain
|
|
67
|
-
| Governance | Coding and authoring rules that load into a Claude session when a matching path is edited
|
|
68
|
-
| Tooling stacks | Golden configs, seeds, and a reference per framework
|
|
69
|
-
| Design system | Ships a `DESIGN.md`
|
|
70
|
-
| Slides | A folder of HTML slides per deck, drawn in the project's tokens and rebuilt as editable shapes
|
|
71
|
-
| Teach | Lessons, sources, and a glossary in one workspace, rendered to a small site
|
|
72
|
-
| Canvas | Pages of HTML frames on a local pan and zoom surface, each frame drawn with the project's tokens
|
|
73
|
-
| Transcripts | A YouTube transcript with metadata frontmatter
|
|
74
|
-
| Sandbox | Scenario scaffolds that provision an isolated project state for verifying each domain flow
|
|
64
|
+
| Domain | What it is | How it reaches you |
|
|
65
|
+
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
|
|
66
|
+
| Plugin skills | Skills that plan a feature, review a diff, sync the planning docs, and run the ship chain | Loaded live from the plugin, never copied |
|
|
67
|
+
| Governance | Coding and authoring rules that load into a Claude session when a matching path is edited | Installed per project by `canon gov install`, refreshed by sync |
|
|
68
|
+
| Tooling stacks | Golden configs, seeds, and a reference per framework | Laid down by `canon init`, reconciled by `canon tooling sync` |
|
|
69
|
+
| Design system | Ships a `DESIGN.md` intent format that points at the project's stylesheet for values, a skill that drafts one from an existing project or from scratch, and a render command | `canon design render` |
|
|
70
|
+
| Slides | A folder of HTML slides per deck, drawn in the project's tokens and rebuilt as editable shapes | `canon slides render` writes PowerPoint |
|
|
71
|
+
| Teach | Lessons, sources, and a glossary in one workspace, rendered to a small site | `canon teach` |
|
|
72
|
+
| Canvas | Pages of HTML frames on a local pan and zoom surface, each frame drawn with the project's tokens | `canon canvas serve` |
|
|
73
|
+
| Transcripts | A YouTube transcript with metadata frontmatter | `canon transcripts <url>` writes it into any repo |
|
|
74
|
+
| Sandbox | Scenario scaffolds that provision an isolated project state for verifying each domain flow | `canon sandbox` |
|
|
75
75
|
|
|
76
76
|
Those domains reach you in three shapes. A tooling stack lands as real files under version control, because a config is something your build reads and your project owns. A plugin skill and the references it carries are never copied, so there is no copy in your repo to drift from this one.
|
|
77
77
|
|
|
@@ -79,6 +79,9 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
|
|
|
79
79
|
- A function returns the object it read from storage, or a type defined beside the storage code.
|
|
80
80
|
- The same input check appears both at the entry point and inside a function it calls.
|
|
81
81
|
- A caller matches on the text of an error message.
|
|
82
|
+
|
|
83
|
+
### Changes, retries, and order
|
|
84
|
+
|
|
82
85
|
- An existing field is changing type or meaning under the same name.
|
|
83
86
|
- A write that a client could retry carries no key, or checks for one with a read before the insert.
|
|
84
87
|
- Output order follows whatever the underlying data returned, and nothing states whether it is sorted.
|
|
@@ -91,6 +94,9 @@ Check each line against the surface the change produced. A line answering no is
|
|
|
91
94
|
- Every new field, flag, or parameter is optional and defaults to the old behavior.
|
|
92
95
|
- No storage type, internal identifier, or bookkeeping field appears in what the surface returns.
|
|
93
96
|
- Every failure on the surface carries the same shape with a stable code.
|
|
97
|
+
|
|
98
|
+
### Input, writes, and contract
|
|
99
|
+
|
|
94
100
|
- Input is checked once, at the boundary, and nowhere deeper.
|
|
95
101
|
- Every write a caller could retry takes a key, claims it atomically, and refuses a reused key with a different body.
|
|
96
102
|
- The contract states what the surface returns and what it refuses.
|
|
@@ -77,13 +77,13 @@ Age is evidence in neither direction. A row untouched for months is not more dec
|
|
|
77
77
|
|
|
78
78
|
Write one item per row in the intake item format, one cluster file per domain the task touches, numbered in read order. Head each item `### N. <task stem>` so apply can find the task from the heading alone.
|
|
79
79
|
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
80
|
+
- **`Problem:`** states what this pass measured, with the count, path, or commit behind it
|
|
81
|
+
- **`Fix:`** states what applying the verdict does to the board
|
|
82
|
+
- **`Worth it:`** names the cost or the reach the verdict rests on in one clause, or says the row names neither. A `yes` or a `later` carries no verdict on its own, so a decline can follow either word
|
|
83
|
+
- **`Open:`** reads `decline, archive, keep, or promote?` on every item
|
|
84
|
+
- **`Suggested:`** opens with exactly one of the four verdict tokens, then the reason. An archive suggestion lists every outcome position it closes, as `archive 1, 3: shipped in #NNN`
|
|
85
|
+
- **`Overlaps:`** names a live board task that already carries the work, where one does
|
|
86
|
+
- **`You:`** ships empty
|
|
87
87
|
|
|
88
88
|
Write `00-overview.md` last, per the intake standard, with the verdict counts by token and an open-questions list linking each item. Where the pass runs out of context before the index, write `99-next-session.md` naming the last row filed, since a compaction drops the rest.
|
|
89
89
|
|
|
@@ -71,6 +71,9 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
|
|
|
71
71
|
- The next commit message needs "and" to say what it does.
|
|
72
72
|
- A slice has been implemented and its tests have not run yet.
|
|
73
73
|
- The build or a test is failing and the next slice has already started.
|
|
74
|
+
|
|
75
|
+
### Scope and ordering
|
|
76
|
+
|
|
74
77
|
- You opened a file the plan does not name and are about to edit it.
|
|
75
78
|
- A commit deletes code and adds its replacement in the same change.
|
|
76
79
|
- You are about to stage a test in a commit after the one that added its code.
|
|
@@ -83,6 +86,9 @@ Check each line against the branch the build produced. A line answering no is fi
|
|
|
83
86
|
- Every commit on the branch carries one logical change and passed the checks it could affect.
|
|
84
87
|
- No commit adds code whose test lands in a later commit.
|
|
85
88
|
- No commit deletes something and adds its replacement together.
|
|
89
|
+
|
|
90
|
+
### Tree and scope
|
|
91
|
+
|
|
86
92
|
- The working tree holds no uncommitted implementation work.
|
|
87
93
|
- Every file changed is in the plan's scope, or its commit says why the plan needed it.
|
|
88
94
|
- Every defect noticed outside the plan is written in the task's findings or the handover, and its file is unchanged.
|
|
@@ -21,6 +21,9 @@ External sources were read and filtered rather than imported. This file is the r
|
|
|
21
21
|
- Vertical, risk-first, and contract-first slicing, stated as rules for choosing the next slice rather than as worked examples tied to one stack.
|
|
22
22
|
- Rule 1, one thing at a time, as one logical change per commit.
|
|
23
23
|
- Rule 2, keep it compilable, as a build left passing at every commit.
|
|
24
|
+
|
|
25
|
+
#### Rollback and the notes
|
|
26
|
+
|
|
24
27
|
- Rule 5, rollback-friendly, as the group on keeping each commit safe to revert and the rule against deleting and replacing in one commit.
|
|
25
28
|
- The "noticed but not touching" list from its scope section, routed to the open task's findings or the handover rather than offered as new tasks, since a worker may not add a row to the board.
|
|
26
29
|
- The note against re-running a command on unchanged code, scoped to a session's own repeats so it never reads as permission to skip a chain's verify step.
|
|
@@ -13,7 +13,7 @@ The damage lands on the files a project owns. A golden config carrying local edi
|
|
|
13
13
|
|
|
14
14
|
The inverse failure is quieter. A session that assumes a sync will pick up a change edits a seed and waits for an update that never comes, because the seed is copy-once and no sync command writes it again. Both failures are one missing fact available before the command runs.
|
|
15
15
|
|
|
16
|
-
A third gap is the route itself. `canon --help` lists every top-level verb
|
|
16
|
+
A third gap is the route itself. `canon --help` lists every top-level verb by a one-line description, and a session with a job in hand pays a `--help` read per candidate to find the one that does it, or picks by name and lands on the wrong one. The job-to-verb mapping is the fact the session needs and no verb answers.
|
|
17
17
|
|
|
18
18
|
Being reachable is a separate problem from being right. This is a pure reference whose moment happens inside another skill's run, so nothing brings it up unless a body names it. A route lives in a body or it does not exist, and a mention in a sibling's requirement file is not one.
|
|
19
19
|
|
|
@@ -23,7 +23,7 @@ Being reachable is a separate problem from being right. This is a pure reference
|
|
|
23
23
|
- Route an author-and-render verb to the skill that owns it rather than describing it
|
|
24
24
|
- Warn about a verb that can lose the project's edits before it runs, naming what it replaces
|
|
25
25
|
- Point each destructive verb at `canon docs install-and-sync`, which owns the overwrite detail
|
|
26
|
-
- Point to `canon <verb> --help` and `canon docs agents` for subcommands, flags, and the invocation contract
|
|
26
|
+
- Point to `canon <verb> --help --all` and `canon docs agents` for subcommands, flags, and the invocation contract, and have the session read that help before running a verb no skill body spells out, a verb a skill pins in full being exempt
|
|
27
27
|
- Defer to `canon docs install-and-sync` when it and this summary disagree, since the summary is a copy and the doc is the source
|
|
28
28
|
|
|
29
29
|
## Must not
|
|
@@ -12,7 +12,8 @@ Consult to pick the `canon` verb for a job, and before running a verb that write
|
|
|
12
12
|
## Find the verb
|
|
13
13
|
|
|
14
14
|
- Each row below names a verb by its job. Subcommands and flags are not listed here, so read them where they are kept.
|
|
15
|
-
- Run `canon <verb> --help` for a verb's subcommands and
|
|
15
|
+
- Run `canon <verb> --help --all` for a verb's subcommands and every flag in one read, where `canon <verb> --help` alone stops at the subcommand list.
|
|
16
|
+
- Read `canon <verb> --help --all` before running a verb no skill body spells out. A verb a skill gives in full runs as that skill wrote it.
|
|
16
17
|
- Run `canon docs agents` for the invocation contract behind every verb, and `canon docs list` for every other reference doc, then `canon docs <topic>` by name.
|
|
17
18
|
|
|
18
19
|
## Project setup
|
|
@@ -84,6 +85,9 @@ Read the doc each line names before running one of these. `canon docs install-an
|
|
|
84
85
|
- `canon sync` runs every installed domain's sync, so it carries each risk below.
|
|
85
86
|
- `canon gov sync` replaces a rule you edited and deletes a rule the toolkit retired, edited or not.
|
|
86
87
|
- `canon tooling sync --write` replaces every golden config a stack ships. Seeds are copy-once. Nothing writes without the flag. See `canon docs sync`.
|
|
88
|
+
|
|
89
|
+
### Design, migrate, and indexes
|
|
90
|
+
|
|
87
91
|
- `canon design sync` replaces the shipped design files and leaves `.claude/design/project/` alone.
|
|
88
92
|
- `canon migrate --write` rewrites files that cite a retired name or layout. It reports and writes nothing without the flag. See `canon docs migrate`.
|
|
89
93
|
- `canon indexes regen` rewrites each generated `index.md` from the folder's current state, so a hand edit there is lost. See `canon docs indexes`.
|
|
@@ -22,6 +22,11 @@ From the conversation so far, identify:
|
|
|
22
22
|
- Target project name or kind, never its full path. The path names a folder on one machine and says nothing a triage session can route on, where the project's own name does. Name a private project by its kind instead, such as `a Next.js app`, since the report leaves the machine.
|
|
23
23
|
- Toolkit surface and its type (plugin skill, tooling config, governance rule, seed, or CLI). The type leads the `### Surface` field, ahead of the first comma, because the CLI picks the issue's domain labels from that text alone.
|
|
24
24
|
- Specific toolkit file or name when the session cites one
|
|
25
|
+
|
|
26
|
+
### Behavior and fix
|
|
27
|
+
|
|
28
|
+
From the same conversation, identify:
|
|
29
|
+
|
|
25
30
|
- Observed behavior
|
|
26
31
|
- Expected behavior, or `unclear`
|
|
27
32
|
- Repro details already in context (commands run, files touched), or `none`
|
|
@@ -19,6 +19,9 @@ Run from the toolkit repo root. This skill reads GitHub issues and writes only i
|
|
|
19
19
|
- If `gh` is not on PATH, stop: `❌ gh CLI not found. Install it to read feedback issues.`
|
|
20
20
|
- If `gh auth status` fails, stop: `❌ gh is not authenticated. Run gh auth login.`
|
|
21
21
|
- If no open `feedback` issues exist, stop: `✅ No open feedback issues.`
|
|
22
|
+
|
|
23
|
+
### Slots and records
|
|
24
|
+
|
|
22
25
|
- Never fill a `You:` slot, and never read an empty one as agreement. Answering runs through `plan-intake-answer` or the operator's own edit.
|
|
23
26
|
- Branch on each `canon` record's `ok` and `reason` rather than on the exit code, which a shell function wrapping `canon` can flatten to zero.
|
|
24
27
|
|
|
@@ -25,7 +25,7 @@ When the operator picks a frame, the session leaves the decision on the canvas a
|
|
|
25
25
|
- Read the operator's selection when they point at something, and treat a stale element pick as unknown
|
|
26
26
|
- Read a frame's inline styles before restyling it, and say which operator edits were kept and which dropped
|
|
27
27
|
- Capture once per finished frame or page rather than after every edit
|
|
28
|
-
- Carry a picked value into the project's design document, and leave a picked layout on the canvas for the plan that builds it
|
|
28
|
+
- Carry a picked value into the project's stylesheet and its intent into the design document, and leave a picked layout on the canvas for the plan that builds it
|
|
29
29
|
|
|
30
30
|
## Must not
|
|
31
31
|
|
|
@@ -49,6 +49,9 @@ Hand the operator the address as a markdown link carrying the URL as its text an
|
|
|
49
49
|
- Add a page for each decision being drafted: `canon canvas page add <page> --json`.
|
|
50
50
|
- Follow the house style in `${CLAUDE_SKILL_DIR}/references/canvas.md` before drafting an explanation frame.
|
|
51
51
|
- Add each frame through the verb, which writes the starting file and its box in one locked step: `canon canvas frame add <page> <frame> --width <px> --height <px> --json`. Give the width the frame should render at, since a capture and the canvas both render at it. The verb places the frame after the last one, and a position the operator asks for goes through `frame move`.
|
|
52
|
+
|
|
53
|
+
### Layout and naming
|
|
54
|
+
|
|
52
55
|
- Lay frames out with `canon canvas frame move <page> <frame> --x <px> --y <px> --json` rather than writing `layout.json` by hand, since the operator's drags write the same file under a lock.
|
|
53
56
|
- Name pages and frames for what they hold, such as `pricing` and `pricing-dense`, so the operator can say which one by name.
|
|
54
57
|
- After an insert or a resize, re-lay the page with `canon canvas arrange <page> --json`. It keeps the rows the operator dragged, places each on the standard gap, and drops layout entries whose frame file is gone. `--check` reports without writing.
|
|
@@ -105,7 +108,7 @@ The operator restyles elements from the inspector, and each edit lands as inline
|
|
|
105
108
|
|
|
106
109
|
When the operator picks a frame, the decision leaves the canvas.
|
|
107
110
|
|
|
108
|
-
- Carry visual values, being color, type, spacing, and radius, into the
|
|
111
|
+
- Carry visual values, being color, type, spacing, and radius, into the stylesheet the design document's lead names, and the intent behind them into the document's sections under the `design.md` standard. A project with no stylesheet yet takes the values under `.claude/design/project/` after `canon design install`, and the lead names that path. Leave structure and layout on the canvas, and name the frame in the plan that builds it.
|
|
109
112
|
- Name the frame the decision came from in the reply, and leave the frame on the canvas until the operator clears it.
|
|
110
113
|
- Never cite a frame path from a tracked file. The folder is gitignored, so the citation resolves on this machine alone.
|
|
111
114
|
|
|
@@ -116,7 +119,7 @@ When the operator picks a frame, the decision leaves the canvas.
|
|
|
116
119
|
Page: <page>, <n> frames
|
|
117
120
|
Selected: <page>/<frame>, element <index>, or none, or stale
|
|
118
121
|
Capture: <path of each capture written>
|
|
119
|
-
Carried: <the design document the pick went to, the plan that cites the frame, or not yet>
|
|
122
|
+
Carried: <the stylesheet and design document the pick went to, the plan that cites the frame, or not yet>
|
|
120
123
|
```
|
|
121
124
|
|
|
122
125
|
Write the canvas line's URL as a markdown link. Omit the capture line when nothing was captured and the carried line when no direction was picked. Emit every path from the project root.
|
|
@@ -58,6 +58,9 @@ A canvas failing these is non-conforming even when it satisfies every shape rule
|
|
|
58
58
|
- Write a frame as a whole document or as a fragment. The server writes in the `html`, `head`, and `body` a fragment leaves out, marked so a pick still matches the file.
|
|
59
59
|
- State a `body` whenever the frame states a `head`. The browser builds one the file leaves out, and an address the operator picks inside the frame can no longer be matched to the file.
|
|
60
60
|
- Write every table with its `tbody` stated, for the same reason. A browser adds one the file leaves out.
|
|
61
|
+
|
|
62
|
+
### Content and edits
|
|
63
|
+
|
|
61
64
|
- Keep a frame self-contained. Inline its own styles and scripts, or link a file inside the same page folder, since a frame is served from its page and nothing outside the canvas resolves.
|
|
62
65
|
- Use the project's custom properties, `var(--<name>)`, for every value the token stylesheet defines. A literal copied from it shows the right color today and the wrong one after the next token change.
|
|
63
66
|
- Edit a frame by rewriting its file. The file is the frame, and nothing else holds a copy of its markup.
|
|
@@ -70,6 +73,9 @@ Applies to an explanation frame only. A mockup of the project's interface render
|
|
|
70
73
|
- Keep lines short, one fact a line.
|
|
71
74
|
- Set body text at 20px or larger and headings at 44px or larger. Set nothing under 16px.
|
|
72
75
|
- Render an explanation frame about 1100px wide.
|
|
76
|
+
|
|
77
|
+
### Colors, faces, and fit
|
|
78
|
+
|
|
73
79
|
- Take colors from the project's custom properties. A frame that defines colors of its own sets the dark values on `:root` and the light ones under `[data-theme="light"]`, since the shell sets `data-theme` on each frame's root.
|
|
74
80
|
- Name only the faces the canvas serves into every frame: `Geist Variable` for text, `Noto Sans Mono` for code, and `Excalifont` for a hand-drawn look. They render the same in a capture and in any browser, so a height fitted against them holds.
|
|
75
81
|
- Make each box tall enough to show all its content, with no scrollbar and no clipped line. Run `canon canvas fit <page>/<frame>` rather than estimating, since it measures the content in the capture browser and sets the height.
|
|
@@ -80,6 +86,9 @@ Applies to an explanation frame only. A mockup of the project's interface render
|
|
|
80
86
|
- Keep one `layout.json` per page, beside its frames. It holds each frame's box and nothing else, so moving a frame never rewrites its markup.
|
|
81
87
|
- Key each box by the frame's name, under one top-level `frames` object.
|
|
82
88
|
- Give every box four finite numbers in pixels: `x` and `y` for its top-left corner on the page, `width` for the width the frame renders at, and `height` for the height it shows on the canvas.
|
|
89
|
+
|
|
90
|
+
### Missing boxes and writes
|
|
91
|
+
|
|
83
92
|
- Leave a frame out of the layout only when its position does not matter yet. A reader places an unnamed frame in a row after the others, at the default size of 1440 by 900.
|
|
84
93
|
- Never write the file while a writer holds its lock, which is the same name with `.lock` appended. Two writers each replacing the whole file lose one of the two edits.
|
|
85
94
|
- Treat a layout that does not parse as a defect to repair, never as an empty one to overwrite. Writing over it erases every box it held.
|
|
@@ -106,6 +115,9 @@ The keys below are the ones a reader parses. The frame names are placeholders.
|
|
|
106
115
|
- Do not assume a viewport. A frame renders at its layout width on the canvas and in a capture alike, so size it with media queries against that width rather than against the operator's window.
|
|
107
116
|
- Do not assume the theme. The canvas theme toggle is the operator's own state, and a capture shows each frame in its default theme.
|
|
108
117
|
- Do not assume a network. Name a served face, or ship the font beside the frame, since a capture refuses a frame naming a font it cannot find.
|
|
118
|
+
|
|
119
|
+
### Font, source, and checkout
|
|
120
|
+
|
|
109
121
|
- Do not assume a default font. Set `font-family` with a served face first on an element the frame's text inherits from, since a capture checks the first family of the text it renders and the browser's default serif is absent from many machines. A frame naming a machine family such as `DejaVu Sans` renders at another height in another browser, which `canon canvas fit` reports.
|
|
110
122
|
- Do not assume the frame is the source. A picked direction is carried into the project's design document or a plan, and the operator clears the frame once it has been carried.
|
|
111
123
|
- Do not assume the canvas survives the checkout. The folder is gitignored, so a lost checkout loses every page in it.
|
|
@@ -10,104 +10,121 @@ Applies to `canon/DESIGN.md`. Captures visual intent and the decisions behind ho
|
|
|
10
10
|
## Contents
|
|
11
11
|
|
|
12
12
|
- [Scope](#scope)
|
|
13
|
+
- [Two shapes](#two-shapes)
|
|
13
14
|
- [What goes in](#what-goes-in)
|
|
14
15
|
- [What does not go in](#what-does-not-go-in)
|
|
15
16
|
- [Format](#format)
|
|
16
17
|
- [Prose budget](#prose-budget)
|
|
17
|
-
- [The uncertainty tag](#the-uncertainty-tag)
|
|
18
18
|
- [Sections](#sections)
|
|
19
|
+
- [The uncertainty tag](#the-uncertainty-tag)
|
|
19
20
|
- [Template](#template)
|
|
20
21
|
|
|
21
22
|
## Scope
|
|
22
23
|
|
|
23
|
-
Governs the visual-intent document at `canon/DESIGN.md
|
|
24
|
+
Governs the visual-intent document at `canon/DESIGN.md`, being the rules and omissions that keep visual scope closed, the intent behind each role, and the pointer to where the values live.
|
|
24
25
|
|
|
25
26
|
Does not govern:
|
|
26
27
|
|
|
27
28
|
- Per-domain implementation narrative: `context.md`
|
|
29
|
+
- The token values themselves, which live in the project's stylesheet
|
|
30
|
+
|
|
31
|
+
## Two shapes
|
|
32
|
+
|
|
33
|
+
- **An intent record** is the shape a project writes by hand. It carries rules, omissions, and each role's intent, and its lead names the stylesheet the values live in. It carries no value, since a hand-typed copy of the stylesheet drifts from it.
|
|
34
|
+
- **A values record** is generated from a token source and carries the value tables beside the rules. It is never edited by hand, and its lead names the module it is rendered from. The toolkit's own record is one.
|
|
35
|
+
|
|
36
|
+
Everything below applies to both shapes unless it names one.
|
|
28
37
|
|
|
29
38
|
## What goes in
|
|
30
39
|
|
|
31
|
-
-
|
|
32
|
-
-
|
|
40
|
+
- In the lead, the stylesheet a reader takes values from, such as `src/styles/tokens.css` or a Tailwind `@theme` block
|
|
41
|
+
- What each color role and each shape role is for, with the custom property that carries it
|
|
42
|
+
- Layout constraints and sizing rules not obvious from the stylesheet and the code
|
|
33
43
|
- Visual rules a developer could get wrong without guidance
|
|
34
44
|
- Non-obvious omissions ("no motion", "no custom icons") that prevent scope creep
|
|
35
45
|
|
|
36
46
|
## What does not go in
|
|
37
47
|
|
|
48
|
+
- A token's value in an intent record, whether a hex, a font stack, a size, a step, or a radius. The stylesheet the lead names carries it.
|
|
38
49
|
- CSS classes and prop names. Those live in code.
|
|
39
50
|
- Anything that needs updating every time the code is refactored
|
|
40
|
-
- The history of how a value or a mark was chosen
|
|
51
|
+
- The history of how a value or a mark was chosen, being the candidates, the rounds, and the date of a pick. State the rule and cut the trail, since version control keeps it.
|
|
41
52
|
|
|
42
53
|
## Format
|
|
43
54
|
|
|
44
|
-
-
|
|
45
|
-
- Plain English over technical notation. If a section could be removed and the developer would still build correctly from the
|
|
46
|
-
- Keep table headers and role names intact so the
|
|
55
|
+
- Write every rule as a short bullet, one decision per line, within `## Prose budget`.
|
|
56
|
+
- Plain English over technical notation. If a section could be removed and the developer would still build correctly from the stylesheet and code alone, remove it.
|
|
57
|
+
- Keep table headers and role names intact so the parser can read the tables.
|
|
47
58
|
|
|
48
59
|
## Prose budget
|
|
49
60
|
|
|
50
|
-
The record is a lookup, so its prose stays short enough to scan
|
|
61
|
+
The record is a lookup, so its prose stays short enough to scan. Why a rule was chosen belongs in the project's context entry for design, never here.
|
|
51
62
|
|
|
52
|
-
-
|
|
63
|
+
- Overview: one paragraph of at most 60 words
|
|
53
64
|
- Any other section: at most 3 rules beside its table, each at most 25 words. A bullet is one rule, and so is a paragraph.
|
|
54
65
|
- The lead before the first section: at most 40 words
|
|
55
66
|
|
|
56
67
|
Headings and table rows are never counted, and a section holding a table and no rules is within budget. A bullet wrapping over several lines counts as one rule, and a nested bullet counts as its own.
|
|
57
68
|
|
|
58
|
-
##
|
|
69
|
+
## Sections
|
|
59
70
|
|
|
60
|
-
|
|
71
|
+
Use `## Overview`, `## Colors`, `## Typography`, `## Spacing`, `## Shapes`, `## Motion`, and `## Iconography`, in that order, which follows Google's DESIGN.md for the sections the two share. An optional `## Layout` sits between Spacing and Shapes. The parser still reads a record written under the earlier names, `## Personality`, `## Color`, and `## Borders`, as the sections they became.
|
|
61
72
|
|
|
62
|
-
|
|
73
|
+
In an intent record, `## Colors` carries a `Role | Property | Intent` table and `## Shapes` a `Role | Property | When used` table. Each row names the custom property the stylesheet declares for that role, such as `--color-accent`. Typography and Spacing carry rules alone.
|
|
63
74
|
|
|
64
|
-
|
|
75
|
+
Add either optional section when the project has content for it:
|
|
65
76
|
|
|
66
|
-
|
|
77
|
+
- `## Layout`: page width, breakpoints, and grid rules, as current constraints. The surface-capture rule reads the breakpoints from here, so a project with none declared here is captured at the 320 reflow floor alone.
|
|
78
|
+
- `## Mark`: the logo's construction rules and the files that carry it
|
|
67
79
|
|
|
68
|
-
##
|
|
80
|
+
## The uncertainty tag
|
|
69
81
|
|
|
70
|
-
|
|
82
|
+
Applies to a values record alone. An intent record carries no value to tag, and a guessed value is marked where it is written, in the stylesheet.
|
|
71
83
|
|
|
72
|
-
|
|
84
|
+
A cell no source anchors ends in ` ? verify`, written inside the cell rather than as a trailing column, since a trailing marker breaks the table parse. A cell wrapping itself in a code span carries the tag inside the span, as in `` `#ffffff ? verify` ``. Both spellings parse.
|
|
73
85
|
|
|
74
|
-
|
|
75
|
-
|
|
86
|
+
The renderer splits the tag off the value, so a swatch and a font sample are built from the value alone and the marker shows beside it. The preview also reports how many cells are anchored against how many are tagged, which is the reading a reviewer takes the record's overall confidence from.
|
|
87
|
+
|
|
88
|
+
Which columns that ratio reads is fixed by the table rather than by the record. The first column of each table names its row, and `Multiplier` and `When used` restate what the row already carries, so none of them is something a source could anchor and none is counted. That leaves `Intent` and `Value` in Colors, `Family`, `Weight`, `Size`, and `Line height` in Typography, `Value` in Spacing, and `Radius` and `Width` in Shapes. A cell tagged outside that set counts anyway, so a marker the preview draws is never missing from the ratio beside it.
|
|
89
|
+
|
|
90
|
+
A prose section takes its uncertainty inline instead, in a sentence saying what is proposed and what has yet to confirm it. A tag appended to a paragraph renders verbatim.
|
|
76
91
|
|
|
77
92
|
## Template
|
|
78
93
|
|
|
79
|
-
The
|
|
94
|
+
The template is the intent record. The column headers are read by exact key, so they stay verbatim. Row names are not, which leaves a project free to rename a role, add one, or drop one it has no use for.
|
|
80
95
|
|
|
81
96
|
```markdown
|
|
82
97
|
# Design
|
|
83
98
|
|
|
84
|
-
|
|
99
|
+
Values live in `<path to the stylesheet>`. This record holds the intent behind them.
|
|
100
|
+
|
|
101
|
+
## Overview
|
|
85
102
|
|
|
86
103
|
<one paragraph on voice, tone, and the feeling a user should have>
|
|
87
104
|
|
|
88
|
-
##
|
|
105
|
+
## Colors
|
|
106
|
+
|
|
107
|
+
- <a rule a developer could get wrong>
|
|
89
108
|
|
|
90
|
-
| Role | Intent |
|
|
91
|
-
| ------ | ---------------- |
|
|
92
|
-
| <role> | <what it is for> |
|
|
109
|
+
| Role | Property | Intent |
|
|
110
|
+
| ------ | ---------------- | ---------------- |
|
|
111
|
+
| <role> | `--color-<role>` | <what it is for> |
|
|
93
112
|
|
|
94
113
|
## Typography
|
|
95
114
|
|
|
96
|
-
|
|
97
|
-
| ------ | -------- | -------- | ------ | ----------- |
|
|
98
|
-
| <role> | <family> | <weight> | <size> | <height> |
|
|
115
|
+
- <how the roles divide between families, and any role that breaks the pattern>
|
|
99
116
|
|
|
100
117
|
## Spacing
|
|
101
118
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
119
|
+
- <the base unit and how the scale steps>
|
|
120
|
+
|
|
121
|
+
## Shapes
|
|
105
122
|
|
|
106
|
-
|
|
123
|
+
- <a rule about radius or border a developer could get wrong>
|
|
107
124
|
|
|
108
|
-
| Role |
|
|
109
|
-
| ------ |
|
|
110
|
-
| <role> |
|
|
125
|
+
| Role | Property | When used |
|
|
126
|
+
| ------ | ----------------- | ----------- |
|
|
127
|
+
| <role> | `--radius-<role>` | <when used> |
|
|
111
128
|
|
|
112
129
|
## Motion
|
|
113
130
|
|
|
@@ -61,6 +61,11 @@ Before responding, verify:
|
|
|
61
61
|
- All actions pinned to major version tags, no `@latest` or `@main`.
|
|
62
62
|
- A new pipeline folds static, unit, and build into one job, and a gate a run log put past two minutes gives them no `needs` so they run in parallel.
|
|
63
63
|
- Every name in a `needs` matches a job declared in the same file. E2E names the artifact producer, release and deploy name E2E.
|
|
64
|
+
|
|
65
|
+
### Artifacts, names, and deploys
|
|
66
|
+
|
|
67
|
+
Before responding, also verify:
|
|
68
|
+
|
|
64
69
|
- Artifacts upload on `if: failure()` only with `retention-days: 7`.
|
|
65
70
|
- Job names use emoji + title format.
|
|
66
71
|
- Deploy, publish, and release jobs carry a placeholder step and a named handoff, never a guessed deploy command.
|
|
@@ -83,6 +83,9 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
|
|
|
83
83
|
- A new class has one method, or a new function's body is one call with the same arguments.
|
|
84
84
|
- The change you are making opens a third file to adjust one rule.
|
|
85
85
|
- You are writing an interface, a factory, or a registry with one implementation behind it.
|
|
86
|
+
|
|
87
|
+
### Defaults and fixes
|
|
88
|
+
|
|
86
89
|
- You wrote a default value, a threshold, or a fallback the task never named.
|
|
87
90
|
- A fix is adding a special case, a catch, or a disabled check rather than changing the code that misbehaved.
|
|
88
91
|
- The code reads the current time, an environment variable, or a global from inside a rule.
|
|
@@ -95,6 +98,9 @@ Check each line against the code the change produced. A line answering no is fix
|
|
|
95
98
|
- Every new function or class hides more than its interface asks a caller to learn, with no pass-through left.
|
|
96
99
|
- No rule the change wrote exists in a second place, and nothing was merged that changes for a different reason.
|
|
97
100
|
- Every pattern in the diff solves a problem present now, with more than one case behind it.
|
|
101
|
+
|
|
102
|
+
### Inputs, scope, and fixes
|
|
103
|
+
|
|
98
104
|
- Clock, environment, and global reads are passed in rather than taken inside a rule.
|
|
99
105
|
- The diff holds no feature, option, or default the task did not ask for or state.
|
|
100
106
|
- Every fix changes the code that misbehaved rather than silencing it.
|
|
@@ -34,7 +34,7 @@ A placement rule in front of the session is also one it can argue past. Each fla
|
|
|
34
34
|
- Carry a hard file-count threshold. A command folder holding sixty files of one role reads fine flat, and a number would fail it.
|
|
35
35
|
- Restate the layer rule, the layer table, or the final filter `test-craft` owns
|
|
36
36
|
- Mandate one layout across projects, such as a `features/` tree, over the project's own strategy
|
|
37
|
-
- Restate the pointer in `
|
|
37
|
+
- Restate the pointer in `routing`, which loads in code stacks only. The rule points here and this body carries the depth.
|
|
38
38
|
|
|
39
39
|
## Guards
|
|
40
40
|
|
|
@@ -90,5 +90,5 @@ Check every new path the plan or the change names against each line, and fix the
|
|
|
90
90
|
- Which layer a test belongs at: `test-craft`. This skill decides where the test file sits once its layer is chosen.
|
|
91
91
|
- What a module exposes across its boundary, being its exports, flags, output, and errors: `api-design`. This skill decides where the file holding it sits.
|
|
92
92
|
- Where a new path gets written into a plan, and the plan's shape: `plan-feature` and the plan standard
|
|
93
|
-
- The pointer here that every session of a code stack loads: `
|
|
94
|
-
- Runner, suffix, and top-level test folder conventions per language: `
|
|
93
|
+
- The pointer here that every session of a code stack loads: `routing`
|
|
94
|
+
- Runner, suffix, and top-level test folder conventions per language: `testing-ts`, `testing-py`, `testing-go`, and `testing-php`
|