agents/<category>/<name>/agent.py exposes the same four symbols.
1
Scaffold the module
2
Implement the contract
LifecycleManager.run() — the shared envelope every run gets
(ADR-006 idempotency, run-log transitions, lifecycle events, cost
tracking) — resolves your manifest’s "entrypoint" and calls
build_runner(deps).execute(context). You never touch the envelope
itself; you only write what’s specific to your agent.3
(Optional) assign an evaluator
4
Register via the seed script
database/seeds/agent_manifests.py discovers every agents/*/*/agent.py
by the same glob the test suite uses, and upserts a manifest from your
module’s own AGENT_ID/ENTRYPOINT/category declarations — you don’t
hand-write a registration API call.5
Write the entrypoint test
A repo-wide test (
tests/unit/test_agents/test_entrypoints.py) walks
every agent module and asserts it exposes ENTRYPOINT,
build_runner(), and execute() — a new agent that’s missing one of
these fails CI immediately, not at first production run.Picking a model
Setmodel_config in your agent’s manifest — never hardcode a provider in
code. Providers load lazily through the provider registry, so your agent
works whether the tenant’s configured provider is Anthropic, OpenAI,
Google, or a self-hosted Ollama/vLLM endpoint. See
AI Agents → Multi-LLM routing.