Skip to main content
This is a Naive → Naive guide. defineConfig is a permanent @deprecated alias — it keeps today’s lenient behavior byte for byte and is never removed — so switching is never urgent, only strictly better. There is no Sunset date on anything here.

Concept map

Both entrypoints return the config unchanged. A legacy config — one that declares neither company nor teams — passes through defineConfig untouched, and gains only the unconsumed-field pass under defineProject.

Before / after

Then evaluate the config (naive up --plan is enough — it is read-only). Either it passes, and you are done, or it refuses with one line per offending field:

What gets refused

The fields on the not-yet-consumed list today — declared, dropped (or carried and read by nothing), enforced nowhere: For each one: remove the field (it was enforcing nothing — the refusal changes what you know, not what runs), or keep the config on defineConfig until a consumer lands. Wiring a field deletes its row from the one shared list, so strictness only shrinks. Not refused, on either entrypoint: fields consumed by one runtime and reported in unconsumed on the other — a hermes-led team’s agent({ model }), team({ review }), spend/hardSpend, memory — and the whole legacy surface (runtime.pool(), systems:, agentProfiles, agent-level runtime: "<pool>" strings), which keeps compiling and applying with a deprecation notice. See what naive up prints.

Minimal viable migration

  1. Rename the call: defineConfigdefineProject (import and call site).
  2. Run naive up --plan. Fix each declared_unconsumed line by deleting the field.
  3. Optionally rename agents:kits: (and agent() entries to kit()) to clear the rename notice — identical output, one namespace, refused only if a name appears in both blocks (kit_and_agent_duplicate).

What does not map yet

  • There is no per-field opt-out. Strict mode is all of the list or none of it — a config that must keep one listed field stays on defineConfig.
  • The strict pass covers the unconsumed list only. It does not (yet) validate the legacy infrastructure / runtime / systems blocks beyond what defineConfig already checks.