@kybernesis/create 0.7.1 → 0.7.2
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/dist/cli.js +15 -0
- package/dist/deploy.d.ts +4 -0
- package/dist/deploy.js +169 -0
- package/dist/register.d.ts +5 -0
- package/dist/register.js +110 -0
- package/dist/skills.js +13 -1
- package/package.json +1 -1
- package/skills/fde-engagement/references/playbook.md +11 -0
- package/skills/kybernesis-packages/SKILL.md +7 -3
- package/skills/self-hosting/SKILL.md +13 -3
- package/skills/.claude/skills/certification/SKILL.md +0 -75
- package/skills/.claude/skills/connect-agents/SKILL.md +0 -119
- package/skills/.claude/skills/control-plane/SKILL.md +0 -80
- package/skills/.claude/skills/eve-building/SKILL.md +0 -106
- package/skills/.claude/skills/fde-engagement/SKILL.md +0 -35
- package/skills/.claude/skills/fde-engagement/references/playbook.md +0 -2312
- package/skills/.claude/skills/kybernesis-packages/SKILL.md +0 -148
- package/skills/.claude/skills/self-hosting/SKILL.md +0 -206
- package/skills/.claude/skills/source-of-truth/SKILL.md +0 -60
|
@@ -1,148 +0,0 @@
|
|
|
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.
|
|
@@ -1,206 +0,0 @@
|
|
|
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.
|
|
@@ -1,60 +0,0 @@
|
|
|
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.
|