@erclx/canon 5.55.0 → 5.57.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/CHANGELOG.md +22 -0
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/SKILL.md +8 -10
- package/claude/skills/auto-ship/SKILL.md +4 -5
- package/claude/skills/auto-ship/references/failure-recovery.md +37 -17
- package/claude/skills/auto-ship/references/tier-failures.md +9 -7
- package/claude/skills/auto-ship/references/worktree-name.md +8 -5
- package/claude/skills/backlog-triage/SKILL.md +10 -10
- package/claude/skills/backlog-triage/references/apply.md +6 -6
- package/claude/skills/canon-feedback-triage/SKILL.md +7 -5
- package/claude/skills/context-fold/references/classify.md +17 -4
- package/claude/skills/create-rule/references/rule.md +4 -0
- package/claude/skills/create-skill/SKILL.md +2 -2
- package/claude/skills/deploy-app/SKILL.md +2 -0
- package/claude/skills/deprecation-migration/SKILL.md +7 -9
- package/claude/skills/document-health/references/axes.md +1 -1
- package/claude/skills/git-followup/REQUIREMENT.md +4 -4
- package/claude/skills/git-followup/SKILL.md +24 -7
- package/claude/skills/git-issue/references/issue.md +9 -11
- package/claude/skills/git-pr/references/closing-issues.md +8 -0
- package/claude/skills/git-pr/references/publish.md +4 -5
- package/claude/skills/git-split/SKILL.md +11 -4
- package/claude/skills/markdown-craft/SKILL.md +1 -1
- package/claude/skills/markdown-craft/references/markdown.md +2 -2
- package/claude/skills/markdown-craft/references/tables.md +9 -7
- package/claude/skills/plan-feature/REQUIREMENT.md +2 -1
- package/claude/skills/plan-feature/SKILL.md +19 -1
- package/claude/skills/plan-feature/references/onboarding.md +51 -0
- package/claude/skills/plan-feature/references/plan.md +18 -0
- package/claude/skills/plan-groundwork/SKILL.md +1 -1
- package/claude/skills/plan-intake/REQUIREMENT.md +3 -3
- package/claude/skills/plan-intake/SKILL.md +4 -0
- package/claude/skills/plan-intake/references/intake.md +10 -0
- package/claude/skills/review-address/SKILL.md +10 -8
- package/claude/skills/review-craft/SKILL.md +7 -9
- package/claude/skills/review-craft/references/adopted.md +10 -8
- package/claude/skills/review-pr/SKILL.md +2 -0
- package/claude/skills/review-pr/references/key-changes.md +8 -6
- package/claude/skills/review-ui/references/driving.md +10 -8
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +6 -4
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +9 -3
- package/claude/skills/role-reviewer/SKILL.md +5 -5
- package/claude/skills/search-craft/SKILL.md +5 -7
- package/claude/skills/session-worktree/SKILL.md +2 -0
- package/claude/skills/session-worktree/references/main-root-writes.md +2 -0
- package/claude/skills/systematic-debugging/SKILL.md +9 -9
- package/claude/skills/systematic-debugging/references/adopted.md +1 -1
- package/claude/skills/target-update/REQUIREMENT.md +1 -0
- package/claude/skills/target-update/SKILL.md +22 -0
- package/claude/skills/task-board/SKILL.md +2 -4
- package/claude/skills/task-board/references/tasks.md +5 -5
- package/claude/skills/task-complete/references/archive.md +5 -2
- package/claude/skills/test-craft/SKILL.md +2 -0
- package/claude/skills/test-craft/references/adopted.md +2 -0
- package/claude/skills/ui-checklist/SKILL.md +8 -9
- package/claude/skills/write-doc/SKILL.md +8 -8
- package/claude/skills/write-doc/references/readme.md +2 -0
- package/claude/skills/write-doc/references/wiki-kind.md +11 -4
- package/docs/agents/context-audit.md +16 -14
- package/docs/agents/markdown-audit.md +11 -4
- package/docs/agents/migrate.md +15 -13
- package/docs/agents/output-shape.md +2 -0
- package/docs/target/migrations.md +3 -3
- package/docs/workflow/operating-model.md +2 -0
- package/package.json +1 -1
- package/src/commands/markdown.ts +25 -29
- package/src/commands/tasks.ts +10 -4
- package/src/labels/density.ts +5 -46
- package/src/markdown/density.ts +41 -6
- package/src/markdown/scope.ts +6 -1
- package/src/markdown/structure.ts +18 -9
- package/src/markdown/tables.ts +32 -18
- package/src/pr/bijection.ts +5 -3
- package/src/pr/paths.ts +32 -10
- package/src/process/harness.ts +8 -0
- package/src/process/seeded-package.ts +21 -0
- package/src/records/validate.ts +1 -0
- package/src/serve/static.ts +2 -60
- package/src/tasks/branch.ts +6 -1
- package/src/tasks/record.ts +44 -0
- package/tooling/base/reference.md +7 -6
- package/tooling/claude/reference.md +7 -5
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +7 -6
- package/src/serve/live.ts +0 -113
|
@@ -71,11 +71,10 @@ A link to one Claude Code session names the session that wrote the text rather t
|
|
|
71
71
|
|
|
72
72
|
A number referring to a pull request or an issue takes the form its destination renders. Write it bare where the destination auto-links it and in backticks where it does not, so a reference moved between destinations is rewritten rather than copied.
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
| Content installed into another repository | qualified against a different, resolvable repository, or no number |
|
|
74
|
+
- Pull request or issue body, a comment on either, a commit: `#123` <!-- canon-allow-reference: the bare spelling this section defines, which a qualified form would destroy -->
|
|
75
|
+
- The same destinations when the reference crosses repositories: `owner/repo#123` <!-- canon-allow-reference: the two spellings this section defines, which a qualified form would destroy -->
|
|
76
|
+
- A markdown file browsed from the repository tree: the number in backticks, since neither spelling links there
|
|
77
|
+
- Content installed into another repository: qualified against a different, resolvable repository, or no number
|
|
79
78
|
|
|
80
79
|
A commit message takes the bare form even though the log links nothing, since the remote is what the form is chosen for. Text quoted from another surface keeps the spelling it arrived with, since rewriting it reports the source as saying something it never said.
|
|
81
80
|
|
|
@@ -74,10 +74,17 @@ Classify the groups before generating commands, since the mode decides each bran
|
|
|
74
74
|
|
|
75
75
|
Append the line for the run's mode to the preview.
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
Stacked mode appends this line:
|
|
78
|
+
|
|
79
|
+
```plaintext
|
|
80
|
+
🔁 Sequential squash-merge loop. Squash-merge each PR bottom-up with --delete-branch. After each merge, signal me so I can restack the next branch onto main before you merge it.
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Independent mode appends this line:
|
|
84
|
+
|
|
85
|
+
```plaintext
|
|
86
|
+
🔁 Squash-merge secondaries first, primary last. The primary keeps every cherry-picked commit, so merging it first lands every secondary's content on main and leaves the secondary PRs empty after rebase.
|
|
87
|
+
```
|
|
81
88
|
|
|
82
89
|
After outputting the preview, execute the final commands immediately. Claude Code's tool permission dialog is the confirmation gate. Do not wait for user input.
|
|
83
90
|
|
|
@@ -14,7 +14,7 @@ Read the references below before a substantial markdown edit. Every rule in them
|
|
|
14
14
|
|
|
15
15
|
Run `canon markdown audit <path>` after the edit, and fix every ban and density finding it reports before moving on. Rewrite the sentence carrying a ban hit rather than swapping the token for a near-synonym, and fix a density finding by its shape rather than trimming characters.
|
|
16
16
|
|
|
17
|
-
A table
|
|
17
|
+
A table cell past its cap and a list after a table gate where density does, and the row count and the wide token report without failing the run. Fix each the way `tables.md` gives for its limit.
|
|
18
18
|
|
|
19
19
|
## Routes
|
|
20
20
|
|
|
@@ -77,7 +77,7 @@ A bold section marker holding its line alone breaks a run the way a heading does
|
|
|
77
77
|
|
|
78
78
|
## Density
|
|
79
79
|
|
|
80
|
-
Six limits keep a file scannable on sight, each a fact `canon markdown audit` measures that fails the push where the surface's gate is on. A table takes four more
|
|
80
|
+
Six limits keep a file scannable on sight, each a fact `canon markdown audit` measures that fails the push where the surface's gate is on. A table takes four more in `tables.md`, two of them gating. Open an H3 with a lead sentence or a table, then a few bullets or a short paragraph, since monotone text is the defect.
|
|
81
81
|
|
|
82
82
|
| Rule | Limit |
|
|
83
83
|
| ------------------- | ------------------------------------------------- |
|
|
@@ -95,7 +95,7 @@ Rules, a requirements or design record, a changelog, examples, and `.canon/` rec
|
|
|
95
95
|
A paragraph is read straight through and a bullet is scanned, so the paragraph limit sits above the bullet one. Four sentences to a paragraph stays advice rather than a limit.
|
|
96
96
|
|
|
97
97
|
- A paragraph's length folds in the lines that wrap it. A paragraph inside a list item counts toward its bullet, never as a paragraph or toward a run.
|
|
98
|
-
- A bullet's length counts its continuation lines and excludes any bullet nested under it
|
|
98
|
+
- A bullet's length counts its continuation lines and excludes any bullet nested under it, and a nested bullet is measured on its own
|
|
99
99
|
- A heading, list, table, fence, or bold section marker ends a run of paragraphs
|
|
100
100
|
- A blank line, a continuation, and a nested item do not break a run of bullets, and a paragraph or a heading does
|
|
101
101
|
- A run whose every item opens with a bold label or a link is exempt from the run limit, since each item names its own subject. A task box is not a link, so a checklist counts as plain.
|
|
@@ -5,18 +5,20 @@ description: The four limits a markdown table takes, being cell length, row coun
|
|
|
5
5
|
|
|
6
6
|
# Table limits
|
|
7
7
|
|
|
8
|
-
None of the density limits in `markdown.md` reads inside a table, so content too long for a bullet tends to move into a cell. Four table limits close that gap. `canon markdown audit` measures them on the paths density covers, outside fences
|
|
8
|
+
None of the density limits in `markdown.md` reads inside a table, so content too long for a bullet tends to move into a cell. Four table limits close that gap. `canon markdown audit` measures them on the paths density covers, outside fences.
|
|
9
|
+
|
|
10
|
+
Cell length and a list after a table fail a push where density gates. Rows and a wide token report without failing one.
|
|
9
11
|
|
|
10
12
|
## Limits
|
|
11
13
|
|
|
12
14
|
Each limit is a count or a shape a scan settles, read the way a renderer draws the table. An escaped pipe stays inside its cell, and pipe lines with no delimiter row are not a table.
|
|
13
15
|
|
|
14
|
-
| Rule | Limit |
|
|
15
|
-
| ---------------- | ----------------------------------------------------- |
|
|
16
|
-
| Cell length | 120 visible characters, counting a link by its label |
|
|
17
|
-
| Rows | 8 body rows, not counting the header |
|
|
18
|
-
| List after table | A list is never the next block after a table |
|
|
19
|
-
| Wide token | No code span in a cell holds a run past 30 characters |
|
|
16
|
+
| Rule | Limit | Effect |
|
|
17
|
+
| ---------------- | ----------------------------------------------------- | ------------ |
|
|
18
|
+
| Cell length | 120 visible characters, counting a link by its label | Gates |
|
|
19
|
+
| Rows | 8 body rows, not counting the header | Reports only |
|
|
20
|
+
| List after table | A list is never the next block after a table | Gates |
|
|
21
|
+
| Wide token | No code span in a cell holds a run past 30 characters | Reports only |
|
|
20
22
|
|
|
21
23
|
A paragraph or a heading between a table and a list clears the third limit, and a blank line alone does not.
|
|
22
24
|
|
|
@@ -13,7 +13,7 @@ A constraint naming a surface to leave alone forbids two acts at once, conformin
|
|
|
13
13
|
|
|
14
14
|
## Must
|
|
15
15
|
|
|
16
|
-
- Read the project's Claude setup
|
|
16
|
+
- Read the project's Claude setup and the domain's context entry, run the existing thing once read-only, then scan source, and name every file touched with its reason
|
|
17
17
|
- Reframe a vague ask as observable success criteria, carry each into the plan's verification, and ask when none can be predicted
|
|
18
18
|
- Slice by user-visible path with the riskiest batch first, and fold a stacked batch sharing most of its files into its parent unless the plan says why they differ
|
|
19
19
|
- Quote the fetched passage behind each outside source, mark an unfetched one unverified, and place each new path against the layout guidance with a one-clause reason
|
|
@@ -23,6 +23,7 @@ A constraint naming a surface to leave alone forbids two acts at once, conformin
|
|
|
23
23
|
|
|
24
24
|
- Implement, or edit any file the plan describes
|
|
25
25
|
- Read directories speculatively, since context spent on files the feature does not touch is context the plan does not get
|
|
26
|
+
- Run a form that writes to the tree being planned against, since a planner writes its plan and nothing else
|
|
26
27
|
- Bundle independent concerns into one plan
|
|
27
28
|
- Restate the plan in chat during follow-up rounds, since the file is the source of truth
|
|
28
29
|
|
|
@@ -13,6 +13,13 @@ metadata:
|
|
|
13
13
|
- Do not implement anything. Output the plan and stop.
|
|
14
14
|
- When the feature description spans two or more independent concerns, write one plan file per concern. Do not bundle them under a single slug.
|
|
15
15
|
|
|
16
|
+
## Write scope
|
|
17
|
+
|
|
18
|
+
Write the plan, and nothing else in the tree being planned against.
|
|
19
|
+
|
|
20
|
+
- A file made only to look at goes to scratch under a topic slug, per `${CLAUDE_SKILL_DIR}/references/onboarding.md`
|
|
21
|
+
- A fixture or headless session that must be its own project goes outside the repository, in a temporary directory
|
|
22
|
+
|
|
16
23
|
### Predict the next three questions
|
|
17
24
|
|
|
18
25
|
Before Step 3, name the next three questions you would ask about what the ask must achieve, and predict the operator's answer to each. The test reads the ask's success criteria, never the plan's open questions.
|
|
@@ -33,7 +40,15 @@ Also read `canon/DESIGN.md` when the feature touches code or UI, for visual inte
|
|
|
33
40
|
|
|
34
41
|
Coding standards live in `.claude/rules/`. Claude Code loads them automatically, and path-scoped rules apply to the files they match.
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
### Read the domain's context entry
|
|
44
|
+
|
|
45
|
+
Onboard to each domain the feature touches before reading its code, through its context entry. Read `${CLAUDE_SKILL_DIR}/references/onboarding.md` for the lookup.
|
|
46
|
+
|
|
47
|
+
## Step 2: run the surface, then scan relevant source files
|
|
48
|
+
|
|
49
|
+
When the feature changes a verb, a route, or a rendered surface that already exists, run it once before reading its code and record what it showed. Read `${CLAUDE_SKILL_DIR}/references/onboarding.md` for the safe form per surface kind, the rules that keep the run from writing, and the not-run record.
|
|
50
|
+
|
|
51
|
+
### Read the code
|
|
37
52
|
|
|
38
53
|
Read the source files directly relevant to the feature, never whole directories speculatively. Where a folder carries an `index.md`, read it first and load only the files it points at.
|
|
39
54
|
|
|
@@ -59,6 +74,7 @@ The section list, what each section holds, and the suggested-and-answer contract
|
|
|
59
74
|
|
|
60
75
|
What this skill adds on top of the standard:
|
|
61
76
|
|
|
77
|
+
- Record each command Step 2 ran and what it showed, or the not-run reason, under `## Current behavior`, and omit the section when nothing ran
|
|
62
78
|
- Reframe a vague ask as success criteria before `## Files to touch`, each an observable result and its check, which becomes one `## Verification` bullet. "Make it faster" names none.
|
|
63
79
|
- Confirm a concrete project or use case drives the feature, and lift patterns from it where precedent exists. A feature with no named user is a guess.
|
|
64
80
|
- Prefer one layout that serves both a new and a grown project over a dual-mode toggle or a migration shim. Two modes double what every later change has to hold.
|
|
@@ -163,6 +179,8 @@ Pick the `Next:` line from the roster check `${CLAUDE_SKILL_DIR}/../task-board/S
|
|
|
163
179
|
| **Not found**, and this session's name starts with `worker-` or `planner-` | `Hand <task> to a worker`, naming no session, since none is live and the operator dispatches by hand |
|
|
164
180
|
| **Not found otherwise**, or the read fails | `/session-worktree` |
|
|
165
181
|
|
|
182
|
+
Three rules apply to the `Next:` choice:
|
|
183
|
+
|
|
166
184
|
- With a live orchestrator and no planner role held, send the plan path to it through `canon:session-relay`, resolved from its `sessionId`
|
|
167
185
|
- A session holding `canon:role-planner` already owes that announcement through its own channel, so it sends none
|
|
168
186
|
- Say which row fired in one clause, since a line with no stated reason is one the next reader re-derives.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Onboarding to a domain
|
|
3
|
+
description: The context lookup, the safe run form per surface kind, and the not-run record a planner takes before reading code
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Onboarding to a domain
|
|
7
|
+
|
|
8
|
+
Applies to the first two reads of `plan-feature` Step 1 and Step 2, taken ahead of the source. They go cheapest first, being the context entry, then one run of the existing thing, then the code. A plan starting from the source alone inherits whatever the running code gets wrong.
|
|
9
|
+
|
|
10
|
+
## Read the context entry
|
|
11
|
+
|
|
12
|
+
- Run `canon indexes list --json canon/context` and read the entries whose title or description matches the domain, rather than walking the folder
|
|
13
|
+
- Report none and continue to the run when the project has no `canon/context/` folder or no entry matches
|
|
14
|
+
- Treat an entry as a claim about the code, to be confirmed by the run
|
|
15
|
+
|
|
16
|
+
## Run the existing thing once
|
|
17
|
+
|
|
18
|
+
When the feature changes a verb, a route, or a rendered surface that already exists, run it once in a form that writes nothing. Record the command and what it showed.
|
|
19
|
+
|
|
20
|
+
| Surface kind | Safe form |
|
|
21
|
+
| ---------------- | ---------------------------------------------------------------------------- |
|
|
22
|
+
| CLI verb | its read verb, or the `--check` or `--dry-run` form, with `--help` for flags |
|
|
23
|
+
| Route or API | one read request against a running instance |
|
|
24
|
+
| Rendered surface | a capture against a running preview |
|
|
25
|
+
| Anything else | the project's own read command, or a sandbox scenario |
|
|
26
|
+
|
|
27
|
+
Three rules hold across every kind:
|
|
28
|
+
|
|
29
|
+
- Write nothing into the planned tree beyond the plan, so never run a form that writes there. The exceptions are the scratch and outside-repository writes below.
|
|
30
|
+
- Send a verb with no read form to a sandbox scenario or a temporary copy, and name which
|
|
31
|
+
- Skip the step for a feature touching nothing that runs, such as prose or a config seed
|
|
32
|
+
|
|
33
|
+
## Place the run and its output
|
|
34
|
+
|
|
35
|
+
A checkout is often shared with sessions building other branches, so where a run happens matters as much as what it runs.
|
|
36
|
+
|
|
37
|
+
- Keep a read-only run in the checkout and never switch its branch, since a switch changes the files under every other session reading it
|
|
38
|
+
- Serve a preview on a free port only when it writes nothing, and run one that builds from a temporary copy, since a build leaves caches and output under the checkout
|
|
39
|
+
- Send a file made only to look at, such as a capture or a dump, to a scratch topic slug under the scratch rule, which owns the path and the reserved slugs
|
|
40
|
+
- Put an own-project fixture or headless session outside the repository, since a tool that walks up to a project root measures the enclosing repository
|
|
41
|
+
- Keep the plan's own text as the record of what a run showed, since scratch is gitignored and no later session reads it
|
|
42
|
+
|
|
43
|
+
### Name the binary a run measured
|
|
44
|
+
|
|
45
|
+
A run against the toolkit itself can reach the installed binary or the checkout's own build, and the two answer differently once the branch has moved. State which one ran, with its version or path, beside the command in `## Current behavior`.
|
|
46
|
+
|
|
47
|
+
## Record a run that did not happen
|
|
48
|
+
|
|
49
|
+
Write the surface as not run with the reason, such as a broken build, a preview that will not start, or a verb with no read form that no sandbox scenario or temporary copy can reach. A skipped run with no record reads the same as one nobody considered.
|
|
50
|
+
|
|
51
|
+
Step 3 writes each run, or its not-run reason, into `## Current behavior`.
|
|
@@ -72,6 +72,7 @@ The document opens with `# Feature: <short title>` and one paragraph stating wha
|
|
|
72
72
|
| Section | Holds | Required |
|
|
73
73
|
| ---------------------- | --------------------------------------------------------------------------- | ------------------------------------------------- |
|
|
74
74
|
| `## Summary` | three to five one-line bullets: the goal, the deliverables, the trade-off | Always |
|
|
75
|
+
| `## Current behavior` | each command run against the thing being changed and what it showed | When the change touches something that runs |
|
|
75
76
|
| `## Constraints` | durable rules the work must respect | When supplied |
|
|
76
77
|
| `## Files to touch` | each file with a one-line reason | Always |
|
|
77
78
|
| `## Design references` | the tracked design folders the change builds against, each with its surface | When Files to touch names a rendered-surface file |
|
|
@@ -81,6 +82,10 @@ The document opens with `# Feature: <short title>` and one paragraph stating wha
|
|
|
81
82
|
| `## Questions` | numbered open decisions, each with a suggestion and an answer slot | Always |
|
|
82
83
|
| `## Sources` | the outside sources a decision rests on, each with its quoted passage | When a decision rests on an outside source |
|
|
83
84
|
|
|
85
|
+
### Writing a section
|
|
86
|
+
|
|
87
|
+
Four rules govern how a section is written:
|
|
88
|
+
|
|
84
89
|
- Write each section as the H2 the table gives, so a reader scans the plan by its outline
|
|
85
90
|
- A section written as a bold label, the spelling before this one, is still that section to every parser. Leave an existing plan's spelling alone.
|
|
86
91
|
- Write `None identified.` under a required section with nothing to report rather than dropping the marker. A dropped section and an unconsidered one read identically.
|
|
@@ -124,6 +129,15 @@ State every count and every claim about the tree as measured during the pass tha
|
|
|
124
129
|
|
|
125
130
|
Prefer a short plan over a padded one. A section filled to look thorough costs the reader the same attention as one that matters.
|
|
126
131
|
|
|
132
|
+
### Current behavior
|
|
133
|
+
|
|
134
|
+
A plan changing a verb, a route, or a rendered surface starts from what that thing does today, so the section records the run the planner made and not a reading of the source.
|
|
135
|
+
|
|
136
|
+
- Write one bullet per run, leading with the command or request in backticks and ending on what it showed
|
|
137
|
+
- Run only a read form, per the safe forms in `onboarding.md`, since a planner writes its plan and nothing else
|
|
138
|
+
- Record a run that could not happen as not run with the reason. Never leave it out silently.
|
|
139
|
+
- Leave the section out of a plan touching nothing that runs, such as prose or a config seed
|
|
140
|
+
|
|
127
141
|
### Constraints
|
|
128
142
|
|
|
129
143
|
Work in flight reaches a plan as a hold or as a shared path. A hold leaves a surface alone and says which of two acts it forbids, rather than leaving the executing session to guess. Neither act is forbidden over a shared path.
|
|
@@ -257,6 +271,10 @@ Each H3 below shows where a section groups once it passes 5 bullets. A section o
|
|
|
257
271
|
- <one-line bullet covering the main deliverables>
|
|
258
272
|
- <one-line bullet covering the key decision or trade-off>
|
|
259
273
|
|
|
274
|
+
## Current behavior
|
|
275
|
+
|
|
276
|
+
- `<command or request>`: <what it showed, or not run and why>
|
|
277
|
+
|
|
260
278
|
## Constraints
|
|
261
279
|
|
|
262
280
|
Measured against `<commit>` on <YYYY-MM-DD>.
|
|
@@ -98,7 +98,7 @@ Read these in parallel from the project root, skipping any that do not exist:
|
|
|
98
98
|
- `canon/REQUIREMENTS.md`: scope and non-goals
|
|
99
99
|
- `.canon/tasks/index.md`: what is already tracked, and what a prior track concluded. Open a task file only when its entry looks related.
|
|
100
100
|
|
|
101
|
-
Then read only what a live question needs, never whole directories speculatively. Where a folder carries an `index.md`, read it first and load only the files it points at.
|
|
101
|
+
Then read only what a live question needs, never whole directories speculatively. Where a folder carries an `index.md`, read it first and load only the files it points at. For each domain the topic touches, read its context entry ahead of measuring, through the lookup in `${CLAUDE_SKILL_DIR}/../plan-feature/references/onboarding.md`.
|
|
102
102
|
|
|
103
103
|
Do not dispatch subagents. A groundwork track is a conversation, and fanning out loses the reasoning that makes the folder worth keeping. A search too large to run inline is a finding that the question is too broad.
|
|
104
104
|
|
|
@@ -7,15 +7,15 @@ description: Why a brain dump gets a filed inventory rather than ten plans, and
|
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
10
|
-
A brain dump reaches a session with nowhere to put it. One plan per concern turns forty findings into ten plans before anything is measured, and what gets filed instead is a list of opinions, because nothing forces a count against the tree.
|
|
10
|
+
A brain dump reaches a session with nowhere to put it. One plan per concern turns forty findings into ten plans before anything is measured, and what gets filed instead is a list of opinions, because nothing forces a count against the tree. A defect confirmed from source alone reads the same as one that was run.
|
|
11
11
|
|
|
12
12
|
An empty operator slot reads as consent under a blank-means-accept contract, which ships changes nobody approved. A report naming only a path hides what moved. A question filed without a pick comes back unresolved, and a pass with no write scope starts fixing what it files.
|
|
13
13
|
|
|
14
14
|
## Must
|
|
15
15
|
|
|
16
16
|
- Route each item on whether the repository can answer it today, sending experiments to `plan-groundwork` and decided work to `plan-feature`
|
|
17
|
-
- Measure every problem line against the tree,
|
|
18
|
-
-
|
|
17
|
+
- Measure every problem line against the tree, running a defect's one-command repro read-only or marking it not reproduced here
|
|
18
|
+
- Close every item with a verdict and a suggested pick on each question, and treat an empty operator slot as unread
|
|
19
19
|
- Reserve the index number, carry the domain in every other filename, and number a new folder past the highest ordinal across intake and groundwork
|
|
20
20
|
- Confine writes to the intake folder and name the heading and the act beside every path written
|
|
21
21
|
|
|
@@ -63,10 +63,14 @@ Read these in parallel from the project root, skipping any that do not exist:
|
|
|
63
63
|
|
|
64
64
|
Then read only what a live item needs, never whole directories speculatively. Where a folder carries an `index.md`, read it first and load only the files it points at.
|
|
65
65
|
|
|
66
|
+
For each domain an item touches, read its context entry through the lookup in `${CLAUDE_SKILL_DIR}/../plan-feature/references/onboarding.md`, since the entry records the traps a grep will not show.
|
|
67
|
+
|
|
66
68
|
## Step 3: measure against the tree
|
|
67
69
|
|
|
68
70
|
Grep for each construct an item names and count the sites. Every problem line carries a number or a file path taken during this pass.
|
|
69
71
|
|
|
72
|
+
When an item reports a defect with a one-command repro, run it in a read-only form and say on the `Problem:` line what it showed, or that it was not reproduced here. Read `${CLAUDE_SKILL_DIR}/references/intake.md` for where one command ends and groundwork begins.
|
|
73
|
+
|
|
70
74
|
- Never carry a figure from an earlier session, a summary, or another document. The tree states the size of a complaint, and that is what separates an inventory from opinions.
|
|
71
75
|
- Confirm any work an item sequences behind is still open, so no item leads with something already shipped
|
|
72
76
|
- Name the commit the pass measured against in the overview body, since that is the half a later reader can check
|
|
@@ -19,6 +19,7 @@ The folder is gitignored. Where a records remote is configured, `canon records p
|
|
|
19
19
|
- [Files](#files)
|
|
20
20
|
- [Frontmatter and dating](#frontmatter-and-dating)
|
|
21
21
|
- [00-overview.md](#00-overviewmd) <!-- canon-allow-reference: a heading anchor, not a pull request number -->
|
|
22
|
+
- [Repro versus groundwork](#repro-versus-groundwork)
|
|
22
23
|
- [Item format](#item-format)
|
|
23
24
|
- [The answer contract](#the-answer-contract)
|
|
24
25
|
- [Retrieval](#retrieval)
|
|
@@ -99,6 +100,15 @@ The index carries no answer slot. One question in two answerable places has no r
|
|
|
99
100
|
|
|
100
101
|
Where an item touches a task already on the board, say so in the index rather than only inside the item. A reader deciding what to promote reads the index first.
|
|
101
102
|
|
|
103
|
+
## Repro versus groundwork
|
|
104
|
+
|
|
105
|
+
An item whose claim is a defect may carry one run of its repro, and the run is where intake's measuring stops. A repro that needs more is groundwork's.
|
|
106
|
+
|
|
107
|
+
- Run one command in a form that writes nothing, per `${CLAUDE_SKILL_DIR}/../plan-feature/references/onboarding.md`, and put what it showed on `Problem:`
|
|
108
|
+
- Mark the item `not reproduced here` on the same line when the repro needs a fixture project, repeated runs, a write, or another project's paths
|
|
109
|
+
- Send the marked item to `plan-groundwork` only when its answer decides a plan, since a claim read from code alone is a reported defect and not a confirmed one
|
|
110
|
+
- Never adapt a repro silently, because a changed command measures something the reporter did not
|
|
111
|
+
|
|
102
112
|
## Item format
|
|
103
113
|
|
|
104
114
|
```markdown
|
|
@@ -82,7 +82,7 @@ This skill owns the reply, so do not reimplement the followup flow here.
|
|
|
82
82
|
|
|
83
83
|
- `git-followup` syncs the body and title on every invocation, `reply-owned` included, so the merge record reflects this pass. The reply still maps fixes to findings in the review's own thread.
|
|
84
84
|
- A rebase in step 5 rewrote the branch, so the push is a force-push `git-followup` resolves from the tracking branch. Worker branches are single-owner, which makes that safe.
|
|
85
|
-
- `git-followup`
|
|
85
|
+
- `git-followup` runs on a clean tree too, since the rebased commits are ahead of the tracking branch. A pass of conscious-accepts after a rebase pushes through it and syncs the body like any other.
|
|
86
86
|
|
|
87
87
|
Once the fixes are commits, re-run step 5's staleness test against the new head. A conflict appearing only now is one the fixes introduced against lines `main` moved, so rebase again under `${CLAUDE_SKILL_DIR}/references/rebase-conflicts.md` and force-push.
|
|
88
88
|
|
|
@@ -90,13 +90,15 @@ Once the fixes are commits, re-run step 5's staleness test against the new head.
|
|
|
90
90
|
|
|
91
91
|
Write a summary reply to `.canon/tmp/pr/reply/reply-<number>.md`, keyed on the PR number so two sessions addressing different pull requests never overwrite each other. Load `write-human` for voice, follow `${CLAUDE_SKILL_DIR}/../markdown-craft/references/markdown.md`, and keep each mapping to one line.
|
|
92
92
|
|
|
93
|
-
| Part | Content
|
|
94
|
-
| -------- |
|
|
95
|
-
| Heading | `## Review response`, distinct from human threads and subordinate to the review's own `## Review`
|
|
96
|
-
| Summary | One sentence
|
|
97
|
-
| Findings | One line per finding under 200 characters, naming its outcome and the commit that carries it, in the shape below
|
|
98
|
-
| Docs | Any `.claude/` docs refreshed as a result of the fixes
|
|
99
|
-
| Close | `🤖 Addressed by Claude Code` on its own line, so the reply reads as a machine pass rather than a human sign-off
|
|
93
|
+
| Part | Content |
|
|
94
|
+
| -------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
95
|
+
| Heading | `## Review response`, distinct from human threads and subordinate to the review's own `## Review` |
|
|
96
|
+
| Summary | One sentence, plus the rebase note below |
|
|
97
|
+
| Findings | One line per finding under 200 characters, naming its outcome and the commit that carries it, in the shape below |
|
|
98
|
+
| Docs | Any `.claude/` docs refreshed as a result of the fixes |
|
|
99
|
+
| Close | `🤖 Addressed by Claude Code` on its own line, so the reply reads as a machine pass rather than a human sign-off |
|
|
100
|
+
|
|
101
|
+
After a step 5 rebase, the summary says so and names the files resolved by hand and those the regen rebuilt, since the next review is a full pass.
|
|
100
102
|
|
|
101
103
|
```markdown
|
|
102
104
|
- **<severity>**, `<file>` line <n>: fixed in `<sha>`. <What now holds, in one sentence.>
|
|
@@ -87,15 +87,13 @@ Three scope checks follow the walk:
|
|
|
87
87
|
|
|
88
88
|
## Excuses and rebuttals
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
| The description says it is faster | A claimed speedup with no measurement, or one run each side, is asserted. Ask for runs that beat the noise. |
|
|
98
|
-
| The change only touches styles, so the screenshots can wait | A stylesheet diff says what changed and only the image says what a user sees. Open them, or say none exist. |
|
|
90
|
+
- **The tests pass, so the change works.** Read what the diff did to the tests first. A test skipped, deleted, or stripped of its assertions passes by proving nothing.
|
|
91
|
+
- **The hunk reads clean, so the review is done.** The hunk is where the author looked. A consumer, a doc a section away, and the commit that added a removed guard are not in it.
|
|
92
|
+
- **The checker passes on the branch.** Read the checker's config and the inline suppressions in the diff. A path excluded from the run passes by not being read.
|
|
93
|
+
- **It was split into smaller functions, so it is simpler.** Count the concepts a reader holds before and after. Moved complexity reads as simpler only to the person who moved it.
|
|
94
|
+
- **Nothing calls it, so deleting it is safe.** Read why it was added. Code nobody calls today can still be guarding a path nobody exercised in the change.
|
|
95
|
+
- **The description says it is faster.** A claimed speedup with no measurement, or one run each side, is asserted. Ask for runs that beat the noise.
|
|
96
|
+
- **The change only touches styles, so the screenshots can wait.** A stylesheet diff says what changed and only the image says what a user sees. Open them, or say none exist.
|
|
99
97
|
|
|
100
98
|
## Red flags
|
|
101
99
|
|
|
@@ -13,14 +13,16 @@ The `addyosmani/agent-skills` citations below all pin commit `addyosmani/agent-s
|
|
|
13
13
|
|
|
14
14
|
### Design and scope
|
|
15
15
|
|
|
16
|
-
**The design procedure.** The nine ordered steps under the design axis draw on four sources, each restated without a language, a framework, or a transport so the walk holds on any stack.
|
|
16
|
+
**The design procedure.** The nine ordered steps under the design axis draw on four sources, each restated without a language, a framework, or a transport so the walk holds on any stack. Each source below carries the step it backs.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
- Ousterhout's deep modules, information hiding, and pass-through methods, [A Philosophy of Software Design](https://web.stanford.edu/~ouster/cgi-bin/book.php)
|
|
19
|
+
- Backs asking what each unit hides, and flagging a unit that passes its arguments straight through
|
|
20
|
+
- Parnas's criterion that a boundary hides a decision likely to change, [On the Criteria To Be Used in Decomposing Systems into Modules](https://dl.acm.org/doi/10.1145/361598.361623)
|
|
21
|
+
- Backs the opening step, naming the next likely change and counting what it touches
|
|
22
|
+
- Beck's design rules as Fowler records them, especially no duplication and fewest elements, [BeckDesignRules](https://martinfowler.com/bliki/BeckDesignRules.html)
|
|
23
|
+
- Backs the one-place step, and matching each pattern to a problem the code has today
|
|
24
|
+
- Google's reviewer guide on design, complexity, and over-engineering, [What to look for in a code review](https://google.github.io/eng-practices/review/reviewer/looking-for.html)
|
|
25
|
+
- Backs the frame for the whole walk, and the reason a speculative abstraction is a finding
|
|
24
26
|
|
|
25
27
|
The procedure stays in the body rather than a reference, since every review reads the design axis and a reference would cost a read on every run.
|
|
26
28
|
|
|
@@ -55,7 +57,7 @@ From `skills/security-and-hardening/SKILL.md`, the threat model first and the de
|
|
|
55
57
|
|
|
56
58
|
### Closing sections
|
|
57
59
|
|
|
58
|
-
The excuses, red flags, and closing checklist follow the shape every practice skill in this toolkit carries, from [`docs/skill-anatomy.md`](https://github.com/addyosmani/agent-skills/blob/2686b620fc1fed2e8f60c704839c766b8594c6b6/docs/skill-anatomy.md). Each excuse
|
|
60
|
+
The excuses, red flags, and closing checklist follow the shape every practice skill in this toolkit carries, from [`docs/skill-anatomy.md`](https://github.com/addyosmani/agent-skills/blob/2686b620fc1fed2e8f60c704839c766b8594c6b6/docs/skill-anatomy.md). Each excuse rebuts a reason a review stops at the hunk, such as passing tests against a test the diff skipped.
|
|
59
61
|
|
|
60
62
|
## Declined
|
|
61
63
|
|
|
@@ -33,6 +33,8 @@ Both headings anchor as a section distinct from human threads. The full set is e
|
|
|
33
33
|
| Evidence | `## Evidence` | `canon pr evidence`, through `pr-evidence` from `git-pr` and `git-followup` |
|
|
34
34
|
| UI | `## UI review`, `## UI review closed` | `review-ui`, posted as a review beside this one and read by nothing here |
|
|
35
35
|
|
|
36
|
+
Three notes qualify the table.
|
|
37
|
+
|
|
36
38
|
- The reply headings in order answer a finding, report a stale branch resolved without one, and carry a finding a worker produced after a close-out
|
|
37
39
|
- `## Evidence` answers no comment on the thread, so the poll leaves it out of the unclassified count rather than reading it as a reply owing a re-review
|
|
38
40
|
- A comment under any other heading reaches the poll as unclassified rather than as silence, so an invented ninth heading is a gap the next run reports
|
|
@@ -13,12 +13,14 @@ Test what `## Key changes` claims against the diff it describes, with `canon pr
|
|
|
13
13
|
|
|
14
14
|
Branch on the record rather than on the exit code, which a shell function wrapping `canon` can flatten to zero. Each field the record carries takes its own reading.
|
|
15
15
|
|
|
16
|
-
| Field | Reading
|
|
17
|
-
| ------------ |
|
|
18
|
-
| `unmet` | a `should-fix` finding under the `**PR body**` block the stale box takes, one per path
|
|
19
|
-
| `unnamed` | read for yourself and raise nothing off the count
|
|
20
|
-
| `unresolved` | reported nowhere, since it was judged in neither direction
|
|
21
|
-
| `incidental` | reported nowhere, since it owes no bullet
|
|
16
|
+
| Field | Reading |
|
|
17
|
+
| ------------ | -------------------------------------------------------------------------------------- |
|
|
18
|
+
| `unmet` | a `should-fix` finding under the `**PR body**` block the stale box takes, one per path |
|
|
19
|
+
| `unnamed` | read for yourself and raise nothing off the count |
|
|
20
|
+
| `unresolved` | reported nowhere, since it was judged in neither direction |
|
|
21
|
+
| `incidental` | reported nowhere, since it owes no bullet |
|
|
22
|
+
|
|
23
|
+
Each `unmet` finding quotes the `preview` bullet and the `head`.
|
|
22
24
|
|
|
23
25
|
### Before filing an unmet path
|
|
24
26
|
|
|
@@ -45,14 +45,16 @@ A taste box takes the shot twice, once per theme, naming the theme in the file a
|
|
|
45
45
|
|
|
46
46
|
## The four verdicts
|
|
47
47
|
|
|
48
|
-
Each box takes exactly one.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
48
|
+
Each box takes exactly one, keyed here by the state it answers.
|
|
49
|
+
|
|
50
|
+
- **pass or fail, read.** The result is a fact the page reports.
|
|
51
|
+
- The evidence is the value read, quoted, such as `scrollWidth 436 against clientWidth 320`.
|
|
52
|
+
- **pass or fail, frame.** The result has a stated criterion only an image settles.
|
|
53
|
+
- The evidence is the matching evidence stem or the pushed frame's link, inline under the failed box's heading, and what the frame shows, in words.
|
|
54
|
+
- **needs eyes.** The box ends in `(taste)`.
|
|
55
|
+
- The evidence is the dark and the light shot as a pair, each the matching evidence stem or a pushed frame's link, and what the frames showed, with nothing about whether it looks right.
|
|
56
|
+
- **not driven.** The state could not be reached.
|
|
57
|
+
- The evidence is the reason, such as an unreachable address, a `(local only)` box on a hosted preview, or a target the snapshot does not hold.
|
|
56
58
|
|
|
57
59
|
A fail names what was expected beside what was read. A not driven never reads as a fail, since it says the pass could not look rather than that the page is wrong. Its reason says whether the cause sits on the page or off it, since only a cause on the page opens the heading Step 7 picks.
|
|
58
60
|
|
|
@@ -9,10 +9,12 @@ Re-test every parked row as orchestrator. A blocker cell is a measurement taken
|
|
|
9
9
|
|
|
10
10
|
Two triggers start this pass, and they differ in scope rather than in procedure.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
- **Sweep.** `orchestrator-sweep.md` sends the rows `canon tasks validate` listed untested.
|
|
13
|
+
- Scope: those rows alone, since a merge changes the tree under every parked row and the validator already re-took the two kinds it settles
|
|
14
|
+
- **Idle.** The session has nothing merged, workers building, and no pull request awaiting a first pass.
|
|
15
|
+
- Scope: every parked row, since no event narrowed them, plus every `backlog.md` row, which carries no blocker cell for the validator to name
|
|
16
|
+
|
|
17
|
+
Three points hold for both triggers.
|
|
16
18
|
|
|
17
19
|
- Neither trigger is a scheduler. `orchestrator-poll.md` owns the one recurring trigger, and a second loop firing into a static board is the always-on failure it warns about.
|
|
18
20
|
- The sweep asks which parked row to promote next, taking the blocker cell as read, and this pass asks whether the cell is still true
|
|
@@ -25,10 +25,14 @@ The third trigger reaches a window the first two cannot. A session with three wo
|
|
|
25
25
|
- Run `task-complete` to archive one the hook left in place
|
|
26
26
|
- A task whose outcomes are standing policy never closes, so hand it to a worker to encode the policy where it is enforced, then cut the outcomes with the reason and archive once that branch merges
|
|
27
27
|
- Encoding it from this session would write a tracked file, which `## Boundaries` in the skill body forbids
|
|
28
|
-
- An outcome marked `- [ ] Operator check: <outcome>` never blocks the archive
|
|
29
|
-
-
|
|
28
|
+
- An outcome marked `- [ ] Operator check: <outcome>` never blocks the archive, so leave it unticked
|
|
29
|
+
- The hook prints no record, so read the archived file's `Operator check:` lines into the report's `Operator checks:` line
|
|
30
|
+
- A merged task whose only open outcomes another repository owes, or that an operator owns and nobody marked, never archives, since `canon tasks archive` refuses `open-outcomes`
|
|
31
|
+
- Strike each one on the task file as `- ~~<outcome>~~ <reason>` with the reason on the same line, then archive. The task files are gitignored scratch, so this session may edit them.
|
|
30
32
|
- Strike only an outcome the operator or another repository owes. An open outcome this repository owes stays on the board, and the task stays with it.
|
|
31
|
-
- Send a struck outcome that another repository owes to that repository's orchestrator through `session-relay`, which resolves the address
|
|
33
|
+
- Send a struck outcome that another repository owes to that repository's orchestrator through `session-relay`, which resolves the address
|
|
34
|
+
- Let the receiver file it with `task-board` on its own board, since `task-board` here would file it on this board
|
|
35
|
+
- Name it in the report for the operator when no such session is live
|
|
32
36
|
- List every struck outcome in the report's `Struck:` line, so the work is carried by a named owner rather than lost to the strike
|
|
33
37
|
4. Read `.canon/tasks/priority.md` and count the `## Up next` rows whose `Waiting on` has cleared, since a blocked row is no reserve. `## Run now` is what is running, so keep one in reserve beyond it.
|
|
34
38
|
5. Promote from the top of `## Needs a plan`, where the last sweep recorded what to plan next.
|
|
@@ -69,6 +73,8 @@ Write `.canon/tasks/priority.md` through the `canon tasks` verbs alone, each rea
|
|
|
69
73
|
| A row up or down inside its group | `canon tasks move <stem> --before <stem>` |
|
|
70
74
|
| What a row waits on, or why it sits there | `canon tasks block <stem> "<reason>"` |
|
|
71
75
|
|
|
76
|
+
The points below govern writing the board through those verbs.
|
|
77
|
+
|
|
72
78
|
- `place` removes the task's backlog line in the same call, so a row never sits on both surfaces or on neither
|
|
73
79
|
- Demoting a row to `backlog.md` has no verb yet. Add the backlog line first, then delete the row with the file-editing tool, which errors on a non-match.
|
|
74
80
|
- Put the reason a row sits where it does in its Waiting on cell through `block`, since a row promoted with the cell left alone carries an order the next sweep cannot check
|
|
@@ -19,11 +19,11 @@ This body states the role, the reads, the boundaries, and the channel, and start
|
|
|
19
19
|
|
|
20
20
|
The session writes its comment and nothing tracked. Each kind of reviewer writes only these:
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
- **Code:** the comment through `review-pr` and the body file it names under `.canon/tmp/pr/review/`
|
|
23
|
+
- **UI:** the comment `review-ui` posts, its body file, and the browser's snapshots and frames under `.canon/tmp/pr/review-ui/`, plus `canon pr tick` on boxes it passed
|
|
24
|
+
- **Either:** the draft flag, through `canon pr lift` and no other way
|
|
25
|
+
|
|
26
|
+
The rules below close off everything else.
|
|
27
27
|
|
|
28
28
|
- A tracked file, a branch, a worktree, a board file, and a commit all sit outside what this session may touch
|
|
29
29
|
- Never enter a worktree or check the branch out. The pass reads a change, and a checkout is the first step toward editing it.
|