@kybernesis/create 0.7.0 → 0.7.1

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.
@@ -0,0 +1,148 @@
1
+ ---
2
+ description: Use when installing, configuring, or debugging any @kybernesis package — arcana (memory), enterprise (governance), multiplayer (Slack), engineer (build+ship), dispatch (agent-to-agent), connectors (Gmail/Calendar/remote MCP), local (the user's own machine), manage (Studio→agent), exe (off-Vercel hosting), evals (QA), create (kyb CLI) — or the Kybernesis registry. Includes every production-learned gotcha.
3
+ ---
4
+
5
+ # The Kybernesis packages
6
+
7
+ Eleven packages, npm-public under `@kybernesis`, Apache-2.0, monorepo
8
+ `KybernesisAI/platform`. Registry: `https://registry.kybernesis.ai`
9
+ (`eve registry add @kybernesis=https://registry.kybernesis.ai/r/{name}.json`,
10
+ then `eve add @kybernesis/<item>`). Each covers one axis:
11
+
12
+ - **arcana** — memory. Extension mount `arcana({ apiKey, workspace,
13
+ resolveWorkspace? })`. Workspace-scoped `kb_` keys (403 outside their
14
+ workspace — one key per brain). `resolveWorkspace` only from VERIFIED
15
+ session context, never model output, and only key-reachable workspaces.
16
+ Subagents: local extension mount (`subagents/<id>/extensions/arcana.ts`,
17
+ eve ≥0.30) or plain connection + skill copies. Header
18
+ `X-Kyberagent-Agent: <workspace>` required by the MCP.
19
+ - **enterprise** — governance. Plain library (route auth can't ship in an
20
+ extension). `kybernesisAuth()` admits only control-plane IdentitySessions
21
+ WITH a grant for this agent (`authorization: Bearer` + `x-kybernesis-bundle`
22
+ headers; 401 no-creds, 403 agent_not_granted). Lazy JWKS — compiles without
23
+ KYBERNESIS_ISSUER. See the `control-plane` skill.
24
+ - **multiplayer** — Slack conversation mechanics. `multiplayerSlackChannel()`
25
+ from `/slack` subpath: thread = shared session with per-speaker verified
26
+ identity, no-re-mention continuation, dual surface (verified
27
+ `surface: "channel"|"dm"` attribute + helpers from package root), `/new` DM
28
+ reset. Slack-only today.
29
+ - **engineer** — build + ship. Extension: `screenshot` (renders in in-sandbox
30
+ Chromium, returns pixels the model SEES) + `deliver` (sandbox file → public
31
+ Blob URL; needs BLOB_READ_WRITE_TOKEN — one-liner:
32
+ `vercel blob create-store <name>-deliverables --access public --yes`) +
33
+ six skills (dev-loop, scaffold, visual-qa, git-discipline, ship,
34
+ architecture-notes). The registry item ALSO writes
35
+ `agent/sandbox/sandbox.ts` — the workshop: Playwright baked into the
36
+ template at DEPLOY time, backend PINNED to Vercel Sandbox (no Docker
37
+ anywhere, local runs use hosted sandboxes via `vercel link` + `env pull`),
38
+ domain allowlist = the client's security posture. Ship loop: preview deploys
39
+ via the Vercel MCP connection (inline file tree, no git needed, no token in
40
+ the VM); production promotion is ALWAYS human-approved.
41
+ - **dispatch** — agent-to-agent. `remotePeer({ envVar, description })` under
42
+ `agent/subagents/` = a separately DEPLOYED eve agent as a callable peer
43
+ (eve's `defineRemoteAgent` underneath: durable park→callback dispatch);
44
+ `dispatchChannel({ trustedPeers, extraAuth? })` as `agent/channels/eve.ts` =
45
+ the receiver, one declaration feeding BOTH the OIDC subjects allowlist and
46
+ `trustedForwarders`. Principal forwarding ON by default — the peer runs as
47
+ the human who asked. `() => true` trust is not expressible. Peers are
48
+ production-environment by default. BOTH ends must run compatible eve
49
+ versions (old receivers silently drop forwarding → service identity).
50
+ Composes with enterprise via `extraAuth: [kybernesisAuth(...)]`. See the
51
+ `connect-agents` skill for the end-to-end wiring flow.
52
+ **GOVERNED mode (≥0.2.1, proven live 2026-08-07):** `remotePeer({ callee:
53
+ "<registered-name>", governed: { issuer } })` + `dispatchChannel({ governed:
54
+ { issuer, agent } })` — edges granted in the control plane, outbound auth =
55
+ a 300s A2A token minted from POST /api/agent/session with the deployment's
56
+ `KYBERNESIS_AGENT_CREDENTIAL`, callee URL from the registry (envVar
57
+ overrides). Revoke in the admin → refused within the token TTL, no
58
+ redeploy. Names match EXACTLY (case-sensitive: "Kyber" ≠ "kyber").
59
+ Requires @kybernesis/enterprise ≥0.2.0 installed (optional peer, lazy).
60
+ 0.2.1 lesson: eve resolves remote URLs at BOOT — url() must degrade
61
+ (env → discovery-if-credentialed → fallbackUrl), never throw on a missing
62
+ credential, or the whole agent (and its evals) fails to boot.
63
+ - **connectors** — the user's SaaS accounts, brokered. `connectorTools()` is a
64
+ dynamic resolver: at turn start it asks the control plane which services THIS
65
+ principal has connected and returns those tools. Composio is the broker; the
66
+ API key is per-org, held in the control plane (never an env var, never a
67
+ client's key in our account). Tools are named `<toolkit>_<action>`. Also
68
+ exports `toolInputSchema` (broker JSON Schema → zod) and a minimal MCP client
69
+ for `mcp-direct` servers that speaks BOTH JSON and text/event-stream.
70
+ - **local** — the user's own machine, through KYBER Studio. `localShellTool`,
71
+ `localRead/List/Write/Edit/SearchTool`, plus `localMcpTools()` for MCP servers
72
+ running on that machine, relayed. Every effect is consented in Studio; the
73
+ agent never holds a shell. `LOCAL_INSTRUCTIONS` explains the arrangement to
74
+ the model — mount it or the agent will offer to do things it cannot do.
75
+ - **manage** — the other direction: `manageChannel()` lets Studio install
76
+ capabilities and write schedules onto a running agent, and `routineTools()`
77
+ turns "every morning at 8, brief me" into a real schedule file. This is how a
78
+ routine gets created from chat without anyone touching the repo.
79
+ - **exe** — running off Vercel. `exeModel()` for exe.dev's LLM integration,
80
+ `grokSubscription()` / `readGrokCredential()` for a SuperGrok or X Premium+
81
+ login (`grok login` → `~/.grok/auth.json`, a valid bearer for api.x.ai —
82
+ same shape as eve's `experimental_chatgpt()`), `hostPreflight()`, Photon
83
+ iMessage credentials, and a `/preview` tool. Subpaths: `/slack`, `/photon`,
84
+ `/sandbox`, `/preview`. See the `self-hosting` skill.
85
+ - **evals** — QA. `kybernesisBaseline({ agentDisplayName, routing,
86
+ engineer? })` = smoke + 5 memory + routing per dept + optional vision-loop
87
+ eval. Judge model ≠ model under test. Hermetic runs force all workspaces to
88
+ `<name>-eval` via the npm script.
89
+ - **create** — the `kyb` CLI: `init [--engineer]`, `doctor`, `upgrade`
90
+ (carries eve to the Kybernesis-CERTIFIED pin, never blind latest),
91
+ `skills`. Ships THIS skill suite.
92
+
93
+ ## Gotchas that each cost a real debugging session
94
+
95
+ - **Tool names are mount-dependent — ALWAYS suffix-match.** Extension mount →
96
+ `arcana__memory__arcana_remember`; plain connection → `arcana__arcana_remember`.
97
+ In approvals/hooks/evals: `toolName.endsWith("arcana_remember")`.
98
+ - **Vercel Connect connectors: use the UID** (`mcp.vercel.com/vercel`), never
99
+ the short name, in `connect()`. No grant editor exists — changing scope =
100
+ detach → remove → create (same UID) → attach, then re-auth from a FRESH
101
+ session (stale sessions error without re-prompting).
102
+ - **Dev servers in the sandbox start DETACHED** (nohup + background + log +
103
+ curl-poll) — a foreground server blocks the tool call and hangs the turn.
104
+ Verified-and-unchanged builds deploy WITHOUT re-running a server.
105
+ - **Deliver/file links: post URLs as plain text** — markdown bold glues
106
+ asterisks onto the URL in Slack and breaks it. Coach agents in prose, not
107
+ shell (WAFs eat shell-syntax Slack messages).
108
+ - **ESM packaging**: relative imports need `.js` extensions (tsc doesn't
109
+ rewrite); eve is a peer dep with an explicit range (`>=0.30.0 <0.31.0`),
110
+ pinned exactly in devDeps.
111
+ - **Eval fixtures are hardened on purpose** — in-test nonces (eve caches
112
+ compiled eval modules), per-run unique keys (workspaces accumulate),
113
+ company-general wording (dept-flavored prompts delegate and hide tool
114
+ calls), no security vocabulary ("canary" triggers refusals), long routing
115
+ timeouts. Do not "clean up" the odd-looking patterns.
116
+ - **A per-turn dynamic resolver needs a deadline.** `connectorTools()` and
117
+ `localMcpTools()` run before every turn and reach across a network. Without a
118
+ budget (6s) and a cache (60s connectors, 5min local discovery) one unreachable
119
+ laptop makes every turn hang — the agent looks broken and nothing in the log
120
+ says why.
121
+ - **Composio: one request per toolkit.** Repeating `toolkit_slug` in a single
122
+ `/api/v3/tools` call returns an EMPTY list, so connecting a second service
123
+ silently emptied the first. The logo is at `meta.logo`, not `logo`. A 200 can
124
+ still carry `successful: false` — check the body, not the status.
125
+ - **The broker's entity is the agent's REGISTERED name**, not its UUID.
126
+ `<agent>:<userId>`. Studio knows agents by id; normalize before you ask the
127
+ broker, or a connected account looks unconnected.
128
+ - **MCP requires the handshake.** `initialize` AND `notifications/initialized`
129
+ before `tools/list`, or the server never answers. Spawn through a LOGIN shell
130
+ (a bare spawn misses the user's PATH and node) and always bind
131
+ `child.on("error")` — without it a failed spawn is an unhandled rejection
132
+ that takes the process, not a error message.
133
+ - **Translate the MCP/broker inputSchema — never pass an open object.** A tool
134
+ with no declared arguments makes the model guess: nine calls to find a
135
+ `file_id` the server had documented all along. `mcpInputSchema` (local) and
136
+ `toolInputSchema` (connectors) do this; keep them permissive where the server
137
+ says nothing.
138
+ - **Never wrap a model object in a Proxy.** The AI SDK's model methods depend on
139
+ their own `this`; intercepting them detaches it and every call dies inside the
140
+ SDK on a missing internal. To swap a credential, wrap `fetch` instead — and
141
+ re-read the credential per request: a Grok login expires in six hours and the
142
+ CLI refreshes it in place.
143
+ - **Credentials are never a user's problem.** No client ever puts a key in a
144
+ `.env` — broker keys live per-org in the control plane, encrypted at rest, set
145
+ through an admin screen. A design that ends in "paste this token" is wrong.
146
+ - **npm**: only the `kybernesis` account creates new packages in the scope;
147
+ publishes need the human's browser auth; new versions take 1–3 min to
148
+ propagate to anonymous reads.
@@ -0,0 +1,206 @@
1
+ ---
2
+ description: Use when deploying an eve agent OFF Vercel — on exe.dev, a VPS, or any client infrastructure — or when a client wants to use their own ChatGPT/LLM subscription. Covers what breaks, what replaces it, and the credential checklist.
3
+ ---
4
+
5
+ # Self-hosted agents (client infrastructure, not Vercel)
6
+
7
+ The Vercel path is the default and the proven one. Reach for this when the
8
+ client **won't or can't use Vercel**, or wants their agent's inference billed to
9
+ a subscription they already pay for.
10
+
11
+ **The governing rule: everything must come from the CLIENT's accounts.** If a
12
+ step only works because you happen to hold a credential, that step is a bug in
13
+ the deployment, not a shortcut. It will fail on the real engagement.
14
+
15
+ ## Scaffold
16
+
17
+ ```bash
18
+ kyb init <name> --host=exe --channel=<imessage|slack|telegram|none> --engineer
19
+ ```
20
+
21
+ `--host=exe` swaps the bindings; everything else is the same product. Run
22
+ `kyb doctor` after — it knows the self-hosted failure modes below.
23
+
24
+ ## What Vercel gives you that a client host does not
25
+
26
+ | Capability | On Vercel | Self-hosted replacement |
27
+ | --- | --- | --- |
28
+ | Model access | AI Gateway | exe.dev LLM integration (`exeModel`) — managed, BYO key, or a **ChatGPT / Grok subscription** |
29
+ | Slack/Photon/Linear credentials | Vercel Connect | **Portable/static credentials the client issues** |
30
+ | Sandbox | `vercel()` hosted | `docker()` on the host |
31
+ | File delivery | Vercel Blob | Blob **or** `DELIVER_DIR` + `DELIVER_BASE_URL` |
32
+ | Public URLs | deployments | a deploy target, or an account-gated preview |
33
+ | Secrets | Vercel env | host env + the platform's own secret injection |
34
+
35
+ **Vercel Connect does not work off-Vercel — at all.** It authenticates via
36
+ Vercel OIDC, which does not exist on another host. That applies to Slack, the
37
+ Vercel MCP connection, Linear, everything. Each becomes a static credential
38
+ someone must issue and rotate. `kyb doctor` fails loudly if a `@vercel/connect`
39
+ import survives into a self-hosted agent.
40
+
41
+ ## Running on the client's own subscription
42
+
43
+ A client who already pays for ChatGPT Plus/Pro or SuperGrok / X Premium+ can
44
+ run the agent on it instead of on metered API billing. Both work the same way:
45
+ a CLI performs a device login on the host, writes a credential to the home
46
+ directory, and that credential is a valid bearer for an OpenAI-compatible
47
+ endpoint. eve ships `experimental_chatgpt()` for the first;
48
+ `@kybernesis/exe` ships `grokSubscription()` for the second.
49
+
50
+ ```bash
51
+ # on the host, as the user the agent runs as
52
+ curl -fsSL https://x.ai/cli/install.sh | bash
53
+ grok login # device flow → ~/.grok/auth.json
54
+ ```
55
+
56
+ ```ts title="agent/agent.ts"
57
+ import { createOpenAI } from "@ai-sdk/openai";
58
+ import { grokSubscription } from "@kybernesis/exe";
59
+
60
+ export default defineAgent({
61
+ model: grokSubscription({ model: "grok-4.6", createOpenAI }),
62
+ modelContextWindowTokens: 400_000,
63
+ });
64
+ ```
65
+
66
+ What this arrangement costs you, and it is worth saying to the client:
67
+
68
+ - **It is per-machine and per-user.** The login belongs to the host's home
69
+ directory. Moving the agent means logging in again; running it as a different
70
+ unix user means it cannot see the credential at all.
71
+ - **The token expires in hours** (Grok: six) and the CLI refreshes it in place.
72
+ Read it per request, never once at boot, or the agent works all afternoon and
73
+ starts failing authentication at dinner for no reason a user can see.
74
+ - **Nobody has proven unattended refresh over days.** If no one runs `grok` on
75
+ that host, whether the refresh keeps happening is an open question — and it
76
+ presents as the agent "breaking".
77
+ - **Ask the vendor's terms question before a client demo**, not after.
78
+
79
+ ## The failure modes, each of which cost a real session
80
+
81
+ - **Docker ships disabled on some images.** exe.dev's exeuntu runs
82
+ `systemctl disable docker.service`, so `docker --version` works while nothing
83
+ can run. Every sandbox call fails with `SandboxTemplateNotProvisionedError`.
84
+ Fix: `sudo systemctl enable --now docker`.
85
+ - **Subagents own their sandbox — they do NOT inherit the root's.** An engineer
86
+ subagent without its own `sandbox/sandbox.ts` gets a bare template, and the
87
+ screenshot tool fails with `Cannot find module 'playwright'` while the root's
88
+ template is fine.
89
+ - **`eve start` does not read `.env.local`** the way `eve dev` does. Export it
90
+ into the process (`scripts/eve-server.sh` in `@kybernesis/exe` does this).
91
+ - **Prewarm lives in the eve CLI, not the built server.** Starting
92
+ `node .output/server/index.mjs` directly gives you clean logs but skips
93
+ template prewarm entirely. Start with `npx eve start`.
94
+ - **`localDev()` never authenticates under `eve start`** — it is a property of
95
+ the deployment, not the request. A self-hosted agent needs a real
96
+ authenticator from day one.
97
+ - **`pkill -f <pattern>` over SSH kills your own session** when the pattern
98
+ appears in the SSH command line — and can take the agent with it. Use a
99
+ pidfile (`scripts/eve-server.sh`).
100
+ - **Never diagnose "nothing is happening" from a log file.** Count runs on disk:
101
+ `.eve/.workflow-data/runs/`. A log can look frozen at boot while the agent
102
+ serves happily.
103
+
104
+ ## Showing the client what the agent built
105
+
106
+ - **Vercel Blob refuses to serve HTML inline** — it forces a download. Use it
107
+ for documents and exports, never to show a web page.
108
+ - **exe.dev forwards ports 3000–9999** to `https://<vm>.exe.xyz:<port>/`, but a
109
+ VM has exactly **one public port** and the agent's webhook already owns it.
110
+ Alternate ports are account-gated: fine for the client reviewing work, not for
111
+ the public.
112
+ - **Anything genuinely public needs a deploy target** — the client's own Vercel
113
+ token, or their hosting. Treat "public" as a deploy step, not a toggle.
114
+ - A sandbox is a container: its ports are not reachable from the host, so a dev
115
+ server inside it cannot be previewed directly. Copy the artifact out (the
116
+ `preview` tool in `@kybernesis/exe`) or deploy it.
117
+
118
+ ## Credential checklist — collect ALL of these from the client
119
+
120
+ Nothing here can be borrowed from another agent or another account.
121
+
122
+ 1. **Host** — VM/server, plus the platform token if the agent provisions anything
123
+ 2. **Model source** — their LLM API key, gateway allocation, or connected
124
+ subscription (exe: `integrations setup chatgpt`, then `integrations edit llm`)
125
+ 3. **Channel app** — their Slack app (bot + app token) / Photon project / bot token
126
+ 4. **Arcana** — workspaces + scoped `kb_` keys (one per brain, plus `-eval`)
127
+ 5. **Storage for deliverables** — their blob store, or a served host directory
128
+ 6. **Deploy target** — their Vercel token or hosting, if the agent ships sites
129
+ 7. **Control plane** — agent registered and the pilot cohort granted
130
+
131
+ ## Before calling it done
132
+
133
+ `kyb doctor` green (or every warning consciously accepted), the eval suite green
134
+ against the client's `-eval` workspace, and a live turn on the real surface.
135
+
136
+ ## Third-party APIs: version pinning and spec-derived calls
137
+
138
+ Two failures here cost most of a day on the first deployment. Both look like
139
+ outages or permission problems and are neither.
140
+
141
+ **Pin the API version the SPEC describes, not the one in a doc example.**
142
+ Notion's OpenAPI spec describes their current API (`/v1/data_sources/…`), but
143
+ eve's docs example pins `Notion-Version: 2022-06-28`, where that endpoint does
144
+ not exist. The mismatch returns `invalid_request_url`, `service_unavailable`
145
+ (503) on search, and "not shared with the integration" — three different lies,
146
+ none of them about the actual problem. Verify by making the SAME call the agent
147
+ makes, headers included.
148
+
149
+ **When the agent and your manual test disagree, the difference between the two
150
+ requests IS the bug.** Diff them at the first contradiction. Repeatedly proving
151
+ "the token works" with a hand-written curl while the agent fails proves nothing
152
+ if your curl sends a different version header.
153
+
154
+ **An agent's error message is a hypothesis, not evidence.** It will confidently
155
+ report an outage or a permissions problem it has not verified. Read the actual
156
+ request and response before acting — and never change a client's permissions on
157
+ an agent's say-so.
158
+
159
+ **Large specs with ambiguous ID schemes need a purpose-built tool, not a raw
160
+ connection.** Notion's spec is ~1.2MB and splits `database_id` from
161
+ `data_source_id` for the same board; a model deriving calls from it picks the
162
+ wrong one. Pin the endpoint and the IDs in a small tool
163
+ (`agent/tools/<domain>.ts`), keep the generic connection for the long tail, and
164
+ point the instructions at the tool.
165
+
166
+ **Credential brokering (exe http-proxy) is the right default off-Vercel:**
167
+
168
+ ```
169
+ integrations add http-proxy --name <svc> --target https://api.example.com \
170
+ --header 'Authorization:Bearer <token>' --header '<Version-Header>:<value>' \
171
+ --attach vm:<vm>
172
+ ```
173
+
174
+ Use `--header` for the token, not `--bearer=-`: the stdin form mangles it and
175
+ the API answers 401 "token is invalid".
176
+
177
+ ## Restarts must be proven, not assumed
178
+
179
+ A restart that silently fails leaves the agent serving a stale build — new
180
+ connections, tools, and instructions never appear, and every later test measures
181
+ yesterday's agent. Assert the process started AFTER the build it should serve
182
+ (`scripts/eve-server.sh` and the restart pattern in `@kybernesis/exe` do this).
183
+ Related: a long-lived channel session caches the compiled agent, so start a
184
+ fresh conversation after changing capabilities.
185
+
186
+ A restart script also has to **serialize** (`flock`, released by the child with
187
+ `9>&-`) and **wait for in-flight turns** — eve does not resume a step killed
188
+ mid-flight, and restarting into a live turn strands the session behind a turn
189
+ that will never finish.
190
+
191
+ Run restarts **detached** from your ssh connection —
192
+ `setsid nohup bash restart.sh >/tmp/r.log 2>&1 </dev/null &` — or a dropped
193
+ connection SIGHUPs the script halfway through and leaves exactly the mess it
194
+ exists to prevent.
195
+
196
+ **Build before you restart.** Proving the process started after the build says
197
+ nothing about whether the build reflects the source — an agent served a build ten
198
+ hours older than its files while reporting success. It also breaks installs:
199
+ `@kybernesis/manage` writes files and then calls the restart script.
200
+
201
+ **And measure it correctly.** `pgrep -f 'server/index.mjs'` typed over ssh
202
+ matches the shell running it: the pattern is in that shell's own command line,
203
+ so it reports two servers when there is one. A whole investigation went into a
204
+ phantom "second server" that `ps -eo pid,ppid,args` would have dismissed
205
+ immediately. Inside a script file it is safe; typed at a shell it is not. List
206
+ the matches before you believe the count.
@@ -0,0 +1,60 @@
1
+ ---
2
+ description: Use whenever a lesson is learned, a bug is fixed, a package/registry/playbook/doc changes, or something shipped — the checklist that keeps the Kybernesis knowledge system the single source of truth. Also use when unsure where a piece of knowledge belongs.
3
+ ---
4
+
5
+ # Source of truth — and how it stays that
6
+
7
+ The knowledge system only works if every change lands in the right place the
8
+ same day it happens. This skill is the routing table and the checklist.
9
+
10
+ ## Where truth lives
11
+
12
+ | Kind of knowledge | Canonical home |
13
+ | --- | --- |
14
+ | How to run an engagement | `packages/create/skills/fde-engagement/references/playbook.md` (THIS package) — the Obsidian copy is a mirror, never edit it first |
15
+ | How to build eve agents / packages / control plane / certification | the sibling skills in `packages/create/skills/` |
16
+ | Package behavior + install steps | each package's README + registry item in `~/platform` |
17
+ | Framework truth | `node_modules/eve/docs/` at the pinned version — never restate at length, point at it |
18
+ | What exists, what's specced, what's parked | the system-overview doc (session-handoff master, Obsidian) |
19
+ | Session-to-session working context | the Claude project memory (`~/.claude/projects/.../memory/`) — pointers and lessons, not content that belongs above |
20
+
21
+ Secrets live in env managers only. Client-specific facts live in the client's
22
+ repo and brain, never in this suite.
23
+
24
+ ## The propagation checklist — run it whenever any of these happens
25
+
26
+ **A live failure taught something / a gotcha was paid for:**
27
+ 1. Encode it where the next run will hit it: a skill in this suite, a package
28
+ README, an eval fixture, or a `kyb doctor` check — prefer executable
29
+ guards (doctor/evals) over prose.
30
+ 2. If it changes engagement procedure → edit `references/playbook.md` here,
31
+ then copy to the Obsidian mirror.
32
+ 3. Bump `@kybernesis/create`, build, commit — the human publishes.
33
+ 4. Add one line to the Claude project memory if future sessions need it
34
+ before they'd naturally read this suite.
35
+
36
+ **A package changed (version, API, install steps):**
37
+ 1. README + registry item updated in the same commit as the change.
38
+ 2. Consuming agent bumped, suite green (the release gate), deployed.
39
+ 3. Version references in the playbook §3.4 pin list + system overview updated.
40
+ 4. If install/setup steps changed → the relevant skill here too.
41
+
42
+ **Something new was built or shipped:**
43
+ 1. System overview: move it into "shipped and verified" with the evidence.
44
+ 2. Playbook: add the operational steps if an FDE will ever repeat them.
45
+ 3. This suite: extend the matching skill (or add one) if Claude needs it.
46
+
47
+ **A framework (eve) version was certified:**
48
+ 1. Advance the pin in `@kybernesis/create` (`EVE_VERSION`).
49
+ 2. Check every skill/playbook claim that names framework behavior — versions
50
+ change what's true (example: "subagents cannot mount extensions" was true
51
+ on 0.29, false on 0.30, and stale in four places until a maintainer
52
+ review caught it).
53
+
54
+ ## The standing rule
55
+
56
+ If you (Claude) finish a piece of work and cannot point at where its lesson
57
+ now lives, the work is not done. When unsure where something belongs, the
58
+ answer is almost always "the most executable place that the next person or
59
+ agent will actually hit" — doctor check > eval fixture > skill > playbook >
60
+ memory, in that order of preference.
@@ -2032,6 +2032,14 @@ because the session is stranded rather than stuck. Poll
2032
2032
  wait for it to clear — with a cap, so a wedged turn cannot block the restart
2033
2033
  that would clear it.
2034
2034
 
2035
+ *And build before you restart.* Proving the process started after the BUILD says
2036
+ nothing about whether the build reflects the SOURCE. A production agent ran for a
2037
+ day on a build ten hours older than its files, reporting "OK: serving the current
2038
+ build" every time. Worse, `@kybernesis/manage` calls the restart script after
2039
+ writing files — so **every capability installed from Studio reported success and
2040
+ changed nothing.** Build when the source has moved, and refuse to restart into a
2041
+ build that failed.
2042
+
2035
2043
  *And measure it correctly.* `pgrep -f 'server/index.mjs'` run over ssh matches
2036
2044
  **the shell running the pgrep** — the pattern is in its own command line — so it
2037
2045
  reports two servers when there is one. An entire investigation went into hunting
@@ -2251,6 +2259,46 @@ The things that cost real sessions here:
2251
2259
  reach across a network to a laptop that might be shut. Budgeted at 6s with a
2252
2260
  five-minute cache; without that, one closed lid makes every turn hang.
2253
2261
 
2262
+ ### 12.9 Rooms — several agents in one conversation
2263
+
2264
+ A client with a planner, a designer, and an engineer agent can put all three in
2265
+ one room and work with them the way they would with people. The room lives
2266
+ entirely in the desktop app: each member keeps its own session with its own
2267
+ deployment, and the app is what puts a message in front of all of them. **No
2268
+ agent needs to know the feature exists**, which is what makes it work with an
2269
+ agent the client wrote themselves.
2270
+
2271
+ **Addressing is the routing, and it is worth teaching in one line.** Name a
2272
+ member and only they answer. `@everyone` addresses the room. Name nobody and
2273
+ the room's lead answers — the first member — who brings the others in. Matching
2274
+ is literal and requires the `@`, because an agent called Design must not be
2275
+ summoned by the word "design" in an ordinary sentence.
2276
+
2277
+ **Hand-offs are how work moves.** An agent's reply reaches another agent only
2278
+ when it names them, and whoever is brought in receives what they missed since
2279
+ they last spoke. Without that catch-up a hand-off is incoherent: the engineer is
2280
+ asked to "build this" having never seen what "this" is.
2281
+
2282
+ Say these plainly to a client, because all three will come up:
2283
+
2284
+ - **Every hop is a billed turn** on a deployed agent. A three-agent hand-off
2285
+ chain is three turns, and there is a depth cap so a pair that keeps addressing
2286
+ each other cannot run away.
2287
+ - **The convention is a prompt, not a protocol.** Each turn carries a line
2288
+ telling the agent it is in a room and how to hand off. A well-behaved agent
2289
+ follows it; nothing enforces it. A misbehaving one is ignored rather than able
2290
+ to start a cascade — agent-to-agent relay has NO policy fallback, precisely so
2291
+ one reply cannot become a reply from everyone.
2292
+ - **A relayed message runs under the human's identity.** When the planner hands
2293
+ to the engineer, the engineer acts with that person's authority on another
2294
+ agent's say-so. Among a client's own agents that is usually what they want.
2295
+ It is still a governance decision, and it should be made rather than
2296
+ discovered.
2297
+
2298
+ What NOT to promise: emergent self-organisation. The chain works when someone —
2299
+ a person or an agent — explicitly hands off. It is a room where people and
2300
+ agents talk, not an autonomous workflow engine.
2301
+
2254
2302
  ## 13. Known gaps — state these plainly, do not sell around them
2255
2303
 
2256
2304
  Being straight about these is a feature. Clients have met vendors who were not.
@@ -193,6 +193,11 @@ Run restarts **detached** from your ssh connection —
193
193
  connection SIGHUPs the script halfway through and leaves exactly the mess it
194
194
  exists to prevent.
195
195
 
196
+ **Build before you restart.** Proving the process started after the build says
197
+ nothing about whether the build reflects the source — an agent served a build ten
198
+ hours older than its files while reporting success. It also breaks installs:
199
+ `@kybernesis/manage` writes files and then calls the restart script.
200
+
196
201
  **And measure it correctly.** `pgrep -f 'server/index.mjs'` typed over ssh
197
202
  matches the shell running it: the pattern is in that shell's own command line,
198
203
  so it reports two servers when there is one. A whole investigation went into a