@erclx/canon 5.43.0 → 5.44.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.
Files changed (133) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/backlog-triage/references/apply.md +6 -6
  3. package/claude/skills/canon-cli/SKILL.md +4 -4
  4. package/claude/skills/canvas-board/REQUIREMENT.md +1 -1
  5. package/claude/skills/canvas-board/SKILL.md +1 -1
  6. package/claude/skills/context-fold/references/context.md +1 -1
  7. package/claude/skills/create-skill/REQUIREMENT.md +1 -1
  8. package/claude/skills/create-skill/SKILL.md +2 -2
  9. package/claude/skills/create-skill/references/skill-requirement.md +68 -9
  10. package/claude/skills/create-skill/references/skill.md +1 -1
  11. package/claude/skills/design-identity/REQUIREMENT.md +40 -0
  12. package/claude/skills/design-identity/SKILL.md +138 -0
  13. package/claude/skills/{draft-identity → design-identity}/references/card-route.md +2 -2
  14. package/claude/skills/design-taste/REQUIREMENT.md +4 -4
  15. package/claude/skills/design-taste/SKILL.md +2 -2
  16. package/claude/skills/design-taste/references/kinds.md +1 -1
  17. package/claude/skills/design-taste/references/preflight.md +1 -1
  18. package/claude/skills/draft-and-pick/REQUIREMENT.md +8 -69
  19. package/claude/skills/draft-and-pick/SKILL.md +3 -153
  20. package/claude/skills/draft-doc/REQUIREMENT.md +9 -30
  21. package/claude/skills/draft-doc/SKILL.md +4 -76
  22. package/claude/skills/draft-figure/REQUIREMENT.md +8 -42
  23. package/claude/skills/draft-figure/SKILL.md +3 -77
  24. package/claude/skills/draft-identity/REQUIREMENT.md +8 -23
  25. package/claude/skills/draft-identity/SKILL.md +3 -130
  26. package/claude/skills/draft-ready/REQUIREMENT.md +8 -37
  27. package/claude/skills/draft-ready/SKILL.md +3 -128
  28. package/claude/skills/draft-screencast/REQUIREMENT.md +8 -23
  29. package/claude/skills/draft-screencast/SKILL.md +3 -62
  30. package/claude/skills/draft-slides/REQUIREMENT.md +8 -27
  31. package/claude/skills/draft-slides/SKILL.md +3 -72
  32. package/claude/skills/draw-figure/REQUIREMENT.md +59 -0
  33. package/claude/skills/draw-figure/SKILL.md +85 -0
  34. package/claude/skills/{draft-figure → draw-figure}/references/architecture-set.md +2 -2
  35. package/claude/skills/{draft-figure → draw-figure}/references/hand-drawn.md +2 -2
  36. package/claude/skills/{draft-figure → draw-figure}/references/mermaid-path.md +2 -2
  37. package/claude/skills/{draft-figure → draw-figure}/references/mermaid.md +1 -1
  38. package/claude/skills/make-deck/REQUIREMENT.md +44 -0
  39. package/claude/skills/make-deck/SKILL.md +80 -0
  40. package/claude/skills/markdown-craft/REQUIREMENT.md +1 -1
  41. package/claude/skills/markdown-craft/SKILL.md +2 -2
  42. package/claude/skills/pick-by-eye/REQUIREMENT.md +86 -0
  43. package/claude/skills/pick-by-eye/SKILL.md +161 -0
  44. package/claude/skills/plan-feature/SKILL.md +2 -1
  45. package/claude/skills/plan-feature/references/plan.md +24 -10
  46. package/claude/skills/plan-groundwork/SKILL.md +1 -1
  47. package/claude/skills/plan-intake/SKILL.md +1 -1
  48. package/claude/skills/plan-ready/REQUIREMENT.md +54 -0
  49. package/claude/skills/plan-ready/SKILL.md +136 -0
  50. package/claude/skills/{draft-ready → plan-ready}/references/assembly.md +1 -1
  51. package/claude/skills/{draft-ready → plan-ready}/references/ready.md +1 -1
  52. package/claude/skills/record-screencast/REQUIREMENT.md +3 -3
  53. package/claude/skills/record-screencast/SKILL.md +2 -2
  54. package/claude/skills/role-orchestrator/REQUIREMENT.md +1 -1
  55. package/claude/skills/role-orchestrator/references/orchestrator-dispatch.md +5 -2
  56. package/claude/skills/role-orchestrator/references/orchestrator-parked.md +2 -2
  57. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +18 -13
  58. package/claude/skills/role-planner/SKILL.md +2 -1
  59. package/claude/skills/role-worker/SKILL.md +9 -0
  60. package/claude/skills/script-screencast/REQUIREMENT.md +40 -0
  61. package/claude/skills/script-screencast/SKILL.md +70 -0
  62. package/claude/skills/{draft-screencast → script-screencast}/references/beats-template.md +2 -2
  63. package/claude/skills/search-craft/REQUIREMENT.md +4 -4
  64. package/claude/skills/search-craft/SKILL.md +1 -1
  65. package/claude/skills/target-setup/SKILL.md +1 -0
  66. package/claude/skills/task-board/SKILL.md +11 -9
  67. package/claude/skills/task-board/references/board.md +15 -12
  68. package/claude/skills/teach-workspace/SKILL.md +1 -1
  69. package/claude/skills/teach-workspace/references/lesson-craft.md +2 -2
  70. package/claude/skills/ui-checklist/SKILL.md +2 -0
  71. package/claude/skills/write-doc/REQUIREMENT.md +46 -0
  72. package/claude/skills/write-doc/SKILL.md +83 -0
  73. package/claude/skills/{draft-doc → write-doc}/references/context.md +2 -2
  74. package/claude/skills/{draft-doc → write-doc}/references/docs.md +2 -2
  75. package/claude/skills/{draft-doc → write-doc}/references/readme.md +2 -2
  76. package/claude/skills/{draft-doc → write-doc}/references/wiki-kind.md +3 -3
  77. package/docs/agents/markdown-audit.md +4 -2
  78. package/docs/agents/migrate.md +2 -2
  79. package/docs/target/migrations.md +17 -4
  80. package/docs/target/projects.md +1 -1
  81. package/docs/workflow/parallel-features.md +3 -2
  82. package/docs/workflow/skill-map-on-request.md +18 -12
  83. package/docs/workflow/skill-map.md +13 -12
  84. package/docs/workflow/visual-design-workflow.md +2 -2
  85. package/governance/ledger/framework/astro.md +73 -0
  86. package/governance/ledger/framework/fastapi.md +76 -0
  87. package/governance/ledger/framework/nextjs.md +86 -0
  88. package/governance/ledger/framework/react.md +83 -0
  89. package/governance/ledger/framework/shadcn.md +60 -0
  90. package/governance/ledger/framework/tailwind.md +55 -0
  91. package/governance/rules/framework/astro.md +12 -14
  92. package/governance/rules/framework/fastapi.md +20 -24
  93. package/governance/rules/framework/nextjs.md +19 -27
  94. package/governance/rules/framework/react.md +22 -33
  95. package/governance/rules/framework/shadcn.md +11 -15
  96. package/governance/rules/framework/tailwind.md +12 -14
  97. package/governance/rules/writing/markdown.md +1 -1
  98. package/package.json +1 -1
  99. package/src/claude/cases/authoring.ts +15 -3
  100. package/src/claude/cases/misc.ts +12 -0
  101. package/src/claude/cases/workflow.ts +19 -1
  102. package/src/claude/skills-audit.ts +113 -1
  103. package/src/commands/claude.ts +34 -11
  104. package/src/commands/demo.ts +1 -1
  105. package/src/commands/markdown.ts +1 -1
  106. package/src/commands/migrate.ts +4 -0
  107. package/src/commands/pr.ts +30 -6
  108. package/src/commands/tasks.ts +383 -2
  109. package/src/context/audit.ts +1 -1
  110. package/src/demo/beats.ts +1 -1
  111. package/src/gov/audit.ts +3 -2
  112. package/src/markdown/scope.ts +45 -35
  113. package/src/migrate/record-layout.ts +1 -1
  114. package/src/migrate/skill-names.ts +68 -21
  115. package/src/pr/frames.ts +14 -3
  116. package/src/records/validate.ts +31 -0
  117. package/src/tasks/board.ts +854 -0
  118. package/src/tasks/record.ts +20 -1
  119. package/src/tasks/validate.ts +206 -9
  120. package/tooling/astro/configs/card-src/pages/og-card.astro +1 -1
  121. package/tooling/astro/reference.md +2 -2
  122. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +65 -0
  123. package/tooling/claude/seeds/.claude/settings.json +4 -0
  124. /package/claude/skills/{draft-figure → draw-figure}/references/figures.md +0 -0
  125. /package/claude/skills/{draft-slides → make-deck}/references/deck.md +0 -0
  126. /package/claude/skills/{draft-and-pick → pick-by-eye}/references/live-arms.md +0 -0
  127. /package/claude/skills/{draft-doc → write-doc}/references/readme/agent-facing.md +0 -0
  128. /package/claude/skills/{draft-doc → write-doc}/references/readme/application.md +0 -0
  129. /package/claude/skills/{draft-doc → write-doc}/references/readme/cli.md +0 -0
  130. /package/claude/skills/{draft-doc → write-doc}/references/readme/library.md +0 -0
  131. /package/claude/skills/{draft-doc → write-doc}/references/readme/plugin.md +0 -0
  132. /package/claude/skills/{draft-doc → write-doc}/references/requirements.md +0 -0
  133. /package/claude/skills/{draft-doc → write-doc}/references/wiki.md +0 -0
