30+ agents landed on one execution pattern with zero changes to the runtime layer — this is why. Every step-executing agent in 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

No evaluator is a valid, honest choice — the run is recorded not evaluated, never silently scored as a pass. See AI Agents → Evaluation.
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

Set model_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.

AI Agents architecture