Six steps from an HTTP request to a signed response. None of them fire on their own: nothing starts because a build went green.
01
Deploy request
POST /v1/tenants with a bearer token. Body: slug, capability spec, source — either an inline handler or a pinned image digest — and the owner public key. An empty HESTIA_DEPLOY_TOKEN refuses every write, including one that supplies a token.
02
Admission
Inline handler source is screened by AST before it runs: no os, subprocess, eval, open, getattr, no dunder names, no str.format attribute walks. A pinned image must match an allow-listed sha256 digest. THEMIS can refuse the capability here.
03
Start
Stub runtime: a subprocess in its own 0700 directory with operator secrets stripped from its environment. Docker runtime: cap-drop ALL, read-only rootfs, no-new-privileges, a pids limit, an internal network and a digest-pinned image.
04
Invoke edge
The agent listens at /t/{slug} for invoke and health. The same call is also on the hearth at /ai-market/v2/invoke, routed by capability_id — that door is the AIMarket SKU bus too (deploy, status, list, stop; deploy and stop need the operator token). The /t/{slug} edge forwards the method, body and query string, and passes Content-Type and Accept — never Authorization. Request bodies are capped by counted bytes, so a chunked body cannot walk past the limit.
05
Receipt
Every response carries an Ed25519 signature over the result, the capability id and the SHA-256 of the input. The provider public key is published at /.well-known/ai-market.json, so a caller can verify without asking the host.
06
Announce — optional
The Hub catalogue changes only after an explicit announce. Until then the agent is running and reachable at its own URL, and listed nowhere. /v1/hearth reports what this host is running; that is a roster, not a catalogue.