@@ -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 | 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
- | `**Verification:**` | the test or command that proves each outcome | Always |
78
- | `**Risks:**` | conflicts, coupling, and the tricky spots | Always |
79
- | `**Review focus:**` | the inputs or states that would break the change, for the reviewer | Always |
80
- | `**Questions:**` | numbered open decisions, each with a suggestion and an answer slot | Always |
81
- | `**Sources:**` | the outside sources a decision rests on, each with its quoted passage | When a decision rests on an outside source |
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 `draft-and-pick` 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.
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-ready, <N> groundwork candidates, <N> already settled
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 `draft-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.
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 `draft-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.
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, `draft-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.
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. `draft-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.
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 `draft-screencast` owns
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 `draft-screencast` prints its next-step line. Do NOT use to draft the beats, which is `draft-screencast`, or to fill in a plan's target or URL, which is the operator's own edit.
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 draft-screencast printed.`
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.
@@ -79,7 +79,7 @@ Dispatch parts from what it checked in three ways. The gate and the worker each
79
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
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
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 `## Run now` is empty or every row in it reads claimed, rather than waking again to fire on a board nobody is clearing
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
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
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
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
@@ -3,7 +3,7 @@ title: Orchestrator dispatch runbook
3
3
  description: The plan-answer gate, the collision check before a self-dispatch, the conflict check against the tracks in flight and the evidence it rests on, the branch the launch names, the one model test applied to each role, the fallback to a human launch, and the loop's stopping condition
