@oneie/claude 0.8.0 → 0.10.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 (230) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/agents/abm-strategist.md +67 -1
  3. package/agents/ads-meta.md +67 -1
  4. package/agents/analyst.md +67 -1
  5. package/agents/animator.md +108 -0
  6. package/agents/architect.md +269 -20
  7. package/agents/brand-guardian.md +67 -1
  8. package/agents/brand-strategist.md +67 -1
  9. package/agents/campaign-content.md +67 -1
  10. package/agents/campaign-email.md +67 -1
  11. package/agents/campaign-sms.md +67 -1
  12. package/agents/campaign-social.md +67 -1
  13. package/agents/cco.md +83 -2
  14. package/agents/ceo.md +108 -11
  15. package/agents/chairman.md +197 -0
  16. package/agents/cmo.md +82 -2
  17. package/agents/community-greeter.md +67 -1
  18. package/agents/community-moderator.md +67 -1
  19. package/agents/compliance.md +67 -1
  20. package/agents/copywriter.md +67 -1
  21. package/agents/creative-strategist.md +67 -1
  22. package/agents/cro.md +81 -1
  23. package/agents/cto.md +266 -28
  24. package/agents/customer-interviewer.md +67 -1
  25. package/agents/customer-researcher.md +67 -1
  26. package/agents/customer-success-manager.md +67 -1
  27. package/agents/customer-trainer.md +67 -1
  28. package/agents/cxo.md +82 -1
  29. package/agents/demand-creator.md +67 -1
  30. package/agents/demo-mover.md +67 -1
  31. package/agents/demo-specialist.md +67 -1
  32. package/agents/demo-thai-family-law.md +67 -1
  33. package/agents/designer.md +67 -1
  34. package/agents/discovery-caller.md +67 -1
  35. package/agents/doctor.md +269 -0
  36. package/agents/educate-coach.md +67 -1
  37. package/agents/elevate-tutor.md +67 -1
  38. package/agents/email-lifecycle-marketer.md +67 -1
  39. package/agents/engage-specialist.md +67 -1
  40. package/agents/events-coordinator.md +67 -1
  41. package/agents/foundation-builder.md +67 -1
  42. package/agents/funnel-architect.md +67 -1
  43. package/agents/gift-creator.md +67 -1
  44. package/agents/google-ads.md +67 -1
  45. package/agents/guide.md +67 -1
  46. package/agents/helpdesk-dispatcher.md +67 -1
  47. package/agents/hook-specialist.md +67 -1
  48. package/agents/identify-optimizer.md +67 -1
  49. package/agents/implementer.md +313 -45
  50. package/agents/incident-commander.md +67 -1
  51. package/agents/insights-lead.md +87 -1
  52. package/agents/journey-runner.md +67 -1
  53. package/agents/linkedin-ads.md +67 -1
  54. package/agents/live-sales-chat.md +67 -1
  55. package/agents/market-researcher.md +67 -1
  56. package/agents/media-buyer.md +67 -1
  57. package/agents/memory-keeper.md +195 -0
  58. package/agents/movers-customer-researcher.md +67 -1
  59. package/agents/movers-foundation-builder.md +67 -1
  60. package/agents/movers-market-researcher.md +67 -1
  61. package/agents/movers-pricing-strategist.md +67 -1
  62. package/agents/nurture-architect.md +67 -1
  63. package/agents/offer-architect.md +67 -1
  64. package/agents/onboarder.md +67 -1
  65. package/agents/onboarding-specialist.md +67 -1
  66. package/agents/operations-dashboard.md +87 -1
  67. package/agents/perf-engineer.md +333 -37
  68. package/agents/playbook-writer.md +67 -1
  69. package/agents/plg-strategist.md +67 -1
  70. package/agents/positioning-architect.md +67 -1
  71. package/agents/press-officer.md +67 -1
  72. package/agents/pricing-strategist.md +67 -1
  73. package/agents/privacy-officer.md +67 -1
  74. package/agents/referral-manager.md +67 -1
  75. package/agents/refine-analyst.md +67 -1
  76. package/agents/release-manager.md +446 -39
  77. package/agents/renewals-upsell-rep.md +67 -1
  78. package/agents/review-engineer.md +319 -45
  79. package/agents/rewards-steward.md +67 -1
  80. package/agents/sales-call-coach.md +67 -1
  81. package/agents/sales-closer.md +67 -1
  82. package/agents/security-auditor.md +343 -48
  83. package/agents/sell-closer.md +67 -1
  84. package/agents/share-amplifier.md +67 -1
  85. package/agents/social-media-manager.md +67 -1
  86. package/agents/storyteller.md +301 -0
  87. package/agents/strategist.md +67 -1
  88. package/agents/strategy-aligner.md +67 -1
  89. package/agents/support-agent.md +67 -1
  90. package/agents/tagger.md +327 -0
  91. package/agents/tech-writer.md +195 -22
  92. package/agents/test-engineer.md +398 -29
  93. package/agents/tiktok-ads.md +67 -1
  94. package/agents/tracking-engineer.md +67 -1
  95. package/agents/trailkeeper.md +181 -0
  96. package/agents/upsell-strategist.md +67 -1
  97. package/agents/voice.md +67 -1
  98. package/agents/w1-recon.md +1 -1
  99. package/agents/w2-decide.md +1 -1
  100. package/agents/w3-edit.md +8 -2
  101. package/agents/w4-verify.md +13 -0
  102. package/agents/workflow-optimiser.md +81 -1
  103. package/commands/close.md +916 -160
  104. package/commands/deploy.md +102 -724
  105. package/commands/do.md +58 -2
  106. package/commands/sweep.md +159 -0
  107. package/commands/tasks.md +222 -0
  108. package/hooks/scripts/dev-only.sh +135 -0
  109. package/hooks/scripts/git-add-guard.sh +37 -2
  110. package/hooks/scripts/session-start.sh +32 -4
  111. package/package.json +1 -1
  112. package/rules/scripts.md +85 -0
  113. package/scripts/CLAUDE.md +315 -0
  114. package/scripts/ad-copy-lint.sh +656 -0
  115. package/scripts/agent-actor-parity.sh +129 -0
  116. package/scripts/blocks-manifest-cached.sh +100 -0
  117. package/scripts/chat-context-check.sh +89 -0
  118. package/scripts/chrome.mjs +18 -0
  119. package/scripts/close-metrics.sh +587 -0
  120. package/scripts/close-owner.sh +326 -0
  121. package/scripts/db-sync-lock-check.sh +116 -0
  122. package/scripts/deploy-emit.sh +311 -0
  123. package/scripts/deploy-gate-check.sh +155 -0
  124. package/scripts/deploy-ready.sh +78 -0
  125. package/scripts/deploy-record.sh +605 -0
  126. package/scripts/deploy-schema-check.sh +58 -0
  127. package/scripts/deploy.sh +393 -243
  128. package/scripts/do-auto.sh +127 -26
  129. package/scripts/do-board.sh +429 -0
  130. package/scripts/do-close.sh +1184 -0
  131. package/scripts/do-consumer-sweep.sh +18 -1
  132. package/scripts/do-decide.sh +476 -0
  133. package/scripts/do-fleet.sh +8 -2
  134. package/scripts/do-plan-json.mjs +110 -12
  135. package/scripts/do-prove-selftest.sh +108 -0
  136. package/scripts/do-prove.sh +86 -10
  137. package/scripts/do-rank.py +200 -3
  138. package/scripts/do-reconcile.sh +73 -12
  139. package/scripts/do-signal.sh +101 -23
  140. package/scripts/do-smoke.sh +18 -1
  141. package/scripts/do-w4-gates.sh +11 -1
  142. package/scripts/do-world-check.sh +153 -0
  143. package/scripts/download-stats.sh +172 -0
  144. package/scripts/factory-brief-check.sh +330 -0
  145. package/scripts/factory-check.sh +18 -1
  146. package/scripts/factory-close-check.sh +257 -0
  147. package/scripts/factory-emit.sh +211 -0
  148. package/scripts/factory-executor-check.mjs +353 -0
  149. package/scripts/factory-peak.sh +301 -0
  150. package/scripts/factory-repo.sh +71 -0
  151. package/scripts/factory-review-check.mjs +61 -0
  152. package/scripts/factory-tasks-check.sh +18 -1
  153. package/scripts/fixtures/factory-brief-real.md +44 -0
  154. package/scripts/flywheel-outcome.sh +63 -0
  155. package/scripts/gate-reaper-check.sh +98 -0
  156. package/scripts/gate-reaper.sh +9 -0
  157. package/scripts/gate-watchdog.sh +619 -0
  158. package/scripts/gc-content-check.sh +142 -0
  159. package/scripts/gh-traffic-capture.sh +153 -0
  160. package/scripts/govern-order-check.sh +202 -0
  161. package/scripts/governor-doors-check.sh +86 -5
  162. package/scripts/health.sh +448 -0
  163. package/scripts/id-inventory.mjs +418 -0
  164. package/scripts/incident.sh +212 -0
  165. package/scripts/land.sh +755 -45
  166. package/scripts/lib/gc-finished.sh +77 -0
  167. package/scripts/livekit-ratchet.sh +18 -1
  168. package/scripts/machine-check.sh +1 -1
  169. package/scripts/memory-index-budget.sh +79 -0
  170. package/scripts/npm-downloads.sh +109 -0
  171. package/scripts/one-agents.mjs +204 -8
  172. package/scripts/one-resume.sh +31 -3
  173. package/scripts/pr-body.sh +335 -0
  174. package/scripts/preview-fd-check.sh +289 -0
  175. package/scripts/redirect-lint.sh +169 -0
  176. package/scripts/release.sh +40 -6
  177. package/scripts/resume-lost-sessions.sh +68 -0
  178. package/scripts/shoot-pages.mjs +140 -0
  179. package/scripts/signal-meta-backfill.ts +451 -0
  180. package/scripts/signal-watch.sh +63 -6
  181. package/scripts/speed-cache-check.sh +12 -2
  182. package/scripts/sweep.sh +426 -0
  183. package/scripts/task-titles-dump.ts +101 -0
  184. package/scripts/test-cached.sh +47 -10
  185. package/scripts/test-lanes.sh +14 -0
  186. package/scripts/thread-name-backfill.ts +215 -0
  187. package/scripts/triage-shape-check.sh +149 -0
  188. package/scripts/tsc-cached.sh +155 -8
  189. package/scripts/typedb-flake-check.sh +3 -1
  190. package/scripts/urls-lint.sh +8 -0
  191. package/scripts/verify-board-doors.sh +80 -0
  192. package/scripts/verify-fast.sh +159 -6
  193. package/scripts/worktree-up.sh +21 -3
  194. package/skills/astro/SKILL.md +9 -3
  195. package/skills/astro/optimize-performance.md +3 -2
  196. package/skills/cloudflare/SKILL.md +3 -2
  197. package/skills/cloudflare-security-audit/AI-AND-LLM.md +83 -0
  198. package/skills/cloudflare-security-audit/ATTACK-CLASSES.md +130 -0
  199. package/skills/cloudflare-security-audit/CLIENT-SIDE.md +83 -0
  200. package/skills/cloudflare-security-audit/CLOUD-AND-DEPLOYMENT.md +86 -0
  201. package/skills/cloudflare-security-audit/DATA-ISOLATION-AND-LIFECYCLE.md +84 -0
  202. package/skills/cloudflare-security-audit/DESKTOP-MOBILE-AND-LOCAL-IPC.md +89 -0
  203. package/skills/cloudflare-security-audit/HUNTING.md +251 -0
  204. package/skills/cloudflare-security-audit/LICENSE +21 -0
  205. package/skills/cloudflare-security-audit/MEMORY-SAFETY-AND-BINARY.md +101 -0
  206. package/skills/cloudflare-security-audit/PROTOCOLS-RPC-AND-MESSAGING.md +81 -0
  207. package/skills/cloudflare-security-audit/PROVENANCE.md +78 -0
  208. package/skills/cloudflare-security-audit/RECONNAISSANCE.md +156 -0
  209. package/skills/cloudflare-security-audit/RESOURCE-EXHAUSTION-AND-AVAILABILITY.md +78 -0
  210. package/skills/cloudflare-security-audit/SKILL.md +192 -0
  211. package/skills/cloudflare-security-audit/SUPPLY-CHAIN-AND-RELEASE.md +73 -0
  212. package/skills/cloudflare-security-audit/VALIDATION-AND-REPORTING.md +186 -0
  213. package/skills/cloudflare-security-audit/WEB-PROTOCOL-AND-AUTH.md +105 -0
  214. package/skills/cloudflare-security-audit/report-schema.json +461 -0
  215. package/skills/cloudflare-security-audit/validate-coverage-ledger.cjs +872 -0
  216. package/skills/cloudflare-security-audit/validate-coverage-ledger.test.cjs +740 -0
  217. package/skills/cloudflare-security-audit/validate-findings.cjs +773 -0
  218. package/skills/cloudflare-security-audit/validate-findings.test.cjs +652 -0
  219. package/skills/deploy/REFERENCE.md +713 -0
  220. package/skills/deploy/SKILL.md +140 -0
  221. package/skills/fleet-audit/SKILL.md +58 -0
  222. package/skills/meeting/SKILL.md +220 -0
  223. package/skills/planning/SKILL.md +256 -0
  224. package/skills/shadcn/SKILL.md +1 -1
  225. package/skills/typedb/SKILL.md +7 -0
  226. package/skills/voice/SKILL.md +94 -6
  227. package/skills/voice/corpus-check.sh +87 -0
  228. package/templates/template-agent.md +7 -1
  229. package/templates/template-feature.md +9 -0
  230. package/templates/template-todo.md +29 -0
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: deploy
3
+ description: Run a deploy as tracked work — file the tasks template when the run opens, report each gate through deploy:event, and read what is still open or never ran. Use whenever a deploy is started, watched, or explained; when asked "did the tests actually run", "what is left in this deploy", "which gate bit", "why is the run still open"; or when wiring anything to the deploy tag. Refuses to call a run green while any gate is open. Does NOT ship — the ship door is release.sh.
4
+ ---
5
+
6
+ # deploy — a deploy as work on a board, not lines in a log
7
+
8
+ **Purpose:** every deploy files its own work as ten open rows the moment it
9
+ starts, each owned by a named crew member, all joined by the run key the deploy
10
+ page already reads. Closing gates close rows. Gates that never fire stay open.
11
+
12
+ Source of truth: `one.ie/web/src/lib/deploy/event.ts` (the spine + mapper) ·
13
+ `one.ie/web/src/lib/deploy/tasks.ts` (the template) · `schema/deploy.tql` (the
14
+ questions) · promise: `text/deploy.md` · mechanism: `text/intake.md`.
15
+
16
+ ---
17
+
18
+ ## HARD RULES
19
+
20
+ - **An unrun gate is never a pass.** `deploy.sh` distinguishes four states
21
+ (`pass|fail|unrun|n/a`) and a board that only knows open/done renders an unrun
22
+ gate exactly like one still in flight. A gate is UNRUN when
23
+ `deploy_gate_open($run,$stage)` is true and `deploy_gate_ran($gate,$target)` is
24
+ empty — you join the two, because TypeQL cannot concatenate `"deploy:"+stage`
25
+ and a function that pretended to would be vacuous. (It was, once: the first
26
+ `deploy_unrun` asked for a *signal* per gate, but `deploy:event` writes to D1
27
+ and paths, never a signal — so it returned every open gate, always.)
28
+ - **Green means every gate CLOSED, never "none failed".** A run where four gates
29
+ never fired and none failed is **not** green. `deploy_green()` is defined as the
30
+ absence of open work precisely so this asymmetry cannot be argued with.
31
+ - **File the template when the run OPENS.** Not as gates finish. Work that
32
+ appears only once it is done is a changelog, not a board — and a gate that
33
+ never runs would never get a row at all.
34
+ - **Never retype the gate names.** `DEPLOY_SPINE_STEPS` is the authority; the
35
+ workflow diff, the event mapper and the tasks template all derive from it.
36
+ A fourth copy is how a ten-gate run quietly files nine rows.
37
+ - **Bare words only.** The crew stakes are `health` (doctor), `ship`
38
+ (release-manager), `deploy` (ceo). A namespaced subscribe tag matches zero
39
+ signals and fails silently.
40
+ - **Chain with `call`, never `await`.** `__awaitParent` is written at
41
+ `workflow-executor.ts:923` and read nowhere; `settle()` has no parent-resume
42
+ leg, so an `await` chain step parks its parent forever, looking exactly like a
43
+ slow step. Anything that runs after a deploy declares `deploy:done` as its own
44
+ `trigger_source`.
45
+ - **A stale-but-clean tree makes every door script old.** `git status` clean says
46
+ nothing about how old `release.sh`/`land.sh`/`deploy.sh` are — measured
47
+ 2026-09-14, the shared main tree was **479 commits behind `origin/main`** and
48
+ clean, so `promote` ran a pre-fix version and refused a valid sha **4×**. Check
49
+ first: `git rev-list --count HEAD..origin/main` — non-zero is exactly how many
50
+ commits old the script you are about to run is.
51
+ - **`git merge-base --is-ancestor` proves REACHABLE, not EXECUTING.** Ancestry is
52
+ a fact about the ref; which code runs is a fact about the checkout. A commit
53
+ can be an ancestor of `main` and absent from the tree whose script you invoked.
54
+ - **A non-run must never read as a pass.** `gate-run.sh` exits **127** when its
55
+ target is not on `PATH` (mechanism unconfirmed: govern.ts spawns with no env override, so PATH should inherit — measured anyway, twice) — invoke by
56
+ absolute path. And never pipe a gate through `tail`: measured 2026-09-14,
57
+ `verify` exited 1 while the pipeline reported **0**. `PIPESTATUS[0]`, or no pipe.
58
+ - **This skill does not ship, and neither do you.** It tracks. The ship is driven
59
+ by **`release-manager`**, spawned as a subagent with `model: "opus"` — that holds
60
+ however the ask arrived, `/deploy` or "ship it" in a sentence
61
+ (`../../CLAUDE.md § The dev → prod loop` · `.claude/commands/deploy.md`). This
62
+ skill reads what that agent reports and says what is still open. Production ships
63
+ from `.release/` via `release.sh ship`; `./deploy --allow-dirty` ships every
64
+ neighbour's uncommitted file and must never be suggested.
65
+
66
+ ---
67
+
68
+ ## The ten gates and who owns them
69
+
70
+ | # | Gate | Owner | The question it asks |
71
+ |---|---|---|---|
72
+ | 1 | `tree` | doctor | Can a receipt bind to this tree? A dirty tree hashes differently every second. |
73
+ | 2 | `credentials` | doctor | Are the secrets actually present — not merely named in a config? |
74
+ | 3 | `typecheck` | release-manager | Zero new type errors. The ratchet tightens, never loosens. |
75
+ | 4 | `tests` | release-manager | Did the FULL lane run, or be REUSED from a receipt for an identical tree? |
76
+ | 5 | `build` | release-manager | Does each target produce an artifact? A skipped build is not a passed build. |
77
+ | 6 | `smoke` | release-manager | Does it answer locally? The last cheap red. |
78
+ | 7 | `approval` | **human** (ceo notified) | The one gate no agent closes. |
79
+ | 8 | `migrations` | release-manager | Applied in order, and is the rollback known? |
80
+ | 9 | `ship` | release-manager | Shipped from `.release/`, where the receipt binds. |
81
+ | 10 | `health` | doctor | Do all five targets answer after the ship? "Deployed" is not "healthy". |
82
+
83
+ ---
84
+
85
+ ## The wire
86
+
87
+ ```
88
+ signal("deploy:event", {
89
+ run, // the deploy's own id — the stamp in deploy.sh's log name
90
+ target, // one-prod | one-dev | pay | channels | api
91
+ stage?, // one of DEPLOY_SPINE_STEPS
92
+ status?, // start | ok | fail (there is deliberately no `skip`)
93
+ verdict?, // green | red — final call only, closes the run
94
+ sha?, door?, reason?, wallMs?, detail?
95
+ })
96
+ ```
97
+
98
+ The run key is `deploy:<target>:<run>` (`deployRunKey`) — id **and**
99
+ idempotency_key, so a double-write returns the same row. It is also the `run:`
100
+ tag on every task the template files, so one string joins the board, the run
101
+ list and every `deploy_*()` function. **Never mint a second run-scoped key.**
102
+
103
+ Tasks are idempotent by a `slug:<runKey>:<stage>` tag — `tasks:create` returns
104
+ the existing row rather than inserting a twin, so a retried deploy does not pile
105
+ up duplicates. No dedupe logic to write.
106
+
107
+ ---
108
+
109
+ ## Asking the substrate
110
+
111
+ | Question | Function |
112
+ |---|---|
113
+ | What is left? | `deploy_open($run)` · `deploy_open_count($run)` |
114
+ | **What never ran?** | `deploy_gate_open($run,$stage)` ∧ NOT `deploy_gate_ran($gate,$target)` |
115
+ | Is it actually green? | `deploy_green($run)` |
116
+ | What can run now? | `deploy_ready($run)` |
117
+ | What is waiting on something? | `deploy_blocked($run)` |
118
+ | Which gate next? | `deploy_next($run)` — the ant's pick, strongest net trail |
119
+ | What does the doctor still owe? | `deploy_crew_open($run, "health")` |
120
+ | Which gate keeps biting? | `deploy_gate_trail($gate,$target)` — net, across runs |
121
+
122
+ `schema/deploy.tql` is **functions only, zero new types** — the `story.tql`
123
+ pattern. A deploy is the set of signals and tasks sharing one run key: a count,
124
+ not an entity. Never add a `deploy-run` entity; the row already exists.
125
+
126
+ ---
127
+
128
+ ## Reporting a deploy honestly
129
+
130
+ When asked how a deploy went, say in this order:
131
+
132
+ 1. **Verdict** — green/red, and green only if `deploy_open_count() == 0`.
133
+ 2. **Unrun gates, named.** If any, the run is not green no matter what the
134
+ verdict field says. Say which.
135
+ 3. **Which lane the tests took** — full, or REUSED from a receipt. A fast pass
136
+ is never reported as a full pass.
137
+ 4. **What bit**, in the gate's own words (`reason`).
138
+
139
+ Never report "deployed" as "healthy" — gate 10 is a separate question, and
140
+ `deploy.astro` probes it live rather than trusting the ship.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: fleet-audit
3
+ description: How to run multi-fleet agent audits without contradiction — probe before reading, shared measurement pack, one join fleet, default REFUTED, fleet-prompt rules. Use when the operator opts into multi-agent audits or fleets.
4
+ ---
5
+
6
+ # Multi-fleet audits — how the 2026-08-25 launch audit actually worked
7
+
8
+ When the operator opts into multi-agent work, this shape holds up. Six fleets ran
9
+ concurrently from one window without contradicting each other.
10
+
11
+ **1. Probe before you read.** Every launch-blocking finding that day came from a
12
+ live probe; not one would have been caught by reading source. The codebase is
13
+ honest about intent and silent about reachability — *declared ≠ wired ≠ configured
14
+ ≠ reachable ≠ working from this egress IP*. Mint a real checkout to learn the
15
+ Stripe mode. Read a D1 **count** (`2 of 68`) to learn if a feature is used. Probe a
16
+ third-party API **from where the code runs** — Solana's public RPC 403s CF egress
17
+ and serves a laptop happily. Treat any `/status` route as a claim: `pay/backend/src/routes/status.ts:37`
18
+ hardcodes its chain list as a literal array.
19
+
20
+ **2. Synchronise by shared evidence, not by orchestration.** Build ONE measurement
21
+ pack of file:line facts, then embed it verbatim in every fleet prompt. Fleets given
22
+ identical facts cannot drift; fleets given only a task description will.
23
+
24
+ **3. One fleet is the join.** A final fleet folds every other fleet's findings back
25
+ into `text/one.md`, which already carries the rule: *the specific doc wins and the
26
+ spine gets reconciled.*
27
+
28
+ **4. Default REFUTED on every verify, and demand the quoted stopping line.** "No
29
+ quotable line ⇒ not proven" is what catches plausible-but-wrong fixes.
30
+
31
+ **5. Two instances of one defect shape ⇒ fix the seam, never the sites.** Two
32
+ unrelated fleets hit the same unenforced-auth-label bug. That is a root cause and a
33
+ base rate, not two bugs — patching both sites would have left ~300 receivers open.
34
+
35
+ **6. Kill a fleet the moment its premise dies.** When the design changed from
36
+ "convert a stranger" to "an agent provisions the account", the in-flight blocker
37
+ fleet was still building an *anonymous checkout* — the exact unauthenticated write
38
+ path every other verifier was hunting. Stop it; discard the worktree.
39
+
40
+ **Four rules for the fleet prompts themselves:**
41
+
42
+ - **Never let a fleet spend money to prove a point.** One audit billed ~$0.215 of
43
+ real DataForSEO credit demonstrating an anonymous-spend hole. Correct finding,
44
+ wrong method — once the first call proves the door is open, reason from code, and
45
+ say so in the prompt.
46
+ - **Never simulate a run and report it as one.** Instruct explicitly: *if you
47
+ cannot execute for real, say so and STOP.* A fabricated run report poisons every
48
+ decision downstream of it.
49
+ - **Give a legitimate "no change needed" exit.** Telling one fleet that "leave it
50
+ gated, fix the funnel order" was an acceptable answer stopped it punching a hole
51
+ in the payment path to make a landing page prettier.
52
+ - **Name the forbidden sentence.** For anything customer-facing, have the fleet
53
+ emit the sentences that would be FALSE, quoted verbatim, so nobody ships them by
54
+ accident. This is what caught "Google recovers your wallet".
55
+
56
+ **Isolation:** worktrees for writers only; doc-only and read-only fleets don't need
57
+ one. Watch for a fleet editing shared `main` — that is how a neighbour's work gets
58
+ swept into the wrong commit.
@@ -0,0 +1,220 @@
1
+ ---
2
+ name: meeting
3
+ description: Host a meeting in /u/<slug>/in where heads claim, delegate, chat and chain rows — not report. Use whenever the chairman (or any convener) convenes heads on a plan, a board, a blocker, or a launch — "hold a meeting", "convene the team", "get the heads on this", "chairman hosts", "everyone claims tasks", "chain these tasks together", "run the board meeting". Writes a measurement pack, opens ONE thread, spawns heads that must each leave with a tid, and closes with a ledger read back from D1. Refuses a meeting whose output is a document and no moved row.
4
+ ---
5
+
6
+ # meeting — the room where rows move
7
+
8
+ **Purpose:** a meeting is not where heads report. It is where they **take a row, hand a row,
9
+ argue on the row, and put the rows in order** — claim · delegate · chat · chain. The output is
10
+ the board's diff, not a document.
11
+
12
+ Shape: `text/template-meeting.md` — **copy it, never write a meeting from scratch.**
13
+
14
+ ```
15
+ cp text/template-meeting.md text/meeting-<subject>-<yyyy-mm-dd>.md
16
+ ```
17
+
18
+ **Why this skill exists, measured.** On 2026-09-11 four capable agents ran a full board meeting,
19
+ produced the best design document in the estate, and **closed zero rows** — net effect **+3**.
20
+ On 2026-09-12 five heads were spawned into a session budget that could not carry them and **all
21
+ five died mid-orientation**, before one number was reported. Both failures are in the template's
22
+ rules. Neither was a failure of the heads.
23
+
24
+ ---
25
+
26
+ ## §0 — THE FOUR LAWS
27
+
28
+ 1. **The room is `/u/<slug>/in`, and there is ONE thread.** A meeting in a session transcript did
29
+ not happen. A meeting whose record lives in `/tmp` dies with the session.
30
+ 2. **Heads talk to each other, not to the convener.** Cross-examination (§4) is mandatory. Four
31
+ heads reporting upward and never reading each other is four interviews, not a meeting.
32
+ 3. **A document is not a deliverable. A moved row is.** Grade every attendee on the board, not
33
+ the prose.
34
+ 4. **Size the spawn to the budget before you write a brief.** Two heads that finish beat five
35
+ that die. The convener checks capacity first; a rate-limited head reports nothing at all.
36
+
37
+ ---
38
+
39
+ ## §1 — THE DOORS (measured; do not improvise)
40
+
41
+ | Purpose | Door |
42
+ |---|---|
43
+ | post to the room | `thread:append` → `{"data":{"slug":"one","group":"space:one","sender":"<agent>","role":"assistant","content":"..."}}` |
44
+ | chat on a row | `tasks:comment` → `{"data":{"tid":"task:<24hex>","workspace":"one","body":"..."}}` |
45
+ | claim | `tasks:claim` → `{"data":{"tid":"task:<24hex>","workspace":"one"}}` **then** `tasks:reassign` → `{"data":{"tid":"…","assignee":"<your slug>","workspace":"one"}}` — under the shared gateway key every head claims as `@one`; the reassign is what puts YOUR name on the row. One act, two calls |
46
+ | delegate, in place | `tasks:reassign` → `{"data":{"tid":"...","assignee":"<slug>","workspace":"one"}}` |
47
+ | delegate, to the world | `tasks:announce` → `{"data":{"taskId":"...","tags":["bare","words"],"workspace":"one"}}` |
48
+ | chain — split | `tasks:subtask` → `{"data":{"parent":"task:...","title":"...","blockedBy":["task:..."],"workspace":"one"}}` |
49
+ | chain — order | `tasks:depend` → `{"data":{"tid":"<blocked>","blockedBy":"<blocker>","workspace":"one"}}` |
50
+ | close | `tasks:status` → `{"data":{"tid":"...","status":"done","workspace":"one"}}` |
51
+ | see the whole board | `tasks:board` → `{"data":{"workspace":"one","view":"summary","scope":"tree"}}` first (exact `total`, ready/blocked sets, counts — no rows), then `{"data":{"workspace":"one","ready":true,"tags":["<tag>"]}}` for rows; follow `nextCursor`, and say so if `truncated` is present |
52
+ | act on many rows | `tasks:bulk` → `creates` (with `ref`s) / `edits` / `where`+`set` — `where` is **dryRun by default**; put a `comment` on every change so the thread records why |
53
+ | read the rungs by tag | `tasks:list` → `{"data":{"workspace":"one","tag":"<tag>"}}` — exact tag, any string (`plan:<slug>` for a /do plan's cycle rows), uncapped; answers `{tid,status,name}` only, no assignee |
54
+
55
+ All writes: `POST https://one.ie/api/ask/<receiver>`, `Authorization: Bearer $GATEWAY_API_KEY`
56
+ (from `one.ie/web/.dev.vars`, **not `.env`** — prod refuses the `.env` key), body wrapped in
57
+ `{"data":{…}}` or you get `envelope_missing`.
58
+
59
+ **Read a post back from D1 before claiming it landed:**
60
+
61
+ ```bash
62
+ cd one.ie/web && npx wrangler d1 execute one-owners --remote --json --command \
63
+ "SELECT id, role, length(content_json) AS len, substr(content_json,1,80) AS head, ts \
64
+ FROM messages WHERE thread_id='<THREAD>' ORDER BY ts DESC LIMIT 5"
65
+ ```
66
+
67
+ ### The doors that lie
68
+
69
+ - **BANNED — `space:post` and `chat:send`.** Both return `ok:true` and write **zero rows**;
70
+ `live:0` is the tell. Six chairman reports were lost to `space:post` on 2026-09-11.
71
+ - **`tasks:notes` with an absent `notes` field CLEARS the row.** Reading a note deletes it.
72
+ - **`tasks:comment` truncates at 4000 bytes**, silently, and still returns `ok:true`.
73
+ - **`tasks:everywhere` is a follow-scoped queue, not the board** — it sorts by weight DESC and
74
+ ignores the `tag` argument, so a weight-0 row can sit below any page. On 2026-09-12 fifteen
75
+ filed rungs were invisible on that read, which is why they had all sat open. **See the board
76
+ with `tasks:board`** (`total` is exact, `truncated` names any cut), or read rungs with
77
+ `tasks:list` by tag. MCP `tasks_list` is one page of `/api/things` — never the whole board.
78
+ - **Only the FIRST `@mention` in a comment creates a follow** (no `g` flag,
79
+ `resolvers/tasks.ts:1899`). Three heads pulled in = three separate comments.
80
+ - One shape under all of these: **a boundary that is silent on the way past it.** Report the cap
81
+ you hit, always.
82
+
83
+ ---
84
+
85
+ ## §2 — THE PRE-READ *(the convener writes this BEFORE any head is spawned)*
86
+
87
+ ONE measurement pack, identical for every attendee, **embedded verbatim in every brief.** Heads
88
+ given the same facts cannot drift; heads given only a task description always will.
89
+
90
+ - [ ] Every number carries the command that produced it.
91
+ - [ ] Every claim from a doc or a task note is marked **UNVERIFIED** until re-measured. Stale
92
+ notes are the norm.
93
+ - [ ] The pack states what the convener did **not** check.
94
+ - [ ] The board's open count is recorded, **with the door that produced it** — a capped read is
95
+ not a count.
96
+ - [ ] Capacity checked. Name how many heads the budget carries, and spawn that many.
97
+
98
+ **THE ONE QUESTION** — one sentence. If you cannot write it, you are calling a status update.
99
+
100
+ ---
101
+
102
+ ## §3 — ROUND 1 · WHAT EACH HEAD MEASURED
103
+
104
+ ```
105
+ @<head> — ROUND 1
106
+ MEASURED: <number> — <the exact command>
107
+ REFUTES: <which pack line this contradicts, or "nothing">
108
+ DID NOT RUN: <every check skipped — an unrun check is not a pass>
109
+ I WAS WRONG ABOUT: <anything from earlier, corrected>
110
+ ```
111
+
112
+ **Default REFUTED.** No quotable stopping line ⇒ not proven. A head that reports its own error
113
+ unprompted is doing the job.
114
+
115
+ ---
116
+
117
+ ## §4 — ROUND 2 · CROSS-EXAMINATION *(the round that makes it a meeting)*
118
+
119
+ Mandatory. The convener does **not** relay it — heads post at each other.
120
+
121
+ ```
122
+ @<head> → @<other-head>
123
+ YOUR NUMBER: … / MY NUMBER: … / THE GAP: <scoping? door? stale read?> / WHO RECONCILES: <name>
124
+ ```
125
+
126
+ On 2026-09-11 one head measured **13** dependency edges and another **259**. Both competent;
127
+ neither had read the other. 13 was not a substrate count — it was what a door surfaced, ~5% of
128
+ the graph. That gap was the day's most important finding and nearly went unnoticed.
129
+
130
+ - [ ] Every contested number is reconciled or **explicitly parked with a named owner**.
131
+ - [ ] **Nobody quotes a contested number at the board until it is reconciled.**
132
+
133
+ ---
134
+
135
+ ## §5 — CHAIN THE WORK *(before anyone fans out)*
136
+
137
+ **Chaining is not bookkeeping — it is what makes the board sequence itself.** `tasks:claim` is
138
+ **blocker-gated**, and `tasks:depend` writes the very `blocks` edge that gate reads. An unchained
139
+ board hands every head every row at once and nothing knows what comes first. **Chain first, or
140
+ the fan-out is a race.**
141
+
142
+ | verb | use |
143
+ |---|---|
144
+ | `tasks:subtask` | split a rung — writes row + notes + tags + `containment` + every `blockedBy` in ONE pipeline, so a child never appears claimable with an empty body or missing ordering |
145
+ | `tasks:depend` | order two existing rows. Refuses a self-edge and a reverse edge, so a cycle cannot be filed |
146
+
147
+ **Never split with `tasks:create`** — a child made that way is an orphan somebody claims before
148
+ it is ready.
149
+
150
+ Two rules keep a chain honest, and they are one rule twice:
151
+ - **A child's cast is a subset of its parent's.** Inherit by default, declare to narrow, **never
152
+ to widen.**
153
+ - **Depth needs a floor.** A parent spawning children while none settle is a leak, not a big
154
+ plan. Freeze the parent's outcome before children mint; let `fade`/`warn` decay what goes quiet.
155
+
156
+ ---
157
+
158
+ ## §6 — DECISIONS
159
+
160
+ | # | Decision | Owner | Recommendation + the measured reason | tid |
161
+ |---|---|---|---|---|
162
+
163
+ Split honestly:
164
+ - **Human-only** — needs a credential, money, or a judgement no measurement settles. **List these
165
+ first, each with a recommendation.** The highest-value output of any meeting is the short list
166
+ of decisions only the operator can make, each made cheap to answer.
167
+ - **Head-owned** — if it reached the convener, it was mis-routed. Hand it back.
168
+
169
+ ---
170
+
171
+ ## §7 — CLOSE · EVERY HEAD LEAVES WITH A TID
172
+
173
+ | Head | tid | Action | If not closed: the ONE thing that would close it |
174
+ |---|---|---|---|
175
+
176
+ Five honest exits, graded differently:
177
+
178
+ | | |
179
+ |---|---|
180
+ | **closed** | the row is done and proven |
181
+ | **claimed** | taken, in flight, named |
182
+ | **delegated** | handed on with `tasks:reassign` — **name who to.** Never by filing a second row |
183
+ | **chained** | split or ordered — **name the parent and the edge** |
184
+ | **declined** | refused on principle, **with an argument**. Sometimes the best act available |
185
+ | **blocked** | by something measured and **named** with a tid or `file:line`. "Blocked" with no named blocker is a shrug |
186
+ | **stale** | the row describes a problem that no longer exists. **This IS a close**, often the best outcome. Prove it |
187
+ | ⚠️ **artifact, not outcome** | produced a document instead of a change. A failure, however good the document — and the one that most looks like success |
188
+
189
+ ---
190
+
191
+ ## §8 — THE LEDGER *(the convener posts it; it is the minutes)*
192
+
193
+ ```
194
+ MEETING: <subject> THREAD: <id> ROWS: <before> → <after>
195
+ CLOSED: <tids>
196
+ CLAIMED: <tid — head>
197
+ DELEGATED: <tid — from → to>
198
+ CHAINED: <parent tid → child tids, and the blockedBy edges>
199
+ BLOCKED ON A HUMAN: <tid — the decision, one line>
200
+ STILL OPEN: <tid — why, named>
201
+ I GOT WRONG: <the convener's own errors, FIRST>
202
+ ```
203
+
204
+ Read the ledger back from D1 and quote the row. **The convener is graded too, by name.** A
205
+ chairman who edits their own record is worth nothing. If a brief asked for a *report*, the open
206
+ row is a **convener** failure — what you ask for is what you get.
207
+
208
+ ---
209
+
210
+ ## Checklist — the convener runs this or the meeting does not start
211
+
212
+ - [ ] §2 pack written, one copy, embedded verbatim in every brief
213
+ - [ ] THE ONE QUESTION in a single sentence
214
+ - [ ] Capacity checked; spawn count sized to the budget
215
+ - [ ] Thread opened with `thread:append` **and read back from D1**
216
+ - [ ] Every brief says **CLAIM · DELEGATE · CHAIN · CLOSE** — never "report" or "return a summary"
217
+ - [ ] §4 cross-examination named as mandatory in every brief
218
+ - [ ] §5 chaining done before fan-out
219
+ - [ ] Board open count recorded before, with the door named
220
+ - [ ] §8 ledger posted, read back, convener's own errors first