@erclx/canon 5.43.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/backlog-triage/references/apply.md +6 -6
- package/claude/skills/canon-cli/SKILL.md +4 -5
- package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
- package/claude/skills/canvas-board/SKILL.md +1 -1
- package/claude/skills/context-fold/references/context.md +1 -1
- package/claude/skills/create-skill/REQUIREMENT.md +1 -1
- package/claude/skills/create-skill/SKILL.md +2 -2
- package/claude/skills/create-skill/references/skill-requirement.md +68 -9
- package/claude/skills/create-skill/references/skill.md +1 -1
- package/claude/skills/design-identity/REQUIREMENT.md +40 -0
- package/claude/skills/design-identity/SKILL.md +138 -0
- package/claude/skills/{draft-identity → design-identity}/references/card-route.md +2 -2
- package/claude/skills/design-taste/REQUIREMENT.md +6 -6
- package/claude/skills/design-taste/SKILL.md +2 -2
- package/claude/skills/design-taste/references/kinds.md +1 -1
- package/claude/skills/design-taste/references/preflight.md +1 -1
- package/claude/skills/draft-and-pick/REQUIREMENT.md +8 -69
- package/claude/skills/draft-and-pick/SKILL.md +3 -153
- package/claude/skills/draft-doc/REQUIREMENT.md +9 -30
- package/claude/skills/draft-doc/SKILL.md +4 -76
- package/claude/skills/draft-figure/REQUIREMENT.md +8 -42
- package/claude/skills/draft-figure/SKILL.md +3 -77
- package/claude/skills/draft-identity/REQUIREMENT.md +8 -23
- package/claude/skills/draft-identity/SKILL.md +3 -130
- package/claude/skills/draft-ready/REQUIREMENT.md +8 -37
- package/claude/skills/draft-ready/SKILL.md +3 -128
- package/claude/skills/draft-screencast/REQUIREMENT.md +8 -23
- package/claude/skills/draft-screencast/SKILL.md +3 -62
- package/claude/skills/draft-slides/REQUIREMENT.md +8 -27
- package/claude/skills/draft-slides/SKILL.md +3 -72
- package/claude/skills/draw-figure/REQUIREMENT.md +59 -0
- package/claude/skills/draw-figure/SKILL.md +85 -0
- package/claude/skills/{draft-figure → draw-figure}/references/architecture-set.md +2 -2
- package/claude/skills/{draft-figure → draw-figure}/references/hand-drawn.md +2 -2
- package/claude/skills/{draft-figure → draw-figure}/references/mermaid-path.md +2 -2
- package/claude/skills/{draft-figure → draw-figure}/references/mermaid.md +1 -1
- package/claude/skills/make-deck/REQUIREMENT.md +44 -0
- package/claude/skills/make-deck/SKILL.md +80 -0
- package/claude/skills/markdown-craft/REQUIREMENT.md +1 -1
- package/claude/skills/markdown-craft/SKILL.md +2 -2
- package/claude/skills/pick-by-eye/REQUIREMENT.md +36 -0
- package/claude/skills/pick-by-eye/SKILL.md +161 -0
- package/claude/skills/plan-feature/SKILL.md +2 -1
- package/claude/skills/plan-feature/references/plan.md +24 -10
- package/claude/skills/plan-groundwork/SKILL.md +1 -1
- package/claude/skills/plan-intake/SKILL.md +1 -1
- package/claude/skills/plan-ready/REQUIREMENT.md +54 -0
- package/claude/skills/plan-ready/SKILL.md +136 -0
- package/claude/skills/{draft-ready → plan-ready}/references/assembly.md +1 -1
- package/claude/skills/{draft-ready → plan-ready}/references/ready.md +1 -1
- package/claude/skills/record-screencast/REQUIREMENT.md +3 -3
- package/claude/skills/record-screencast/SKILL.md +2 -2
- package/claude/skills/role-orchestrator/REQUIREMENT.md +16 -99
- package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +5 -2
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
- package/claude/skills/role-orchestrator/references/orchestrator-refill.md +18 -13
- package/claude/skills/role-planner/REQUIREMENT.md +15 -73
- package/claude/skills/role-planner/SKILL.md +2 -1
- package/claude/skills/role-worker/REQUIREMENT.md +13 -41
- package/claude/skills/role-worker/SKILL.md +9 -0
- package/claude/skills/script-screencast/REQUIREMENT.md +40 -0
- package/claude/skills/script-screencast/SKILL.md +70 -0
- package/claude/skills/{draft-screencast → script-screencast}/references/beats-template.md +2 -2
- package/claude/skills/search-craft/REQUIREMENT.md +4 -4
- package/claude/skills/search-craft/SKILL.md +1 -1
- package/claude/skills/target-setup/SKILL.md +3 -2
- package/claude/skills/target-setup/references/detect.md +0 -1
- package/claude/skills/target-setup/references/verify.md +2 -2
- package/claude/skills/task-board/SKILL.md +11 -9
- package/claude/skills/task-board/references/board.md +15 -12
- package/claude/skills/teach-workspace/REQUIREMENT.md +1 -1
- package/claude/skills/teach-workspace/SKILL.md +1 -1
- package/claude/skills/teach-workspace/references/lesson-craft.md +2 -2
- package/claude/skills/teach-workspace/references/promotion.md +5 -5
- package/claude/skills/ui-checklist/SKILL.md +2 -0
- package/claude/skills/write-doc/REQUIREMENT.md +46 -0
- package/claude/skills/write-doc/SKILL.md +83 -0
- package/claude/skills/{draft-doc → write-doc}/references/context.md +2 -2
- package/claude/skills/{draft-doc → write-doc}/references/docs.md +2 -2
- package/claude/skills/{draft-doc → write-doc}/references/readme.md +2 -2
- package/claude/skills/{draft-doc → write-doc}/references/wiki-kind.md +3 -3
- package/docs/agents/install-and-sync.md +2 -2
- package/docs/agents/markdown-audit.md +4 -2
- package/docs/agents/migrate.md +2 -2
- package/docs/agents/output-shape.md +1 -2
- package/docs/target/migrations.md +35 -4
- package/docs/target/projects.md +2 -3
- package/docs/target/scenarios.md +4 -1
- package/docs/workflow/parallel-features.md +3 -2
- package/docs/workflow/skill-map-on-request.md +19 -13
- package/docs/workflow/skill-map.md +13 -12
- package/docs/workflow/visual-design-workflow.md +2 -2
- package/governance/detect.toml +4 -0
- package/governance/ledger/framework/astro.md +73 -0
- package/governance/ledger/framework/fastapi.md +76 -0
- package/governance/ledger/framework/nextjs.md +86 -0
- package/governance/ledger/framework/react.md +83 -0
- package/governance/ledger/framework/shadcn.md +60 -0
- package/governance/ledger/framework/tailwind.md +55 -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/framework/astro.md +12 -14
- package/governance/rules/framework/fastapi.md +20 -24
- package/governance/rules/framework/nextjs.md +19 -27
- package/governance/rules/framework/react.md +22 -33
- package/governance/rules/framework/shadcn.md +11 -15
- package/governance/rules/framework/tailwind.md +12 -14
- 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/governance/rules/writing/markdown.md +1 -1
- package/package.json +1 -1
- package/scripts/core/install-check.sh +1 -1
- package/src/claude/cases/authoring.ts +15 -3
- package/src/claude/cases/misc.ts +12 -0
- package/src/claude/cases/workflow.ts +19 -1
- package/src/claude/skills-audit.ts +113 -1
- package/src/cli/help.ts +0 -1
- package/src/cli.ts +0 -2
- package/src/commands/claude.ts +34 -11
- package/src/commands/demo.ts +1 -1
- package/src/commands/gov.ts +4 -0
- package/src/commands/init.ts +2 -2
- package/src/commands/markdown.ts +1 -1
- package/src/commands/migrate.ts +4 -0
- package/src/commands/pr.ts +30 -6
- package/src/commands/tasks.ts +383 -2
- package/src/commands/tooling.ts +18 -5
- package/src/context/audit.ts +1 -1
- package/src/demo/beats.ts +1 -1
- package/src/design/components.ts +1 -1
- package/src/gov/audit.ts +25 -4
- 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 +49 -35
- package/src/migrate/record-layout.ts +1 -1
- package/src/migrate/scratch-evidence.ts +12 -4
- package/src/migrate/skill-names.ts +68 -21
- package/src/pr/frames.ts +14 -3
- package/src/records/backup.ts +3 -3
- package/src/records/validate.ts +31 -0
- package/src/roots/record.ts +17 -8
- package/src/tasks/board.ts +854 -0
- package/src/tasks/record.ts +20 -1
- package/src/tasks/validate.ts +206 -9
- 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/configs/card-src/pages/og-card.astro +1 -1
- 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/board-validate.sh +65 -0
- 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/claude/seeds/.claude/settings.json +4 -0
- 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/claude/skills/{draft-figure → draw-figure}/references/figures.md +0 -0
- /package/claude/skills/{draft-slides → make-deck}/references/deck.md +0 -0
- /package/claude/skills/{draft-and-pick → pick-by-eye}/references/live-arms.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/agent-facing.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/application.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/cli.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/library.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/readme/plugin.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/requirements.md +0 -0
- /package/claude/skills/{draft-doc → write-doc}/references/wiki.md +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pick-by-eye
|
|
3
|
+
description: Drafts several candidates for a decision judged by looking, lays them out side by side as frames on one canvas page, hands the operator the address, takes the pick through the structured question surface, and loops on the pick until they stop. Use when asked to "draft some options", "show me a few versions", "try a few variations", "mock up alternatives", "give me candidates for X", or when a choice is taste rather than correctness. Do NOT use when the request already names the answer and asks for it to be built, which is `plan-feature`. Do NOT use to read source for roughness, which is `ux-audit`, to measure what a running interface costs to paint, which is `ux-measure`, to write what to look at on a change already made, which is `ui-checklist`, or to script a recording, which is `script-screencast`.
|
|
4
|
+
metadata:
|
|
5
|
+
family: decide
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Pick by eye
|
|
9
|
+
|
|
10
|
+
Some decisions are settled by looking rather than by reasoning, and no draft is wrong until one is picked. Every step here puts several candidates in front of the operator and keeps the real surface untouched until they have chosen.
|
|
11
|
+
|
|
12
|
+
The candidates live on the local design canvas, the surface `canon:canvas-board` drives. Every verb below is `canon canvas`, and `${CLAUDE_SKILL_DIR}/../canvas-board/references/canvas.md` fixes the content format a frame takes. Read that reference before writing the first frame.
|
|
13
|
+
|
|
14
|
+
## Guards
|
|
15
|
+
|
|
16
|
+
- If the request names one answer and asks for it to be built, stop: `❌ This names one answer, so there is nothing to pick between. Use /canon:plan-feature.`
|
|
17
|
+
- If the decision has no visible form, stop: `❌ Nothing to look at. Drafting candidates needs a decision a render can show.`
|
|
18
|
+
- Draft no candidate for a decision the operator has not asked to make, since options everywhere spend their attention rather than saving it
|
|
19
|
+
|
|
20
|
+
## Step 1: name the decision and the arms
|
|
21
|
+
|
|
22
|
+
1. State the decision in one sentence, naming what changes between arms and what stays fixed.
|
|
23
|
+
2. Emit the design read in the run's output, in the form `design-taste` fixes, taking the layer from its ordered catalog. The arms differ at that layer, and a missing read is visible.
|
|
24
|
+
3. Derive a kebab slug from that sentence. The first round's page is `<slug>`, and Step 5 names later rounds `<slug>-2`, `<slug>-3`, and so on.
|
|
25
|
+
4. Write one arm per candidate, each carrying an id, a label, and what the arm costs. An arm with no stated cost is not an option.
|
|
26
|
+
5. Make the current state arm `0`, so the baseline is a candidate rather than an absence. A decision with nothing shipped yet says so and starts at arm `1`.
|
|
27
|
+
6. Stop at three to five arms. Two is a comparison the operator can hold in prose, and past five the pick stops being a look and becomes a sort.
|
|
28
|
+
|
|
29
|
+
Inside a live `plan-groundwork` track, renders land in the track's own `evidence/<slug>/renders/`, since a candidate render is evidence its decision file cites. Everywhere else they land in session scratch.
|
|
30
|
+
|
|
31
|
+
## Step 2: draft the arms as frames on one canvas page
|
|
32
|
+
|
|
33
|
+
Every arm of a round sits as one frame on one canvas page, side by side. The operator judges that page, never a set of separate images compared from memory.
|
|
34
|
+
|
|
35
|
+
1. Start the canvas the way `canon:canvas-board` Step 1 states, unless this run already has. Note whether this run started the server, since Step 6 stops only a server this run started.
|
|
36
|
+
2. Add the round's page with `canon canvas page add <page> --json` and record it on the run's list of pages. A name `canvas list` already shows is somebody else's, so take the next free suffix.
|
|
37
|
+
3. Add each arm with `canon canvas frame add <page> arm-<id> --width <px> --height <px> --json`. Step 6's archive keys on the `arm-<id>` names.
|
|
38
|
+
4. Write each arm's whole document to the `path` the add verb reported. From a linked worktree, take the heredoc route `canon:canvas-board` Step 3 gives for a main-root write.
|
|
39
|
+
5. Lay the frames out in one row, in arm order, with `canon canvas frame move <page> arm-<id> --x <px> --y <px> --json`.
|
|
40
|
+
|
|
41
|
+
The `canvas-board` start reads `canon canvas list --json`, serves with `canon canvas serve --json` in the background unless the operator named an address that answers, and checks the shell's body holds a `<script` tag. A refused serve or a blank shell stops the run with its `reason`, and no file stands in for a canvas.
|
|
42
|
+
|
|
43
|
+
Set each frame's width to the one the arm is judged at. A frame renders at its own layout width on the canvas and in a capture alike, so a layout decision needs no device toolbar.
|
|
44
|
+
|
|
45
|
+
### What every frame carries
|
|
46
|
+
|
|
47
|
+
Each frame carries its own label and follows the canvas theme, so the set reads as one comparison.
|
|
48
|
+
|
|
49
|
+
- Label each arm inside its frame with its id and its cost, since the composite capture draws no captions
|
|
50
|
+
- Theme every arm off the `data-theme` attribute the canvas sets on each frame's root, so the theme toggle sets the whole set at once. A set spanning both themes cannot be compared.
|
|
51
|
+
- Give no arm a script that stores a theme and reapplies it on load. It overwrites the toggle, and a fresh browser profile hides the fault.
|
|
52
|
+
|
|
53
|
+
### Default path and live app
|
|
54
|
+
|
|
55
|
+
A running app under decision takes the live-app branch, and every other decision takes the default path.
|
|
56
|
+
|
|
57
|
+
- Live app: lift the rendered markup and link a copy of the built stylesheet rather than inlining, per `${CLAUDE_SKILL_DIR}/references/live-arms.md`
|
|
58
|
+
- Default path: inline every style, script, and asset. A frame resolves nothing outside its own page folder, so a build step or network font silently drops out.
|
|
59
|
+
- Default path: name a real font first in the stack, one the machine has or the frame embeds, such as the project's own family. A generic keyword such as `system-ui` resolves differently per machine.
|
|
60
|
+
|
|
61
|
+
The capture refuses a frame that would rewrap against a substitute font rather than ship a false comparison. A frame naming no font is refused on whatever the default resolves to.
|
|
62
|
+
|
|
63
|
+
### What varies
|
|
64
|
+
|
|
65
|
+
Vary one property across the arms, since a pick cannot say which of three differences decided it.
|
|
66
|
+
|
|
67
|
+
- Vary the property the decision is about. Holding composition fixed and varying color produces five skins of one design, and a palette cannot be picked ahead of the composition it serves.
|
|
68
|
+
- Grey-box the arms when the declared layer sits below typography, per `design-taste`, and say the set is grey-boxed when handing it over
|
|
69
|
+
- Do not grey-box a set judged at composition that carries a finished palette, since the operator looks at the higher layers instead of the question
|
|
70
|
+
|
|
71
|
+
## Step 3: render and hand off
|
|
72
|
+
|
|
73
|
+
Render the page and look at what came back before handing anything over:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
canon canvas capture <page> --composite --json
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- Point `--out` at `evidence/<slug>/renders/<page>.png` inside a live track, and leave the scratch default elsewhere. Step 6 archives the picked round alone.
|
|
80
|
+
- Read the PNG's `path` off the record. The composite shows each frame in its default theme, so check the other theme on the live canvas.
|
|
81
|
+
- A capture refusing on a font names the family it read. Take the repair `canon:canvas-board` Step 6 gives and capture again.
|
|
82
|
+
|
|
83
|
+
When `canon canvas capture` refuses for a missing browser binary, report it and name `bunx playwright install chromium` as the repair. Stop the canvas server if this run started it, then stop rather than describe an arm nobody has seen.
|
|
84
|
+
|
|
85
|
+
### Handing over
|
|
86
|
+
|
|
87
|
+
Hand over the address rather than a description. Emit the canvas link first on its own line, naming the page, then the PNG path on its own line.
|
|
88
|
+
|
|
89
|
+
- A still answers how a thing looks and none of a hover, a scroll-linked position, or a pace, which the live frame does
|
|
90
|
+
- Never report a visual result you have not looked at, since a claim about appearance with no render behind it is a guess
|
|
91
|
+
- Look to judge rather than to confirm. Name the weakest thing on the page in a sentence, fix it where that sentence would embarrass the work, and say what remains.
|
|
92
|
+
|
|
93
|
+
## Step 4: take the pick
|
|
94
|
+
|
|
95
|
+
Put the choice to the operator through the structured question surface, since a call the operator's preference decides always routes through it rather than through prose.
|
|
96
|
+
|
|
97
|
+
- Emit the link ahead of the question call and again in the question's text, since some surfaces render the card alone
|
|
98
|
+
- One option per arm, labeled with the arm's id and carrying its cost as the description
|
|
99
|
+
- Rank the recommendation first and mark it `(Recommended)`
|
|
100
|
+
- Author the real arms only. The surface appends its own free-text and reopen escapes, and a duplicate is rejected.
|
|
101
|
+
|
|
102
|
+
### Taking the answer
|
|
103
|
+
|
|
104
|
+
Take no pick on the operator's behalf when two arms are both defensible and the difference is taste. That call is theirs, and a silent one is the failure this skill exists to prevent.
|
|
105
|
+
|
|
106
|
+
Read `canon canvas selection --json` when the answer points at the canvas, such as "the selected one". Resolve it against the record's `page` as well as its `frame`, since every round reuses the `arm-<id>` names.
|
|
107
|
+
|
|
108
|
+
| Selection | Reading |
|
|
109
|
+
| ---------------------------------------------------------------- | ---------------------------------------------- |
|
|
110
|
+
| A frame on the current round's page | The pick |
|
|
111
|
+
| A frame on an earlier round's page | A revert, so name the round back before acting |
|
|
112
|
+
| A fresh element inside a picked frame | A correction Step 5 carries by its `index` |
|
|
113
|
+
| `selection: null`, a page this run did not add, or `stale: true` | No answer, so ask again rather than guess |
|
|
114
|
+
|
|
115
|
+
## Step 5: loop on the pick
|
|
116
|
+
|
|
117
|
+
1. Add each iteration as its own page, recorded on the run's list. An overwritten page cannot be reopened, and the losing round stops a correction re-proposing a rejected arm.
|
|
118
|
+
2. Write fresh arms off the pick and return to Step 2 where the correction opens a new question. Revise the one arm's frame where it does not.
|
|
119
|
+
3. Re-render, hand off again, and take the next answer.
|
|
120
|
+
4. Repeat until the operator says it is right. A run stopping because the arms stopped differing has stopped early.
|
|
121
|
+
5. Hold the real surface untouched across every iteration. Nothing outside the run's own canvas pages changes until the pick is final.
|
|
122
|
+
|
|
123
|
+
## Step 6: close
|
|
124
|
+
|
|
125
|
+
1. Apply the winning arm to the real surface, in one change.
|
|
126
|
+
2. Close out any document stating the decision as open, in the same change, naming the winner and the arms that stayed defensible. Skip this where nothing stated the decision.
|
|
127
|
+
3. Capture the picked round's frames with `canon canvas capture <page> --out <archive-dir> --json`. Each lands as `arm-<id>.png`, keeping the losing arms as a revert record.
|
|
128
|
+
4. Resolve `<archive-dir>` as `.canon/picks/<slug>/` against the main worktree root, since shared session scratch resolves there rather than in a linked worktree.
|
|
129
|
+
5. Delete every page folder on the run's list from under the `content` folder `canon canvas list --json` reports. Touch no page the run did not add, whatever its name.
|
|
130
|
+
6. Stop the canvas server if this run started it, and leave one the operator started running.
|
|
131
|
+
7. Leave the renders in a live track's `evidence/<slug>/renders/`, since `plan-groundwork` treats evidence as durable.
|
|
132
|
+
8. Report each page whose delete is refused, naming the path for the operator to remove. The pick is applied either way.
|
|
133
|
+
9. Report every surface that changed, each on its own line, name the winning arm by its id and its cost, and report the archive path.
|
|
134
|
+
|
|
135
|
+
The picked round is the final one unless Step 4 resolved a revert. Archiving any other page lets item 5 delete the winning arm with nothing kept, and a variant left on the canvas is a second design nobody maintains.
|
|
136
|
+
|
|
137
|
+
## Reading a measurement
|
|
138
|
+
|
|
139
|
+
A capture proves appearance and a measurement proves a relationship, so reach for the second whenever the claim is a number, such as a contrast ratio, a column width, or a tap target. `canon drive` runs the probes and ships the failure modes each one carries.
|
|
140
|
+
|
|
141
|
+
- Composite alpha before reading a color. A `color-mix` toward transparent resolves to channels plus an alpha, and reading them as opaque reports a color nobody sees.
|
|
142
|
+
- Sample inside the shape. A patch at a bounding box corner misses a round control and reads the page behind it.
|
|
143
|
+
- Ask whether a reader would see the thing. A panel sized a healthy 1517 by 639 passed every size check while sitting 1868px above the viewport.
|
|
144
|
+
|
|
145
|
+
`canon drive` reports findings and never gates. Read its record as evidence for the operator rather than as a filter over the arms, since the probe catalog has not earned the right to drop one.
|
|
146
|
+
|
|
147
|
+
## What this delegates
|
|
148
|
+
|
|
149
|
+
Cite these rather than restating them. A step reimplemented here rots against the skill that owns it.
|
|
150
|
+
|
|
151
|
+
- `plan-feature` plans the work once the pick is made, and declares the pull request boundary that plan carries
|
|
152
|
+
- `design-taste` carries the layer catalog, the ordering, grey-boxing, and the defaults an arm should reach past
|
|
153
|
+
- `write-human` carries the voice for any copy an arm puts in front of a reader
|
|
154
|
+
|
|
155
|
+
### Git and review
|
|
156
|
+
|
|
157
|
+
Commits, review, and the canvas mechanics each have an owner.
|
|
158
|
+
|
|
159
|
+
- `git-stage`, `git-pr`, and `git-followup` carry the commits and the pull request
|
|
160
|
+
- `review-pr` and `review-address` run the review pass
|
|
161
|
+
- `canon:canvas-board` carries the canvas start-and-check sequence, the main-root write route for a frame, and the selection and capture refusals
|
|
@@ -29,7 +29,7 @@ Read these in parallel from the project root, skipping any that do not exist:
|
|
|
29
29
|
- `canon/REQUIREMENTS.md`: feature scope and non-goals
|
|
30
30
|
- `.canon/tasks/index.md`: current scope and status, then any task file the feature relates to
|
|
31
31
|
|
|
32
|
-
Also read `canon/DESIGN.md` when the feature touches code or UI, for visual intent and component rules, with values read from the stylesheet its lead names. Skip it for prose, docs, catalog, or config-only changes.
|
|
32
|
+
Also read `canon/DESIGN.md` when the feature touches code or UI, for visual intent and component rules, with values read from the stylesheet its lead names. Skip it for prose, docs, catalog, or config-only changes. For a UI feature, read `canon/design/index.md` too, if it exists, for the surfaces with an accepted design.
|
|
33
33
|
|
|
34
34
|
Coding standards live in `.claude/rules/`. Claude Code loads them automatically, and path-scoped rules apply to the files they match.
|
|
35
35
|
|
|
@@ -69,6 +69,7 @@ Every `- Suggested:` line takes senior judgment, picking the best option in one
|
|
|
69
69
|
|
|
70
70
|
- Suggest a real default when best practice, the codebase, or prior context points to one
|
|
71
71
|
- Load `canon:codebase-layout` before `**Files to touch:**` when an entry names a path that does not exist yet, and give each new path its placement reason. Report it if it does not resolve.
|
|
72
|
+
- Fill `**Design references:**` with the `canon/design/<surface>/` folder for each surface a UI file in `**Files to touch:**` renders, and write `None identified.` in a project with no folder
|
|
72
73
|
- Write `**Verification:**` as one bullet per outcome naming the test or command that proves it
|
|
73
74
|
- Write `**Review focus:**` as the inputs or states that would break the change, carrying the risk you understood to the executor and the reviewer
|
|
74
75
|
|
|
@@ -69,16 +69,17 @@ A staged batch is a concern of its own and takes its own file rather than a `**B
|
|
|
69
69
|
|
|
70
70
|
The document opens with `# Feature: <short title>` and one paragraph stating what is being built and why now. The sections below follow in this order.
|
|
71
71
|
|
|
72
|
-
| Section
|
|
73
|
-
|
|
|
74
|
-
| `## Summary`
|
|
75
|
-
| `**Constraints:**`
|
|
76
|
-
| `**Files to touch:**`
|
|
77
|
-
| `**
|
|
78
|
-
| `**
|
|
79
|
-
| `**
|
|
80
|
-
| `**
|
|
81
|
-
| `**
|
|
72
|
+
| Section | Holds | Required |
|
|
73
|
+
| ------------------------ | --------------------------------------------------------------------------- | ------------------------------------------------- |
|
|
74
|
+
| `## Summary` | three to five one-line bullets: the goal, the deliverables, the trade-off | Always |
|
|
75
|
+
| `**Constraints:**` | durable rules the work must respect | When supplied |
|
|
76
|
+
| `**Files to touch:**` | each file with a one-line reason | Always |
|
|
77
|
+
| `**Design references:**` | the tracked design folders the change builds against, each with its surface | When Files to touch names a rendered-surface file |
|
|
78
|
+
| `**Verification:**` | the test or command that proves each outcome | Always |
|
|
79
|
+
| `**Risks:**` | conflicts, coupling, and the tricky spots | Always |
|
|
80
|
+
| `**Review focus:**` | the inputs or states that would break the change, for the reviewer | Always |
|
|
81
|
+
| `**Questions:**` | numbered open decisions, each with a suggestion and an answer slot | Always |
|
|
82
|
+
| `**Sources:**` | the outside sources a decision rests on, each with its quoted passage | When a decision rests on an outside source |
|
|
82
83
|
|
|
83
84
|
- Write each marker as the table gives it. `Summary` opens the prose a reader scans, so it takes an H2, and the others are labels over lists rather than sections of prose.
|
|
84
85
|
- A section in the other spelling is still that section, since `## Risks` and `**Risks:**` name one thing, and either spelling breaks a depth run
|
|
@@ -133,6 +134,15 @@ A batch in a fan-in set declares its side in a constraint bullet, ``Fan-in membe
|
|
|
133
134
|
|
|
134
135
|
A constraint naming a `.canon/ready/` folder is a third shape beside the hold and the shared path. It makes that folder's files the verbatim source for the paths this plan's `**Files to touch:**` lists, per `ready.md`, so the executing session copies those paths rather than authoring them.
|
|
135
136
|
|
|
137
|
+
### Design references
|
|
138
|
+
|
|
139
|
+
A plan whose `**Files to touch:**` names a rendered-surface file (`.tsx`, `.jsx`, `.astro`, `.vue`, `.svelte`, `.html`, or `.css`) carries this section. It tells the building session which accepted design to open before it writes a line.
|
|
140
|
+
|
|
141
|
+
- Give each entry a folder path under `canon/design/` and the surface it governs, as one bullet
|
|
142
|
+
- Write `None identified.` when the project has no `canon/design/` folder or no folder governs the change, so the section reads as considered
|
|
143
|
+
- Cite a tracked folder only, since the building session opens its light and dark images and its frame HTML from the working tree
|
|
144
|
+
- `canon records validate plans` reports `section-missing` for a plan that names a rendered-surface file and omits the section
|
|
145
|
+
|
|
136
146
|
### Verification
|
|
137
147
|
|
|
138
148
|
Every outcome reaches the review with its proof named.
|
|
@@ -233,6 +243,10 @@ This contract inverts the one an intake folder keeps, where an empty slot means
|
|
|
233
243
|
|
|
234
244
|
- `<path/to/file>`: <reason>
|
|
235
245
|
|
|
246
|
+
**Design references:**
|
|
247
|
+
|
|
248
|
+
- `canon/design/<surface>/`: <the surface it governs>
|
|
249
|
+
|
|
236
250
|
**Verification:**
|
|
237
251
|
|
|
238
252
|
- <outcome>: `<test or command that proves it>`
|
|
@@ -37,7 +37,7 @@ Write only inside `.canon/groundwork/<nn>-<slug>/`. A feature plan, source chang
|
|
|
37
37
|
|
|
38
38
|
What a spike produces stays inside the track, under `.canon/groundwork/<nn>-<slug>/evidence/`, which the first rule already permits. Mode detection matches only top-level entries, so a nested folder cannot be mistaken for a track, and scratch holds only what can be deleted without loss.
|
|
39
39
|
|
|
40
|
-
A `
|
|
40
|
+
A `pick-by-eye` run invoked from inside a live track follows its own branch for this. It writes its renders to `evidence/` here, and drafts its candidates as canvas pages under `.canon/canvas/` that its close deletes.
|
|
41
41
|
|
|
42
42
|
### Reading and backing
|
|
43
43
|
|
|
@@ -105,7 +105,7 @@ This overrides the paths-only reporting the project states generally, which stay
|
|
|
105
105
|
- `.canon/intake/<nn>-<slug>/05-coverage.md` gains items 6 to 8 under a new `## What the merge gate covers`
|
|
106
106
|
- `.canon/intake/<nn>-<slug>/00-overview.md` cluster rows and verdict counts updated
|
|
107
107
|
|
|
108
|
-
**Routing:** <N> plan
|
|
108
|
+
**Routing:** <N> ready to plan, <N> groundwork candidates, <N> already settled
|
|
109
109
|
|
|
110
110
|
**Open questions:** <N> awaiting your call
|
|
111
111
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan-ready
|
|
3
|
+
description: Why writing a ready folder, its overview, the thin plan, and the task row is one invocation rather than four hand writes, and where the boundary against the planning and shipping skills falls
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Plan ready requirement
|
|
7
|
+
|
|
8
|
+
## Gap
|
|
9
|
+
|
|
10
|
+
Without this skill, a session holding finished files that hands them to a worker:
|
|
11
|
+
|
|
12
|
+
- Writes the folder, the overview, the plan, and the task row as four separate hand writes, and the four drift from each other because nothing compares them.
|
|
13
|
+
- Lists a destination in the overview that the plan's `**Files to touch:**` omits, or the reverse. The omitted path is invisible to `plan-reach`, so a second track writes the same file and neither side finds out.
|
|
14
|
+
- Picks the next ordinal by reading only the live folder, and reuses a number an archived folder already spent, which the pull request that shipped it cites by name.
|
|
15
|
+
- Picks a phase label by scanning the live board alone, which is the scan that let two sessions hand out one label within minutes of each other.
|
|
16
|
+
- Reads the label bare, which reserves nothing and returns one a live claim already holds until that claim's task file lands.
|
|
17
|
+
- Leaves the plan's `**Constraints:**` without a line naming the folder as the verbatim source, so the worker reads the files as inspiration and writes its own version.
|
|
18
|
+
- Leaves a note, an alternate, or a draft passage in the folder beside the real files, so the worker guesses which one is the source.
|
|
19
|
+
- Writes into the main worktree root from a linked worktree with `Edit` or `Write`, which the isolation guard refuses, and takes the refusal's redirect into a second gitignored copy no later session reads.
|
|
20
|
+
- Reports the handoff as done while the archive move at the end, which no verb performs, is left for someone to remember.
|
|
21
|
+
|
|
22
|
+
## Must
|
|
23
|
+
|
|
24
|
+
- Refuse before writing when the operator has named no finished file, since a folder assembled from a description is a plan with extra steps.
|
|
25
|
+
- Read the ordinal from the live folder and its archive together, so a spent number is never reused.
|
|
26
|
+
- Take the phase label from `canon tasks next-label --claim` rather than from a scan of its own or a bare read, and stop on a binary that predates the flag rather than falling back.
|
|
27
|
+
- Derive the overview's `destinations` and the plan's `**Files to touch:**` from one list, and compare the two before reporting, so neither can name a path the other lacks.
|
|
28
|
+
- Write the plan's `**Constraints:**` line naming the folder as the verbatim source.
|
|
29
|
+
- Copy each finished file whole to its destination path inside the folder, and carry nothing else into it.
|
|
30
|
+
- Write the plan and the task through `canon tasks plan-link`, `canon records validate plans`, and `canon markdown audit` rather than by restating what those verbs check.
|
|
31
|
+
- Place the task's row by the three branches `task-board` Step 4 states, so a solo project never ends with a task file on no surface.
|
|
32
|
+
- Route a write at the main root from a linked worktree through `Bash`, the way `session-worktree` routes it.
|
|
33
|
+
- Name the archive move in the closing report, since the skill writes a folder that stays live until someone moves it.
|
|
34
|
+
|
|
35
|
+
## Must not
|
|
36
|
+
|
|
37
|
+
- Edit a finished file. The worker copies verbatim, so a change made here is a change the warm session should have made before invoking the skill.
|
|
38
|
+
- Hardcode a branch type, which `branch.md` owns, or restate the folder shape, which `ready.md` owns.
|
|
39
|
+
- Write `priority.md` or `backlog.md` where an orchestrator is on the roster or the session is a worker or planner, since one board writer at a time is what keeps a gitignored board safe. Those two cases report the row instead.
|
|
40
|
+
- Automate the archive move. No verb owns the relocation, and a skill doing it by hand would be the second copy of a step the standard already states.
|
|
41
|
+
- Dispatch or start the worker, which belongs to whoever runs the board.
|
|
42
|
+
|
|
43
|
+
## Guards
|
|
44
|
+
|
|
45
|
+
- No finished file named, stop: `❌ No finished file named. A ready folder carries text that already exists, so write the files first or use /canon:plan-feature.`
|
|
46
|
+
- A named file that does not resolve, stop: `❌ <path> does not exist. Name a file that is already written.`
|
|
47
|
+
|
|
48
|
+
## Out of scope
|
|
49
|
+
|
|
50
|
+
- `plan-feature` writes a plan describing a change nobody has written yet. This begins from text already written and writes a plan thin enough to point at it.
|
|
51
|
+
- `role-worker` copies the folder into a worktree and ships it. This stops once the three artifacts exist.
|
|
52
|
+
- `task-board` creates a task file for a row with no ready folder. This writes the row it needs beside the folder and calls the same verbs.
|
|
53
|
+
- `git-ship` ships a branch, and a ready folder never reaches one.
|
|
54
|
+
- `references/ready.md` owns the folder's shape and lifecycle, and this skill owns the procedure that produces it, the way `write-human` and the `markdown` rule split.
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plan-ready
|
|
3
|
+
description: Writes a ready folder for finished files, its `00-overview.md`, the thin plan that points at it, and the task with a board row placed, reported to an orchestrator, or left to the operator, in one invocation. Use when asked to "write a ready folder", "hand these files to a worker", "package these finished files for a worker", "make a ready handoff", or when a session already holds the exact text of a skill, rule, or doc and a worker should copy it rather than author it. Do NOT use to plan a change nobody has written yet, which is `plan-feature`, to copy a folder into a worktree and ship it, which is `role-worker`, or to file a task with no finished files behind it, which is `task-board`.
|
|
4
|
+
metadata:
|
|
5
|
+
family: generate
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Plan ready
|
|
9
|
+
|
|
10
|
+
A warm session that has already written a change hands the exact text to the worker that ships it. This skill writes the three artifacts that handoff needs and stops before anyone is dispatched.
|
|
11
|
+
|
|
12
|
+
Read these in parallel before writing:
|
|
13
|
+
|
|
14
|
+
- `${CLAUDE_SKILL_DIR}/references/ready.md`: the folder layout, the overview frontmatter, the mirrored tree, and the thin-plan contract
|
|
15
|
+
- `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md`: the plan's sections and its answer contract
|
|
16
|
+
- `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md`: the task file's shape and origin lines
|
|
17
|
+
- `${CLAUDE_SKILL_DIR}/references/assembly.md`: the overview and thin-plan templates and the destination match check
|
|
18
|
+
|
|
19
|
+
## Guards
|
|
20
|
+
|
|
21
|
+
- If the operator named no finished file, stop: `❌ No finished file named. A ready folder carries text that already exists, so write the files first or use /canon:plan-feature.`
|
|
22
|
+
- If a named file does not resolve, stop: `❌ <path> does not exist. Name a file that is already written.`
|
|
23
|
+
- Resolve `<main-root>` as `git worktree list --porcelain | grep -m 1 '^worktree ' | cut -d' ' -f2-`. The folder, the plan, and the task all live there.
|
|
24
|
+
|
|
25
|
+
## Step 1: read the finished files
|
|
26
|
+
|
|
27
|
+
1. Take each finished file with the destination path the operator gave it. A file arriving with no destination is asked for once, since the mirrored tree cannot place it.
|
|
28
|
+
2. Read every file whole. The overview states what the worker still owns beyond copying, and that comes off the files, not off the operator's description of them.
|
|
29
|
+
3. Take the branch type from `${CLAUDE_SKILL_DIR}/../git-branch/references/branch.md`, never from a list carried here.
|
|
30
|
+
4. Derive one kebab slug for the change. The folder, the plan, and the task all carry it.
|
|
31
|
+
|
|
32
|
+
## Step 2: allocate the ordinal and the label
|
|
33
|
+
|
|
34
|
+
Read `<main-root>/.canon/ready/` and `<main-root>/.canon/ready/archive/` together and take the highest `<nn>` across both, plus one. A folder set with no entry takes `01`. Keep this skill-local. No verb allocates a ready ordinal, and two writers running at once can claim one number, so re-read the folder immediately before Step 3 writes.
|
|
35
|
+
|
|
36
|
+
Claim the label through the verb rather than reading it bare or scanning for it:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
canon tasks next-label --claim --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The claim reserves the label under `.canon/ordinal-locks/`, so a second session allocating at the same moment gets the next one. A bare read reserves nothing and can return a label a live claim already holds.
|
|
43
|
+
|
|
44
|
+
Branch on the record's `reason` rather than on the exit code, taking `label` from a record that carries one.
|
|
45
|
+
|
|
46
|
+
- `label-contended` means re-run the claim
|
|
47
|
+
- Report the verb as unavailable and stop when the binary carries no `next-label` subcommand, or prints no record for an unknown `--claim`, since it predates the flag
|
|
48
|
+
- Never fall back to a bare read or a label picked by hand, which reopens the collision the claim exists to prevent
|
|
49
|
+
|
|
50
|
+
## Step 3: write the overview
|
|
51
|
+
|
|
52
|
+
Write `<main-root>/.canon/ready/<nn>-<slug>/00-overview.md` from the template in `${CLAUDE_SKILL_DIR}/references/assembly.md`. Set `destinations` from the Step 1 list and nothing else, and state in prose what the worker still owns, or `nothing further` where the files are the whole change.
|
|
53
|
+
|
|
54
|
+
## Step 4: mirror the tree
|
|
55
|
+
|
|
56
|
+
Copy each finished file to `<main-root>/.canon/ready/<nn>-<slug>/<destination path>`, one command per file, so the tree mirrors the destinations exactly.
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
install -D -m 0644 <source> <main-root>/.canon/ready/<nn>-<slug>/<destination path>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- Copy whole and edit nothing. A change wanted now is made in the source file first and copied after.
|
|
63
|
+
- Carry no notes, alternates, or drafts into the folder. Anything else belongs in the plan or the pull request body.
|
|
64
|
+
- Write each of these at the main root, routed the way `session-worktree` states. Create a whole new file with a heredoc.
|
|
65
|
+
|
|
66
|
+
## Step 5: write the thin plan
|
|
67
|
+
|
|
68
|
+
Write `<main-root>/.canon/plans/feature-<slug>.md` from the template, by heredoc, per `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md`.
|
|
69
|
+
|
|
70
|
+
- List every Step 1 destination under `**Files to touch:**`, each with one clause on why it changes, pointing at the folder's copy rather than restating it.
|
|
71
|
+
- Add a `**Constraints:**` line naming the ready folder as the verbatim source for those paths.
|
|
72
|
+
- Name the branch type from Step 1 in `## Summary`. Write `None identified.` under `**Questions:**` unless a call is genuinely the operator's.
|
|
73
|
+
|
|
74
|
+
Run the match check in `${CLAUDE_SKILL_DIR}/references/assembly.md` before going further. The two lists are one list, and a path in either without the other stops the run.
|
|
75
|
+
|
|
76
|
+
## Step 6: write the task
|
|
77
|
+
|
|
78
|
+
Write `<main-root>/.canon/tasks/<label>-<slug>.md` by heredoc from the label Step 2 claimed, never calling the verb again, which would claim another. Its frontmatter, H1, and `## Outcomes` follow `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md`.
|
|
79
|
+
|
|
80
|
+
Write a `Ready:` line beside the `Plan:` line pointing at the folder, then point the task at the plan through the verb:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
canon tasks plan-link <task-stem> .canon/plans/feature-<slug>.md --json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Branch on the record rather than on the exit. The `Ready:` line orients a worker reading the task, and `canon tasks archive` reads it to move the folder on ship.
|
|
87
|
+
|
|
88
|
+
### Place the row
|
|
89
|
+
|
|
90
|
+
A task file with no row is a dropped task, so place the row in the same pass. The plan exists and no worker holds it yet, so the row takes `## Up next`, per the tests in `${CLAUDE_SKILL_DIR}/../task-board/references/board.md`.
|
|
91
|
+
|
|
92
|
+
A path `canon tasks plan-reach` reports as claimed is a shared file rather than a hold. Name each one and its holder wherever the row is reported, so whoever controls the board decides whether a contract, a relocation, or a sweep holds the row.
|
|
93
|
+
|
|
94
|
+
### Check the roster
|
|
95
|
+
|
|
96
|
+
Check the roster the way `canon:task-board` Step 4 does, reading `canon sessions list --self --json` for this session and `canon sessions list --json` for a same-repository row under another `sessionId` whose `name` starts with `orchestrator-`. A refused read counts as failed.
|
|
97
|
+
|
|
98
|
+
- **Orchestrator found.** Write neither file. Message that session with the row's title, the plan link, and the group with its reason, so two sessions never write the board at once.
|
|
99
|
+
- **Not found, and this session's name starts with `worker-` or `planner-`.** Write neither file, since both role bodies ban a board write. Report the row and its group in Step 8.
|
|
100
|
+
- **Not found otherwise, or the roster read fails.** Run `canon tasks place <stem> --group up-next --waiting "Planned, not dispatched yet"`, since stopping on a failed read strands the task.
|
|
101
|
+
|
|
102
|
+
Say which branch fired in Step 8.
|
|
103
|
+
|
|
104
|
+
Regenerate the task index after writing, since a hook on `Write|Edit` never fires on `Bash`:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
canon indexes regen .canon/tasks
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Step 7: validate
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
canon records validate plans --json
|
|
114
|
+
canon markdown audit <main-root>/.canon/ready/<nn>-<slug>/00-overview.md
|
|
115
|
+
canon markdown audit <main-root>/.canon/plans/feature-<slug>.md
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Fix what the records name in the files this run wrote and re-run once. Report a finding on a file it did not write, such as a neighbor folder missing its overview, without repairing it.
|
|
119
|
+
|
|
120
|
+
## Step 8: report
|
|
121
|
+
|
|
122
|
+
```plaintext
|
|
123
|
+
✅ Ready folder written: .canon/ready/<nn>-<slug>/
|
|
124
|
+
Plan: .canon/plans/feature-<slug>.md
|
|
125
|
+
Task: .canon/tasks/<label>-<slug>.md
|
|
126
|
+
Row: <label> <title>, <written under ## Up next | reported to <orchestrator name> | left for the operator to place>, <reason>
|
|
127
|
+
Archive on ship: canon tasks archive moves the folder to .canon/ready/archive/<nn>-<slug>/
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Name the archive move every time, so whoever ships knows the verb carries the folder and needs no step of their own.
|
|
131
|
+
|
|
132
|
+
## Rules
|
|
133
|
+
|
|
134
|
+
- Edit no finished file. The worker copies verbatim, so a change belongs in the source before this runs.
|
|
135
|
+
- Restate nothing the standards own. A shape question is answered by `ready.md` and a plan question by `plan.md`.
|
|
136
|
+
- Dispatch nothing. Starting the worker belongs to whoever runs the board.
|
|
@@ -5,7 +5,7 @@ description: The overview and thin-plan templates for a ready folder, and the ma
|
|
|
5
5
|
|
|
6
6
|
# Assembly
|
|
7
7
|
|
|
8
|
-
Loaded from Step 3 and Step 5 of `
|
|
8
|
+
Loaded from Step 3 and Step 5 of `plan-ready`. The shape rules live in `${CLAUDE_SKILL_DIR}/references/ready.md` and `${CLAUDE_SKILL_DIR}/../plan-feature/references/plan.md`, so this file holds the fill-in forms and the one check that compares them.
|
|
9
9
|
|
|
10
10
|
## The overview
|
|
11
11
|
|
|
@@ -27,7 +27,7 @@ The folder holds the finished files at their destination paths, so the worker co
|
|
|
27
27
|
|
|
28
28
|
## Scope
|
|
29
29
|
|
|
30
|
-
The `
|
|
30
|
+
The `plan-ready` skill owns the procedure, and this standard owns the shape. It governs a ready folder under `.canon/ready/<nn>-<slug>/`, being its layout, ordinal naming, the overview's frontmatter, what the mirrored tree holds, the thin-plan contract that ships it, and the lifecycle from the live folder to the archive.
|
|
31
31
|
|
|
32
32
|
Does not govern:
|
|
33
33
|
|
|
@@ -7,7 +7,7 @@ description: Why compiling and running a screencast draft needs a routed skill r
|
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
10
|
-
Without this skill, `
|
|
10
|
+
Without this skill, `script-screencast` writes a draft and names `canon demo compile` as the next step, and nothing after that routes a session there or to `canon demo run`. An operator has to know both verbs, type them in order, and read the compile record for unresolved fields by hand. A session that fills one in on its own reproduces the exact failure `canon demo run`'s `plan-unresolved` reason exists to catch, one layer up where nothing enforces it.
|
|
11
11
|
|
|
12
12
|
## Must
|
|
13
13
|
|
|
@@ -25,7 +25,7 @@ Without this skill, `draft-screencast` writes a draft and names `canon demo comp
|
|
|
25
25
|
- Guess or fill a target, a URL, or any other unresolved field
|
|
26
26
|
- Drive the application through anything other than `canon demo run`
|
|
27
27
|
- Install HyperFrames, vendor it, or restate its composition rules, which its own skills own
|
|
28
|
-
- Assume this skill's own invocation frequency needs no check. `
|
|
28
|
+
- Assume this skill's own invocation frequency needs no check. `script-screencast`'s closing block names it by hand, but whether anything else reaches for it beyond that pointer or an operator typing its name has no answer at creation time, so a review pass some months in should read that back rather than take it on faith.
|
|
29
29
|
|
|
30
30
|
## Guards
|
|
31
31
|
|
|
@@ -33,6 +33,6 @@ Without this skill, `draft-screencast` writes a draft and names `canon demo comp
|
|
|
33
33
|
|
|
34
34
|
## Out of scope
|
|
35
35
|
|
|
36
|
-
- Drafting the beats, which `
|
|
36
|
+
- Drafting the beats, which `script-screencast` owns
|
|
37
37
|
- Filling an existing plan's target or URL, which is the operator's own edit
|
|
38
38
|
- Verifying a recording beyond its own caption, which nothing in the toolkit does yet
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: record-screencast
|
|
3
|
-
description: Drives a screencast draft through to a recording. Compiles it with `canon demo compile` when no plan exists yet at the default path, skipping compile when one is already there, runs `canon demo run` once nothing is unresolved, then composes the take into a finished mp4 through HyperFrames when the draft's wrap section asks for anything. Reports every unresolved field from the compile or run record and stops rather than guessing one. Use when asked to "record the screencast", "run the demo", "compile and record this draft", or right after `
|
|
3
|
+
description: Drives a screencast draft through to a recording. Compiles it with `canon demo compile` when no plan exists yet at the default path, skipping compile when one is already there, runs `canon demo run` once nothing is unresolved, then composes the take into a finished mp4 through HyperFrames when the draft's wrap section asks for anything. Reports every unresolved field from the compile or run record and stops rather than guessing one. Use when asked to "record the screencast", "run the demo", "compile and record this draft", or right after `script-screencast` prints its next-step line. Do NOT use to draft the beats, which is `script-screencast`, or to fill in a plan's target or URL, which is the operator's own edit.
|
|
4
4
|
metadata:
|
|
5
5
|
family: generate
|
|
6
6
|
---
|
|
@@ -9,7 +9,7 @@ metadata:
|
|
|
9
9
|
|
|
10
10
|
## Guards
|
|
11
11
|
|
|
12
|
-
- If no draft path is given, stop: `❌ No draft path. Pass the path
|
|
12
|
+
- If no draft path is given, stop: `❌ No draft path. Pass the path script-screencast printed.`
|
|
13
13
|
- Never guess or fill an unresolved field, a target, a URL, or anything else the compile or run record names. Report it and stop.
|
|
14
14
|
- Filling one in reproduces the failure `canon demo run`'s `plan-unresolved` reason exists to catch, one layer up where nothing enforces it
|
|
15
15
|
- Never pass `--force` to compile. A plan at the default output path may carry timing tuned by hand that the draft cannot reproduce.
|