4
4
  ---
5
5
 
6
- Run this at loop step 4, for a `## Run now` row whose plan is verified, in place of handing the worktree to a human. The conflict check below is where that row is tested against every track in flight, and it is the one statement of what holds a row there.
6
+ Run this at loop step 4, for a `## Up next` row whose plan is verified, in place of handing the worktree to a human. The conflict check below is where that row is tested against every track in flight, and it is the one statement of what holds a row there.
7
7
 
8
8
  ## Contents
9
9
 
@@ -40,6 +40,7 @@ Never shorten a non-conforming slug here, since a rename parts the branch from t
40
40
 
41
41
  Run `canon tasks plan-answers <plan> --json` and read `launchable` off the record. Branch on `launchable` rather than on the exit code, which a wrapping shell function can flatten to zero and so read a held row as clear.
42
42
 
43
+ - Hold a row whose `Waiting on` has not cleared, which no other check reads
43
44
  - `launchable: true`: the plan answers itself, so proceed to the branch check.
44
45
  - `launchable: false`: report every entry in `open`, each with its question label and stated reason, and hand the row to the human-launch line below
45
46
  - Never fill the slot on the operator's behalf, the one move the plan standard forbids outright
@@ -152,6 +153,8 @@ A row qualifies for that pick when its plan carries no open question and touches
152
153
 
