@erclx/canon 5.44.0 → 5.46.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 (253) hide show
  1. package/README.md +1 -1
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/api-design/REQUIREMENT.md +15 -31
  4. package/claude/skills/auto-ship/REQUIREMENT.md +14 -25
  5. package/claude/skills/backlog-triage/REQUIREMENT.md +12 -23
  6. package/claude/skills/build-in-slices/REQUIREMENT.md +15 -25
  7. package/claude/skills/canon-cli/REQUIREMENT.md +15 -27
  8. package/claude/skills/canon-cli/SKILL.md +0 -1
  9. package/claude/skills/canon-feedback/REQUIREMENT.md +10 -18
  10. package/claude/skills/canon-feedback-triage/REQUIREMENT.md +10 -15
  11. package/claude/skills/canvas-board/REQUIREMENT.md +14 -28
  12. package/claude/skills/ci-workflow/REQUIREMENT.md +12 -21
  13. package/claude/skills/code-craft/REQUIREMENT.md +14 -28
  14. package/claude/skills/codebase-layout/REQUIREMENT.md +14 -31
  15. package/claude/skills/context-fold/REQUIREMENT.md +15 -39
  16. package/claude/skills/context-fold/references/context.md +3 -3
  17. package/claude/skills/create-rule/REQUIREMENT.md +10 -24
  18. package/claude/skills/create-rule/SKILL.md +3 -0
  19. package/claude/skills/create-skill/REQUIREMENT.md +10 -21
  20. package/claude/skills/decision-escalate/REQUIREMENT.md +12 -24
  21. package/claude/skills/deploy-app/REQUIREMENT.md +12 -22
  22. package/claude/skills/deprecation-migration/REQUIREMENT.md +14 -42
  23. package/claude/skills/design-identity/REQUIREMENT.md +14 -20
  24. package/claude/skills/design-taste/REQUIREMENT.md +16 -57
  25. package/claude/skills/docs-sync/REQUIREMENT.md +14 -23
  26. package/claude/skills/document-health/REQUIREMENT.md +15 -29
  27. package/claude/skills/document-health/SKILL.md +2 -2
  28. package/claude/skills/document-repair/REQUIREMENT.md +32 -0
  29. package/claude/skills/document-repair/SKILL.md +76 -0
  30. package/claude/skills/document-repair/references/batches.md +44 -0
  31. package/claude/skills/draft-and-pick/REQUIREMENT.md +4 -3
  32. package/claude/skills/draft-doc/REQUIREMENT.md +4 -3
  33. package/claude/skills/draft-figure/REQUIREMENT.md +4 -3
  34. package/claude/skills/draft-identity/REQUIREMENT.md +4 -3
  35. package/claude/skills/draft-ready/REQUIREMENT.md +4 -3
  36. package/claude/skills/draft-screencast/REQUIREMENT.md +4 -3
  37. package/claude/skills/draft-slides/REQUIREMENT.md +4 -3
  38. package/claude/skills/draw-figure/REQUIREMENT.md +15 -39
  39. package/claude/skills/git-branch/REQUIREMENT.md +12 -26
  40. package/claude/skills/git-commit/REQUIREMENT.md +11 -15
  41. package/claude/skills/git-followup/REQUIREMENT.md +11 -22
  42. package/claude/skills/git-issue/REQUIREMENT.md +9 -15
  43. package/claude/skills/git-pr/REQUIREMENT.md +13 -32
  44. package/claude/skills/git-pr/SKILL.md +10 -2
  45. package/claude/skills/git-pr/references/closing-issues.md +47 -0
  46. package/claude/skills/git-pr/references/pr.md +4 -0
  47. package/claude/skills/git-ship/REQUIREMENT.md +13 -26
  48. package/claude/skills/git-split/REQUIREMENT.md +10 -17
  49. package/claude/skills/git-stage/REQUIREMENT.md +12 -18
  50. package/claude/skills/git-worktree/REQUIREMENT.md +15 -19
  51. package/claude/skills/make-deck/REQUIREMENT.md +13 -21
  52. package/claude/skills/markdown-craft/REQUIREMENT.md +9 -3
  53. package/claude/skills/pick-by-eye/REQUIREMENT.md +17 -67
  54. package/claude/skills/plan-feature/REQUIREMENT.md +15 -24
  55. package/claude/skills/plan-groundwork/REQUIREMENT.md +12 -28
  56. package/claude/skills/plan-groundwork/SKILL.md +5 -2
  57. package/claude/skills/plan-groundwork/references/output.md +47 -1
  58. package/claude/skills/plan-intake/REQUIREMENT.md +11 -26
  59. package/claude/skills/plan-intake/references/intake.md +2 -2
  60. package/claude/skills/plan-intake-answer/REQUIREMENT.md +14 -29
  61. package/claude/skills/plan-intake-answer/SKILL.md +7 -1
  62. package/claude/skills/plan-ready/REQUIREMENT.md +17 -36
  63. package/claude/skills/pr-evidence/REQUIREMENT.md +11 -17
  64. package/claude/skills/read-frames/REQUIREMENT.md +3 -8
  65. package/claude/skills/record-screencast/REQUIREMENT.md +14 -17
  66. package/claude/skills/review-address/REQUIREMENT.md +14 -38
  67. package/claude/skills/review-craft/REQUIREMENT.md +14 -32
  68. package/claude/skills/review-pr/REQUIREMENT.md +15 -34
  69. package/claude/skills/review-ui/REQUIREMENT.md +14 -39
  70. package/claude/skills/role-orchestrator/REQUIREMENT.md +16 -99
  71. package/claude/skills/role-orchestrator/references/orchestrator-refill.md +5 -0
  72. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +9 -0
  73. package/claude/skills/role-planner/REQUIREMENT.md +15 -73
  74. package/claude/skills/role-reviewer/REQUIREMENT.md +15 -65
  75. package/claude/skills/role-reviewer/SKILL.md +5 -1
  76. package/claude/skills/role-worker/REQUIREMENT.md +13 -41
  77. package/claude/skills/role-worker/SKILL.md +2 -0
  78. package/claude/skills/script-screencast/REQUIREMENT.md +10 -16
  79. package/claude/skills/search-craft/REQUIREMENT.md +12 -36
  80. package/claude/skills/search-craft/SKILL.md +1 -1
  81. package/claude/skills/search-craft/references/adopted.md +2 -2
  82. package/claude/skills/session-compact/REQUIREMENT.md +13 -23
  83. package/claude/skills/session-map/REQUIREMENT.md +13 -29
  84. package/claude/skills/session-relay/REQUIREMENT.md +14 -58
  85. package/claude/skills/session-relay/SKILL.md +6 -0
  86. package/claude/skills/session-resume/REQUIREMENT.md +13 -27
  87. package/claude/skills/session-worktree/REQUIREMENT.md +14 -43
  88. package/claude/skills/systematic-debugging/REQUIREMENT.md +13 -34
  89. package/claude/skills/target-check/REQUIREMENT.md +16 -23
  90. package/claude/skills/target-setup/REQUIREMENT.md +11 -34
  91. package/claude/skills/target-setup/SKILL.md +2 -2
  92. package/claude/skills/target-setup/references/detect.md +0 -1
  93. package/claude/skills/target-setup/references/verify.md +2 -2
  94. package/claude/skills/task-board/REQUIREMENT.md +13 -22
  95. package/claude/skills/task-board/SKILL.md +7 -0
  96. package/claude/skills/task-board/references/tasks.md +1 -1
  97. package/claude/skills/task-complete/REQUIREMENT.md +11 -24
  98. package/claude/skills/task-complete/references/archive.md +1 -0
  99. package/claude/skills/teach-workspace/REQUIREMENT.md +14 -45
  100. package/claude/skills/teach-workspace/references/promotion.md +5 -5
  101. package/claude/skills/test-craft/REQUIREMENT.md +15 -46
  102. package/claude/skills/test-first/REQUIREMENT.md +14 -20
  103. package/claude/skills/ui-checklist/REQUIREMENT.md +14 -29
  104. package/claude/skills/ux-audit/REQUIREMENT.md +3 -7
  105. package/claude/skills/ux-measure/REQUIREMENT.md +14 -28
  106. package/claude/skills/video-craft/REQUIREMENT.md +14 -27
  107. package/claude/skills/write-doc/REQUIREMENT.md +14 -24
  108. package/claude/skills/write-human/REQUIREMENT.md +15 -27
  109. package/claude/skills/youtube-transcripts/REQUIREMENT.md +9 -15
  110. package/docs/agents/context-audit.md +19 -12
  111. package/docs/agents/install-and-sync.md +2 -2
  112. package/docs/agents/markdown-audit.md +15 -10
  113. package/docs/agents/output-shape.md +1 -2
  114. package/docs/target/migrations.md +18 -0
  115. package/docs/target/projects.md +3 -2
  116. package/docs/target/scenarios.md +4 -1
  117. package/docs/workflow/skill-map-on-request.md +1 -1
  118. package/docs/workflow/skill-map.md +6 -5
  119. package/governance/detect.toml +4 -0
  120. package/governance/ledger/lang/go.md +61 -0
  121. package/governance/ledger/lang/php.md +50 -0
  122. package/governance/ledger/lang/python.md +68 -0
  123. package/governance/ledger/lang/typescript.md +64 -0
  124. package/governance/ledger/lib/database.md +65 -0
  125. package/governance/ledger/lib/e2e-reliability.md +57 -0
  126. package/governance/ledger/lib/pydantic.md +61 -0
  127. package/governance/ledger/lib/security-server.md +62 -0
  128. package/governance/ledger/lib/security-web.md +51 -0
  129. package/governance/ledger/lib/tanstack-query.md +57 -0
  130. package/governance/ledger/lib/test-scope.md +43 -0
  131. package/governance/ledger/lib/testing-go.md +57 -0
  132. package/governance/ledger/lib/testing-php.md +51 -0
  133. package/governance/ledger/lib/testing-py.md +67 -0
  134. package/governance/ledger/lib/testing-ts.md +63 -0
  135. package/governance/ledger/lib/zod.md +47 -0
  136. package/governance/ledger/tooling/ci-workflow.md +33 -0
  137. package/governance/ledger/tooling/code-comments.md +48 -0
  138. package/governance/ledger/tooling/config-comments.md +27 -0
  139. package/governance/ledger/tooling/dependencies.md +38 -0
  140. package/governance/ledger/ui/a11y.md +55 -0
  141. package/governance/ledger/ui/copy.md +49 -0
  142. package/governance/ledger/ui/design-reference.md +42 -0
  143. package/governance/ledger/ui/design-taste.md +19 -0
  144. package/governance/ledger/ui/forms.md +71 -0
  145. package/governance/ledger/ui/interface-casing.md +47 -0
  146. package/governance/ledger/ui/keyboard.md +68 -0
  147. package/governance/ledger/ui/link-behavior.md +29 -0
  148. package/governance/ledger/ui/motion.md +33 -0
  149. package/governance/ledger/ui/surface-capture.md +69 -0
  150. package/governance/ledger/ui/ux-completeness.md +79 -0
  151. package/governance/renames.toml +0 -2
  152. package/governance/rules/claude/output.md +5 -1
  153. package/governance/rules/code/routing.md +5 -1
  154. package/governance/rules/lang/go.md +7 -16
  155. package/governance/rules/lang/php.md +3 -3
  156. package/governance/rules/lang/python.md +9 -18
  157. package/governance/rules/lang/typescript.md +9 -19
  158. package/governance/rules/lib/database.md +5 -5
  159. package/governance/rules/lib/e2e-reliability.md +4 -6
  160. package/governance/rules/lib/pydantic.md +14 -16
  161. package/governance/rules/lib/security-server.md +4 -4
  162. package/governance/rules/lib/security-web.md +6 -10
  163. package/governance/rules/lib/tanstack-query.md +10 -12
  164. package/governance/rules/lib/test-scope.md +4 -4
  165. package/governance/rules/lib/testing-go.md +1 -2
  166. package/governance/rules/lib/testing-php.md +4 -5
  167. package/governance/rules/lib/testing-py.md +11 -19
  168. package/governance/rules/lib/testing-ts.md +7 -16
  169. package/governance/rules/lib/zod.md +6 -8
  170. package/governance/rules/tooling/code-comments.md +2 -4
  171. package/governance/rules/tooling/config-comments.md +1 -4
  172. package/governance/rules/tooling/dependencies.md +1 -1
  173. package/governance/rules/ui/a11y.md +16 -45
  174. package/governance/rules/ui/copy.md +6 -9
  175. package/governance/rules/ui/forms.md +13 -19
  176. package/governance/rules/ui/interface-casing.md +5 -7
  177. package/governance/rules/ui/keyboard.md +38 -0
  178. package/governance/rules/ui/link-behavior.md +3 -3
  179. package/governance/rules/ui/motion.md +3 -3
  180. package/governance/rules/ui/surface-capture.md +15 -27
  181. package/governance/rules/ui/ux-completeness.md +16 -39
  182. package/governance/stacks/base.toml +0 -1
  183. package/package.json +1 -1
  184. package/scripts/core/install-check.sh +1 -1
  185. package/src/claude/cases/workflow.ts +12 -0
  186. package/src/cli/help.ts +0 -1
  187. package/src/cli.ts +0 -2
  188. package/src/commands/context.ts +57 -3
  189. package/src/commands/gov.ts +4 -0
  190. package/src/commands/init.ts +2 -2
  191. package/src/commands/labels.ts +83 -3
  192. package/src/commands/markdown.ts +188 -21
  193. package/src/commands/sessions.ts +36 -3
  194. package/src/commands/tasks.ts +180 -0
  195. package/src/commands/tooling.ts +18 -5
  196. package/src/commands/worktrees.ts +2 -0
  197. package/src/context/coverage.ts +210 -0
  198. package/src/context/gate.ts +12 -3
  199. package/src/design/components.ts +1 -1
  200. package/src/gate/stages.ts +1 -1
  201. package/src/gov/audit.ts +22 -2
  202. package/src/init/plan.ts +1 -8
  203. package/src/init/steps.ts +44 -7
  204. package/src/intake/items.ts +14 -0
  205. package/src/inventory/subjects.ts +1 -1
  206. package/src/labels/closing.ts +46 -0
  207. package/src/markdown/gated.ts +250 -0
  208. package/src/markdown/scope.ts +119 -2
  209. package/src/migrate/rename.ts +6 -0
  210. package/src/migrate/scratch-evidence.ts +12 -4
  211. package/src/records/backup.ts +3 -3
  212. package/src/records/validate.ts +3 -3
  213. package/src/roots/record.ts +17 -8
  214. package/src/sessions/claim.ts +7 -0
  215. package/src/sessions/live.ts +53 -6
  216. package/src/sessions/registry.ts +11 -0
  217. package/src/sessions/resolve.ts +32 -5
  218. package/src/tasks/closes.ts +136 -0
  219. package/src/tasks/record.ts +1 -1
  220. package/src/tooling/inject.ts +26 -7
  221. package/src/tooling/package.ts +32 -0
  222. package/src/tooling/read.ts +46 -3
  223. package/src/tooling/scan.ts +8 -2
  224. package/src/worktrees/reclaim.ts +16 -1
  225. package/tooling/astro/reference.md +64 -93
  226. package/tooling/base/configs/.github/workflows/phase-label-gate.yml +1 -1
  227. package/tooling/base/configs/scripts/verify.ts +2 -2
  228. package/tooling/base/reference.md +1 -9
  229. package/tooling/base/seeds/canon/context/{ci.md → development/ci.md} +1 -1
  230. package/tooling/base/seeds/canon/context/development/index.md +11 -0
  231. package/tooling/base/seeds/canon/context/{development.md → development/setup.md} +8 -12
  232. package/tooling/base/seeds/canon/context/index.md +1 -2
  233. package/tooling/claude/manifest.toml +1 -5
  234. package/tooling/claude/reference.md +36 -59
  235. package/tooling/claude/seeds/.claude/hooks/board-validate.sh +1 -1
  236. package/tooling/claude/seeds/.claude/hooks/index-reminder.sh +2 -7
  237. package/tooling/claude/seeds/.claude/hooks/pr-create-log.sh +2 -7
  238. package/tooling/claude/seeds/.claude/hooks/scratch-guard.sh +3 -10
  239. package/tooling/claude/seeds/.claude/hooks/search-reminder.sh +2 -7
  240. package/tooling/claude/seeds/.claude/hooks/standards-audit.sh +2 -4
  241. package/tooling/claude/seeds/CLAUDE.md +2 -2
  242. package/tooling/nextjs/reference.md +0 -6
  243. package/tooling/php/reference.md +0 -4
  244. package/tooling/web/configs/.github/workflows/verify.yml +28 -0
  245. package/tooling/web/configs/.oxlintrc.json +7 -0
  246. package/tooling/web/configs/e2e/capture-types.ts +35 -0
  247. package/tooling/web/configs/e2e/screenshot.ts +23 -72
  248. package/tooling/web/manifest.toml +1 -1
  249. package/tooling/web/reference.md +77 -124
  250. package/tooling/web/seeds/e2e/capture/cases.ts +47 -0
  251. package/governance/rules/canon/task-scope.md +0 -12
  252. package/src/commands/wiki.ts +0 -100
  253. package/src/wiki/init.ts +0 -85
