@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.
- package/.claude-plugin/plugin.json +1 -1
- package/agents/abm-strategist.md +67 -1
- package/agents/ads-meta.md +67 -1
- package/agents/analyst.md +67 -1
- package/agents/animator.md +108 -0
- package/agents/architect.md +269 -20
- package/agents/brand-guardian.md +67 -1
- package/agents/brand-strategist.md +67 -1
- package/agents/campaign-content.md +67 -1
- package/agents/campaign-email.md +67 -1
- package/agents/campaign-sms.md +67 -1
- package/agents/campaign-social.md +67 -1
- package/agents/cco.md +83 -2
- package/agents/ceo.md +108 -11
- package/agents/chairman.md +197 -0
- package/agents/cmo.md +82 -2
- package/agents/community-greeter.md +67 -1
- package/agents/community-moderator.md +67 -1
- package/agents/compliance.md +67 -1
- package/agents/copywriter.md +67 -1
- package/agents/creative-strategist.md +67 -1
- package/agents/cro.md +81 -1
- package/agents/cto.md +266 -28
- package/agents/customer-interviewer.md +67 -1
- package/agents/customer-researcher.md +67 -1
- package/agents/customer-success-manager.md +67 -1
- package/agents/customer-trainer.md +67 -1
- package/agents/cxo.md +82 -1
- package/agents/demand-creator.md +67 -1
- package/agents/demo-mover.md +67 -1
- package/agents/demo-specialist.md +67 -1
- package/agents/demo-thai-family-law.md +67 -1
- package/agents/designer.md +67 -1
- package/agents/discovery-caller.md +67 -1
- package/agents/doctor.md +269 -0
- package/agents/educate-coach.md +67 -1
- package/agents/elevate-tutor.md +67 -1
- package/agents/email-lifecycle-marketer.md +67 -1
- package/agents/engage-specialist.md +67 -1
- package/agents/events-coordinator.md +67 -1
- package/agents/foundation-builder.md +67 -1
- package/agents/funnel-architect.md +67 -1
- package/agents/gift-creator.md +67 -1
- package/agents/google-ads.md +67 -1
- package/agents/guide.md +67 -1
- package/agents/helpdesk-dispatcher.md +67 -1
- package/agents/hook-specialist.md +67 -1
- package/agents/identify-optimizer.md +67 -1
- package/agents/implementer.md +313 -45
- package/agents/incident-commander.md +67 -1
- package/agents/insights-lead.md +87 -1
- package/agents/journey-runner.md +67 -1
- package/agents/linkedin-ads.md +67 -1
- package/agents/live-sales-chat.md +67 -1
- package/agents/market-researcher.md +67 -1
- package/agents/media-buyer.md +67 -1
- package/agents/memory-keeper.md +195 -0
- package/agents/movers-customer-researcher.md +67 -1
- package/agents/movers-foundation-builder.md +67 -1
- package/agents/movers-market-researcher.md +67 -1
- package/agents/movers-pricing-strategist.md +67 -1
- package/agents/nurture-architect.md +67 -1
- package/agents/offer-architect.md +67 -1
- package/agents/onboarder.md +67 -1
- package/agents/onboarding-specialist.md +67 -1
- package/agents/operations-dashboard.md +87 -1
- package/agents/perf-engineer.md +333 -37
- package/agents/playbook-writer.md +67 -1
- package/agents/plg-strategist.md +67 -1
- package/agents/positioning-architect.md +67 -1
- package/agents/press-officer.md +67 -1
- package/agents/pricing-strategist.md +67 -1
- package/agents/privacy-officer.md +67 -1
- package/agents/referral-manager.md +67 -1
- package/agents/refine-analyst.md +67 -1
- package/agents/release-manager.md +446 -39
- package/agents/renewals-upsell-rep.md +67 -1
- package/agents/review-engineer.md +319 -45
- package/agents/rewards-steward.md +67 -1
- package/agents/sales-call-coach.md +67 -1
- package/agents/sales-closer.md +67 -1
- package/agents/security-auditor.md +343 -48
- package/agents/sell-closer.md +67 -1
- package/agents/share-amplifier.md +67 -1
- package/agents/social-media-manager.md +67 -1
- package/agents/storyteller.md +301 -0
- package/agents/strategist.md +67 -1
- package/agents/strategy-aligner.md +67 -1
- package/agents/support-agent.md +67 -1
- package/agents/tagger.md +327 -0
- package/agents/tech-writer.md +195 -22
- package/agents/test-engineer.md +398 -29
- package/agents/tiktok-ads.md +67 -1
- package/agents/tracking-engineer.md +67 -1
- package/agents/trailkeeper.md +181 -0
- package/agents/upsell-strategist.md +67 -1
- package/agents/voice.md +67 -1
- package/agents/w1-recon.md +1 -1
- package/agents/w2-decide.md +1 -1
- package/agents/w3-edit.md +8 -2
- package/agents/w4-verify.md +13 -0
- package/agents/workflow-optimiser.md +81 -1
- package/commands/close.md +916 -160
- package/commands/deploy.md +102 -724
- package/commands/do.md +58 -2
- package/commands/sweep.md +159 -0
- package/commands/tasks.md +222 -0
- package/hooks/scripts/dev-only.sh +135 -0
- package/hooks/scripts/git-add-guard.sh +37 -2
- package/hooks/scripts/session-start.sh +32 -4
- package/package.json +1 -1
- package/rules/scripts.md +85 -0
- package/scripts/CLAUDE.md +315 -0
- package/scripts/ad-copy-lint.sh +656 -0
- package/scripts/agent-actor-parity.sh +129 -0
- package/scripts/blocks-manifest-cached.sh +100 -0
- package/scripts/chat-context-check.sh +89 -0
- package/scripts/chrome.mjs +18 -0
- package/scripts/close-metrics.sh +587 -0
- package/scripts/close-owner.sh +326 -0
- package/scripts/db-sync-lock-check.sh +116 -0
- package/scripts/deploy-emit.sh +311 -0
- package/scripts/deploy-gate-check.sh +155 -0
- package/scripts/deploy-ready.sh +78 -0
- package/scripts/deploy-record.sh +605 -0
- package/scripts/deploy-schema-check.sh +58 -0
- package/scripts/deploy.sh +393 -243
- package/scripts/do-auto.sh +127 -26
- package/scripts/do-board.sh +429 -0
- package/scripts/do-close.sh +1184 -0
- package/scripts/do-consumer-sweep.sh +18 -1
- package/scripts/do-decide.sh +476 -0
- package/scripts/do-fleet.sh +8 -2
- package/scripts/do-plan-json.mjs +110 -12
- package/scripts/do-prove-selftest.sh +108 -0
- package/scripts/do-prove.sh +86 -10
- package/scripts/do-rank.py +200 -3
- package/scripts/do-reconcile.sh +73 -12
- package/scripts/do-signal.sh +101 -23
- package/scripts/do-smoke.sh +18 -1
- package/scripts/do-w4-gates.sh +11 -1
- package/scripts/do-world-check.sh +153 -0
- package/scripts/download-stats.sh +172 -0
- package/scripts/factory-brief-check.sh +330 -0
- package/scripts/factory-check.sh +18 -1
- package/scripts/factory-close-check.sh +257 -0
- package/scripts/factory-emit.sh +211 -0
- package/scripts/factory-executor-check.mjs +353 -0
- package/scripts/factory-peak.sh +301 -0
- package/scripts/factory-repo.sh +71 -0
- package/scripts/factory-review-check.mjs +61 -0
- package/scripts/factory-tasks-check.sh +18 -1
- package/scripts/fixtures/factory-brief-real.md +44 -0
- package/scripts/flywheel-outcome.sh +63 -0
- package/scripts/gate-reaper-check.sh +98 -0
- package/scripts/gate-reaper.sh +9 -0
- package/scripts/gate-watchdog.sh +619 -0
- package/scripts/gc-content-check.sh +142 -0
- package/scripts/gh-traffic-capture.sh +153 -0
- package/scripts/govern-order-check.sh +202 -0
- package/scripts/governor-doors-check.sh +86 -5
- package/scripts/health.sh +448 -0
- package/scripts/id-inventory.mjs +418 -0
- package/scripts/incident.sh +212 -0
- package/scripts/land.sh +755 -45
- package/scripts/lib/gc-finished.sh +77 -0
- package/scripts/livekit-ratchet.sh +18 -1
- package/scripts/machine-check.sh +1 -1
- package/scripts/memory-index-budget.sh +79 -0
- package/scripts/npm-downloads.sh +109 -0
- package/scripts/one-agents.mjs +204 -8
- package/scripts/one-resume.sh +31 -3
- package/scripts/pr-body.sh +335 -0
- package/scripts/preview-fd-check.sh +289 -0
- package/scripts/redirect-lint.sh +169 -0
- package/scripts/release.sh +40 -6
- package/scripts/resume-lost-sessions.sh +68 -0
- package/scripts/shoot-pages.mjs +140 -0
- package/scripts/signal-meta-backfill.ts +451 -0
- package/scripts/signal-watch.sh +63 -6
- package/scripts/speed-cache-check.sh +12 -2
- package/scripts/sweep.sh +426 -0
- package/scripts/task-titles-dump.ts +101 -0
- package/scripts/test-cached.sh +47 -10
- package/scripts/test-lanes.sh +14 -0
- package/scripts/thread-name-backfill.ts +215 -0
- package/scripts/triage-shape-check.sh +149 -0
- package/scripts/tsc-cached.sh +155 -8
- package/scripts/typedb-flake-check.sh +3 -1
- package/scripts/urls-lint.sh +8 -0
- package/scripts/verify-board-doors.sh +80 -0
- package/scripts/verify-fast.sh +159 -6
- package/scripts/worktree-up.sh +21 -3
- package/skills/astro/SKILL.md +9 -3
- package/skills/astro/optimize-performance.md +3 -2
- package/skills/cloudflare/SKILL.md +3 -2
- package/skills/cloudflare-security-audit/AI-AND-LLM.md +83 -0
- package/skills/cloudflare-security-audit/ATTACK-CLASSES.md +130 -0
- package/skills/cloudflare-security-audit/CLIENT-SIDE.md +83 -0
- package/skills/cloudflare-security-audit/CLOUD-AND-DEPLOYMENT.md +86 -0
- package/skills/cloudflare-security-audit/DATA-ISOLATION-AND-LIFECYCLE.md +84 -0
- package/skills/cloudflare-security-audit/DESKTOP-MOBILE-AND-LOCAL-IPC.md +89 -0
- package/skills/cloudflare-security-audit/HUNTING.md +251 -0
- package/skills/cloudflare-security-audit/LICENSE +21 -0
- package/skills/cloudflare-security-audit/MEMORY-SAFETY-AND-BINARY.md +101 -0
- package/skills/cloudflare-security-audit/PROTOCOLS-RPC-AND-MESSAGING.md +81 -0
- package/skills/cloudflare-security-audit/PROVENANCE.md +78 -0
- package/skills/cloudflare-security-audit/RECONNAISSANCE.md +156 -0
- package/skills/cloudflare-security-audit/RESOURCE-EXHAUSTION-AND-AVAILABILITY.md +78 -0
- package/skills/cloudflare-security-audit/SKILL.md +192 -0
- package/skills/cloudflare-security-audit/SUPPLY-CHAIN-AND-RELEASE.md +73 -0
- package/skills/cloudflare-security-audit/VALIDATION-AND-REPORTING.md +186 -0
- package/skills/cloudflare-security-audit/WEB-PROTOCOL-AND-AUTH.md +105 -0
- package/skills/cloudflare-security-audit/report-schema.json +461 -0
- package/skills/cloudflare-security-audit/validate-coverage-ledger.cjs +872 -0
- package/skills/cloudflare-security-audit/validate-coverage-ledger.test.cjs +740 -0
- package/skills/cloudflare-security-audit/validate-findings.cjs +773 -0
- package/skills/cloudflare-security-audit/validate-findings.test.cjs +652 -0
- package/skills/deploy/REFERENCE.md +713 -0
- package/skills/deploy/SKILL.md +140 -0
- package/skills/fleet-audit/SKILL.md +58 -0
- package/skills/meeting/SKILL.md +220 -0
- package/skills/planning/SKILL.md +256 -0
- package/skills/shadcn/SKILL.md +1 -1
- package/skills/typedb/SKILL.md +7 -0
- package/skills/voice/SKILL.md +94 -6
- package/skills/voice/corpus-check.sh +87 -0
- package/templates/template-agent.md +7 -1
- package/templates/template-feature.md +9 -0
- 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
|