153
154
  Read `${CLAUDE_SKILL_DIR}/references/orchestrator-launch.md` once every check above clears, and launch from its build template, which sits beside the review-address and planning shapes that skip these checks. A cloud row launches from `${CLAUDE_SKILL_DIR}/references/orchestrator-cloud-launch.md`, since the VM shares no plugin or board.
154
155
 
156
+ Once the launch succeeds, run `canon tasks promote <stem>`.
157
+
155
158
  ## Fall back to the human
156
159
 
157
160
  Hand the row to the human-launch line in step 4 instead of dispatching when any of these hold, and name which one. A shared file alone is not listed.
@@ -171,4 +174,4 @@ Hand the person one command, `/canon:auto-ship <plan>`, naming the row, the plan
171
174
 
172
175
  ## Stop the loop
173
176
 
174
- Wrapped in `/loop`, re-run the check against `## Run now` on each wake, and stop once the group is empty or every row reads `claimed: true`. Report that once, on the wake that finds it, rather than polling a board nobody is clearing, the reasoning `orchestrator-poll.md` carries for the review trigger.
177
+ Wrapped in `/loop`, re-run the check against `## Up next` on each wake, and stop once the group is empty or every row left in it is held. Report that once, on the wake that finds it, rather than polling a board nobody is clearing, the reasoning `orchestrator-poll.md` carries for the review trigger.
@@ -55,7 +55,7 @@ Every measurement this pass takes decides whether a row can start rather than ho
55
55
 
56
56
  Write the result into the row, since a re-test reported in chat is lost at the next compaction and measured again.
57
57
 
58
- - Rewrite a blocker cell whose test no longer holds, and move the row to the group its new state puts it in
58
+ - Rewrite a blocker cell whose test no longer holds through `canon tasks block <stem> "<blocker>"`, and move the row to the group its new state puts it in through `canon tasks place`
59
59
  - Record the measurement in the task's `## Findings` as a line labeled with this session and the date, per `${CLAUDE_SKILL_DIR}/../task-board/references/tasks.md`
60
60
  - `### Writing the board` in `role-orchestrator` owns the method, and `canon tasks validate` runs once the board is rewritten and before the report
61
61
 
@@ -69,7 +69,7 @@ A backlog row carries no blocker cell, since `${CLAUDE_SKILL_DIR}/../task-board/
69
69
 
70
70
  ### Moving a cleared row
71
71
 
72
- A cleared row moves out of `backlog.md` onto the bottom of `## Needs a plan`, with a `Waiting on` cell stating what changed and ending with the word `last`.
72
+ A cleared row moves out of `backlog.md` onto the bottom of `## Needs a plan` in one call, `canon tasks place <stem> --group needs-a-plan --bottom --waiting "<what changed>. Last"`.
73
73
 
74
74
  - `canon tasks validate`'s ordering check reads `last` as the ordinal the bottom placement claims
75
75
  - A cell stating only what changed matches neither the ordinal nor the rank reading, raising a finding against the pass's own row
@@ -25,7 +25,7 @@ The third trigger reaches a window the first two cannot. A session with three wo
25
25
  - Run `task-complete` to archive one the hook left in place
26
26
  - A task whose outcomes are standing policy never closes, so hand it to a worker to encode the policy where it is enforced, then cut the outcomes with the reason and archive once that branch merges
27
27
  - Encoding it from this session would write a tracked file, which `## Boundaries` in the skill body forbids
28
- 4. Read `.canon/tasks/priority.md` and count entries under its `## Run now` heading that carry a written plan. Keep one in reserve beyond what is running.
28
+ 4. Read `.canon/tasks/priority.md` and count the `## Up next` rows whose `Waiting on` has cleared, since a blocked row is no reserve. `## Run now` is what is running, so keep one in reserve beyond it.
29
29
  5. Promote from the top of `## Needs a plan`, where the last sweep recorded what to plan next.
30
30
  - Depart from that order when something changed under it and say what, since a position nobody honors is the ordering going stale