@@ -7,58 +7,30 @@ description: What a building session is, the shared surfaces it may not write, a
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a building session is told what to do and never what it is. One shipped body asserts a session role and it is the orchestrator, so worker behavior spreads across three skills that each own a step and none of them names the role or the channel it runs on. The handback works because a session reading plain text tends to follow it rather than because anything says it should, which held while a person launched every worker and stopped holding the first time one ran with nobody watching.
10
+ Without this skill, a building session is told what to do and never what it is. It writes shared surfaces, hand-writing the board from a stale copy, filing a task with no row, or re-drafting a readied pull request. From a linked worktree it finds no plan folder and reports the task has no plan.
11
11
 
12
- The session then writes surfaces nothing told it were shared. One worker split a concern its own run could not reach, hand-wrote the priority board from a copy taken minutes earlier, and reverted a promotion with nothing reporting it, on a board that still validated afterwards because a reverted row is a well-formed board. A second added a row and labelled it with an identifier another row already held. The rule against both sits inside the controlling session's own body, which no worker loads.
13
-
14
- Standing in a linked worktree fails one step earlier and reports confidently while it does. The plan folder is gitignored, so `git worktree add` never creates it, and a worker reading it from the build tree reports that the task has no plan. That is true from where the session stands and wrong about the world, and a reader holding no second tree cannot tell those apart. Three workers hit it in one day and an absolute path unblocked all three.
15
-
16
- A blocked worker reaches nobody at all. Two dispatched sessions opened an interactive prompt inside a background session no operator was attached to, and the roster read both as alive throughout. An answer relayed afterwards arrives and does not land, since a queued message drains at the next tool round and a session waiting on input never reaches one, so the channel closes the gap only when it is used before the prompt opens. One of the two held uncommitted work across three files, which made stopping and relaunching a destructive recovery rather than a free one.
17
-
18
- Finishing is invisible from the other side. A worker that opens a pull request goes idle rather than exiting, so the one push signal available fired for a worker that was stopped and never fired for the one that finished, which then sat unnoticed for eighteen minutes. Polling covers that interval by spending a fixed cost against a worker with no pull request to report, measured as five consecutive runs reporting no movement across roughly fifteen minutes while one worker built.
19
-
20
- Nothing tells the session that refusing is allowed either. Four occasions across two days had a worker halt correctly with the cost falling on the dispatcher, and the correction that mattered most reached the right place because a worker argued back with evidence rather than complying. A role written only as report-upward suppresses exactly that.
21
-
22
- The draft mark fails from both ends. On 2026-08-31 four sessions re-drafted a pull request someone had readied, acting on a belief no surface in the tree stated. On 2026-09-07 a controlling session told a worker to lift the mark rather than lifting it itself, and the worker complied and reported against the surface rather than the outcome. From 2026-10-12 `canon pr lift` reads the gates itself, so the reviewers run it on a close and the controlling session runs it as the fallback. A worker leaves the verb to them and readies a pull request directly for nobody, since a direct ready skips every gate the verb reads.
12
+ The channel fails on the worker's side. Blocks open prompts nobody is attached to, and a finished pull request goes idle unannounced or stalls silently on its reviews. Painted ones ship with no address for the UI reviewer. Late asks widen the reviewed scope, and a worker told only to report upward never argues back.
23
13
 
