@erclx/canon 5.36.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/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/SKILL.md +3 -0
- package/claude/skills/canon-feedback/SKILL.md +5 -0
- package/claude/skills/canon-feedback-triage/SKILL.md +3 -0
- package/claude/skills/canvas-board/SKILL.md +3 -0
- package/claude/skills/canvas-board/references/canvas.md +12 -0
- package/claude/skills/ci-workflow/SKILL.md +5 -0
- package/claude/skills/code-craft/SKILL.md +6 -0
- package/claude/skills/context-fold/references/context.md +48 -34
- package/claude/skills/create-rule/SKILL.md +11 -9
- package/claude/skills/create-rule/references/rule.md +6 -0
- 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 +25 -24
- package/claude/skills/deprecation-migration/SKILL.md +6 -0
- package/claude/skills/deprecation-migration/references/adopted.md +3 -0
- package/claude/skills/design-taste/SKILL.md +6 -0
- package/claude/skills/design-taste/references/craft.md +3 -0
- package/claude/skills/design-taste/references/preflight.md +16 -0
- 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-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 +24 -6
- package/claude/skills/plan-feature/SKILL.md +9 -0
- 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-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 +5 -0
- package/claude/skills/video-craft/SKILL.md +6 -0
- package/claude/skills/write-human/SKILL.md +9 -0
- package/docs/agents/capture.md +2 -0
- package/docs/agents/commands.md +54 -54
- 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/index.md +1 -1
- package/docs/agents/install-and-sync.md +2 -2
- package/docs/agents/markdown-audit-weight.md +11 -3
- package/docs/agents/markdown-audit.md +2 -2
- package/docs/agents/pr-frames.md +17 -3
- package/docs/agents/sessions-transfer.md +8 -6
- package/docs/agents/skills-audit.md +9 -1
- package/docs/target/scenarios.md +1 -1
- package/docs/target/standards-moved.md +20 -18
- package/docs/workflow/ai-workflow.md +3 -0
- package/docs/workflow/visual-design-workflow.md +5 -0
- package/package.json +2 -2
- package/src/cli/help.ts +1 -1
- package/src/commands/context.ts +29 -4
- package/src/commands/gate.ts +1 -8
- package/src/commands/markdown.ts +52 -0
- package/src/commands/pr.ts +17 -10
- package/src/context/audit.ts +83 -0
- package/src/context/classify/prompts.ts +6 -1
- package/src/context/gate.ts +6 -3
- package/src/gate/measures.ts +186 -1
- 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/install.ts +2 -2
- package/src/gov/list.ts +1 -1
- package/src/gov/payload.ts +1 -1
- package/src/gov/stacks.ts +1 -1
- package/src/markdown/gate.ts +10 -0
- package/src/markdown/growth.ts +43 -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/sync/check.ts +23 -23
- package/tooling/astro/configs/tsconfig.json +1 -1
- package/tooling/astro/reference.md +2 -2
- package/tooling/base/configs/scripts/verify.json +1 -1
- package/tooling/base/configs/scripts/verify.ts +2 -8
- package/tooling/base/reference.md +10 -10
- package/tooling/base/seeds/canon/context/ci.md +4 -4
- package/tooling/base/seeds/canon/context/development.md +9 -9
- package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +8 -0
- package/tooling/vite-react/configs/tsconfig.json +1 -1
- package/tooling/vite-react/configs/vitest.config.ts +1 -1
- package/tooling/vite-react/reference.md +2 -2
- package/tooling/web/configs/src/test/setup.ts +1 -1
- package/tooling/web/manifest.toml +3 -3
- package/tooling/web/reference.md +1 -1
|
@@ -93,6 +93,9 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
|
|
|
93
93
|
- A deprecation notice names no replacement or no removal date.
|
|
94
94
|
- The diff adds a replacement and deletes the original in the same change.
|
|
95
95
|
- A fallback or compatibility path has no stated condition for its removal.
|
|
96
|
+
|
|
97
|
+
### Behavior and callers
|
|
98
|
+
|
|
96
99
|
- You are adding behavior to the surface being deprecated.
|
|
97
100
|
- Your report says "no callers" without naming the caller kinds the search could not reach.
|
|
98
101
|
- A caller outside the repository was found and the plan still deletes the original.
|
|
@@ -104,6 +107,9 @@ Check each line against what the change produced. A line answering no is fixed o
|
|
|
104
107
|
- The surface is deprecated only if it has a stated cost, a shipped replacement, and a named owner.
|
|
105
108
|
- Every compulsory deprecation states its removal date where a caller looks.
|
|
106
109
|
- Every caller reachable in the repository was migrated, or is named with the reason it was not.
|
|
110
|
+
|
|
111
|
+
### Checks and fallbacks
|
|
112
|
+
|
|
107
113
|
- The zero-consumers check covered every caller kind, and the report names the kinds it could not reach.
|
|
108
114
|
- No change both adds the replacement and removes the original.
|
|
109
115
|
- Every fallback left in place states when it goes and who removes it.
|
|
@@ -27,6 +27,9 @@ External sources were read and filtered rather than imported. This file is the r
|
|
|
27
27
|
- The five-question deprecation decision, cut to four. Its unique-value and maintenance-cost questions merge into one question about what keeping the surface costs. Its per-consumer migration-cost question drops, since the Churn Rule puts that cost on the owner rather than weighing it per caller. The owner question from the book takes the freed place.
|
|
28
28
|
- The rule never to deprecate without a replacement, as the third decision question.
|
|
29
29
|
- The strangler and adapter patterns, stated as when each fits rather than as worked code tied to one stack.
|
|
30
|
+
|
|
31
|
+
#### Migration, zombie code, and red flags
|
|
32
|
+
|
|
30
33
|
- Expand, migrate, contract, lifted out of its schema section and stated for any surface as three separate changes.
|
|
31
34
|
- Zombie code, narrowed to code that is unowned, uncalled, and still built, and settled by the same zero-consumers check rather than a list of staleness signals.
|
|
32
35
|
- The rationalizations and red flags that carry across stacks, reworded for any surface rather than a service or a column. Two excuse rows come from here:
|
|
@@ -22,6 +22,9 @@ This is what the population average looks like. Each one is what gets drawn when
|
|
|
22
22
|
- A violet-to-blue gradient used as the accent.
|
|
23
23
|
- Numbered labels above sections: `001 / Capabilities`, `Phase 02`, `Step 1`.
|
|
24
24
|
- A scroll cue at the bottom of the first screen.
|
|
25
|
+
|
|
26
|
+
### Details and copy
|
|
27
|
+
|
|
25
28
|
- A colored dot before every navigation item, row or badge.
|
|
26
29
|
- A glow standing in for elevation, on a pure black or pure white ground.
|
|
27
30
|
- A product screenshot built out of styled rectangles.
|
|
@@ -144,6 +147,9 @@ Run `${CLAUDE_SKILL_DIR}/references/preflight.md` against the output. It is the
|
|
|
144
147
|
- Focus, keyboard, ARIA, alt text, and every accessibility floor: the `ui` governance rules, which fire on the same paths this skill does and are the single source
|
|
145
148
|
- States, empty and loading coverage, destructive confirmation, truncation: the same rules
|
|
146
149
|
- Rendered copy casing, button labels, error message shape: the same rules
|
|
150
|
+
|
|
151
|
+
### Other skills
|
|
152
|
+
|
|
147
153
|
- The candidate loop, the arm set, the render, and the pick: `draft-and-pick`
|
|
148
154
|
- The shape of the project's design document and where its values live: `${CLAUDE_SKILL_DIR}/../canvas-board/references/design.md`
|
|
149
155
|
- Reading source for roughness: `ux-audit`. Measuring what a running interface costs to paint: `ux-measure`
|
|
@@ -53,6 +53,9 @@ Reaching for size is the first instinct and the weakest tool.
|
|
|
53
53
|
- A link or action that goes nowhere.
|
|
54
54
|
- Navigation with no indication of where the reader currently is.
|
|
55
55
|
- The same portrait used for several different people.
|
|
56
|
+
|
|
57
|
+
### Content and copy
|
|
58
|
+
|
|
56
59
|
- Every item dated identically, which no real collection ever is.
|
|
57
60
|
- An exclamation mark in a success message. Confidence is quieter than that.
|
|
58
61
|
- An error opening on an apology rather than on what to do next.
|
|
@@ -26,10 +26,15 @@ Skip nothing on the ground that it is obviously fine. A rule is on this list bec
|
|
|
26
26
|
|
|
27
27
|
## Composition
|
|
28
28
|
|
|
29
|
+
### Section rhythm
|
|
30
|
+
|
|
29
31
|
- [ ] No layout family used twice. Eight sections carry at least four families
|
|
30
32
|
- [ ] No three consecutive sections sharing the image-and-text split
|
|
31
33
|
- [ ] Small uppercase labels above headings number no more than one per three sections, per `interface-casing`
|
|
32
34
|
- [ ] At most one horizontal marquee
|
|
35
|
+
|
|
36
|
+
### Content and first screen
|
|
37
|
+
|
|
33
38
|
- [ ] Grid cells equal content items, with no blank tile filling a gap
|
|
34
39
|
- [ ] Lists over five items use something other than a longer list
|
|
35
40
|
- [ ] The first screen carries the point and the primary action without scrolling
|
|
@@ -39,9 +44,14 @@ Skip nothing on the ground that it is obviously fine. A rule is on this list bec
|
|
|
39
44
|
|
|
40
45
|
Skip this group where the surface draws on a system already settled.
|
|
41
46
|
|
|
47
|
+
### Space and type
|
|
48
|
+
|
|
42
49
|
- [ ] Every gap comes from one scale, and the distinct spacing values number under about eight
|
|
43
50
|
- [ ] Space between groups exceeds space within them
|
|
44
51
|
- [ ] The type scale carries five to seven steps, each visibly different from its neighbors
|
|
52
|
+
|
|
53
|
+
### Color
|
|
54
|
+
|
|
45
55
|
- [ ] The accent is rare enough to read as an accent
|
|
46
56
|
- [ ] Neutrals sit in one family at one temperature
|
|
47
57
|
- [ ] Adjacent surfaces separate by a little and content separates from ground by a lot
|
|
@@ -51,6 +61,9 @@ Skip this group where the surface draws on a system already settled.
|
|
|
51
61
|
|
|
52
62
|
- [ ] Shared elements align across every item in a row, and actions form one line
|
|
53
63
|
- [ ] Nothing centered by arithmetic that reads off-center
|
|
64
|
+
|
|
65
|
+
### Type detail
|
|
66
|
+
|
|
54
67
|
- [ ] No orphaned word closing a heading
|
|
55
68
|
- [ ] Body text measure is capped
|
|
56
69
|
- [ ] Changing numbers set in tabular figures
|
|
@@ -61,6 +74,9 @@ Skip this group where the surface draws on a system already settled.
|
|
|
61
74
|
- [ ] Every visible string re-read in one pass, with anything broken, unclear or performatively clever rewritten
|
|
62
75
|
- [ ] Every number either real, labeled as sample, or removed
|
|
63
76
|
- [ ] No placeholder that reads as placeholder: generic names, generic company names, reused portraits, identical dates
|
|
77
|
+
|
|
78
|
+
### Wording
|
|
79
|
+
|
|
64
80
|
- [ ] No filler verbs
|
|
65
81
|
- [ ] Sentence case throughout, with exceptions per `interface-casing`
|
|
66
82
|
- [ ] Every claim about what the product does is a thing it does
|
|
@@ -48,6 +48,9 @@ A page failing these is non-conforming even when it satisfies every shape rule b
|
|
|
48
48
|
- `title` (required): sentence case, naming the surface the page covers rather than the action a reader takes on it
|
|
49
49
|
- `description` (required): one line naming what the page covers, which is what the folder's catalog shows beside the link
|
|
50
50
|
- `category` (conditional): the shelf the page sits on in that catalog
|
|
51
|
+
|
|
52
|
+
### Declaring category
|
|
53
|
+
|
|
51
54
|
- Declare `category` on every page in a folder where any page declares one. A grouped catalog writes the declared shelves and nothing else, so a page omitting the field beside a sibling that carries one is absent from the catalog with nothing reporting it.
|
|
52
55
|
- Omit it on every page or on none. A folder where no page declares one lists flat, which is the right shape for a folder whose pages need no shelves.
|
|
53
56
|
- Spell one shelf's value identically on every page sitting there. The grouping reads the literal string, so a second spelling opens a second shelf holding one page.
|
|
@@ -65,6 +68,9 @@ A page failing these is non-conforming even when it satisfies every shape rule b
|
|
|
65
68
|
- Write for a reader with no access to the source. A sentence that resolves only by opening a file belongs in internal narrative instead.
|
|
66
69
|
- Name the failures a surface produces alongside the path that works. A page documenting success alone sends its reader to the source at the first refusal.
|
|
67
70
|
- Link to the adjacent page rather than restating it. One page owns each surface, and a second copy drifts with nothing comparing the two.
|
|
71
|
+
|
|
72
|
+
### What to leave out
|
|
73
|
+
|
|
68
74
|
- Do not restate output a command already prints, such as a full flag table. Name the command that prints it.
|
|
69
75
|
- Do not carry the history of how a surface reached its shape. A page describes the surface as it stands, and the change that moved it is recorded wherever the project tracks work.
|
|
70
76
|
- Do not carry contributor setup or the argument for adopting the project. Both are addressed to a reader who has not installed anything yet.
|
|
@@ -51,10 +51,16 @@ Scoped to the README at a repository root. A nested README documenting a folder,
|
|
|
51
51
|
|
|
52
52
|
- Required: project description, installation/setup, usage examples, support/help resources
|
|
53
53
|
- Optional: the header block below, features, contributing (link to `CONTRIBUTING.md`), license (link to `LICENSE`)
|
|
54
|
+
|
|
55
|
+
### Leave out
|
|
56
|
+
|
|
54
57
|
- Do not include full API documentation. Link to separate docs instead.
|
|
55
58
|
- Do not include license text. Reference the `LICENSE` file.
|
|
56
59
|
- Do not include detailed contribution guidelines. Reference `CONTRIBUTING.md`.
|
|
57
60
|
- Do not include extensive troubleshooting guides. Use a wiki or separate documentation.
|
|
61
|
+
|
|
62
|
+
### Routing and generator output
|
|
63
|
+
|
|
58
64
|
- A README that points to the project's own context entries instead of restating them satisfies the required list by routing rather than carrying. A repository documented in `docs/` or `canon/context/` names the entry point and the listing command, then stops. The reader is one hop away, the same way `## Badges` treats zero as complete.
|
|
59
65
|
- A README missing an H1, or whose headings restate the tool that scaffolded it rather than the project, is unedited generator output rather than a page anyone wrote. Draft over it. Nothing here asks a session to preserve a section a scaffold wrote and nobody replaced.
|
|
60
66
|
|
|
@@ -74,6 +80,9 @@ The description of 2-3 sentences follows the block and expands the claim rather
|
|
|
74
80
|
- A project with no page omits the link and the screenshot. A library or a CLI reads as a complete block with a title, badges, and a claim.
|
|
75
81
|
- A project whose own page carries the screenshot omits it here and keeps the live link, which answers the slot rather than skipping it. Say so in the pull request that drops it.
|
|
76
82
|
- The order is the block's rather than the page's. The screenshot sits last inside the block, which puts it in the first row of content a reader meets below the title, badges, and claim.
|
|
83
|
+
|
|
84
|
+
#### Themes and wrappers
|
|
85
|
+
|
|
77
86
|
- A themed light and dark pair counts as one element in the slot rather than two. The block does not require a pair and leaves the handling of themes to the project.
|
|
78
87
|
- Centering the block in an HTML wrapper is optional. Plain markdown reaches every host a README renders on, and a wrapper is styling a project can add.
|
|
79
88
|
- Never invent an element. A mark or a screenshot the project does not hold stays out of the page.
|
|
@@ -91,6 +100,9 @@ Stars, forks, download counts, language chips, and "made with" badges fail. The
|
|
|
91
100
|
- Cap the block at four. A fifth costs more scanning than any badge repays.
|
|
92
101
|
- Give each badge alt text naming what it reports rather than the service that renders it. Write `npm version`, not `shields.io`.
|
|
93
102
|
- Link each badge to the page a doubting reader would check next, which is the registry listing for a version badge and the run history for a status badge. A red badge with no route to the failing run reports a problem and withholds the only thing the reader wants.
|
|
103
|
+
|
|
104
|
+
#### Pinning and verifying
|
|
105
|
+
|
|
94
106
|
- Pin a status badge to the branch whose health it claims to report, and confirm the workflow actually runs on that branch. A workflow triggered by pull requests alone never runs on the default branch, so an unpinned badge reports whichever branch ran last and a pinned one reports nothing at all. Fix the trigger, or drop the badge under the rule below.
|
|
95
107
|
- Verify a badge by the value it renders, not by its status code. A badge service answers 200 for a query it cannot satisfy, so a blank badge and a working one look identical to a status check.
|
|
96
108
|
- Zero badges is a correct answer. A private project with no registry presence and no CI has nothing that passes the test, and an empty block beats a padded one.
|
|
@@ -100,6 +112,9 @@ Stars, forks, download counts, language chips, and "made with" badges fail. The
|
|
|
100
112
|
- Open public-facing READMEs with universal problems any reader recognizes, not repo-specific artifact names. Save artifact names for feature or "What is inside" sections.
|
|
101
113
|
- Use relative paths for repository files. Use absolute URLs for external resources.
|
|
102
114
|
- Include practical usage snippets for core functionality
|
|
115
|
+
|
|
116
|
+
### Per project kind
|
|
117
|
+
|
|
103
118
|
- For libraries/tools: include API quickstart
|
|
104
119
|
- For applications/products: include usage instructions and configuration options
|
|
105
120
|
- For CLI tools: include command examples with flags
|
|
@@ -41,6 +41,9 @@ Every arm of a round sits as one frame on one canvas page, side by side. The com
|
|
|
41
41
|
- Label each arm inside its frame with its id and its cost. The composite capture draws no captions, so the label is how the render carries what the question will ask about.
|
|
42
42
|
- Theme every arm off the `data-theme` attribute the canvas sets on each frame's root, so the canvas theme toggle sets the whole set at once. A set spanning both themes cannot be compared, since the operator has to hold one arm in memory while reading the next.
|
|
43
43
|
- Give no arm a script that stores a theme and reapplies it on load. That script overwrites the toggle, shows one frame in the other theme, and passes a fresh browser profile because the stored value is not there yet.
|
|
44
|
+
|
|
45
|
+
#### Default path and live app
|
|
46
|
+
|
|
44
47
|
- Take the live-app branch instead when the surface under decision is a running app: lift the rendered markup and link a copy of the built stylesheet rather than inlining, per `${CLAUDE_SKILL_DIR}/references/live-arms.md`.
|
|
45
48
|
- On the default path, inline every style, script, and asset the frame needs. A frame resolves nothing outside its own page folder, so one reaching for a build step or a network font renders without it and the arms differ by something nobody chose.
|
|
46
49
|
- On the default path, name a real font first in the stack, one the machine has or the frame embeds, such as the project's own family from its design tokens. A generic keyword such as `system-ui` or `sans-serif` is refused, since it resolves to a different font on each machine. The capture refuses a frame that would rewrap against a substitute rather than shipping a false comparison, so a frame naming no font at all is refused on whatever the default resolves to.
|
|
@@ -63,6 +66,9 @@ canon canvas capture <page> --composite --json
|
|
|
63
66
|
- Read the PNG's `path` off the record. The composite shows every frame in its default theme, so look at the other theme on the live canvas where the arms carry two.
|
|
64
67
|
- `canon canvas capture` needs a browser binary the toolkit does not install. When it refuses for that reason, report the refusal and name `bunx playwright install chromium` as the repair, stop the canvas server if this run started it, then stop rather than describing an arm nobody has seen.
|
|
65
68
|
- A capture refusing on a font names the family it read off the frame's text. Take the repair `canon:canvas-board` Step 6 gives and capture again.
|
|
69
|
+
|
|
70
|
+
### Handing over
|
|
71
|
+
|
|
66
72
|
- Hand over the address rather than a description. Emit the canvas link first on its own line, naming the page, then the PNG path on its own line. A still answers how a thing looks and answers none of a hover response, a scroll-linked position, or a pace, which the live frame does.
|
|
67
73
|
- Never report a visual result you have not looked at. A claim about appearance with no render behind it is a guess.
|
|
68
74
|
- Look to judge rather than to confirm. Reading the image back to check it rendered satisfies the rule above and still hands over weak work, so name the weakest thing on the page in a sentence. Where that sentence would embarrass the work, fix it and hand over the second version. Say the remaining weakness out loud either way, so the operator is not hunting for what you already know.
|
|
@@ -75,6 +81,9 @@ Put the choice to the operator through the structured question surface, since a
|
|
|
75
81
|
- One option per arm, labeled with the arm's id and carrying its cost as the description.
|
|
76
82
|
- Rank the recommendation first and mark it `(Recommended)`.
|
|
77
83
|
- Author the real arms only. The surface appends its own escapes for a free-text answer and for reopening the question, so writing either as an option ships a duplicate the tool rejects.
|
|
84
|
+
|
|
85
|
+
### Taking the answer
|
|
86
|
+
|
|
78
87
|
- Take no pick on the operator's behalf when two arms are both defensible and the difference is taste. That call is theirs, and a silent one is the failure this skill exists to prevent.
|
|
79
88
|
- Read `canon canvas selection --json` when the answer points at the canvas rather than naming an arm, such as "the selected one". Resolve it against the record's `page` as well as its `frame`, since every round names its arms `arm-<id>` from the same ids. A selected frame on the current round's page is the pick. One on an earlier round's page picks that round's arm, which is a revert, so name the round back to the operator before acting on it. A fresh element inside a picked frame is a correction Step 5 carries by its `index`.
|
|
80
89
|
- Treat `selection: null`, a frame on a page this run did not add, or an element carrying `stale: true` as no answer, and ask again rather than guessing.
|
|
@@ -118,6 +127,9 @@ Cite these rather than restating them. A step reimplemented here rots against th
|
|
|
118
127
|
- `plan-feature` plans the work once the pick is made, and declares the pull request boundary that plan carries
|
|
119
128
|
- `design-taste` carries the layer catalog, the ordering, grey-boxing, and the defaults an arm should reach past
|
|
120
129
|
- `write-human` carries the voice for any copy an arm puts in front of a reader
|
|
130
|
+
|
|
131
|
+
### Git and review
|
|
132
|
+
|
|
121
133
|
- `git-stage`, `git-pr`, and `git-followup` carry the commits and the pull request
|
|
122
134
|
- `review-pr` and `review-address` run the review pass
|
|
123
135
|
- `canon:canvas-board` carries the canvas start-and-check sequence, the main-root write route for a frame, and the selection and capture refusals
|
|
@@ -24,7 +24,7 @@ A project the surface move has not reached keeps its context folder under `.clau
|
|
|
24
24
|
|
|
25
25
|
- Read the domain's own folders and files well enough to answer the standard's three questions: where things live, why they are that way, and how to add one more of what the domain holds.
|
|
26
26
|
- Draft `title` and `description` frontmatter, then `## Overview`, `## Layout` (folder ownership lines only, never a file-by-file list), and `## Decisions` or `## Gotchas` wherever the domain's history supplies a non-obvious choice or a workaround worth preserving.
|
|
27
|
-
- Keep the standard's
|
|
27
|
+
- Keep the standard's closed set and order: `Overview`, `Layout`, `Decisions`, `Gotchas`. A topic of the domain's own is an H3 under one of them, per `context.md` in the `context-fold` skill's references.
|
|
28
28
|
|
|
29
29
|
## Write
|
|
30
30
|
|
|
@@ -65,6 +65,9 @@ Between agent-facing and plugin alone, a repository with no plugin manifest take
|
|
|
65
65
|
- Open the page with the standard's header block, filling each slot from what Detect found: mark, title, badges, a one-line claim from the manifest description, the live link, then the product screenshot.
|
|
66
66
|
- Fill the screenshot slot only with an image the project already commits, referenced with alt text naming what it depicts. This kind cannot capture one. Omit the slot when no such image exists and say so in the preview. Never write a placeholder path or invent a mark.
|
|
67
67
|
- Omit the link and the screenshot for a project with no page, and the mark for a project with none, without a note in the drafted page. A project with a page and no known URL gets the screenshot slot, and the Confirm step asks for the link.
|
|
68
|
+
|
|
69
|
+
### Types and badges
|
|
70
|
+
|
|
68
71
|
- Cover every applicable project type from the standard's `## Content` list rather than picking the closest one.
|
|
69
72
|
- Candidate badges: check for a published package (a registry field in the manifest), a CI workflow, and a `LICENSE` file.
|
|
70
73
|
- State each candidate's rendered value in the preview rather than trusting a fetch's status code, since a badge service answers 200 for a query it cannot satisfy.
|
|
@@ -34,8 +34,14 @@ A diagram failing these is non-conforming even when it satisfies every shape rul
|
|
|
34
34
|
- Declare `flowchart TB` by default. Mermaid ignores a subgraph's direction whenever that subgraph links outward, and an architecture diagram links across its subgraphs as the normal case, so top-bottom is a declaration rather than a guarantee.
|
|
35
35
|
- Restructure a diagram that renders diagonal or left-to-right. Repeating the direction keyword does not fix it.
|
|
36
36
|
- Render a context, component, or pipeline diagram taller than wide. A `sequenceDiagram` is wide by construction and is exempt.
|
|
37
|
+
|
|
38
|
+
### Rows and edges
|
|
39
|
+
|
|
37
40
|
- Do not let independent nodes render in a row. A row of siblings reads as a sequential chain and asserts a pipeline the system does not have.
|
|
38
41
|
- Do not converge many edges on one node from one side. A crossing bundle is unreadable whatever it encodes.
|
|
42
|
+
|
|
43
|
+
### Labels and subgraphs
|
|
44
|
+
|
|
39
45
|
- Keep node labels short. Three or four words max. Detail goes in the paragraph below the diagram.
|
|
40
46
|
- Use `<br/>` for a second short line on a node when the label is two ideas, never for a sentence.
|
|
41
47
|
- Subgraphs are for grouping unrelated lanes such as offline versus online or browser versus server. Do not subgraph a single linear flow.
|
|
@@ -41,6 +41,9 @@ The render injects the project's token stylesheet ahead of each slide's own styl
|
|
|
41
41
|
- Use the project's custom properties, such as `var(--color-accent)`, for every color, face, and spacing value the stylesheet defines. Read the names from `.claude/design/base.css` and any overrides under `.claude/design/project/`. When neither exists, say the deck renders unstyled rather than inventing values to cover it.
|
|
42
42
|
- Leave the `--color-*` roles to the stylesheet rather than redefining them in a slide. The master reads its colors off the first slide's `<html>`, and a slide body computing its own `--color-text` is reported, since the bands keep the master's colors.
|
|
43
43
|
- Vary the composition across slides. Never repeat a title over bullets on every slide. Reach for columns, a row of large numbers, a grid of cards, a chart, a pull quote, and section dividers.
|
|
44
|
+
|
|
45
|
+
### Fit and shapes
|
|
46
|
+
|
|
44
47
|
- Keep titles short and lines tight, so text fits its box at the size the design sets rather than overflowing the frame.
|
|
45
48
|
- Never write centered body text.
|
|
46
49
|
- Prefer CSS the converter maps to native shapes. An element computing a property it cannot map is drawn as a picture of itself and reported on stderr, so a slide full of gradients and filters stops being editable.
|
|
@@ -22,6 +22,9 @@ Does not govern:
|
|
|
22
22
|
- Length: 50 characters maximum
|
|
23
23
|
- Casing: kebab-case only, no underscores or camelCase
|
|
24
24
|
- Description: 2 words maximum, up to 4 only when genuinely needed for specificity
|
|
25
|
+
|
|
26
|
+
### Description content
|
|
27
|
+
|
|
25
28
|
- Capture the core change, not the commit message verbatim
|
|
26
29
|
- For branches with multiple commits, use the unifying concern as the description.
|
|
27
30
|
- Do not duplicate type in description (e.g., `feat/feature-login`)
|
|
@@ -30,17 +33,19 @@ The upper bound reads 4 rather than 3 for every branch, whoever named it. It was
|
|
|
30
33
|
|
|
31
34
|
## Types
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
| Type | Use |
|
|
37
|
+
| ---------- | ------------------------------------------- |
|
|
38
|
+
| `feat` | new feature or capability |
|
|
39
|
+
| `fix` | bug fix |
|
|
40
|
+
| `refactor` | structural changes (not a fix or feature) |
|
|
41
|
+
| `docs` | documentation only (README) |
|
|
42
|
+
| `chore` | maintenance tasks (deps, tooling, configs) |
|
|
43
|
+
| `perf` | performance improvements |
|
|
44
|
+
| `test` | add or modify tests |
|
|
45
|
+
| `style` | code formatting (whitespace, semicolons) |
|
|
46
|
+
| `build` | build system changes (webpack, npm scripts) |
|
|
47
|
+
| `ci` | CI/CD pipeline changes (GitHub Actions) |
|
|
48
|
+
| `revert` | revert a previous commit |
|
|
44
49
|
|
|
45
50
|
## Examples
|
|
46
51
|
|
|
@@ -23,23 +23,28 @@ Does not govern:
|
|
|
23
23
|
|
|
24
24
|
## Types
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
| Type | Use |
|
|
27
|
+
| ---------- | ------------------------------------------- |
|
|
28
|
+
| `feat` | new feature or capability |
|
|
29
|
+
| `fix` | bug fix |
|
|
30
|
+
| `refactor` | structural changes (not a fix or feature) |
|
|
31
|
+
| `docs` | documentation only (README) |
|
|
32
|
+
| `chore` | maintenance tasks (deps, tooling, configs) |
|
|
33
|
+
| `perf` | performance improvements |
|
|
34
|
+
| `test` | add or modify tests |
|
|
35
|
+
| `style` | code formatting (whitespace, semicolons) |
|
|
36
|
+
| `build` | build system changes (webpack, npm scripts) |
|
|
37
|
+
| `ci` | CI/CD pipeline changes (GitHub Actions) |
|
|
38
|
+
| `revert` | revert a previous commit |
|
|
37
39
|
|
|
38
40
|
## Scope vocabulary
|
|
39
41
|
|
|
40
42
|
- Single lowercase word representing a system component
|
|
41
43
|
- Prefer single word
|
|
42
44
|
- Use kebab-case only when two words are genuinely needed for specificity
|
|
45
|
+
|
|
46
|
+
### What a scope may not be
|
|
47
|
+
|
|
43
48
|
- Do not use specific filenames as scopes
|
|
44
49
|
- Do not use a scope that duplicates the type
|
|
45
50
|
- Write scopes for release readability. They surface in `changelogithub` release notes.
|
|
@@ -49,6 +54,9 @@ Does not govern:
|
|
|
49
54
|
- Use imperative mood (`add` not `added`)
|
|
50
55
|
- Describe the actual technical change, not that something changed
|
|
51
56
|
- Do not use vague verbs (`improve`, `refine`, `enhance`)
|
|
57
|
+
|
|
58
|
+
### Form and quoting
|
|
59
|
+
|
|
52
60
|
- Do not repeat the scope in the subject line
|
|
53
61
|
- Use single quotes if quoting
|
|
54
62
|
- No backslash escaping or internal double quotes
|
|
@@ -16,6 +16,9 @@ Does not govern:
|
|
|
16
16
|
- The format of a phase label, which is project-specific by the rule below
|
|
17
17
|
- Task filenames and folder layout: `tasks.md`
|
|
18
18
|
- Commit subject, branch name, and pull request title format: `commit.md`, `branch.md`, and `pr.md`
|
|
19
|
+
|
|
20
|
+
### Neighboring concerns
|
|
21
|
+
|
|
19
22
|
- Voice, rhythm, and sentence construction in any text carrying a label: the `write-human` skill
|
|
20
23
|
- Punctuation, formatting, and word choice in any text carrying a label: `markdown.md`
|
|
21
24
|
- How a quoted-alone version-shaped token or a record path is caught as a board reference, which sits outside the phase-label/semver split this file owns: `publish.md`
|
|
@@ -59,11 +62,17 @@ External release identity used in git tags and release notes. Independent of pha
|
|
|
59
62
|
- Commit subjects do not embed phase labels.
|
|
60
63
|
- Git tags use semver only. Phase labels never become tags.
|
|
61
64
|
- A PR that cuts a release may reference its semver tag in the title or body. Phase labels still do not appear.
|
|
65
|
+
|
|
66
|
+
### Bodies and code spans
|
|
67
|
+
|
|
62
68
|
- PR bodies, review comments, and issue text name the change itself, never the internal stream that scheduled it. Describe the work rather than the label it was planned under.
|
|
63
69
|
- A phase label written alone inside its own code span reads as shown rather than asserted. `canon labels scan` masks a code span before checking for a bare token, so a backticked label on its own does not count as an appearance for the phase-label check.
|
|
64
70
|
- That masking clears one check and not the gate. A span whose whole content is the label still resolves as a board reference under `publish.md`'s own board-identifier check, run by the same scan, so a title or body quoting a label alone in a span still fails on that check and does not clear every surface the table above marks `no`.
|
|
65
71
|
- The one shape neither check reaches is a version-shaped token folded into a longer quoted phrase, such as a fixture name or a file path. A backticked span quoting a test fixture's own version-shaped name is the corpus case that forced this carve-out, and a real phase label folded the same way inside a review comment is the counterexample where it read as clean on both checks.
|
|
66
72
|
- The operator decided to keep the carve-out rather than narrow it to fenced blocks alone or drop it outright, leaving an author responsible for writing a live reference in plain text instead of folding it into a quoted phrase.
|
|
73
|
+
|
|
74
|
+
### Phase labels in shipped files
|
|
75
|
+
|
|
67
76
|
- A phase label in a context entry is permitted only when its substance is restated inline beside it. A bare label carrying nothing beside it is forbidden, since a reader without the board has nothing to resolve it against.
|
|
68
77
|
- A phase label carries no exception for a surface this repository authors and ships to a target it does not control: a standard, a skill body, and a governance rule are all forbidden outright, substance restated or not. The line is ownership rather than reachability. A shipped file is read by a project that never edits it, so the label names a board that reader can never reach. A context entry stays permitted above because it is this project's own tracked surface, never shipped.
|
|
69
78
|
- The shipped-surface rule governs a reference to a real row, never a token shown to illustrate the label's own format. A phase label naming no decision, written only to show the pattern's shape, is not a citation, which is what lets a standard defining the format still show what one looks like.
|
|
@@ -53,15 +53,18 @@ Does not govern:
|
|
|
53
53
|
### Feedback
|
|
54
54
|
|
|
55
55
|
- One `## Toolkit feedback` wrapper holds every field as a nested `###` heading. A flat `##` field is not recognized.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
56
|
+
| Field | Holds |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| `### From project` (optional) | the reporting project's name or kind. |
|
|
59
|
+
| `### Surface` (required) | the toolkit surface and its type, and the specific file or name when known. |
|
|
60
|
+
| `### Observed` (required) | the observed behavior. |
|
|
61
|
+
| `### Expected` (optional) | the expected behavior, or `unclear`. |
|
|
62
|
+
| `### Repro` (optional) | repro details, or `none`. |
|
|
63
|
+
| `### Proposed fix` (required) | a proposed fix, or `open` when the session settled on no direction. |
|
|
64
|
+
| `### Suggested shape` (optional) | the template, output, or field list the change should take, inside a `<details>` block. Omit the heading when there is none. |
|
|
65
|
+
| `### Why` (optional) | the reasons for the fix, one bullet each. Omit the heading when there are none. |
|
|
66
|
+
| `### Links` (optional) | the issues, pull requests, or documents the report cites, one per line. Omit the heading when there are none. |
|
|
67
|
+
|
|
65
68
|
- A required field is refused when present but empty. Write the fallback literal for From project, Expected, and Repro rather than leaving one blank.
|
|
66
69
|
|
|
67
70
|
## Formatting
|
|
@@ -14,6 +14,11 @@ Read these files in parallel:
|
|
|
14
14
|
- `${CLAUDE_SKILL_DIR}/../git-branch/references/branch.md`: branch format, valid types, and constraints
|
|
15
15
|
- `${CLAUDE_SKILL_DIR}/references/pr.md`: structure, rules, and banned phrases
|
|
16
16
|
- `${CLAUDE_SKILL_DIR}/references/labels.md`: label map format, matching, and the missing-label warning. Skip when the project has no `canon/config/pr-labels.toml` and no `.claude/canon/pr-labels.toml`.
|
|
17
|
+
|
|
18
|
+
### Writing standards
|
|
19
|
+
|
|
20
|
+
Read these in the same pass:
|
|
21
|
+
|
|
17
22
|
- `${CLAUDE_SKILL_DIR}/../markdown-craft/references/markdown.md`: punctuation and formatting for all generated text
|
|
18
23
|
- The `write-human` skill: voice, rhythm, and sentence construction for all generated text
|
|
19
24
|
- `${CLAUDE_SKILL_DIR}/../git-commit/references/versioning.md`: phase label vs semver discipline
|
|
@@ -21,12 +21,12 @@ Governs a pull request title and body: their format and the sections the body ca
|
|
|
21
21
|
|
|
22
22
|
Does not govern:
|
|
23
23
|
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
24
|
+
- **`commit.md`**: commit subject format, which shares the title form
|
|
25
|
+
- **`branch.md`**: branch naming
|
|
26
|
+
- **`versioning.md`**: whether a phase label or a semver tag may appear in a title or body
|
|
27
|
+
- **`publish.md`**: whether a quoted label, a gitignored record path, or a link to one Claude Code session may appear in a title or body, which `canon labels scan` fails on
|
|
28
|
+
- **the `write-human` skill**: voice, rhythm, and sentence construction in pull request prose
|
|
29
|
+
- **`markdown.md`**: punctuation and formatting in pull request prose
|
|
30
30
|
|
|
31
31
|
## Title
|
|
32
32
|
|
|
@@ -39,6 +39,9 @@ Does not govern:
|
|
|
39
39
|
- Use imperative mood for all content (`add`, `fix`, `refactor`)
|
|
40
40
|
- Do not start with "This PR," "This commit," "Included are," or "I have"
|
|
41
41
|
- Do not use buzzwords (`seamless`, `robust`, `game-changer`, `enhanced`)
|
|
42
|
+
|
|
43
|
+
### What to leave out
|
|
44
|
+
|
|
42
45
|
- Do not describe historical behavior or unchanged code. Describe new behavior only.
|
|
43
46
|
- Do not include future promises or speculative documentation
|
|
44
47
|
- Do not explain obvious changes (formatting, renaming variables)
|
|
@@ -48,12 +51,21 @@ Does not govern:
|
|
|
48
51
|
|
|
49
52
|
- `## Summary`: 1-2 sentences following `<Action Verb> <Direct Object> to <Result>`, expand for clarity if needed
|
|
50
53
|
- `## Key changes`: name actual files, functions, or modules (e.g., `AuthService.verify()` not "auth handler"). Always use bullet points, never prose.
|
|
54
|
+
|
|
55
|
+
### Context section
|
|
56
|
+
|
|
51
57
|
- `## Technical context` (optional): 1-2 lines of architectural reasoning explaining why, not what
|
|
52
58
|
- Omit Technical context for docs, config, or trivial changes
|
|
53
59
|
- Use bullet points for multiple reasons, one sentence for a single reason
|
|
60
|
+
|
|
61
|
+
### Testing section
|
|
62
|
+
|
|
54
63
|
- `## Testing` (optional): specify exact commands or test cases run
|
|
55
64
|
- Omit Testing for docs, config, or trivial sync changes
|
|
56
65
|
- Use checkboxes, never prose. See Testing discipline for which box gets ticked.
|
|
66
|
+
|
|
67
|
+
### Reviewer section and visuals
|
|
68
|
+
|
|
57
69
|
- `## For the reviewer` (optional): what the reviewing session should confirm, one bullet per request
|
|
58
70
|
- Visuals: include only when they clarify architecture, UI, or complex logic flows
|
|
59
71
|
- The list is closed. A body carries the sections above and nothing after the last of them, which covers a trailer a harness appends once the body is composed. `canon labels scan` holds the list: it fails a level-two heading outside the five above, and a body missing `## Summary` or `## Key changes`. A review body and a release-please body are exempt.
|
|
@@ -64,10 +76,16 @@ Does not govern:
|
|
|
64
76
|
- Tick the box and state the observed result. `- [x] npm test passes, 42 tests` beats `- [ ] run npm test`.
|
|
65
77
|
- Quote the count or output the run reported, never a figure carried from elsewhere.
|
|
66
78
|
- A ticked box describes the tree as it stands, not as it stood when it was written. A later commit that removes or replaces what it names makes the box false, and the branch that made that commit corrects it in the same pass, the same as any other stale claim in the body.
|
|
79
|
+
|
|
80
|
+
### Human-only boxes
|
|
81
|
+
|
|
67
82
|
- Leave a box unchecked only when a human is required, and name which human and why on the same line.
|
|
68
83
|
- Human-only covers visual or aesthetic judgment, anything needing credentials or a live third-party service, anything needing a second machine or a fresh OS, and judgment about whether a boundary or an abstraction reads correctly. The agent runs everything else.
|
|
69
84
|
- What makes a human required is a capability the agent lacks, never the cost of the run. Authorizing a spend is the operator's and performing the run is not, so an arm the repository ships a harness for gets driven once the operator has cleared the spend, and the box records what it returned.
|
|
70
85
|
- A tool refusal that actually fired is a capability gap, and the line says which refusal rather than naming the cost behind it. A refusal predicted and never met is not one.
|
|
86
|
+
|
|
87
|
+
### Live sessions and reviewer requests
|
|
88
|
+
|
|
71
89
|
- A live agent session is not a human. A box reading `needs a live session driving the skill` names the thing writing the description, so that run is owed rather than blocked.
|
|
72
90
|
- Put a request for the reviewer under `## For the reviewer`. It is a request rather than unfinished testing, so it never appears as an unchecked Testing box.
|
|
73
91
|
|
|
@@ -54,6 +54,9 @@ On the wake, branch on the final record's fields rather than on the exit:
|
|
|
54
54
|
- `state: passing`: read the evidence thread under `### Settling the evidence thread` below, then continue to After completion on `settled`.
|
|
55
55
|
- `state: failing`: stop the sequence and report the failing check with its URL.
|
|
56
56
|
- `conflicted: true`: stop the sequence and report that the branch conflicts with its base, since no run will start for it. A rebase is the repair.
|
|
57
|
+
|
|
58
|
+
#### Refused and unsettled reads
|
|
59
|
+
|
|
57
60
|
- A `reason` and no `state`: the read was refused, such as `no-remote-branch` for a branch deleted on the remote. Stop and report that `reason`. A missing `state` is never a pass.
|
|
58
61
|
- The command hit its timeout and printed no final record: report CI unsettled after 60 minutes, and emit no `✅ Shipped`.
|
|
59
62
|
- The `gh pr checks --watch` fallback ran, which prints a check table rather than a record. Only a printed table carrying at least one check, every one passing, continues to After completion. Any failing check stops the sequence naming it with its URL. Empty or errored output stops the sequence and reports the message, since `no checks reported on the '<branch>' branch` is what a conflicted branch prints, and that fallback has no `conflicted` field to separate it from lag.
|
|
@@ -36,9 +36,15 @@ Run these commands in parallel to gather git context:
|
|
|
36
36
|
- Group commits by concern using both commit messages and file paths.
|
|
37
37
|
- Prefer fewer branches: combine related commits into one branch.
|
|
38
38
|
- Only split into separate branches when concerns are clearly independent.
|
|
39
|
+
|
|
40
|
+
### Primary concern
|
|
41
|
+
|
|
39
42
|
- Identify the primary concern of the current branch. Rename it using `git branch -m` if the current name does not already match. Skip the rename if it already matches. Secondary concerns are extracted as new focused branches via cherry-pick.
|
|
40
43
|
- If no single concern dominates (dumping-ground branch with no clear primary), split all commits into new focused branches and add `git branch -d <current>` to delete the original.
|
|
41
44
|
- Propose one new branch per secondary concern following branch.md format.
|
|
45
|
+
|
|
46
|
+
### Independent and stacked
|
|
47
|
+
|
|
42
48
|
- Classify groups as independent or stacked before generating commands.
|
|
43
49
|
- Independent groups: each group's commits apply to `main` without the others. Base every branch on `main`.
|
|
44
50
|
- Stacked groups: groups are ordered and each depends on the commits before it. Base each branch on the previous group's branch. Cherry-pick only that group's commits onto it. The base branch already carries all prior commits.
|
|
@@ -31,6 +31,9 @@ Run these commands in parallel to gather git context:
|
|
|
31
31
|
- Group files by shared concern. A group is a single commit.
|
|
32
32
|
- Files belong together when they implement or modify the same logical unit.
|
|
33
33
|
- A file that clearly stands alone is its own group.
|
|
34
|
+
|
|
35
|
+
### Order and commands
|
|
36
|
+
|
|
34
37
|
- Order commits by dependency: commit dependencies before the files that import them.
|
|
35
38
|
- Prefix the full command sequence with `git restore --staged .` to unstage everything, then stage and commit each group in order.
|
|
36
39
|
- For `D` status files, use `git rm <file>`. For `A` or `M` files, use `git add <file>`.
|
|
@@ -83,12 +83,12 @@ If Enumeration marked the roster unreadable, stop: `❌ Session roster unreadabl
|
|
|
83
83
|
|
|
84
84
|
From the enumeration, include a worktree in the remove set when all hold:
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
1. Not the main row.
|
|
87
|
+
2. Not the current session's worktree.
|
|
88
|
+
3. Not occupied by a live session.
|
|
89
|
+
4. Not a `foreign` tree.
|
|
90
|
+
5. State is `merged` or `merged (local)`.
|
|
91
|
+
6. Working tree is clean.
|
|
92
92
|
|
|
93
93
|
Every other non-main row goes to the skip set with a one-word reason, the first that applies in this order: `current`, `occupied`, `foreign`, `dirty`, `open`, `closed`, `unmerged`. A `foreign` tree that is also dirty reports `foreign`, since `dirty` is a state the operator can clear and `foreign` is not. Leading with the transient reason invites a commit or stash that changes nothing, after which the row reports `foreign` and holds back anyway.
|
|
94
94
|
|