beehaven 0.8.16

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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -0
  3. package/dist/__tests__/_cli-switch.js +105 -0
  4. package/dist/__tests__/agent-wrap-probe.js +136 -0
  5. package/dist/agent-attribution.js +192 -0
  6. package/dist/agent-identity-daemon.js +135 -0
  7. package/dist/agent-onboard.js +156 -0
  8. package/dist/agent-scope.js +79 -0
  9. package/dist/agent-sessions.js +370 -0
  10. package/dist/agent-state.js +482 -0
  11. package/dist/app-manifest.js +221 -0
  12. package/dist/app-signer.js +54 -0
  13. package/dist/app-signing.js +127 -0
  14. package/dist/audio-play.js +98 -0
  15. package/dist/avatar-protocol.js +25 -0
  16. package/dist/avatar-route.js +79 -0
  17. package/dist/bee/cloud-proxy.js +130 -0
  18. package/dist/blocked-actions.js +120 -0
  19. package/dist/build-channel.js +101 -0
  20. package/dist/buildings/daemon-workspace.js +475 -0
  21. package/dist/claude-bridge.js +310 -0
  22. package/dist/claude-credential-store.js +633 -0
  23. package/dist/clearly-sync.js +518 -0
  24. package/dist/clearly.js +616 -0
  25. package/dist/cli-state.js +334 -0
  26. package/dist/cli.js +6973 -0
  27. package/dist/commands/agent-skills.js +302 -0
  28. package/dist/commands/agent.js +1310 -0
  29. package/dist/commands/app.js +1123 -0
  30. package/dist/commands/auth.js +171 -0
  31. package/dist/commands/building-shell.js +392 -0
  32. package/dist/commands/canvas.js +932 -0
  33. package/dist/commands/claude.js +218 -0
  34. package/dist/commands/compliance.js +387 -0
  35. package/dist/commands/compose.js +507 -0
  36. package/dist/commands/composition.js +95 -0
  37. package/dist/commands/connect-session.js +409 -0
  38. package/dist/commands/conversations.js +160 -0
  39. package/dist/commands/costs.js +443 -0
  40. package/dist/commands/d1.js +253 -0
  41. package/dist/commands/daemon-cmd.js +162 -0
  42. package/dist/commands/deploy.js +164 -0
  43. package/dist/commands/design.js +617 -0
  44. package/dist/commands/dev-generate.js +125 -0
  45. package/dist/commands/dev.js +109 -0
  46. package/dist/commands/devices.js +135 -0
  47. package/dist/commands/explain-router.js +24 -0
  48. package/dist/commands/explain.js +882 -0
  49. package/dist/commands/explore.js +264 -0
  50. package/dist/commands/help.js +2418 -0
  51. package/dist/commands/init.js +408 -0
  52. package/dist/commands/install.js +129 -0
  53. package/dist/commands/library.js +229 -0
  54. package/dist/commands/marketplace.js +138 -0
  55. package/dist/commands/mcp-install.js +476 -0
  56. package/dist/commands/mention.js +257 -0
  57. package/dist/commands/omni.js +529 -0
  58. package/dist/commands/secrets.js +323 -0
  59. package/dist/commands/self-update.js +206 -0
  60. package/dist/commands/sheet.js +264 -0
  61. package/dist/commands/shell-output.js +309 -0
  62. package/dist/commands/shell.js +1048 -0
  63. package/dist/commands/shop.js +368 -0
  64. package/dist/commands/skills.js +311 -0
  65. package/dist/commands/slides.js +418 -0
  66. package/dist/commands/swarm.js +341 -0
  67. package/dist/commands/ticket.js +1301 -0
  68. package/dist/commands/tool.js +312 -0
  69. package/dist/commands/trash.js +106 -0
  70. package/dist/commands/treehouse.js +120 -0
  71. package/dist/commands/user.js +240 -0
  72. package/dist/commands/voice-tts.js +319 -0
  73. package/dist/commands/voice.js +166 -0
  74. package/dist/commands/watch-git.js +401 -0
  75. package/dist/commands/webhook.js +159 -0
  76. package/dist/commands/workspace.js +3354 -0
  77. package/dist/composition-repos.js +91 -0
  78. package/dist/daemon-avatar.js +130 -0
  79. package/dist/daemon-claude-code-auto-install.js +52 -0
  80. package/dist/daemon-client.js +363 -0
  81. package/dist/daemon-codex.js +349 -0
  82. package/dist/daemon-entry.js +101 -0
  83. package/dist/daemon-fetch-allowlist.js +194 -0
  84. package/dist/daemon-gemini.js +224 -0
  85. package/dist/daemon-mcp-clearly.js +353 -0
  86. package/dist/daemon-mcp-sandbox.js +127 -0
  87. package/dist/daemon-omni-company.js +338 -0
  88. package/dist/daemon-omni-hooks.js +375 -0
  89. package/dist/daemon-omni-identity.js +229 -0
  90. package/dist/daemon-omni-pipeline.js +251 -0
  91. package/dist/daemon-omni-policies.js +346 -0
  92. package/dist/daemon-omni-principal.js +580 -0
  93. package/dist/daemon-omni-tool-gate.js +116 -0
  94. package/dist/daemon-omni.js +1442 -0
  95. package/dist/daemon-path-transform.js +120 -0
  96. package/dist/daemon-write-sandbox.js +191 -0
  97. package/dist/daemon.js +4471 -0
  98. package/dist/dashboard.js +846 -0
  99. package/dist/dep-installer.js +286 -0
  100. package/dist/dev-mode.js +67 -0
  101. package/dist/doc-indexer.js +169 -0
  102. package/dist/e2e-crypto.js +94 -0
  103. package/dist/feature-flags.js +154 -0
  104. package/dist/file-browser.js +88 -0
  105. package/dist/first-party-hives.js +211 -0
  106. package/dist/folder-sync.js +226 -0
  107. package/dist/health.js +56 -0
  108. package/dist/ipc-auth.js +299 -0
  109. package/dist/ipc-client.js +495 -0
  110. package/dist/ipc-server.js +684 -0
  111. package/dist/keychain.js +224 -0
  112. package/dist/lib/admin-client.js +73 -0
  113. package/dist/lib/mobile-build-parser.js +156 -0
  114. package/dist/local-app-manager.js +660 -0
  115. package/dist/log-redaction.js +89 -0
  116. package/dist/logger.js +108 -0
  117. package/dist/manifest.js +143 -0
  118. package/dist/marketplace.js +793 -0
  119. package/dist/min-version-copy.js +51 -0
  120. package/dist/min-version.js +214 -0
  121. package/dist/public-surface.js +23 -0
  122. package/dist/relay-presets.js +89 -0
  123. package/dist/relay.js +2723 -0
  124. package/dist/repl.js +619 -0
  125. package/dist/setup-relay.js +363 -0
  126. package/dist/setup-service.js +536 -0
  127. package/dist/shared/bee-memory/index.js +6 -0
  128. package/dist/shared/bee-memory/types.js +682 -0
  129. package/dist/shared/claude-code/daemon-types.js +112 -0
  130. package/dist/shared/claude-code/index.js +2 -0
  131. package/dist/shared/claude-code/types.js +1 -0
  132. package/dist/shared/status/schema.js +133 -0
  133. package/dist/shell-session.js +198 -0
  134. package/dist/speak-lock.js +97 -0
  135. package/dist/spinner.js +57 -0
  136. package/dist/telemetry.js +166 -0
  137. package/dist/terminal/block-parser.js +207 -0
  138. package/dist/terminal/shell-integration.js +108 -0
  139. package/dist/transcript-tailer.js +215 -0
  140. package/dist/tts-qwen3.js +547 -0
  141. package/dist/types.js +4 -0
  142. package/dist/utm.js +38 -0
  143. package/dist/verb-surface.js +331 -0
  144. package/dist/version-utils.js +85 -0
  145. package/dist/watcher.js +207 -0
  146. package/package.json +88 -0
  147. package/python/qwen3_tts.py +230 -0
  148. package/scripts/stamp-build-channel.mjs +115 -0
  149. package/scripts/sync-installed.mjs +159 -0
  150. package/scripts/sync-skills.mjs +112 -0
  151. package/skills/README.md +24 -0
  152. package/skills/agent-doodle-space/SKILL.md +118 -0
  153. package/skills/agent-home/SKILL.md +98 -0
  154. package/skills/beehaven-cli/SKILL.md +144 -0
  155. package/skills/claude-shopper/README.md +90 -0
  156. package/skills/claude-shopper/SKILL.md +151 -0
  157. package/skills/clearly-agent/SKILL.md +183 -0
  158. package/skills/clearly-canvas/SKILL.md +222 -0
  159. package/skills/clearly-canvas/authoring.md +160 -0
  160. package/skills/clearly-canvas/communications.md +32 -0
  161. package/skills/clearly-canvas/composition-patterns.md +84 -0
  162. package/skills/clearly-canvas/example.mjs +78 -0
  163. package/skills/clearly-canvas/project-plans.md +156 -0
  164. package/skills/clearly-canvas/review.mjs +68 -0
  165. package/skills/clearly-workspace/SKILL.md +79 -0
  166. package/skills/clearly-workspace/survey.mjs +101 -0
  167. package/skills/codebase-map/SKILL.md +142 -0
  168. package/skills/design-craft/SKILL.md +300 -0
  169. package/skills/index.json +79 -0
  170. package/skills/layout-systems/SKILL.md +184 -0
  171. package/skills/pair-on-canvas/SKILL.md +92 -0