24
14
  ## Must
25
15
 
26
- - Assert what a building session is, what it may not do, and how long the role lasts, since the three step-owning skills each carry a procedure and none carries a role
27
- - State that session scratch resolves at the main worktree root, since a linked worktree holds none of those folders and their absence reads as a missing artifact rather than as a wrong vantage
28
- - State the shared board as read-only for a building session and name what it does instead when a row is owed, since a task file with no row is a dropped task and placing the row is the controlling session's call
29
- - Owe an announcement the moment the pull request opens, carrying the number, the branch, and the task, since that transition is the one interval only the worker can observe
30
- - Carry a row the build turned up in the pull request announcement, and send it alone only when the session ends before a pull request opens, since the worker files no task file of its own and the channel is the row's only route
31
- - Carry a fan-in member's branch and head commit in its done message in place of a pull request number, and end its role at the push, since a member opens no pull request and its integrator fixes what the merge surfaces
32
- - Send the controller the `canon pr review-state` record when a wait for the reviews times out, rather than waiting on, since a worker improvising that read stalled silently with both reviewers idle behind it
33
- - Owe a message before a block becomes an interactive prompt, since a session already waiting on input never reaches the tool round an inbound message drains at
34
- - Defer the addressee resolution to `session-relay` and keep only the operator ask and the last-rung inference, which discriminates here because a worker holds a feature branch and a controller does not, and which falls back to the roster and says so, since an operator's own launch names nobody
35
- - Keep refusing a dispatcher a first-class move carrying its evidence, since the halts measured so far were correct and the cost of each fell where it belonged
36
- - State that a held body may be older than the branch under it, since a plugin skill loads from the marketplace cache rather than from the working tree
37
- - Carry a talk clause for a launch whose operator is in the session, asking them at a judgment call and sending a close message when they end the conversation, since a cold worker's halt-toward-the-controller and merge-ends-the-role rules contradict a brief that asks it to talk
38
- - Freeze the plan's scope at dispatch, sorting a late ask into a defect to fix, a follow-up row to report, or an addition the operator's word admits with its re-review cost stated, since intake 155 measured about four UI review rounds on one pull request from late asks, each re-running both reviews
39
- - Own the local preview server for a painted diff, started as a tracked background command before the pull request opens, since a `no-server` read leaves the evidence comment and the UI reviewer without an address on the one path nobody watched being built (erclx/frameboard#1 and erclx/frameboard#4)
40
- - Point at `session-worktree`, `auto-ship`, and `review-address` for the steps each already owns
16
+ - Session scratch resolves at the main worktree root, and a plan that fails to resolve is reported unreadable from there rather than absent
17
+ - The announcement carries the number, branch, task, reach, any uncleared spend, and any row the build turned up, and a painted diff has its preview server running before the pull request opens
18
+ - A block goes out as a message before it becomes a prompt, a fan-in member's done message carries its branch and head commit, and a review wait that times out reaches the controller
19
+ - The plan's scope freezes at dispatch, and a late ask is sorted into a defect, a follow-up row, or an addition on the operator's word
20
+ - A refusal of an instruction the tree contradicts carries its evidence, and a talk launch puts its judgment calls to the operator in the session
41
21
 
42
22
  ## Must not
43
23
 
44
- - Restate a procedure any of the three step-owning skills carries, since thinness is what keeps one body correct for a dispatched worker reading it as its whole contract and for a hand-launched one reading it beside a person
45
- - Restate a boundary the orchestrator already states about itself
46
- - Report progress through the channel, which rebuilds on the sender's side the poll the announcement exists to retire
47
24
  - Write the priority board or the backlog, at any size
48
- - Create a task file for work the build turns up, through `task-board` or by hand, since the file lands with no row and the placement is not the worker's to make
49
- - Be a skill nothing invokes but its author typing the name. `auto-ship` Step 0 invokes it on every build, dispatched or hand-launched, so a stretch where only a typed invocation reaches it is the signal that the role never took.
50
-
51
- ## Guards
52
-
53
- - Plan path does not resolve from inside the worktree: report it unreadable from here and name the main-root path, rather than reporting the task as having no plan
54
- - Plan carries a suggestion written as needing the operator's call: halt and message, rather than answering it
55
- - Launch named no controlling session: resolve from the roster, address the match, and say the addressee was inferred
56
- - No live session holds the other end: report what would have been sent and stop, rather than retrying or waiting
25
+ - Create a task file for work the build turns up
26
+ - Ready the pull request directly, or re-draft one someone readied
27
+ - Report progress through the channel
28
+ - Restate a procedure `session-worktree`, `auto-ship`, or `review-address` carries
57
29
 
58
30
  ## Out of scope
59
31
 
60
32
  - Entering the worktree, which `session-worktree` owns
61
33
  - The chain from implement through pull request, which `auto-ship` owns
62
- - How the build moves through the plan, slice by slice with a commit each, which `build-in-slices` owns
34
+ - Moving through the plan slice by slice, which `build-in-slices` owns
63
35
  - Answering a posted review, which `review-address` owns
64
- - The controlling session's half of the channel, the review poll, and the watch beside it, which `role-orchestrator` and its runbooks hold
36
+ - The controlling session's half of the channel and the review poll, which `role-orchestrator` owns
@@ -93,6 +93,8 @@ Announce the pull request as the ship chain's pull request step returns, carryin
93
93
  - Say the reach was unread rather than clear when the installed binary carries no such subcommand, and leave the undeclared list to the pull request
94
94
  - Carry a row this build turned up with its title, origin, and surface. Send it alone only when the session ends before a pull request opens.
95
95
 
96
+ Name any billed run the Testing section needs that the operator has not cleared, so the controller asks before the first review. Leave it out when no spend is owed or it is cleared, and send no second message for it.
97
+
96
98
  ### A fan-in member
97
99
 
98
100
  A member of a fan-in set opens no pull request, so its done message stands in for the announcement. `auto-ship` sends it after the push.
@@ -7,34 +7,28 @@ description: Why a recording script ships pre-seeded rather than blank, what the
7
7
 
8
8
  ## Gap
9
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.
10
+ Without this skill, a recording plan arrives as blank fields, so the user fills a template instead of editing a draft. The opposite failure costs more. A session skipping discovery guesses the audience, the length, and the hero moment, and writes beats that get thrown away. What surrounds the take surfaces only at compose time.
11
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.
12
+ A draft naming the recording software, the editing software, or the window manager pins the script to one person's setup. Re-invoking to refine silently overwrites the edits the user made in the file, which destroys work rather than wasting it.
13
13
 
14
14
  ## Must
15
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
16
+ - Project context and recent commits are read before proposing, and exactly four discovery questions each carry a default derived from them
17
+ - The run waits for answers rather than reading silence as acceptance
18
+ - Every section is pre-seeded with concrete content, so the draft ships as written and the user edits down
19
+ - The draft lands at `demos/<slug>/beats.md` at the project root, with the slug derived from the topic and the answers, and its path printed on its own line
20
+ - A wrap section names intro, outro, and music with a default each
23
21
 
24
22
  ## Must not
25
23
 
26
24
  - Name recording software, editing software, fonts, or window managers
27
25
  - Record, edit video, or generate captions
28
26
  - 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
27
+ - Infer the hero moment without asking, or guess the topic when none is given
34
28
 
35
29
  ## Out of scope
36
30
 
37
31
  - Producing the recording, which `record-screencast` owns
38
- - Refining an existing draft, which is a direct edit of the file
39
32
  - Slide decks, which `make-deck` owns
40
- - Where the recording ships, which the draft lists and the user decides
33
+ - Refining an existing draft, which a direct edit of the file owns
34
+ - Where the recording ships, which the user owns
@@ -7,51 +7,27 @@ description: Why a session needs a thinking step before an outside search, deriv
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session reaching outside the project runs one generic `WebSearch` and takes what ranks highest. Nothing in the toolkit says how to search, and the two procedures that require an outside source, `plan-groundwork` and `write-doc`'s wiki kind, give no route to one.
10
+ A session reaching outside the project runs one generic `WebSearch` and takes what ranks highest. Open results skew to third-party pages, two summaries of the same query can disagree on a fact, and an advocacy source can lean the answer. Scoped to authorities the session names itself, the same query returns primary sources.
11
11
 
12
- The miss is measured. On 2026-10-02 two queries ran twice each with identical text, once open and once with `allowed_domains` set to authorities the session derived itself with no list to consult.
13
-
14
- - `css container queries browser support`: 1 of 9 open results came from MDN, and that one was a blog post rather than the reference page. The rest were third-party pages, three of them thin guides. Scoped to MDN, web.dev, and caniuse, 10 of 10 results were primary sources.
15
- - The two summaries disagreed on a fact. The open one said Firefox shipped style queries in version 128, and the scoped one, reading caniuse, said 151. A direct fetch of the caniuse table returned 151, so a session that searched once would have reported the wrong version.
16
- - `effect of minimum wage increase on employment evidence`: the open set mixed journals with advocacy groups and its summary leaned one way. Scoped to five authorities the session named, being a research bureau's working papers, the economists' professional association, a working-paper index, a policy institute, and a legislature's budget office, 7 of 9 results were working papers or official analysis, and the summary carried both the near-zero and the negative estimates.
17
- - 2 of the 9 scoped economics results came from a domain outside the allow list, so the filter is not strict.
18
-
19
- The authorities in both pairs were named by the session unprompted once it was asked to, which is the argument for a method over a list. Two queries at one run each show the effect exists and do not size it.
20
-
21
- Access is a second gap a session cannot derive. Probed on 2026-10-02, Reddit refused its JSON search with a 403 and refused `WebFetch`, while its RSS feed answered 200. X redirected `curl` to a login page and returned 402 to `WebFetch`, so no free route reaches it. Re-probed on 2026-10-04, Reddit's RSS feed, its search feed, and its JSON listing and search all answered 403, so the feed that answered two days earlier no longer does.
12
+ Access is a second gap a session cannot derive. Some sites refuse a fetch, a feed that answered once stops answering, and a free route to others does not exist. `plan-groundwork` and `write-doc` require an outside source and give no route to one.
22
13
 
23
14
  ## Must
24
15
 
25
- - Name the field, or two, before a query is written
26
- - Derive the field's authorities from the kind of body it trusts, and search for who they are first when unsure
27
- - Run the query scoped to those authorities and open beside it, prefer the scoped result on a conflict, and say in the output that the two disagreed
28
- - Use the open result for practitioner write-ups and news the authorities do not publish
29
- - Warn that the domain filter is not strict, so a scoped result has its domain checked before it is cited
30
- - Prefer a public API over a fetched and summarized page where one exists, since the API returns the dates, authors, and identifiers a citation needs
31
- - Carry a dated access note grown only from a failure a session hit, and stop to ask the operator before any paid or logged-in route
32
- - Close with the practice skill's excuses, red flags, and closing checklist, answering "the model already knows the good sites" and "one search was enough"
33
- - Be loaded from the sourcing steps of `plan-groundwork` and `write-doc`'s wiki kind, each reporting when the skill does not resolve
16
+ - Name the field before a query is written, and derive its authorities from the kind of body the field trusts
17
+ - Run the query scoped to those authorities and open beside it, prefer the scoped result on a conflict, and say the two disagreed
18
+ - Check a scoped result's domain before citing it, since the filter is not strict
19
+ - Prefer a public API over a fetched page where one exists, and keep an access note grown from failures a session hit, dated by the commit that adds each line
20
+ - Stop for the operator before a paid or logged-in route, and close with the practice skill's excuses, red flags, checklist, and the sources adopted and declined with the reason for each
34
21
 
35
22
  ## Must not
36
23
 
37
- - Name a site as the destination for a category of question. An example authority appears only inside the method as an illustration of deriving one, marked as such. A line reading "for economics, use X" is the catalog the operator ruled out and a reviewer reads against this line.
38
- - Ship code. Access code a session needs repeatedly becomes a `canon` verb, never a script in the skill.
39
- - Restate citation format, which belongs to the surface writing the citation
24
+ - Name a site as the destination for a category of question, outside an example marked as an illustration of deriving one
25
+ - Ship code, since access code a session needs repeatedly becomes a `canon` verb
40
26
  - Suggest scraping behind a login or a paywall
41
27
 
42
28
  ## Out of scope
43
29
 
44
- - The form a citation takes: the procedure or standard writing it
45
- - A Claude Code subject: a direct fetch of `https://code.claude.com/docs/llms.txt` and the `.md` page it names, as `write-doc`'s wiki sourcing step already does
30
+ - The form a citation takes, which the procedure writing it owns
31
+ - Sourcing a Claude Code subject, which `write-doc` owns through its wiki sourcing step
46
32
  - Image generation, which makes a picture rather than finding a source
47
- - Loading on every web search rather than on a research-shaped request: a hook matching `WebSearch`, planned on its own
48
- - Whether a session already scopes searches without the skill, which only a run on a fresh research request without it would show
49
-
50
- ## Measured
51
-
52
- 2026-10-03, one Sonnet run of the toolkit's own sandbox scenario for this skill, a housing brief asking for linked notes and a prompt for the strongest evidence on whether rent control reduces housing supply. The skill sat in the project's skill folder and the run was allowed the skill, search, and fetch tools.
53
-
54
- - No `Skill` call fired, so the description did not route a plain research request to the body.
55
- - The run searched four times with no domain filter, naming authors and journals from recall, then fetched the papers' own pages. It never named the field, so the scenario's field pattern failed and the arm went red on one of its assertions.
56
-
57
- The arm shows the trigger is the gap rather than the body: a session that never loads the skill cannot follow it. The pointers from `plan-groundwork` and `write-doc`'s wiki kind reach only those procedures, and the hook matching `WebSearch` is the route for every other search. One run on one model shows the miss exists and does not size it.
33
+ - Loading on every web search rather than a research-shaped request, which a hook matching `WebSearch` owns
@@ -44,7 +44,7 @@ This skill carries the step before the search. Work out where the field's author
44
44
 
45
45
  ## Access note
46
46
 
47
- Each line is a claim measured once, and `${CLAUDE_SKILL_DIR}/REQUIREMENT.md` records the date under its Gap. Sites change their blocking without notice, so re-check a line before relying on it. Add a line only for a failure a session actually hit, and record the date it hit in the requirement beside it.
47
+ Each line is a claim measured once, and the commit that adds it carries the date. Sites change their blocking without notice, so re-check a line before relying on it. Add a line only for a failure a session actually hit.
48
48
 
49
49
  - Reddit refuses its RSS feed and its JSON search alike with a 403. `WebFetch` is refused for the site, so no keyless route reaches it.
50
50
  - X answers nothing without paying or a login. `curl` redirects to a login page and `WebFetch` returns 402.
@@ -5,7 +5,7 @@ description: Which comparable research skills this skill was read against, what
5
5
 
6
6
  # Adopted and declined
7
7
 
8
- Three third-party research skills were read before this one was written. None of them was imported, and most of the body rests on paired searches measured in this skill's `REQUIREMENT.md` rather than on any of them. A later session extending the skill adds to this file rather than re-arguing an item settled here.
8
+ Three third-party research skills were read before this one was written. None of them was imported, and most of the body rests on paired open and scoped searches run against this skill's own question rather than on any of them. A later session extending the skill adds to this file rather than re-arguing an item settled here.
9
9
 
10
10
  ## Adopted
11
11
 
@@ -37,6 +37,6 @@ None of the three is one, and each earns its keep on access and cost instead. A
37
37
 
38
38
  ## Stated by no source
39
39
 
40
- **Naming the field and deriving its authorities.** No comparable skill takes a thinking step before searching. The step rests on the paired open and scoped searches recorded in `REQUIREMENT.md` under `Gap`, where the scoped run returned primary sources and caught a wrong version number the open run carried.
40
+ **Naming the field and deriving its authorities.** No comparable skill takes a thinking step before searching. The step rests on paired open and scoped searches, where the scoped run returned primary sources and caught a wrong version number the open run carried.
41
41
 
42
42
  **Preferring a public API over a fetched page.** It rests on the same probes, where the scholarly and reference APIs returned the dates, authors, and identifiers a citation needs and a fetched page returned a summary.
@@ -7,36 +7,26 @@ description: Why a plain session needs a handoff surface that is not the task bo
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session facing a compaction reaches for `session-map`, which writes `.canon/tasks/session-<slug>.md`. The board carries four such files today, and `session-resume` drops them by name prefix to read the real rows, so a reader works around a misplacement on every run.
10
+ Without this skill, a session facing a compaction reaches for `session-map`, which writes onto the task board in the orchestrator's shape. That shape runs a drift check against a start commit nothing records and fills a `## State` section, so a session that shipped nothing pays for both and leaves a file every board reader filters out.
11
11
 
12
- `session-map` also carries the orchestrator's shape: a drift check against a start commit nothing records, a step for role sections, and a `## State` section. A session that shipped nothing pays all three to leave one note behind, and the `session-map` skill's `references/session.md` already names a `## State` filled from the tree as non-conforming, which is the failure that shape invites.
13
-
14
- Sessions also write the wrong thing into a handoff. They restate the tree, which survives a compaction, and omit what each decision beat, which does not.
12
+ Sessions also write the wrong thing into a handoff. They restate the tree, which survives a compaction, and omit what each decision beat, which does not. A session about to move machines finds no surface naming the push and export it needs first.
15
13
 
16
14
  ## Must
17
15
 
18
- - Write to `.canon/compact/`, outside the task board and outside scratch.
19
- - Carry a stated shape for the note, so what belongs in it is not re-derived per session.
20
- - Require a citation for every claim, and a rejected alternative beside every decision.
21
- - Decline in one line where the session holds nothing a compaction would destroy.
22
- - Name `canon records push` then `canon sessions export` in the report when the caller asked to move the session to another machine, since this is the step a session takes before it moves and no other skill names either verb.
16
+ - The note lands in `.canon/compact/`, outside the task board and outside scratch, and in a stated shape
17
+ - Every claim carries a citation, and every decision carries the alternative it rejected
18
+ - A session holding nothing a compaction would destroy gets a one-line decline rather than a padded note
19
+ - A caller who asked to move the session gets `canon records push` then `canon sessions export` named in the report
20
+ - The skill keeps a caller of its own beyond an operator typing it, being the `PreCompact` hook naming it on a manual compaction
23
21
 
24
22
  ## Must not
25
23
 
26
- - Write a task row, a plan, or anything under `.canon/tasks/`.
27
- - Write a `## State` section, or any section a reader could fill from `git status`.
28
- - Run a drift check or recover a start commit. Both belong to the role that ships code.
29
- - Lose its caller. The `PreCompact` hook names this skill on a manual compaction, and that hook plus an operator typing it are the two callers the third creation question asks for. A hook edit that names another skill leaves one caller, which is a reason to revisit this skill rather than to keep it.
30
-
31
- ## Guards
32
-
33
- - No repository is required. The slug comes from the work, so a session outside git still writes a note.
34
- - `.canon/` resolves at the main worktree root. From a linked worktree the write goes through the shell, since the file-editing tools refuse that path.
35
- - Decline rather than pad. A note a reader finds is a note a reader trusts.
36
- - The note is backed up by `canon records push`, which carries every top-level `.canon/` folder, and the push is a run someone makes. Until it runs, or where no remote is configured, the note sits on one disk. The skill's report does not say so on an ordinary note, since it would restate a run the operator owns on every note. A caller who named a move is the exception, because the push is then the step the move depends on rather than a reminder, and the line prints on that report alone.
24
+ - Write a task row, a plan, or anything under `.canon/tasks/`
25
+ - Write a `## State` section, or any section a reader could fill from `git status`
26
+ - Run a drift check or recover a start commit, which belong to the role that ships code
37
27
 
38
28
  ## Out of scope
39
29
 
40
- - The orchestrator's handoff, which carries a drift check and a board row: `canon:session-map`. The two skills are held apart by role, so a plain session belongs here and a session holding `canon:role-orchestrator` belongs there.
41
- - Reading a handoff back: `canon:session-resume`, which reads `.canon/compact/` ahead of the older task-board form.
42
- - A decision a groundwork track owns, which belongs in that track's `06-decision.md`: `canon:plan-groundwork`.
30
+ - The orchestrator's handoff with its drift check and board row, which `session-map` owns
31
+ - Reading a handoff back, which `session-resume` owns
32
+ - A decision a groundwork track owns, which `plan-groundwork` owns in that track's decision file
@@ -7,44 +7,28 @@ description: Why the write procedure needs a board-side route for the orchestrat
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, the standard governing the pre-compaction handoff carries a complete numbered write procedure and nothing routes a session to it. The reading half already works, since the resume path opens the newest map and leads its report with it, so a file nobody is routed to write is read by a surface built to find it.
10
+ Without this skill, the standard for the board-side handoff carries a full write procedure and nothing routes a session to it, though the resume path reads the newest map first. The only other routed writer is the orchestrator role, which hands a plain session a section it cannot fill.
11
11
 
12
- The only routed writer belongs to the orchestrator role. It disables model invocation, asserts that role on invocation, and adds a section for decisions taken under delegated authority, so a plain feature session that reaches it receives a section it cannot fill and a review poll it does not run.
13
-
14
- The drift step is the one most specific to session length and the easiest to skip. It reads the commit the session started from, nothing on the machine records that commit, and a route that names the step without naming how to recover the ref ships an instruction nobody can follow.
15
-
16
- A step that reads a surface a project may not carry gets skipped on the reasoning that it has nothing to act on. A cold session run against a project with no `.claude/` tree skipped the drift step and wrote its own rationale into the map, so the step the route exists to carry did not run on the first test from outside. The skip is worst where it looks most defensible, and a session that takes it quietly leaves a map indistinguishable from a conforming one.
17
-
18
- A body that restates the sections, the frontmatter, or the numbered steps becomes a second source that drifts from the standard, which is the failure the split between the role writer and the core was made to remove rather than move.
12
+ The drift step reads a start commit nothing on the machine records, so naming the step without its recovery ships an instruction nobody can follow. Where the step's surface is missing, a session skips it as having nothing to act on and leaves a map that looks conforming. A body restating the standard drifts from it.
19
13
 
20
14
  ## Must
21
15
 
22
- - Write for an orchestrating session, or on a request naming the session map or the board, without asserting a role the session does not hold
23
- - Cite the standard for the filename, the frontmatter, the sections, the numbered procedure, and the citation rule rather than restating any of them
24
- - Run the drift step and state how to recover the ref it reads from how long the session has run
25
- - Record what the drift verb names, and read a refusal as the boundary of what the verb can read
26
- - Resolve the folder at the main worktree root, and write the file whole from the shell where the editing tools refuse that root
27
- - Fall back to the branchless filename on an empty slug rather than stopping
28
- - Leave model invocation enabled, so a session that has dropped its routing still reaches this by description
16
+ - An orchestrating session, or a request naming the session map or the board, reaches the write without the skill asserting a role the session does not hold
17
+ - The filename, frontmatter, sections, numbered steps, and citation rule come from the standard by citation, never restated
18
+ - The drift step runs, its start ref is recovered from how long the session has run, and what the verb names or refuses is recorded as the boundary of what it read
19
+ - The file lands whole at the main worktree root, through the shell where the editing tools refuse that root, under the branchless filename when the slug is empty
20
+ - Model invocation stays enabled, so a session that has dropped its routing still reaches the write by description
29
21
 
30
22
  ## Must not
31
23
 
32
- - Restate the standard's sections, frontmatter, or numbered steps
33
24
  - Skip a step by predicting what its skill or verb would have answered, rather than running it and recording what came back
34
- - Assert a role, or add a role's section to a map written by a session holding no such role
25
+ - Add a role's section to a map written by a session holding no such role
35
26
  - Take the worktree-local copy the editing tools offer in place of the main-root path
36
- - Summarize the board, the task files, or the work that shipped, each of which is carried by an artifact a compaction leaves standing
37
-
38
- ## Guards
39
-
40
- - Not a git repository: stop, since the filename comes from the branch
41
- - Empty slug: fall back rather than stop, since the reasoning is worth more than the name
42
- - The drift verb refusing: record the boundary under standing cautions and keep writing
27
+ - Summarize the board, the task files, or the shipped work, each of which survives a compaction on its own
28
+ - Write a map outside a git repository, since the filename comes from the branch
43
29
 
44
30
  ## Out of scope
45
31
 
46
- - The handoff a plain session writes before a compaction, which is a note outside the board with no drift step and no `## State`: `session-compact`. Both skills once claimed the phrases "write the handoff" and "about to compact", so this description narrows to the orchestrator and to a request naming the map or the board, and a plain session belongs to `session-compact`.
47
- - Reading a handoff back at the start of the next session: `session-resume`
48
- - The sections a role adds over the core three, which belong to that role's own surface. `role-orchestrator` owns the orchestrator's and cites this route for the generic half.
49
- - Validating a written map against the standard, which no record kind covers, so a conforming shape rests on the standard being followed
50
- - Firing the write without being asked, which is a question about what the harness supports and is measured on its own track
32
+ - The note a plain session writes before a compaction, outside the board and with no drift step, which `session-compact` owns
33
+ - Reading a handoff back at the start of the next session, which `session-resume` owns
34
+ - The orchestrator's sections over the core three, which `role-orchestrator` owns
@@ -1,76 +1,32 @@
1
1
  ---
2
2
  name: session-relay
3
- description: Why a standalone skill with no firing condition never fired, why the first inline draft repeated the same protocol in two bodies, why the missing sender identity sat unaddressed through both attempts, and why the two guards that scoped it to a session holding a role and no send tool came off
3
+ description: Why sending to another session is one skill any session reaches, why it resolves the address and names the sender, and why the message body and the addressee stay with the caller
4
4
  ---
5
5
 
6
6
  # Session relay requirement
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, every session that owes another session a message resolves
11
- the addressee itself. `role-worker` and `role-planner` each state the messages
12
- owed and each carried the resolution inline, and a session holding neither role
13
- carried it nowhere, so the mechanical half of the send existed in two copies
14
- plus however many a roleless caller improvised.
10
+ Without this skill, every session that owes another a message resolves the addressee itself, so one protocol lives in each role body and in whatever a roleless session improvises, and a fix reaching one copy misses the rest. A skill matched only by request never fires, so firing rests on the pointer in each role's channel section.
15
11
 
16
- A standalone skill was proposed for the gap and declined the same day. It fired
17
- on no condition of its own, since nothing routes a session to a skill matching
18
- no request and reaching for no artifact, so a skill built to close the gap never
19
- closed it. That history is why the pointer inside each role's
20
- `## The channel` section still matters: it is a section both bodies read at
21
- session start rather than one reached by request match alone, and it is what
22
- makes the firing survive.
23
-
24
- The first draft of this plan closed the gap with a paragraph drafted inline,
25
- once inside `role-worker` and once inside `role-planner`. The operator overrode
26
- that call: two bodies carrying identical protocol text is the shared-surface
27
- case, since a later
28
- fix reaching one copy and not the other diverges silently.
29
-
30
- Neither attempt named who the relay is from. A message an operator relays by
31
- hand needs a sender as much as an addressee, and the standalone draft and the
32
- inline draft both composed a body and an addressee with no line stating whose
33
- turn produced it.
34
-
35
- Scoping the skill to a session holding a role and no send tool left two holes
36
- rather than one. A session holding neither role had no `## The channel` section
37
- to carry the pointer and was refused outright on arrival. A session that held a
38
- role and a send tool was refused too, which left the resolution ladder
39
- duplicated in both role bodies for the ordinary case. Both guards came off
40
- together, since the mechanics are the same whichever route carries the text.
41
-
42
- No governance rule carries the addressing or the reason for the order, so this
43
- body is the only surface stating either for a session holding neither role. A
44
- project that installs governance without the plugin therefore gets no surface
45
- telling a roleless session to send before it prompts, a cost the operator
46
- accepted over a rule loading into every session of every governed target.
12
+ A relayed message carries no sender, so an operator cannot say whose turn produced it. A name prefix can resolve to the wrong session and still report success. A send to another repository's session, or from a sender with no roster row, lands where nobody asked for it. Nothing else tells a roleless session why a block goes before a prompt.
47
13
 
48
14
  ## Must
49
15
 
50
- - Fire for any session sending to another session, with or without a role and with or without a message-sending tool
51
- - Read the sender's own name off `canon sessions list --self --json` before composing anything, and degrade to naming itself from the environment when the installed CLI answers `--self` with an unknown option rather than a refusal carrying a reason
52
- - Resolve the addressee from a `sessionId` or a branch at the moment of sending, never by a name prefix
53
- - Check the resolved name against the agent listing, sending it bare under a single row and completing it with the `[ref]` under more than one
54
- - Send through a message-sending tool where one exists, and compose the copyable block where none does or where the listing carries no row to address
55
- - State why a block goes out before a prompt as the only surface carrying that reason, since no rule carries it and a caller restating the reason drifts from this body with nothing comparing them, while each caller still states that the message is owed
56
- - Carry the message body verbatim from whatever names it
57
- - Open the composed text with a header naming the sender, the addressee, and what the message is
58
- - State the header as a default a session may write around, rather than a fixed vocabulary
16
+ - Any session sending to another reaches the skill, with or without a role or a send tool, and a send to a row in another repository is refused unless the caller names the operator's ask
17
+ - The sender's name comes from `canon sessions list --self --json`, degrading to a name from the environment when the installed CLI lacks `--self`, and a sender with no roster row reads as unread
18
+ - The addressee resolves from a `sessionId` or a branch at the moment of sending, never by name prefix, and is checked against the agent listing with its `[ref]` added under more than one row
19
+ - The send goes through a message-sending tool where one exists, and a copyable block opening on a sender, addressee, and purpose header is composed where none does or the listing has no row
20
+ - The body carries the message verbatim from its caller, and states why a block goes out before a prompt as the one surface holding that reason
59
21
 
60
22
  ## Must not
61
23
 
62
- - Draft a message body of its own. The text it composes belongs to the calling role's bullet or to the dispatch.
63
- - Decide who the message goes to. The caller names an id or a branch and this body turns it into an address.
64
- - Restate the last-rung inference `role-worker` and `role-planner` each carry, which differs between them
65
-
66
- ## Guards
67
-
68
- - The roster cannot name the sender: report the refusal and its reason in place of a name
69
- - The resolution returns no row: report it rather than guessing, since the roster and the send channel enumerate different populations in both directions
70
- - The caller named no addressee at all: defer to the calling role's own last rung, and ask the operator where one is present
24
+ - Draft a message body of its own
25
+ - Decide who the message goes to, or guess an addressee when the resolution returns no row
26
+ - Restate the last-rung inference the role bodies each carry
71
27
 
72
28
  ## Out of scope
73
29
 
74
- - Which messages are owed and when, which stays in the calling role's own bullet or in the dispatch
75
- - The last-rung inference, which stays in `role-worker` and `role-planner` because a worker holds a feature branch and a planner does not, so the two discriminate differently
76
- - Inbound reach as a distinct case. A relay in either direction is one session sending to another, which is what this body now covers.
30
+ - Which messages are owed and when, which the calling role or the dispatch owns
31
+ - The last-rung inference for a worker, which `role-worker` owns because a worker holds a feature branch
32
+ - The last-rung inference for a planner, which `role-planner` owns because a planner holds none
@@ -34,6 +34,12 @@ The caller names the addressee as a `sessionId` or a branch, never as a name. A
34
34
  - From a `sessionId`: run `canon sessions list --json`, find the row carrying that id, and take the `name` on it
35
35
  - From a branch: take the row whose `branch` matches. Nothing renames a session when it takes a role, so an id is the stronger key and a branch the fallback.
36
36
 
37
+ ### Refuse another repository
38
+
39
+ Refuse a send to a row whose `repository` differs from the sender's own, unless the caller names the operator's ask. Read the sender's repository from the Step 1 row and report the refusal with both paths.
40
+
41
+ When Step 1 returned no row, the sender's repository is unread, so the comparison cannot run. Report it as unread and send only when the caller names the operator's ask.
42
+
37
43
  ### Check the name against the agent listing
38
44
 
39
45
  A name is not unique, and the roster carries no field separating two live sessions holding one. Check the name against the agent listing before sending.
@@ -7,41 +7,27 @@ description: Why resuming reads the handoff before the board, reads an index bef
7
7
 
8
8
  ## Gap
9
9
 
10
- Without this skill, a session picking up old work reconstructs state from the git log, which records what shipped and not what is queued, so finished work reads as pending and the actual next item goes unmentioned. The alternative failure is worse for a different reason. A session that reads every task file and every plan to be thorough spends the context the work needs before the work starts, and the summary arrives in a session with no room left to act on it.
10
+ Without this skill, a session picking up old work rebuilds state from the git log, which records what shipped rather than what is queued. Reading every task file spends the context the work needs before it starts. A resume reading only the board walks past the handoff written to survive the compaction.
11
11
 
12
- A compaction keeps conclusions and drops the reasoning that produced them, and the previous session can write that reasoning to a handoff before it goes. A resume that reads the board and the plans alone walks past that file, so the one artifact written to survive the compaction reaches nobody and the next session re-derives what it holds.
13
-
14
- The task index is a folder catalog rather than a task filter, so it carries a row for the ordering file and one for every handoff on the board. A session reporting each row as a backlog item queues work nobody filed, and the count grows with every session that ever wrote a handoff.
15
-
16
- From a linked worktree the shared scratch folders resolve against the worktree rather than the main root, where they are empty. That reports no tracked work on a repository carrying a full backlog, and the report is indistinguishable from the true empty case.
17
-
18
- A resume is a read, and a session that treats it as a cleanup pass offers to archive finished entries or rewrite a plan it decided was stale. Both change tracked state on the strength of a summary the user has not confirmed yet.
12
+ The task index catalogs the folder rather than filtering it, so its rows include the ordering file and every handoff. From a linked worktree the scratch folders resolve empty, which reads as no tracked work. A resume treated as cleanup offers to archive entries on a summary nobody confirmed.
19
13
 
20
14
  ## Must
21
15
 
22
- - Read the newest handoff before the board, and report what it carries attributed to its writer
23
- - Resolve the handoff, plans, and tasks folders at the main worktree root
24
- - Read the task index before any individual task file, and open only the task files the summary needs
25
- - Drop the board siblings from the index before reporting it as the backlog, since the catalog filters nothing and carries a row per handoff
26
- - Preserve the index's order in the report, since the order is the priority
27
- - Close with one recommendation naming the first item and whether a plan backs it
16
+ - The newest handoff is read before the board and reported under its writer's name, its counts and sizes framed as true when written
17
+ - The handoff, plans, and tasks folders resolve at the main worktree root
18
+ - The index is read before any task file, its board siblings dropped, its order kept as the priority, and only the task files the summary needs opened
19
+ - The report closes on one recommendation naming the first item and whether a plan backs it, or what a handoff leaves open beside an empty board
20
+ - Every surface absent or empty reports no tracked work and stops
28
21
 
29
22
  ## Must not
30
23
 
31
24
  - Read the whole tasks folder to build a summary
32
- - Report the absence of a handoff, which is the common case and would train a reader to skip the line on the run where one exists
33
- - Restate a handoff's counts, sizes, or costs as current. Each was true when written.
34
- - Offer to remove, archive, or reorder an entry. Resume reports and does not mutate.
35
-
36
- ## Guards
37
-
38
- - Every surface absent or empty reports no tracked work and stops, rather than inventing a next step from the repository
39
- - A handoff found beside an empty board recommends what the handoff leaves open, since the guard passes on the handoff alone and the recommendation has no backlog item to name
25
+ - Report that no handoff exists, which is the common case and trains a reader to skip the line
26
+ - Offer to remove, archive, or reorder an entry, since a resume reports and does not mutate
27
+ - Invent a next step from the repository when the board is empty
40
28
 
41
29
  ## Out of scope
42
30
 
43
- - Writing a handoff, which happens at the close of a session rather than at its start. This skill names the standard that governs one and follows it no further.
44
- - The sections a role adds over the core handoff, which belong to that role's own surface
45
- - Archiving a shipped task out of the folder: `task-complete`
46
- - Marking an outcome, which `task-complete` does when the work ships, and archiving a plan, which the merge does
47
- - Implementing the item it recommends, which is the next request rather than part of this one
31
+ - Writing a plain session's handoff, which `session-compact` owns
32
+ - Writing the board-side map, which `session-map` owns
33
+ - Marking an outcome or archiving a shipped task, which `task-complete` owns