@erclx/canon 5.44.0 → 5.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/canon-cli/SKILL.md +0 -1
- package/claude/skills/design-taste/REQUIREMENT.md +2 -2
- package/claude/skills/pick-by-eye/REQUIREMENT.md +17 -67
- package/claude/skills/role-orchestrator/REQUIREMENT.md +16 -99
- package/claude/skills/role-planner/REQUIREMENT.md +15 -73
- package/claude/skills/role-worker/REQUIREMENT.md +13 -41
- package/claude/skills/target-setup/SKILL.md +2 -2
- package/claude/skills/target-setup/references/detect.md +0 -1
- package/claude/skills/target-setup/references/verify.md +2 -2
- package/claude/skills/teach-workspace/REQUIREMENT.md +1 -1
- package/claude/skills/teach-workspace/references/promotion.md +5 -5
- package/docs/agents/install-and-sync.md +2 -2
- package/docs/agents/output-shape.md +1 -2
- package/docs/target/migrations.md +18 -0
- package/docs/target/projects.md +1 -2
- package/docs/target/scenarios.md +4 -1
- package/docs/workflow/skill-map-on-request.md +1 -1
- package/governance/detect.toml +4 -0
- package/governance/ledger/lang/go.md +61 -0
- package/governance/ledger/lang/php.md +50 -0
- package/governance/ledger/lang/python.md +68 -0
- package/governance/ledger/lang/typescript.md +64 -0
- package/governance/ledger/lib/database.md +65 -0
- package/governance/ledger/lib/e2e-reliability.md +57 -0
- package/governance/ledger/lib/pydantic.md +61 -0
- package/governance/ledger/lib/security-server.md +62 -0
- package/governance/ledger/lib/security-web.md +51 -0
- package/governance/ledger/lib/tanstack-query.md +57 -0
- package/governance/ledger/lib/test-scope.md +43 -0
- package/governance/ledger/lib/testing-go.md +57 -0
- package/governance/ledger/lib/testing-php.md +51 -0
- package/governance/ledger/lib/testing-py.md +67 -0
- package/governance/ledger/lib/testing-ts.md +63 -0
- package/governance/ledger/lib/zod.md +47 -0
- package/governance/ledger/tooling/ci-workflow.md +33 -0
- package/governance/ledger/tooling/code-comments.md +48 -0
- package/governance/ledger/tooling/config-comments.md +27 -0
- package/governance/ledger/tooling/dependencies.md +38 -0
- package/governance/ledger/ui/a11y.md +55 -0
- package/governance/ledger/ui/copy.md +49 -0
- package/governance/ledger/ui/design-reference.md +42 -0
- package/governance/ledger/ui/design-taste.md +19 -0
- package/governance/ledger/ui/forms.md +71 -0
- package/governance/ledger/ui/interface-casing.md +47 -0
- package/governance/ledger/ui/keyboard.md +68 -0
- package/governance/ledger/ui/link-behavior.md +29 -0
- package/governance/ledger/ui/motion.md +33 -0
- package/governance/ledger/ui/surface-capture.md +69 -0
- package/governance/ledger/ui/ux-completeness.md +79 -0
- package/governance/rules/lang/go.md +7 -16
- package/governance/rules/lang/php.md +3 -3
- package/governance/rules/lang/python.md +9 -18
- package/governance/rules/lang/typescript.md +9 -19
- package/governance/rules/lib/database.md +5 -5
- package/governance/rules/lib/e2e-reliability.md +4 -6
- package/governance/rules/lib/pydantic.md +14 -16
- package/governance/rules/lib/security-server.md +4 -4
- package/governance/rules/lib/security-web.md +6 -10
- package/governance/rules/lib/tanstack-query.md +10 -12
- package/governance/rules/lib/test-scope.md +4 -4
- package/governance/rules/lib/testing-go.md +1 -2
- package/governance/rules/lib/testing-php.md +4 -5
- package/governance/rules/lib/testing-py.md +11 -19
- package/governance/rules/lib/testing-ts.md +7 -16
- package/governance/rules/lib/zod.md +6 -8
- package/governance/rules/tooling/code-comments.md +2 -4
- package/governance/rules/tooling/config-comments.md +1 -4
- package/governance/rules/tooling/dependencies.md +1 -1
- package/governance/rules/ui/a11y.md +16 -45
- package/governance/rules/ui/copy.md +6 -9
- package/governance/rules/ui/forms.md +13 -19
- package/governance/rules/ui/interface-casing.md +5 -7
- package/governance/rules/ui/keyboard.md +38 -0
- package/governance/rules/ui/link-behavior.md +3 -3
- package/governance/rules/ui/motion.md +3 -3
- package/governance/rules/ui/surface-capture.md +15 -27
- package/governance/rules/ui/ux-completeness.md +16 -39
- package/package.json +1 -1
- package/scripts/core/install-check.sh +1 -1
- package/src/cli/help.ts +0 -1
- package/src/cli.ts +0 -2
- package/src/commands/gov.ts +4 -0
- package/src/commands/init.ts +2 -2
- package/src/commands/tooling.ts +18 -5
- package/src/design/components.ts +1 -1
- package/src/gov/audit.ts +22 -2
- package/src/init/plan.ts +1 -8
- package/src/init/steps.ts +0 -8
- package/src/inventory/subjects.ts +1 -1
- package/src/markdown/scope.ts +4 -0
- package/src/migrate/scratch-evidence.ts +12 -4
- package/src/records/backup.ts +3 -3
- package/src/records/validate.ts +3 -3
- package/src/roots/record.ts +17 -8
- package/src/tooling/inject.ts +26 -7
- package/src/tooling/package.ts +32 -0
- package/src/tooling/read.ts +46 -3
- package/src/tooling/scan.ts +8 -2
- package/tooling/astro/reference.md +64 -93
- package/tooling/base/configs/.github/workflows/phase-label-gate.yml +1 -1
- package/tooling/base/configs/scripts/verify.ts +1 -1
- package/tooling/base/reference.md +1 -9
- package/tooling/base/seeds/canon/context/{ci.md → development/ci.md} +1 -1
- package/tooling/base/seeds/canon/context/development/index.md +11 -0
- package/tooling/base/seeds/canon/context/{development.md → development/setup.md} +8 -12
- package/tooling/base/seeds/canon/context/index.md +1 -2
- package/tooling/claude/manifest.toml +1 -5
- package/tooling/claude/reference.md +36 -59
- package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +2 -7
- package/tooling/claude/seeds/.claude/hooks/pr-create-log.sh +2 -7
- package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +3 -10
- package/tooling/claude/seeds/.claude/hooks/search-reminder.sh +2 -7
- package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +2 -4
- package/tooling/nextjs/reference.md +0 -6
- package/tooling/php/reference.md +0 -4
- package/tooling/web/configs/.github/workflows/verify.yml +28 -0
- package/tooling/web/configs/.oxlintrc.json +7 -0
- package/tooling/web/configs/e2e/capture-types.ts +35 -0
- package/tooling/web/configs/e2e/screenshot.ts +23 -72
- package/tooling/web/manifest.toml +1 -1
- package/tooling/web/reference.md +77 -124
- package/tooling/web/seeds/e2e/capture/cases.ts +47 -0
- package/src/commands/wiki.ts +0 -100
- package/src/wiki/init.ts +0 -85
package/README.md
CHANGED
|
@@ -165,7 +165,7 @@ git init
|
|
|
165
165
|
canon init
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
-
`canon init` installs base tooling configs, Claude seeds, and governance rules in one pass
|
|
168
|
+
`canon init` installs base tooling configs, Claude seeds, and governance rules in one pass.
|
|
169
169
|
|
|
170
170
|
- Governance defaults to the `base` stack, so a bare init lands the workflow and doc-authoring rules in `.claude/rules/`.
|
|
171
171
|
- Each rule names the skill it loads, so no corpus is copied into your project.
|
|
@@ -33,7 +33,6 @@ Consult to pick the `canon` verb for a job, and before running a verb that write
|
|
|
33
33
|
| Install or sync governance rules | `canon gov` |
|
|
34
34
|
| Sync a tooling stack's configs and seeds, or read its reference | `canon tooling` |
|
|
35
35
|
| Set up or sync the Claude workflow | `canon claude` |
|
|
36
|
-
| Scaffold a wiki | `canon wiki` |
|
|
37
36
|
| Regenerate the `index.md` files | `canon indexes` |
|
|
38
37
|
| Read a toolkit reference doc | `canon docs` |
|
|
39
38
|
|
|
@@ -27,7 +27,7 @@ A session handed either one unfiltered adopts a stack the project does not use,
|
|
|
27
27
|
- Enumerate the layers in settle order, so an instruction to name one has a catalog behind it
|
|
28
28
|
- State that a round varies one layer, and that a complaint is worked at the lowest layer it reaches rather than the cheapest one to change
|
|
29
29
|
- Carry grey-boxing as the operational form of the ordering rule, since removing the higher layers from view is what makes a lower one judgeable
|
|
30
|
-
- Cite the correctness floor rather than restating it. `copy`, `a11y`, `forms` and `ux-completeness` already carry accessibility, keyboard, forms, states and rendered copy on the rendered paths, and a second copy here drifts with nothing comparing the two.
|
|
30
|
+
- Cite the correctness floor rather than restating it. `copy`, `a11y`, `keyboard`, `forms` and `ux-completeness` already carry accessibility, keyboard, forms, states and rendered copy on the rendered paths, and a second copy here drifts with nothing comparing the two.
|
|
31
31
|
- Hold in the body what every design moment pays for, being the read, the layers, the ordering, grey-boxing and the locks, and defer everything a single moment needs.
|
|
32
32
|
- State what has to stay constant across a whole surface, since coherence is a property of the whole and each of those is broken one section at a time.
|
|
33
33
|
- Detect the mode before reading anything when a surface already exists, and name what cannot change silently, since a slug, a field name or an analytics event breaks something outside the surface.
|
|
@@ -66,7 +66,7 @@ A rule failing any of the four is recorded as considered and declined rather tha
|
|
|
66
66
|
|
|
67
67
|
## Out of scope
|
|
68
68
|
|
|
69
|
-
- Accessibility,
|
|
69
|
+
- Accessibility, ARIA and alt text, which `a11y` owns on every rendered path, and keyboard interaction, which `keyboard` owns
|
|
70
70
|
- State coverage, empty and loading treatment, destructive confirmation and truncation, which `ux-completeness` owns
|
|
71
71
|
- Validation timing, error placement and save blocking, which `forms` owns
|
|
72
72
|
- Rendered copy casing, button labels and error wording, which `copy` owns
|
|
@@ -7,80 +7,30 @@ description: Why a decision settled by looking needs its own surface, and where
|
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
10
|
-
Without this skill, a session facing a decision
|
|
10
|
+
Without this skill, a session facing a decision settled by looking describes the options in prose or ships one answer to a taste call. The operator never sees what they chose between. A drafted set varies several properties or the wrong layer, sits in the real surface, and mixes themes and widths, so no pick names what decided it.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
- Produces one answer for a decision that was taste, so the operator never sees what they were choosing between and the call is taken silently by whoever wrote the code.
|
|
14
|
-
- Reports that a candidate reads well without rendering it, so the claim rests on the markup having been written rather than on the page having been seen.
|
|
15
|
-
- Hands over one image per arm, which asks the operator to hold the differences in memory rather than showing them. The comparison is the artifact and a set of separate files is not one.
|
|
16
|
-
- Varies three properties at once across the arms, so the pick cannot say which difference decided it and the next iteration guesses.
|
|
17
|
-
- Writes the candidates into the real surface, so the losing arms have to be unpicked out of a tree the operator has not judged yet, and a variant left behind a flag becomes a second design nobody maintains.
|
|
18
|
-
- Stops the loop when the arms stop differing rather than when the operator says the pick is right, which ends the run on the session's own patience.
|
|
19
|
-
- Reads a driver record as a verdict and drops an arm on it. `canon drive` reports findings and never gates, so a run filtering the arms on a probe reading has made a claim the probe catalog has not earned.
|
|
20
|
-
- Reads a color without compositing its alpha, samples a round control at the corner of its bounding box, or confirms a panel's dimensions while it sits above the viewport. Each reads as a passing measurement about something no reader sees.
|
|
21
|
-
- Meets a machine with no browser binary and reports on the arms anyway, since nothing in the default flow separates a render that failed from one that was never attempted.
|
|
22
|
-
- Hand-writes a mockup of a surface a running app already serves, which drifts from what ships by a few pixels and a few words the moment the app's own markup or stylesheet moves on.
|
|
23
|
-
- Varies a property the decision is not about, which satisfies the one-property rule and produces a set differing in the layer a reader notices least. Five palettes over one identical page read as five skins of one design, and the operator rejected the whole set on sight.
|
|
24
|
-
- Renders each arm in whatever theme it happens to carry, so a set spanning both themes cannot be compared without the operator toggling every arm and holding the earlier ones in memory.
|
|
25
|
-
- Looks at a render to confirm it came out rather than to judge whether it is worth showing, which satisfies the rule against reporting an unseen result and still hands over weak work.
|
|
26
|
-
- Writes the run's renders to a scratch path outside the record that cites them, leaving the folder holding source markup and none of the images, so the judgment is unreachable to everyone except the session that made it.
|
|
27
|
-
- Narrows the page onto the picked arm in place on each iteration, so every earlier round is overwritten and a later pass cannot see what was already rejected.
|
|
28
|
-
- Names no layer at all, since the instruction to name one carries no catalog to name from and nothing reports the omission. Four consecutive rounds against one page each varied a property at the top layer while the defect sat two below it, and three of the four changed nothing the operator could see.
|
|
29
|
-
- Judges a lower layer through a finished higher one, so an operator asked about composition looks at the palette instead and answers about that.
|
|
30
|
-
- Hands over the combined page alone for a decision about layout, where every arm sits in a column while the media queries answer to the whole window, so no arm is ever seen at its own viewport and a fault that appears only narrower survives the pick.
|
|
31
|
-
- Rebuilds a navigation harness by hand on a run with several rounds, since each round writes its own folder and nothing reaches all of them from one address. Two design tracks hand-wrote the same page picker and theme toggle.
|
|
32
|
-
- Meets a session with no canvas server and drafts into a file instead, which leaves the operator a second surface to open and the run a second close to remember. The canvas is the one drafting surface, so a run without one starts it rather than falling back.
|
|
33
|
-
- Puts the pick question with no address in its output, after capturing the page and reading the image back. The operator then has to ask for a served page before they can look, so the question goes unanswered or gets answered blind.
|
|
34
|
-
- Sets the theme on an arm that persists its own and reads it back on load, so the control reports one theme while the arm renders the other and the set is compared across two.
|
|
12
|
+
The evidence fails as well. Arms get reported without being rendered or judged, a driver finding reads as a verdict, and the pick question arrives with no address to look at. Renders land in scratch, each round overwrites the last, and the losing arms vanish with the run's pages.
|
|
35
13
|
|
|
36
14
|
## Must
|
|
37
15
|
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
- Theme every arm off the attribute the canvas toggle sets on each frame, so one control sets the whole set and the comparison holds still while the operator reads it, and give no arm a script that reads a stored preference back on load over the toggle.
|
|
44
|
-
- Give each frame the width the arm is judged at, since a frame renders at its own layout width and answers how an arm behaves at a width where a column on a shared page could not.
|
|
45
|
-
- Judge each render against a stated bar before handing it over, name the weakest thing on the page, and fix it where that sentence would embarrass the work.
|
|
46
|
-
- Write each iteration to its own canvas page rather than narrowing the previous one in place, so every earlier round stays openable from the canvas page list.
|
|
47
|
-
- Write the run's renders inside the record that cites them wherever one exists, and reserve the scratch path for inputs that are re-runnable and cited by nothing.
|
|
48
|
-
- Render before reporting on any arm, and report a missing browser binary as a refusal naming the repair rather than describing an arm nobody has seen.
|
|
49
|
-
- Take the pick through the structured question surface, with the recommendation ranked first and marked, and every option carrying its cost. Read the canvas selection only to resolve an answer that points at it, and treat an empty or stale selection as no answer.
|
|
50
|
-
- Keep every write inside the run's own canvas pages until the pick is final.
|
|
51
|
-
- Apply the winning arm in one change.
|
|
52
|
-
- Capture every arm from the round the pick came from, whichever round that is, as an image named for its frame before deleting the run's pages, rather than discarding the losing arms with them.
|
|
53
|
-
- Delete only the canvas pages the run itself added, recorded as it adds them, and stop only a canvas server the run itself started.
|
|
54
|
-
- Resolve the archival capture's destination against the main worktree root, never against a linked worktree the run happens to be building in.
|
|
55
|
-
- Put the candidates on the canvas on every run, whatever the decision's layer, and emit the canvas link ahead of the first pick question, so the operator can open the page the question is about and a still is never the only address.
|
|
16
|
+
- Three to five arms, the shipping state among them, each carry an id, a label, and a cost, and vary only at a layer named from the `design-taste` catalog
|
|
17
|
+
- Each round is one canvas page of frames at their judged widths, themed by the canvas toggle and captured once as a composite, with the link ahead of the first pick question
|
|
18
|
+
- Every arm is rendered and judged against a stated bar before handover, and a missing browser or a canvas that will not start is reported as a refusal
|
|
19
|
+
- The pick comes through the structured question surface with the recommendation first and every option's cost, and the winner lands in one change
|
|
20
|
+
- Every round stays openable on its own page until the pick, and the picked round's arms are captured into the citing record at the main root before the run's pages go
|
|
56
21
|
|
|
57
22
|
## Must not
|
|
58
23
|
|
|
59
|
-
- Take the pick where two arms are
|
|
60
|
-
- Draft candidates for a decision the operator has not asked to make
|
|
61
|
-
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
|
|
65
|
-
## Guards
|
|
66
|
-
|
|
67
|
-
The refusal strings sit in the body, since the runtime loads that file and ignores this one. Two conditions stop a run: a request naming one answer and asking for it to be built, and a decision with no visible form for a render to show.
|
|
24
|
+
- Take the pick where two arms are defensible and the difference is taste
|
|
25
|
+
- Draft candidates for a decision the operator has not asked to make, or for a request that already names one answer
|
|
26
|
+
- Write into the real surface before the pick is final
|
|
27
|
+
- Restate the mechanics `canon canvas` and `canon drive` own, or read a drive finding as a gate over the arms
|
|
28
|
+
- Delete a canvas page or stop a server the run did not start
|
|
68
29
|
|
|
69
30
|
## Out of scope
|
|
70
31
|
|
|
71
|
-
-
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
-
|
|
76
|
-
- `canon canvas` owns the page, the frames, the selection, the address, and the render, and `canon drive` owns the probes. Both are invoked rather than reimplemented.
|
|
77
|
-
|
|
78
|
-
### What did not travel
|
|
79
|
-
|
|
80
|
-
This descends from a project-local skill whose interactive half was written against one repository. Three of its capabilities do not travel, and the two verbs above are what stands in their place:
|
|
81
|
-
|
|
82
|
-
- An arm switcher compiled into the project's own page, driven by a query parameter. A canvas page of frames replaces it, which puts the arms on the canvas rather than in the source and removes the call site a run had to remember to delete.
|
|
83
|
-
- A copy cycle keyed to canonical page text held in a second repository. No toolkit surface has that shape, so a project holding one owns the second edit and this skill states nothing about it.
|
|
84
|
-
- A walker that reads every control on every page and groups them by treatment. `canon drive` probes one page and reports findings, so a sweep across every surface of a site is out of reach here and a run needing one measures by hand.
|
|
85
|
-
|
|
86
|
-
The capture mechanics traveled with a change of owner rather than being lost. They sat in a project-local path-scoped rule that fired whether or not the skill ran, and `canon canvas capture` owns them here, which is why this file bars restating them rather than naming a rule to defer to.
|
|
32
|
+
- Planning the work once the answer is settled, which `plan-feature` owns
|
|
33
|
+
- Finding roughness by reading source, which `ux-audit` owns
|
|
34
|
+
- Measuring what a running interface costs to paint, which `ux-measure` owns
|
|
35
|
+
- Listing what to look at on a change already made, which `ui-checklist` owns
|
|
36
|
+
- Scripting a recording of something already built, which `script-screencast` owns
|
|
@@ -7,113 +7,30 @@ description: What the one warm control session owns, why it plans and dispatches
|
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
10
|
-
Without this skill, the session
|
|
10
|
+
Without this skill, the control session builds or merges, and the cross-feature picture goes with it. Plans go out unread against each other and a moved tree, the queue empties or fills with whatever is oldest, a parked row's blocker is never re-tested, and a second orchestrator writes a board neither can read.
|
|
11
11
|
|
|
12
|
-
The
|
|
13
|
-
|
|
14
|
-
Refilling on a merge and on a thinning ready list leaves the window between them unwatched. A wave mid-build has merged nothing and has moved no rows, so both conditions stay silent across the whole build and the wave finishes into an empty queue, which lands planning on the critical path directly after the stretch where it would have cost nothing.
|
|
15
|
-
|
|
16
|
-
Every one of those triggers looks forward, so a row already parked is measured once and re-tested never. A blocker cell is a claim about the tree that was true the day it was written, and a merge changes the tree under every parked row at once rather than under the rows naming it. A row therefore sits on a condition that stopped holding weeks earlier with nothing reporting the gap.
|
|
17
|
-
|
|
18
|
-
Re-measuring one goes wrong twice over, and both ways return a confident number rather than an error. A count read looser than its consumer defines the shape answers a question nobody asked, and a condition measured against the tree at hand reads as unreachable while it stays live in the corpus a shipped command runs against. Waiting is not evidence either, and a task conflicting with everything by construction gets re-measured every pass rather than split.
|
|
19
|
-
|
|
20
|
-
Writing those plans against the tree alone is the second half, since several branches are already changing the shape a plan describes. A plan carrying a bare path list rather than a constraint per in-flight track leaves the worker guessing which act each path forbids, which is the dangling citation the rule against bare paths already exists to prevent.
|
|
21
|
-
|
|
22
|
-
The session also writes surfaces it is told only how to read. With no stated method for rewriting the priority file, a session invents one that can exit clean on a non-match, carry prose where a plan pointer belongs, or keep a pointer to a plan a worker's branch archived, and each reads as correct until a dispatch spends on it.
|
|
23
|
-
|
|
24
|
-
The ban on writing at all fails on a different axis, which is that nothing enforces it and a session weighs proportionality against it. A one-line prose correction found while orchestrating satisfies the root instruction to handle a small edit immediately and violates this rule, and a session given no statement of which one wins takes the smaller apparent cost and authors the change.
|
|
25
|
-
|
|
26
|
-
That removes the independent pass the repository built to catch what a self-review misses, and the vantage does not come back, since no later session can review the change without re-deriving the context that produced it. A correction no open task owns has nowhere to go either, so the route matters as much as the ban.
|
|
27
|
-
|
|
28
|
-
The contract also stops one state short of what the session holds. Its sections cover what the human launches and what they review, and a self-dispatching session adds a third that sits between them for ten to thirty minutes, which a session reports under no section while the launch section keeps recommending a plan a worker is already building.
|
|
29
|
-
|
|
30
|
-
Output drifts everywhere the contract stops. The specified shape covers invocation alone, so a sweep report, a board report, and an analysis each end in a decision the human owns and each buries it under the evidence they would have skipped. A compaction is the same failure one step earlier, since the file that survives it has a stated reader and no stated writer, and the session improvises what to save and loses the reasoning the board never held.
|
|
31
|
-
|
|
32
|
-
Naming that reader without naming the way in fails on the next axis, and it fails circularly. The command that routes a resume request lives in this body, which is the surface a long session is likeliest to have dropped, and dropping it is the condition the handoff exists to survive, so the session holding a complete handoff cannot reach the runbook that reads it back. The review poll is lost in the same moment and recovered by neither, since it is session-scoped and the resume performs no restart, which leaves a reader who follows the whole handoff with a board and no trigger.
|
|
33
|
-
|
|
34
|
-
The runbooks the session cannot run from memory fail on a third axis, which is where they are kept. A runbook reached by an installed path is a dependency on a channel this skill does not travel on, so a project holding the plugin and running no install follows the citation to nothing, and nothing reports the break because a missing file produces no error until someone opens the path.
|
|
35
|
-
|
|
36
|
-
Every one of them therefore has to ship inside the skill. The review trigger fails on an axis of its own when it names one client's command as the way to start the loop, since the file ships to every target holding the plugin and a client without that command reaches no path.
|
|
37
|
-
|
|
38
|
-
The dispatch's return leg is unplaced for the same reason. A reply reaches this session as a message and settles a finding, corrects which session holds which branch, or names a gate a worker's edits pass through, and reading it is the whole of what happens to it. Both sessions then end, so the half that belonged on the pull request never reaches it and the half that belonged on the board is rediscovered by whoever needs it next.
|
|
39
|
-
|
|
40
|
-
Both halves of that channel are written here and one of them is performed elsewhere, so a worker owes what nothing it loads states. The review trigger inherits the same asymmetry: firing on a dispatch spends an interval against a building worker that has no pull request, and a trigger matching pull requests alone stays silent through a worker that crashes, which only a roster read the poll script cannot make would catch.
|
|
41
|
-
|
|
42
|
-
Cost never enters the decision to widen a wave. The rule weighing how many tracks to open measures conflict and review attention, and both describe what a worker writes rather than what the loop spends. Claude Code delivers a message from another session as a fresh turn carrying the whole accumulated context, and a recurring poll bills that same window on its own interval, so a wave's spend tracks this session's context rather than the work coming back. The one setting that bounds it reads as available to whoever finds it, and the two values that would bound it break the handback the loop runs on.
|
|
43
|
-
|
|
44
|
-
Dispatch parts from what it checked in three ways. The gate and the worker each derive the branch from their own reading of one plan and reach different strings, a launched worker inherits its launcher's model rather than the configured default, and a declared file set does not hold, since a track crosses the set its plan named.
|
|
12
|
+
The channel fails at every hand-off. A finding or a reply stays in a thread nobody re-reads, a dispatch launches a branch other than the one the check cleared, a wave's cost grows unweighed, a report buries the human's decision, and a compaction loses the way back in.
|
|
45
13
|
|
|
46
14
|
## Must
|
|
47
15
|
|
|
48
|
-
-
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
- Place every finding a merged pull request produced against the surface that owns it, and write the board so a row's readiness and hold claims stay checkable
|
|
54
|
-
- Place what the return leg carries by what it changes, sending an answer that settles a finding onto the pull request and one that corrects this session's model of the world to the task owning that surface, since neither becomes a record by being read
|
|
55
|
-
- Keep one planned, non-conflicting task in reserve beyond what is running
|
|
56
|
-
- Refill the queue while a wave is still building, rather than on a merge and a thinning list alone, since neither of those fires across the window planning costs nothing
|
|
57
|
-
- Carry a constraint naming each in-flight track's file set in every plan written from here, stating per set which of the two acts it forbids, since a bare path list leaves a broken citation in place
|
|
58
|
-
- Carry a slot for this session's own workers mid-build, and withhold their plans from the launch slot, since the two other slots cover what a human launches and what they review and nothing between
|
|
59
|
-
- Start the review poll on an open pull request rather than on a dispatch, and keep the dispatch as a fallback for an announcement that never arrives, since the script reads pull requests and a building worker has none
|
|
60
|
-
- Point at the worker's own skill for the announcement, the block message, and the board ban, rather than holding the only written copy of obligations this session does not perform
|
|
61
|
-
- Ship the roster-and-pull-request watch as a script beside the poll, since the loop that covered the gap lived in one session's temporary directory against a hardcoded path and died with that session
|
|
62
|
-
- Lead a sweep report, a board report, and an analysis with the state, the open decisions, and the next action, keeping the evidence below them
|
|
63
|
-
- Write the pre-compact handoff with what no other file carries, and name the runbook that reads it back
|
|
64
|
-
- Carry the resume invocation and the owed poll restart in the handoff file itself, not in the runbook that writes it alone, since the file is what survives a compaction and the runbook is what a session has to already be holding to read
|
|
65
|
-
- Distinguish this resume from the general-purpose `session-resume`, since the name an operator reaches for first reaches a skill that knows nothing about the board
|
|
66
|
-
- Retire the sessions this wave delivered before the map is written and ahead of any reclaim run, reporting a hand-launched one rather than acting on it, since no verb decides a planner or an unmerged worker and a live session holding a worktree is what the reclaim reading refuses on
|
|
67
|
-
- Carry every runbook the session cannot run from memory inside the skill, so each citation resolves for a project holding the plugin and nothing else
|
|
68
|
-
- State which rule wins where the tracked-file ban collides with the root instruction on small edits, and where a correction no open task owns goes
|
|
69
|
-
- State the review trigger as a recurring prompt rather than as one client's command, since the runbook ships to targets running whatever client they run
|
|
70
|
-
- Read the handoff or the resume runbook when the human asks for that side of a compaction, since the request is the only signal available for a moment the loop cannot detect
|
|
71
|
-
- Re-test every parked row's blocker against the current tree on request, since every refill trigger looks forward and none of them re-reads a row already waiting
|
|
72
|
-
- Measure a condition the way the code consuming it defines the shape, and settle which tree the condition is about before counting, since both errors return a number rather than a failure
|
|
73
|
-
- Write each re-test into the row and its measurement into that task's Findings, since a result reported in chat is gone at the next compaction and the next pass measures the same thing
|
|
74
|
-
- Plan a row the re-test clears, since a cleared row carrying no plan is one the next pass looks at again
|
|
75
|
-
- Split a task that conflicts with every other by construction, rather than re-measuring a scoping defect that reads as a blocker
|
|
76
|
-
- Check a candidate branch is unclaimed by an existing worktree or a live session before dispatching a background worker for it, since the measured failure this closes is a worker colliding with someone else's work already sitting in the row
|
|
77
|
-
- Dispatch a candidate sharing only files with a track in flight and name the shared paths, and have the branch merging second resolve after the first merges, since every source the gate cites tests at integration
|
|
78
|
-
- Write a stated reason on the hold it makes, since two tracks interact in ways no plan reading shows
|
|
79
|
-
- Name each self-dispatched worker explicitly with the `worker-` prefix, since that is the role the name marks and a client-derived name is a fragment of the session's identifier
|
|
80
|
-
- Carry the dispatcher's `sessionId` in the launch prompt, since a worker owed two messages has no property on the roster that resolves a controller and a name goes stale inside the window it builds in
|
|
81
|
-
- Report each self-dispatch and the row it fired against loudly enough to follow, since a person no longer watches the launch step happen
|
|
82
|
-
- Stop dispatching once `## Up next` is empty or every row left in it is held, rather than waking again to fire on a board nobody is clearing
|
|
83
|
-
- Launch a planner or worker the operator will talk with from the talk shape, with the `-talk` suffix and the brief sentence that tells it so, since a cold launch retires the session the moment its delivery lands while the operator still wants the conversation
|
|
84
|
-
- Retire a talk session only on the operator's word and report it as held open until then, since its delivery says nothing about whether the conversation is over
|
|
85
|
-
- Dispatch every non-release pull request's review to `role-reviewer`, leave each round's messages to it and the worker, and keep one cross-branch pass per wave here, since any pass or relay run here bills the context the wave shares
|
|
16
|
+
- Every plan is verified against the current tree and names each in-flight track's file set, and a candidate holds only on a dependency, a contract, a relocation, a sweep, or a stated reason
|
|
17
|
+
- One planned, non-conflicting task stays in reserve, refilled while a wave builds, and every parked row's blocker is re-tested against the current tree with the result written to the board
|
|
18
|
+
- A finding or a reply lands on the surface that owns it, the pull request or the task, rather than in chat
|
|
19
|
+
- A dispatch launches the branch the check cleared under a `worker-` name carrying this session's `sessionId`, hands review to `role-reviewer`, and states what the wave costs in inbound turns
|
|
20
|
+
- A report and the pre-compact handoff lead with state, open decisions, and next action, the handoff carries its own resume invocation and poll restart, and every runbook ships inside the skill
|
|
86
21
|
|
|
87
22
|
## Must not
|
|
88
23
|
|
|
89
|
-
- Implement
|
|
90
|
-
-
|
|
91
|
-
- Spawn a worker with the Agent tool, since an in-process subagent shares this session's context and cannot be steered or reached independently. A dispatched `claude --bg` process is not this: it is a separate session with its own worktree and its own PR, gated by the branch check and the conflict check.
|
|
92
|
-
- Hand a worker anything but a plan, because scope lives there
|
|
93
|
-
- Name a count of the defect's extent or the mechanism behind it while filing a row, since this seat measures a defect from where it stands and the planner is the reader who commits to that scope. A blocker re-test, a branch check, and a conflict check decide whether a row can start rather than how big it is, and they stay.
|
|
24
|
+
- Implement, edit any tracked file at any size, or merge
|
|
25
|
+
- Spawn a worker with the Agent tool, or hand a worker anything but a plan
|
|
94
26
|
- Run a second orchestrator against the same board
|
|
95
|
-
- Promote a
|
|
96
|
-
-
|
|
97
|
-
- Schedule the parked-row pass on a recurring loop, since the review poll owns the one recurring trigger this skill has and a second loop fires into a static board
|
|
98
|
-
- Rewrite the board with a shell stream editor or an inline string replace, both of which exit clean when they match nothing
|
|
99
|
-
- Restate the board, a task file, or a groundwork folder in the pre-compact handoff, which is the padding that makes a handoff stop being read
|
|
100
|
-
- Specify a shape for a correction, since a format for admitting error invites ceremony where plainness is the whole value
|
|
101
|
-
|
|
102
|
-
## Guards
|
|
103
|
-
|
|
104
|
-
- Priority file absent: report the queue and say the order is unrecorded rather than inferring it from the index
|
|
105
|
-
- Cross-version sequencing asked for: say no surface carries it, rather than asserting an active version the tree does not state
|
|
106
|
-
- This body dropped from a long session approaching a compaction: name the re-invocation and the runbook paths, since the routing lives in the body and a user-invoked skill routes nothing once it is gone
|
|
107
|
-
- Blocker only an operator can clear: record the row as untestable this pass and name the action owed, rather than re-measuring what no session can move
|
|
108
|
-
- Branch check refuses, with no session registry or no repository resolved: treat the candidate as unverified and fall back to the human-launch line, rather than reading a check that could not run as a clear one
|
|
109
|
-
- Candidate holds under the conflict check: leave the row ready and name the hold, rather than dispatching onto a contract still moving
|
|
110
|
-
- Talk session the client renamed after launch: find it by the `sessionId` recorded in the map, since the `-talk` suffix is display only and a rename can drop it
|
|
111
|
-
- Operator states a cap for the session: honor it for that session alone, rather than treating it as a standing rule or writing the number into a file
|
|
27
|
+
- Promote a row to fill the queue when nothing qualifies, or on how long it has waited
|
|
28
|
+
- Rewrite the board with a stream editor or a string replace that exits clean on no match
|
|
112
29
|
|
|
113
30
|
## Out of scope
|
|
114
31
|
|
|
115
|
-
- Writing the plan itself, which `plan-feature` owns
|
|
116
|
-
- Reviewing a worker's pull request, which `review-pr`
|
|
117
|
-
- Entering the worktree a build runs in, which
|
|
118
|
-
- The worker's half of the channel and
|
|
119
|
-
-
|
|
32
|
+
- Writing the plan itself, which `plan-feature` owns
|
|
33
|
+
- Reviewing a worker's pull request, which `review-pr` and `role-reviewer` own
|
|
34
|
+
- Entering the worktree a build runs in, which `session-worktree` owns
|
|
35
|
+
- The worker's half of the channel and its boundaries, which `role-worker` owns
|
|
36
|
+
- Resuming a session with no board behind it, which `session-resume` owns
|
|
@@ -7,87 +7,29 @@ description: What a thinking session is across planning, groundwork, and intake,
|
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
10
|
-
Without this skill, a planning session is told what to plan and never what it
|
|
11
|
-
is. `role-worker` states the building role and `auto-ship` Step 0 reaches
|
|
12
|
-
it on every build, so a builder takes a role whether a person launched it or a
|
|
13
|
-
dispatcher did. Planning has no equivalent, and two trials on 2026-08-31 ran
|
|
14
|
-
entirely on prose the controller retyped into each launch. That is the shape
|
|
15
|
-
`role-orchestrator` already bans on the building side, where one half held the
|
|
16
|
-
only written copy of obligations the other half performs.
|
|
10
|
+
Without this skill, a planning, groundwork, or intake session is told what to plan and never what it is. Every launch retypes the role's rules, and the forgotten one fails. The session counts worktrees and branches as in flight though a squash merge leaves both behind, and it quotes a row's stale count instead of opening the source.
|
|
17
11
|
|
|
18
|
-
|
|
19
|
-
tracked file, no board write, report the path alone, and re-measure rather than
|
|
20
|
-
trusting the task file. A seventh was added only after a trial got it wrong.
|
|
21
|
-
Every one of them is a property of the role rather than of the row, so each
|
|
22
|
-
dispatch reproduced them from memory and the one nobody remembered was the one
|
|
23
|
-
that failed.
|
|
24
|
-
|
|
25
|
-
The in-flight read is that failure. The first trial counted worktrees and local
|
|
26
|
-
branches and named four branches as in flight, all four of which had merged,
|
|
27
|
-
because this repository squash-merges and leaves both behind. A corrected brief
|
|
28
|
-
naming `gh pr list` as the source closed it and no constraint in the second
|
|
29
|
-
batch was wrong, which puts the fix in a launch string that the next dispatch
|
|
30
|
-
has to remember to carry.
|
|
31
|
-
|
|
32
|
-
Measuring rather than trusting the row is the other half and it is what the
|
|
33
|
-
trials were strongest on. Across four plans the planner reported ten things the
|
|
34
|
-
task files got wrong, and one plan overturned its own row's closing conclusion.
|
|
35
|
-
Nothing in any skill body tells a planner to open the source rather than quote
|
|
36
|
-
the row, so a session that skips that read produces a plan built on the same
|
|
37
|
-
stale count the row already carried.
|
|
38
|
-
|
|
39
|
-
A planner reading the board sees blockers and file sets and can write a
|
|
40
|
-
confident merge order off a partial picture. Which rows collide, what merges
|
|
41
|
-
before what, and whether a row should run at all stay with the controlling
|
|
42
|
-
session, and no body states that boundary for the planning side.
|
|
43
|
-
|
|
44
|
-
Nothing scans a plan for ban hits either. `.gitignore` ignores
|
|
45
|
-
`.canon/plans/`, and the audit's default path set is what git lists, so no gate
|
|
46
|
-
ever opens one. Six ban hits landed across the four trial plans and three of the
|
|
47
|
-
four carried at least one, caught only because the planner ran
|
|
48
|
-
`canon markdown audit` unprompted.
|
|
12
|
+
It also reaches past its seat. A planner reading blockers and file sets writes a merge order off a partial picture. Its plans land in a gitignored folder no gate audits, and the controller learns nothing of what the row got wrong unless the planner says so.
|
|
49
13
|
|
|
50
14
|
## Must
|
|
51
15
|
|
|
52
|
-
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
- Run that read once per task rather than once per batch, since a reused session ages its picture of the tree while it works
|
|
58
|
-
- Name every read a plan needed and a launch string did not carry, the task file's findings and the source files among them, since a count quoted from a row was wrong or stale in ten places across four plans
|
|
59
|
-
- Name the validate and audit calls the written plan passes through, since nothing else opens a plan and the audit caught ban hits in three of four trial plans
|
|
60
|
-
- State the shared board as read-only and name the cross-feature call as the controller's, since a planner reading blockers and file sets can write a merge order off a partial picture and will not notice that it has
|
|
61
|
-
- Owe an announcement when the record lands, carrying the path and what the row got wrong, since the controller cannot watch the read happen
|
|
62
|
-
- Owe a message before a block becomes an interactive prompt, since a session already waiting on input never reaches the tool round an inbound message drains at
|
|
63
|
-
- Keep correcting the dispatcher a first-class move carrying its evidence, since a trial corrected a brief's premise, planned every row anyway, and carried the consequence into a plan question
|
|
64
|
-
- Carry a talk clause for a launch whose operator is in the session, putting each open question to them, recording a settled pick in place, sending an ask about a row now building to the controller rather than the worker, and owing a close message when they end the conversation, since a cold planner's halting rules contradict a brief that asks it to talk
|
|
65
|
-
- Point at each of the three skills for its record's shape and the steps that write it
|
|
66
|
-
- Defer the addressee resolution to `session-relay` and keep only the last-rung inference, which discriminates differently here than it does for a worker because a session in this role holds no feature branch either
|
|
16
|
+
- One role covers `plan-feature`, `plan-groundwork`, and `plan-intake`, writing records and never source, with each scope's exceptions left to its own skill
|
|
17
|
+
- The in-flight read composes the session roster with open pull requests once per task, and never counts a branch or a worktree as evidence
|
|
18
|
+
- A plan rests on the task file's findings and the source files rather than on counts quoted from the row
|
|
19
|
+
- Every record passes the validate and audit calls before it is announced, and the announcement carries the path and what the row got wrong
|
|
20
|
+
- A block goes out as a message before it becomes a prompt, a correction to the dispatcher carries its evidence, and a talk launch puts each open question to the operator
|
|
67
21
|
|
|
68
22
|
## Must not
|
|
69
23
|
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
- Restate a
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
- Report progress through the channel, which rebuilds on the sender's side the poll the announcement exists to retire
|
|
76
|
-
- Write the priority board or the backlog, at any size, or the task file outside `plan-groundwork`'s close-time exception
|
|
77
|
-
- Be a skill nothing invokes but its author typing the name. `orchestrator-launch.md` names it on the planning launch the way it names `role-worker` on a build, so a stretch where only a typed invocation reaches it is the signal that the role never took.
|
|
78
|
-
|
|
79
|
-
## Guards
|
|
80
|
-
|
|
81
|
-
- Task file does not resolve from where the session stands: report it unreadable and name the main-root path, rather than reporting the row as absent
|
|
82
|
-
- A read of what is in flight returns nothing: report that no pull request is open and no live session holds another branch, rather than falling back to a raw branch or worktree count
|
|
83
|
-
- Launch named no controlling session and an operator is present: ask which row to address rather than inferring
|
|
84
|
-
- Launch named no controlling session and nobody is present: infer from the sessions holding no feature branch, never from a name prefix, and say the addressee was inferred
|
|
24
|
+
- Write the priority board or the backlog, or a task file outside the close-time exception `plan-groundwork` states
|
|
25
|
+
- Decide which rows run or in what order
|
|
26
|
+
- Restate a record's sections, its answer contract, or the steps the running skill carries
|
|
27
|
+
- Halt on a plan question the suggested line already answers, outside a talk launch
|
|
28
|
+
- Report progress through the channel
|
|
85
29
|
|
|
86
30
|
## Out of scope
|
|
87
31
|
|
|
88
|
-
- Each record's sections
|
|
89
|
-
-
|
|
90
|
-
- The mechanical addressee resolution, which `session-relay` owns for every session with or without a role
|
|
32
|
+
- Each record's sections, answer contract, write-scope exceptions, and writing steps, which `plan-feature`, `plan-groundwork`, and `plan-intake` own
|
|
33
|
+
- Resolving an addressee, which `session-relay` owns
|
|
91
34
|
- The branch, the build, and the pull request, which `role-worker` and `auto-ship` own
|
|
92
|
-
-
|
|
93
|
-
- The dispatch itself, its collision check, and its conflict check, which `orchestrator-dispatch.md` holds
|
|
35
|
+
- Choosing which rows run, their order, and the dispatch with its collision and conflict checks, which `role-orchestrator` owns
|
|
@@ -7,58 +7,30 @@ description: What a building session is, the shared surfaces it may not write, a
|
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
10
|
-
Without this skill, a building session is told what to do and never what it is.
|
|
10
|
+
Without this skill, a building session is told what to do and never what it is. It writes shared surfaces, hand-writing the board from a stale copy, filing a task with no row, or re-drafting a readied pull request. From a linked worktree it finds no plan folder and reports the task has no plan.
|
|
11
11
|
|
|
12
|
-
The
|
|
13
|
-
|
|
14
|
-
Standing in a linked worktree fails one step earlier and reports confidently while it does. The plan folder is gitignored, so `git worktree add` never creates it, and a worker reading it from the build tree reports that the task has no plan. That is true from where the session stands and wrong about the world, and a reader holding no second tree cannot tell those apart. Three workers hit it in one day and an absolute path unblocked all three.
|
|
15
|
-
|
|
16
|
-
A blocked worker reaches nobody at all. Two dispatched sessions opened an interactive prompt inside a background session no operator was attached to, and the roster read both as alive throughout. An answer relayed afterwards arrives and does not land, since a queued message drains at the next tool round and a session waiting on input never reaches one, so the channel closes the gap only when it is used before the prompt opens. One of the two held uncommitted work across three files, which made stopping and relaunching a destructive recovery rather than a free one.
|
|
17
|
-
|
|
18
|
-
Finishing is invisible from the other side. A worker that opens a pull request goes idle rather than exiting, so the one push signal available fired for a worker that was stopped and never fired for the one that finished, which then sat unnoticed for eighteen minutes. Polling covers that interval by spending a fixed cost against a worker with no pull request to report, measured as five consecutive runs reporting no movement across roughly fifteen minutes while one worker built.
|
|
19
|
-
|
|
20
|
-
Nothing tells the session that refusing is allowed either. Four occasions across two days had a worker halt correctly with the cost falling on the dispatcher, and the correction that mattered most reached the right place because a worker argued back with evidence rather than complying. A role written only as report-upward suppresses exactly that.
|
|
21
|
-
|
|
22
|
-
The draft mark fails from both ends. On 2026-08-31 four sessions re-drafted a pull request someone had readied, acting on a belief no surface in the tree stated. On 2026-09-07 a controlling session told a worker to lift the mark rather than lifting it itself, and the worker complied and reported against the surface rather than the outcome. From 2026-10-12 `canon pr lift` reads the gates itself, so the reviewers run it on a close and the controlling session runs it as the fallback. A worker leaves the verb to them and readies a pull request directly for nobody, since a direct ready skips every gate the verb reads.
|
|
12
|
+
The channel fails on the worker's side. Blocks open prompts nobody is attached to, and a finished pull request goes idle unannounced or stalls silently on its reviews. Painted ones ship with no address for the UI reviewer. Late asks widen the reviewed scope, and a worker told only to report upward never argues back.
|
|
23
13
|
|
|
24
14
|
## Must
|
|
25
15
|
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
31
|
-
- Carry a fan-in member's branch and head commit in its done message in place of a pull request number, and end its role at the push, since a member opens no pull request and its integrator fixes what the merge surfaces
|
|
32
|
-
- Send the controller the `canon pr review-state` record when a wait for the reviews times out, rather than waiting on, since a worker improvising that read stalled silently with both reviewers idle behind it
|
|
33
|
-
- Owe a message before a block becomes an interactive prompt, since a session already waiting on input never reaches the tool round an inbound message drains at
|
|
34
|
-
- Defer the addressee resolution to `session-relay` and keep only the operator ask and the last-rung inference, which discriminates here because a worker holds a feature branch and a controller does not, and which falls back to the roster and says so, since an operator's own launch names nobody
|
|
35
|
-
- Keep refusing a dispatcher a first-class move carrying its evidence, since the halts measured so far were correct and the cost of each fell where it belonged
|
|
36
|
-
- State that a held body may be older than the branch under it, since a plugin skill loads from the marketplace cache rather than from the working tree
|
|
37
|
-
- Carry a talk clause for a launch whose operator is in the session, asking them at a judgment call and sending a close message when they end the conversation, since a cold worker's halt-toward-the-controller and merge-ends-the-role rules contradict a brief that asks it to talk
|
|
38
|
-
- Freeze the plan's scope at dispatch, sorting a late ask into a defect to fix, a follow-up row to report, or an addition the operator's word admits with its re-review cost stated, since intake 155 measured about four UI review rounds on one pull request from late asks, each re-running both reviews
|
|
39
|
-
- Own the local preview server for a painted diff, started as a tracked background command before the pull request opens, since a `no-server` read leaves the evidence comment and the UI reviewer without an address on the one path nobody watched being built (erclx/frameboard#1 and erclx/frameboard#4)
|
|
40
|
-
- Point at `session-worktree`, `auto-ship`, and `review-address` for the steps each already owns
|
|
16
|
+
- Session scratch resolves at the main worktree root, and a plan that fails to resolve is reported unreadable from there rather than absent
|
|
17
|
+
- The pull request announcement carries the number, the branch, the task, the reach, and any row the build turned up, and a painted diff has its preview server running before the pull request opens
|
|
18
|
+
- A block goes out as a message before it becomes a prompt, a fan-in member's done message carries its branch and head commit, and a review wait that times out reaches the controller
|
|
19
|
+
- The plan's scope freezes at dispatch, and a late ask is sorted into a defect, a follow-up row, or an addition on the operator's word
|
|
20
|
+
- A refusal of an instruction the tree contradicts carries its evidence, and a talk launch puts its judgment calls to the operator in the session
|
|
41
21
|
|
|
42
22
|
## Must not
|
|
43
23
|
|
|
44
|
-
- Restate a procedure any of the three step-owning skills carries, since thinness is what keeps one body correct for a dispatched worker reading it as its whole contract and for a hand-launched one reading it beside a person
|
|
45
|
-
- Restate a boundary the orchestrator already states about itself
|
|
46
|
-
- Report progress through the channel, which rebuilds on the sender's side the poll the announcement exists to retire
|
|
47
24
|
- Write the priority board or the backlog, at any size
|
|
48
|
-
- Create a task file for work the build turns up
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
- Plan path does not resolve from inside the worktree: report it unreadable from here and name the main-root path, rather than reporting the task as having no plan
|
|
54
|
-
- Plan carries a suggestion written as needing the operator's call: halt and message, rather than answering it
|
|
55
|
-
- Launch named no controlling session: resolve from the roster, address the match, and say the addressee was inferred
|
|
56
|
-
- No live session holds the other end: report what would have been sent and stop, rather than retrying or waiting
|
|
25
|
+
- Create a task file for work the build turns up
|
|
26
|
+
- Ready the pull request directly, or re-draft one someone readied
|
|
27
|
+
- Report progress through the channel
|
|
28
|
+
- Restate a procedure `session-worktree`, `auto-ship`, or `review-address` carries
|
|
57
29
|
|
|
58
30
|
## Out of scope
|
|
59
31
|
|
|
60
32
|
- Entering the worktree, which `session-worktree` owns
|
|
61
33
|
- The chain from implement through pull request, which `auto-ship` owns
|
|
62
|
-
-
|
|
34
|
+
- Moving through the plan slice by slice, which `build-in-slices` owns
|
|
63
35
|
- Answering a posted review, which `review-address` owns
|
|
64
|
-
- The controlling session's half of the channel
|
|
36
|
+
- The controlling session's half of the channel and the review poll, which `role-orchestrator` owns
|
|
@@ -88,7 +88,7 @@ preview proposed, per the detect reference. Run from the
|
|
|
88
88
|
target project's current directory. Do not cd into the toolkit source tree. The
|
|
89
89
|
`canon` CLI is global.
|
|
90
90
|
|
|
91
|
-
Step 1: `canon init` installs base tooling, claude seeds, governance rules
|
|
91
|
+
Step 1: `canon init` installs base tooling, claude seeds, and governance rules.
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
94
|
CANON_NON_INTERACTIVE=1 canon init \
|
|
@@ -121,7 +121,7 @@ CANON_NON_INTERACTIVE=1 canon tooling sync python ./backend --skip base --write
|
|
|
121
121
|
- Without `--skip base`, each subtree re-drops husky, and git honors only one `core.hooksPath`, so the extra hook dirs silently break
|
|
122
122
|
- Each subtree keeps its own framework configs, and its stack reference reads through `canon tooling reference <stack>`
|
|
123
123
|
- A subtree sync withholds `.github/`, since GitHub reads workflows only at the root, and names each withheld file with the `working-directory` a root CI job needs
|
|
124
|
-
- A subtree
|
|
124
|
+
- A subtree with no `package.json` gets a minimal one from the sync, so its scripts and dependencies land in the same pass
|
|
125
125
|
|
|
126
126
|
### Post-sync fixups
|
|
127
127
|
|
|
@@ -93,7 +93,6 @@ A language root below the repository root whose language the stack does not carr
|
|
|
93
93
|
A language root below the repository root takes its own `canon tooling sync <stack> <path> --skip base`, since `canon init` already lands `base` once at the root.
|
|
94
94
|
|
|
95
95
|
- Leave a root whose stack resolves to `base` out of the commands, since that sync lands nothing. A root `package.json` hosting only formatters and hooks is that case and adds no row.
|
|
96
|
-
- `wiki` installs by default. Add `--skip wiki` only when the user explicitly wants it left out.
|
|
97
96
|
|
|
98
97
|
## Gap handling
|
|
99
98
|
|
|
@@ -32,7 +32,7 @@ canon targets list --sweep <root> --json
|
|
|
32
32
|
|
|
33
33
|
- The root is a folder to verify when it carries a `package.json`.
|
|
34
34
|
- Each path in the record's `targets` that sits under the root and carries its own `package.json` is a folder to verify.
|
|
35
|
-
- A path under the root with no `package.json` is not verified. Name it as skipped with its fix, `
|
|
35
|
+
- A path under the root with no `package.json` is not verified. Name it as skipped with its fix, `sync the stack in <path> to write one`, and carry on with the rest.
|
|
36
36
|
- If neither the root nor any stamped subfolder carries a `package.json`, stop: `❌ No package.json at the root or in any synced subfolder. Cannot verify.`
|
|
37
37
|
- In each folder to verify, if `node_modules/` does not exist, run `bun install` there first, then proceed.
|
|
38
38
|
|
|
@@ -103,7 +103,7 @@ port to poll across stacks, so port-probing is out of reach here.
|
|
|
103
103
|
## Step 3: report
|
|
104
104
|
|
|
105
105
|
Report per folder, under a heading naming its path relative to the root, and
|
|
106
|
-
list each skipped folder with its
|
|
106
|
+
list each skipped folder with its sync fix. For each script run, report
|
|
107
107
|
one of:
|
|
108
108
|
|
|
109
109
|
- `✅ <script>`
|
|
@@ -55,7 +55,7 @@ Two failures land specifically on where the folder sits. A workspace resolved ag
|
|
|
55
55
|
## Guards
|
|
56
56
|
|
|
57
57
|
- No subject named and no existing workspace matching, stop rather than opening a workspace with nothing to learn
|
|
58
|
-
- No wiki folder in the project and a page routing there, refuse and name the
|
|
58
|
+
- No wiki folder in the project and a page routing there, refuse and name the folder to create rather than scaffolding a surface the project never chose
|
|
59
59
|
|
|
60
60
|
## Out of scope
|
|
61
61
|
|