31
31
  - The order is set by whether a task establishes functionality, so prefer one that adds or proves a mechanism over one that trims, tidies, or audits
@@ -53,27 +53,32 @@ That block is the detail. Lead the reply with the three slots under `## Every la
53
53
 
54
54
  ## Writing the board
55
55
 
56
- Promoting, demoting, and archiving a row all write `.canon/tasks/priority.md`, and this session is the only writer apart from `canon tasks archive`. Moving a task between the board and `.canon/tasks/backlog.md` writes both files, and this session is that file's only writer.
56
+ Write `.canon/tasks/priority.md` through the `canon tasks` verbs alone, each reading the file once, rendering every table, and writing it once. Beside this session, `canon tasks archive` drops a shipped row and `plan-link` promotes a parked one.
57
57
 
58
- - Edit with the file-editing tool, which errors on a non-match, where a shell stream editor or an inline replace exits clean and leaves the board wrong
59
- - Write both halves of a move before reporting it, since a row on neither surface leaves a task file nothing names in a gitignored folder with no history
60
- - `canon tasks validate` reports that state, so run it after any move
61
- - Put the reason a row sits where it does in its Waiting on cell, since a row promoted with the cell left alone carries an order the next sweep cannot check
58
+ | Move | Verb |
59
+ | ----------------------------------------- | ---------------------------------------------------------- |
60
+ | A backlog row onto the board, or across | `canon tasks place <stem> --group <group> --waiting "..."` |
61
+ | A planned row to `## Run now` on dispatch | `canon tasks promote <stem>` |
62
+ | A row up or down inside its group | `canon tasks move <stem> --before <stem>` |
63
+ | What a row waits on, or why it sits there | `canon tasks block <stem> "<reason>"` |
64
+
65
+ - `place` removes the task's backlog line in the same call, so a row never sits on both surfaces or on neither
66
+ - Demoting a row to `backlog.md` has no verb yet. Add the backlog line first, then delete the row with the file-editing tool, which errors on a non-match.
67
+ - Put the reason a row sits where it does in its Waiting on cell through `block`, since a row promoted with the cell left alone carries an order the next sweep cannot check
68
+ - Run `canon tasks validate` after any move, which reports a hand edit the verbs would have refused
62
69
 
63
70
  ### Columns and read-back
64
71
 
65
- Each column carries a fact a later reader checks rather than reasons again.
72
+ The verbs derive the Task, Touches, and Plan cells from the task file and its live plans, so a later reader checks them rather than reasoning again.
66
73
 
67
- - Put a pointer in the Plan column, never prose, since `auto-ship` refuses at its guard when the column leads to no plan, spending a dispatch
68
- - `## Run now` claims a written plan covers every open outcome, which is what the pointer backs
69
- - Name the file set in the Touches column, which feeds the merge order and the shared paths a dispatch names, so step 6's hold call stays checkable later
70
- - Re-resolve every Plan pointer after anything archives a plan
71
- - Read the file back after writing it, since the row that lands is the row a worker acts on
74
+ - `place` and `promote` refuse a row the target group's test fails, so a Plan cell never leads `auto-ship` to no plan and spends a dispatch
75
+ - A Touches cell differing from its plan's list is `touches-stale`. Change the plan's list rather than the cell, and step 6's hold call reads the result.
76
+ - Read the board back after a write, since the row that lands is the row a worker acts on
72
77
 
73
78
  ### Stale plan pointers
74
79
 
75
80
  A Plan pointer goes stale from a merge this board never sees. The `post-merge` hook moves a plan to `.canon/plans/archive/` through `canon tasks archive` and rewrites the citation in the archived task file alone.
76
81
 
77
- - A row for a task still on the board keeps pointing into `.canon/plans/` at a file that has moved
82
+ - A row for a task still on the board keeps pointing into `.canon/plans/` at a file that has moved, until the next verb call re-derives every Plan cell from the live plans
78
83
  - `task-complete` marks outcomes on each worker's branch and moves nothing, so the move lands at the merge
79
84
  - The board then reads as correct until a pointer is followed
@@ -72,7 +72,8 @@ The plan standard fixes that block for a feature plan, and a groundwork or intak
72
72
 
73
73
  ## The board is read-only