@@ -0,0 +1,79 @@
1
+ [
2
+ {
3
+ "name": "beehaven-cli",
4
+ "files": [
5
+ "SKILL.md"
6
+ ],
7
+ "sha": "03e91dcc483f189d"
8
+ },
9
+ {
10
+ "name": "clearly-canvas",
11
+ "files": [
12
+ "SKILL.md",
13
+ "authoring.md",
14
+ "communications.md",
15
+ "composition-patterns.md",
16
+ "example.mjs",
17
+ "project-plans.md",
18
+ "review.mjs"
19
+ ],
20
+ "sha": "fe0256c5ce9dea7c"
21
+ },
22
+ {
23
+ "name": "agent-home",
24
+ "files": [
25
+ "SKILL.md"
26
+ ],
27
+ "sha": "0bbcdbd33cfb11a3"
28
+ },
29
+ {
30
+ "name": "agent-doodle-space",
31
+ "files": [
32
+ "SKILL.md"
33
+ ],
34
+ "sha": "053fc1cd5a1494d4"
35
+ },
36
+ {
37
+ "name": "design-craft",
38
+ "files": [
39
+ "SKILL.md"
40
+ ],
41
+ "sha": "7761aa240847d20c"
42
+ },
43
+ {
44
+ "name": "layout-systems",
45
+ "files": [
46
+ "SKILL.md"
47
+ ],
48
+ "sha": "8de89b7b7c86f81f"
49
+ },
50
+ {
51
+ "name": "pair-on-canvas",
52
+ "files": [
53
+ "SKILL.md"
54
+ ],
55
+ "sha": "65f87e74bf3566a6"
56
+ },
57
+ {
58
+ "name": "codebase-map",
59
+ "files": [
60
+ "SKILL.md"
61
+ ],
62
+ "sha": "2e80ffd32f77327f"
63
+ },
64
+ {
65
+ "name": "clearly-workspace",
66
+ "files": [
67
+ "SKILL.md",
68
+ "survey.mjs"
69
+ ],
70
+ "sha": "f5585be212a67c32"
71
+ },
72
+ {
73
+ "name": "clearly-agent",
74
+ "files": [
75
+ "SKILL.md"
76
+ ],
77
+ "sha": "89e5a04a420defe3"
78
+ }
79
+ ]
@@ -0,0 +1,184 @@
1
+ ---
2
+ name: layout-systems
3
+ description: >-
4
+ Compose a specific artefact on a Clearly canvas to studio standard — poster,
5
+ social campaign, presentation deck, landing page, editorial spread, report
6
+ cover, one-pager. Gives the composition patterns, the real numbers per format,
7
+ and the failure modes for each. Use after design-craft (which supplies grid,
8
+ type scale and colour) when the job is a named deliverable rather than a
9
+ system. Triggers: "design a poster", "make a deck", "landing page", "social
10
+ campaign", "magazine spread", "report cover", "one-pager", "pitch deck",
11
+ "hero section", "lay out this content", "make these slides".
12
+ ---
13
+
14
+ # layout-systems — the named artefacts, with their real numbers
15
+
16
+ `design-craft` gives you grid, type scale, colour and the studio pass. This gives you the
17
+ composition patterns for a specific thing, and the way each one usually fails.
18
+
19
+ ⚠ Load `design-craft` first. Everything here assumes its margins, scale and spacing system.
20
+
21
+ ---
22
+
23
+ ## The five compositions that cover almost everything
24
+
25
+ Pick one deliberately. Naming the pattern before you place a node is what stops a layout
26
+ becoming "things arranged until the space was full".
27
+
28
+ | pattern | shape | reads as | use for |
29
+ |---|---|---|---|
30
+ | **Anchored corner** | one heavy element in a corner, the rest quiet | confident, editorial | posters, covers |
31
+ | **Stacked bands** | full-width horizontal registers | ordered, calm | landing pages, reports |
32
+ | **Split field** | 2 fields, unequal (⅓ / ⅔ or 40/60) | modern, dynamic | heroes, slides, cards |
33
+ | **Centred axis** | symmetry about a vertical | formal, ceremonial | titles, invitations, certificates |
34
+ | **Field of one** | a single object in a large void | premium, quiet | product, luxury, statements |
35
+
36
+ ⚠⚠ **NEVER 50/50.** An exact half-split has no hierarchy — the eye cannot choose, so it
37
+ reads as indecision. Use ⅓/⅔, 40/60 or 38/62. This is the single most common layout failure
38
+ in agent-generated work.
39
+
40
+ ⚠ **Odd numbers group better than even.** Three cards read as a set; four read as a grid
41
+ that lost one. If you have four items, ask whether one is really a different thing.
42
+
43
+ ---
44
+
45
+ ## Poster / cover — 1080×1350, or A3 3508×4961 at 300dpi
46
+
47
+ ```
48
+ margin 8–10% of the short edge (1080 → 88–108; A3 → 280–350)
49
+ display 12–20% of the HEIGHT (1350 → 160–270px), weight 700–900, tracking −3 to −6,
50
+ lineHeight 0.92–1.0
51
+ supporting 2–3% of height credits, date, venue — deliberately small
52
+ ```
53
+
54
+ - **The scale jump is the whole poster.** Display to supporting should be **6–10×**. A poster
55
+ whose headline is twice its body is a flyer.
56
+ - **One image or one shape. Not both.** If there is a photograph, the type sits ON it or
57
+ BESIDE it — never a third element competing.
58
+ - ⚠ **Let something bleed.** A shape cropped by the edge implies a world larger than the
59
+ page. A poster where every element floats inside the margin reads timid. **Bleed exactly
60
+ one thing.**
61
+ - **Credits block**: set it small, tracked +1, in 2–4 short lines, bottom-aligned to the
62
+ margin. This block is what makes a poster look like a real poster.
63
+
64
+ ⚠ Paula Scher's Public Theater work is the reference for typographic posters: the type IS the
65
+ image — wood-type weights, extreme scale contrast, colour blocks — and it held up for decades
66
+ precisely because it did not depend on a photograph that would need replacing.
67
+
68
+ ---
69
+
70
+ ## Social campaign — 1080×1350 feed · 1080×1920 story · 1080×1080 tile
71
+
72
+ - **Design the feed post first, then cut the story from it** — not the reverse. A 4:5 that
73
+ works crops up cleanly; a 9:16 rarely crops down.
74
+ - ⚠⚠ **STORY SAFE ZONES: 250px top and bottom.** Platform UI sits there. Content inside that
75
+ band will be covered. The band should not be empty-looking either — carry a background
76
+ texture or an oversized faint element through it so it reads as reserved, not unfinished.
77
+ - **A campaign is a SYSTEM, not one post.** Three posts that share a grid, a type scale and
78
+ one colour move read as a campaign; three beautiful unrelated posts do not. Vary the
79
+ content, hold the structure.
80
+ - **Thumb test**: render it and view at ~150px wide. If the headline is unreadable, the
81
+ headline is too long — cut words, do not shrink type.
82
+
83
+ ---
84
+
85
+ ## Presentation deck — 1920×1080
86
+
87
+ ```
88
+ margin 120 · title 72–96 · body 28–32 · caption 20
89
+ content column ≤ 1200 even though the slide is 1920
90
+ ```
91
+
92
+ - ⚠⚠ **≤ 40 words per slide, and one idea.** A slide is a headline with evidence. If it needs
93
+ a paragraph, the paragraph belongs in a document and the slide gets its conclusion.
94
+ - **The title is the ARGUMENT, not the topic.** "Revenue" is a label; "Revenue doubled after
95
+ we cut the plan count" is a slide.
96
+ - **Slide types, and a deck should use only 5–6:** title · statement · statistic · bullets
97
+ (≤4, and ideally not at all) · quote · image-full · section divider · closing.
98
+ - ⚠ **Full-width text at 1920 is unreadable** — that is a ~160-character measure. Hold the
99
+ content column at ≤1200 and let the outer space do the work.
100
+ - **A section divider every 4–6 slides.** Decks fail from lack of rhythm more than lack of
101
+ content.
102
+
103
+ ---
104
+
105
+ ## Landing page / hero — 1440 wide (design), content max 1200
106
+
107
+ ```
108
+ margin 96 · headline 64–88 (tracking −2, lineHeight 1.05) · sub 20–24 muted, w ≤ 640
109
+ CTA 48–56 tall, 24–32 horizontal padding · section spacing 96–160 vertical
110
+ ```
111
+
112
+ - **The hero answers three questions in order**: what is it, who is it for, what do I do next.
113
+ If any is missing the hero has failed regardless of how it looks.
114
+ - ⚠ **Sub-headline measure ≤ 640px.** A full-width subhead under a big headline is the most
115
+ common hero failure — it turns the strongest element on the page into a wall.
116
+ - **One CTA.** A second, equal-weight button halves the first. If a secondary action is
117
+ needed it is a text link, not a button.
118
+ - **Vertical rhythm between sections is a scale too**: 96 / 128 / 160. Sections at arbitrary
119
+ distances read as a page assembled from parts.
120
+
121
+ ---
122
+
123
+ ## Editorial spread / report — A4 2480×3508 at 300dpi
124
+
125
+ ```
126
+ margin: outer 10%, inner (gutter side) 12–14% — asymmetric, because the binding eats it
127
+ columns 2–3 for A4 body · measure 45–75ch · body 10–11pt (≈42–46px at 300dpi), lineHeight 1.45
128
+ ```
129
+
130
+ - **Asymmetric margins are the mark of real editorial.** Equal margins all round read as a
131
+ word-processor document.
132
+ - **A baseline grid across columns is what makes a spread look typeset.** Every line of body
133
+ copy in every column sits on the same horizontal line.
134
+ - **Pull-quotes and captions are the rhythm.** A page of unbroken body copy is a wall; a
135
+ pull-quote every 2–3 columns gives the eye a landing.
136
+ - ⚠ **Widows and orphans**: no single word alone on a last line, no single line alone at the
137
+ top of a column. Fix by editing the copy, not by re-tracking the paragraph.
138
+
139
+ ---
140
+
141
+ ## Cards, tables and dense UI
142
+
143
+ - **Card padding 24–32, radius 10–16, gap between cards ≥ 2× padding.**
144
+ - ⚠⚠ **BACKGROUND FIRST, LABEL SECOND.** Later nodes draw over earlier ones — create the
145
+ card rect, THEN its text. Reversed, the opaque fill hides the label and you get the classic
146
+ "grid of cards with no text".
147
+ - **In tables, align numbers RIGHT and use tabular figures.** Left-aligned numbers of
148
+ different lengths cannot be compared, which is the only reason the table exists.
149
+ - **Zebra striping OR rules, never both.** Ideally neither — space is enough at ≥12px row padding.
150
+
151
+ ---
152
+
153
+ ## Building it on the canvas
154
+
155
+ ```jsonc
156
+ // ONE batch. Frames first, then children with parentId (x/y RELATIVE to the frame).
157
+ {"action":"frame.create","args":{"name":"poster","x":200,"y":300,"w":1080,"h":1350,"fill":"#111111"}}
158
+ {"action":"canvas.create-node","args":{"name":"headline","type":"text","parentId":"poster",
159
+ "x":88,"y":900,"w":904,"text":"…","size":180,"fontWeight":800,"letterSpacing":-5,"lineHeight":0.95}}
160
+ ```
161
+
162
+ - ⚠ **Omit `h` on text** — it hugs its wrapped content. Pin `h` only when a later element's
163
+ position is computed from this one's bottom edge.
164
+ - ⚠ **`canvas.measure-text` before you place display type.** `{text, size, fontWeight,
165
+ letterSpacing, maxWidth}` → `{width, fits, overflowBy}`. A headline estimated by
166
+ character-count ratio is how type ships past the margin.
167
+ - **Caption every artboard** above it (`19/700`, accent, tracking 2) so a multi-artboard board
168
+ reads as a deck.
169
+ - **Then LOOK**: `canvas-perceive {includePixels, fitNodeIds:[frameId], pixelScale:2}` and read
170
+ the picture. `canvas.audit` cannot see that it is ugly.
171
+
172
+ ---
173
+
174
+ ## The failure modes, per format
175
+
176
+ | format | it usually fails because |
177
+ |---|---|
178
+ | Poster | scale contrast too timid; nothing bleeds; credits block missing |
179
+ | Social | headline too long to read at thumb size; story safe zone left visibly empty |
180
+ | Deck | too many words; title states the topic instead of the argument; full-width text |
181
+ | Landing | subhead runs full width; two competing CTAs; sections evenly spaced |
182
+ | Editorial | symmetric margins; no baseline grid; unbroken columns |
183
+ | Cards | text created before its background; gaps equal to padding so groups do not read |
184
+ | **All** | **an exact 50/50 split, and four type sizes where three would do** |
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: pair-on-canvas
3
+ description: Use a Clearly canvas as mission control for a coding task — read the spec the human placed on the board, do the work in the repo, and report progress, diffs, and next steps back as cards they steer by inking. Load this when the user says "work the task on my canvas", "take this from the board", "what's on my Clearly canvas", "pick up the spec", "let's pair on the canvas", or whenever a human is directing your coding work spatially instead of in a chat thread.
4
+ ---
5
+
6
+ > **⚠ CANVAS WORK GOES THROUGH THE CLI, NOT AN MCP TOOL.** Anything written
7
+ > `canvas-act { … }` / `canvas-perceive { … }` below is an ACTION, run as
8
+ > `beehaven call canvas-act '<the JSON>'`. The payloads are exactly as shown. The MCP
9
+ > surface is seven tools split by operation, and a single tool that dispatches 230
10
+ > caller-named canvas actions spans reads, writes and deletes at once — which is why the
11
+ > generic door is the shell instead. `clearly_read { target, type: "composition" }` still
12
+ > reads a canvas as an artifact.
13
+
14
+ # Pair on canvas — the board as mission control
15
+
16
+ A chat is a single thread: you talk, the human talks, the work scrolls away. A Clearly canvas is a **standing command surface** — the human pins the spec where they can point at it, you land your work as cards beside it, and they steer by *gesture*: circle a region, ink "rename this", drop a sticky "do this first". This skill is the loop that makes the canvas the place a human **directs** a coding agent and **reviews** what comes back — not a place you dump a render.
17
+
18
+ Prereq: the `beehaven` CLI is installed, signed in as an agent, and connected to the intended
19
+ workspace (`clearly-init` handles setup). Know the primitives from **clearly-canvas**. The seven
20
+ MCP tools are optional for artifact reads and writes.
21
+
22
+ The spine repeats every turn: **intake → plan → work → report → steer → ship.** The board is where the conversation lives *between* turns — durable, pointable, glanceable.
23
+
24
+ ## Why the canvas beats a chat for this (say it to yourself before you start)
25
+
26
+ Your one unfair advantage here is **pointing, not prompting**. `canvas-perceive` returns `focus` (what the human selected), `gaze` (where they're looking), and `contents` (every node + bounds). So "make *this* responsive", "wire *these two*", "the bug is in *that* card" resolve to exact nodes. A terminal agent only has words; you have deixis. Use it — it's the whole reason the work is on a board.
27
+
28
+ ## 0. Find the board + the task
29
+
30
+ ```jsonc
31
+ canvas-list-compositions {} // newest first → pick the active board
32
+ canvas-perceive { "compositionId": "c_…", "format": "text" }
33
+ ```
34
+
35
+ Read the **spec**: the human's text/doc/sticky node, or whatever is in `focus` (selected) / sitting in `gaze.visibleWorldRect` (what they're looking at). If the board is empty, ask them to drop a spec card — or propose one yourself and let them edit it. **Always pass `compositionId`** so everything persists headlessly (no tab needed).
36
+
37
+ ## 1. Intake — restate the task before you spend a turn
38
+
39
+ Don't guess. Drop a small **"🤖 Reading this as…"** card next to the spec restating the task + your assumptions, and tell them to correct it. One cheap round-trip here saves a wasted work cycle. (`canvas-act` → `canvas.create-node` text, placed in their `gaze`.)
40
+
41
+ ## 2. Plan — post it where they can veto it
42
+
43
+ Before any repo edit, land a **"🤖 Plan — &lt;task&gt;"** card: a `canvas.add-document` with the steps, or a framed checklist of text nodes. The human can reorder/cut it *before* you burn tokens. This is the canvas version of "here's my plan, ok?" — but it stays on the board as the task's header.
44
+
45
+ ## 3. Work — in the repo, narrate on the board
46
+
47
+ Do the real edits with your normal tools (Bash / Edit / the repo). Keep **ONE status card live** and update it in place — don't spam:
48
+
49
+ ```jsonc
50
+ // create once…
51
+ canvas-act { "compositionId":"c_…", "action":"canvas.create-node",
52
+ "args":{ "type":"text","name":"status","text":"🟢 working — editing auth.ts (2/5)","x":…, "y":…, "size":15, "fontWeight":600, "fill":"#22c55e" } } // → { id }
53
+ // …then update as you go
54
+ canvas-act { "compositionId":"c_…", "action":"canvas.update-nodes",
55
+ "args":{ "ids":["<statusId>"], "patch":{ "text":"🟡 running tests (4/5)" } } }
56
+ ```
57
+
58
+ That status card **is your presence** — the human glances it instead of watching a terminal. (When a tab's open you also appear as a live room `occupant` for free; the status card is the headless equivalent.)
59
+
60
+ ## 4. Report — land the diff as a MAP, not a wall of text
61
+
62
+ Use the canvas's built-in diff block directly:
63
+
64
+ ```bash
65
+ git diff main...HEAD # or HEAD / --staged / git show <sha>
66
+ ```
67
+ ```jsonc
68
+ canvas-act { "compositionId":"c_…", "action":"canvas.add-diff",
69
+ "args":{ "diff":"<full git diff>", "title":"<commit subject>", "commit":"abc1234", "frame":true } }
70
+ ```
71
+
72
+ Then make it reviewable: dependency arrows between files that now call each other, and a **"🤖 Summary"** `canvas.add-document` card — *what changed · why · risks · how to verify*. The reviewer sees the shape of the change, not a scroll.
73
+
74
+ ## 5. Steer — read their ink, revise
75
+
76
+ Tell them to look. Then `canvas-perceive` again — their annotations land in `contents`, their selection in `focus`. A sticky on `auth.ts` saying "this breaks SSO" is now a node you read and act on: fix the repo, `canvas.update-nodes` the affected card, bump the status. **annotate → perceive → revise** is the loop; run it until they stop inking.
77
+
78
+ ## 6. Ship — close the arc on the board
79
+
80
+ Open the PR (`gh pr create …`), then land a **"✅ Shipped"** card with the PR URL + commit, and flip the status card to done. The board now shows the whole arc — **spec → plan → diff → PR, with the human's notes in place**: a durable record of the decision, not a chat that vanished. New task → new frame, gutter between; the board becomes a column of tasks, each self-contained.
81
+
82
+ ## Conventions that keep it legible
83
+
84
+ - **Prefix your cards with 🤖**; leave the human's un-prefixed. At a glance: who said what.
85
+ - **One status card, updated in place** — never a trail of status nodes.
86
+ - **One frame per task.** The board reads as a stack of tasks, each with its spec/plan/diff/PR.
87
+ - **Perceive first; design WITH `backgroundColor`; place work in `gaze`.** (See clearly-canvas.)
88
+ - **Headless is fine** — every card persists to the composition with no tab open; just always pass `compositionId`.
89
+
90
+ ## The payoff
91
+
92
+ A human directs many tasks by **pointing and glancing** — circle the spec, read the status cards, ink a correction — instead of typing paragraphs and scrolling logs. The work becomes a reviewable map that lives on. That's mission control for a coding agent, and it's something a chat thread structurally can't be.