74
74
 
75
- - Never write `.canon/tasks/priority.md` or `.canon/tasks/backlog.md`. Both are gitignored, so an overwrite drops a row with no history to recover it from.
75
+ - Never write `.canon/tasks/priority.md` or `.canon/tasks/backlog.md` by hand. Both are gitignored, so an overwrite drops a row with no history to recover it from.
76
+ - `canon tasks plan-link` is the one board write this role makes. It moves the row out of `## Needs a plan` once the plan is linked, in one read and one write a hand edit cannot match.
76
77
  - Never write the task file. The record is the whole output, and a row edited from here changes what the controller reads back as the board's state.
77
78
  - Report what the row got wrong rather than repairing it, such as a stale count or a dead path, in the record and the handback. The controller decides which carries the correction.
78
79
  - Leave the cross-feature call alone. `priority.md` shows enough to write a confident merge order off a partial picture, which is the failure this boundary prevents.
@@ -51,6 +51,15 @@ A painted pull request needs a server in this worktree for `canon pr local` to f
51
51
 
52
52
  A hand-run `git-ship` or `git-pr` starts no server, since only a worker has a lifetime to own one.
53
53
 
54
+ ### Building against a design reference
55
+
56
+ A plan carrying a `**Design references:**` section names the accepted design for the surface it changes. Open it before building, since the build matches it and a worker that reads the dark image alone ships a light theme nobody saw.
57
+
58
+ - Open each cited folder's light and dark images and its frame HTML before the first edit to that surface
59
+ - Take sizes, spacing, and colors from the frame HTML rather than from the image
60
+ - Report a reference that does not resolve in the working tree, naming the path, rather than building without it
61
+ - Leave `None identified.` as it stands and build without a reference
62
+
54
63
  ## Scope after dispatch
55
64
 
56
65
  The plan is the scope from the dispatch on. A late ask restarts both reviews, and one pull request took about four UI review rounds from asks that arrived mid-build.
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: script-screencast
3
+ description: Why a recording script ships pre-seeded rather than blank, what the four discovery questions buy, and why the draft stays stack-agnostic
4
+ ---
5
+
6
+ # Script screencast requirement
7
+
8
+ ## Gap
9
+
10
+ Without this skill, a recording plan arrives as a wall of blank fields, so the user fills a template instead of editing a draft and the work the skill was meant to do lands back on them. The opposite failure costs more. A session that skips discovery guesses the audience, the length, and the hero moment, then writes five beats for a video nobody asked for, and every one of them has to be thrown away rather than edited.
11
+
12
+ A draft that names the recording software, the editing software, or the window manager pins the script to one machine and one person's setup, so it stops being reusable the moment anyone else records. And re-invoking to refine silently overwrites the edits the user made in the file, which is the one failure that destroys work rather than wasting it.
13
+
14
+ ## Must
15
+
16
+ - Read project context and recent commits before proposing, since what shipped recently is usually the subject
17
+ - Ask exactly four discovery questions, each carrying a default derived from that context
18
+ - Wait for answers rather than reading silence as acceptance
19
+ - Pre-seed every section with concrete content so the draft is shippable as written and the user edits down
20
+ - Derive the slug from the topic and the discovery answers
21
+ - Write to `demos/<slug>/beats.md` at the project root, the committed folder the rest of the demo lives in, and print that path on its own line
22
+ - Seed a wrap section naming intro, outro, and music with a default each, so the choice of what surrounds the take is made at draft time rather than discovered at compose time
23
+
24
+ ## Must not
25
+
26
+ - Name recording software, editing software, fonts, or window managers
27
+ - Record, edit video, or generate captions
28
+ - Re-run against an existing draft to refine it, since re-running overwrites
29
+ - Infer the hero moment without asking, which is the beat the whole script is built around
30
+
31
+ ## Guards
32
+
33
+ - No topic provided: stop rather than guessing what is being recorded
34
+
35
+ ## Out of scope
36
+
37
+ - Producing the recording, which `record-screencast` owns
38
+ - Refining an existing draft, which is a direct edit of the file
39
+ - Slide decks, which `make-deck` owns
40
+ - Where the recording ships, which the draft lists and the user decides