All case studies Open-source reference implementation

Wizards of Odd: rename one field, 12 build failures

TypeScript / React / MetaObjects

A live AI app you can clone and read — one metadata spine drives the database schema, the API types, the LLM prompts, and the SSE protocol, and renaming a single field fails ten prompt templates and two generated artifacts in CI at once.

github.com/Draagon/wizardsofodd ↗

1 → 12
rename one field → build failures
10 prompt templates + 2 artifacts
4
surfaces from one spine
DB schema · API types · prompts · SSE
1
config file — the whole pipeline
metaobjects.config.ts
28
metadata files · Apache-2.0
metaobjects/*.yaml, live + public

Wizards of Odd is a live AI "wizard council" app, built from scratch to be read. One metadata spine generates the database schema, the API types, the LLM prompts, and the SSE streaming protocol — and there's a ten-second command that proves it: rename one field, and twelve generated things fail in CI at once.

The challenge: AI makes drift faster than you can catch it

An LLM app declares the same shape in four places — the database schema, the API types, the prompt payloads, and the streaming protocol — and an AI agent editing one can leave the other three silently behind. "Locally coherent, globally divergent" is how these bugs ship: every file looks right on its own.

Wizards of Odd was built greenfield to answer one question in public: what if changing the shape of the data in one place was the only way to change it?

The solution: one spine, four surfaces, one gate

A single set of typed metadata files under metaobjects/ is the durable spine. From it, meta gen produces the database schema (Drizzle), the shared API types, the LLM prompt render handles, and the SSE streaming protocol — the last via a project-local template.streamFrame subtype that extends MetaObjects for this app's server-sent-event envelope. The entire generation pipeline lives in one file: metaobjects.config.ts.

The money shot: rename a field, watch it fail

Rename one field in a payload metadata file, then run the drift demo:

# rename `question` in metaobjects/meta-wizard-user-payload.yaml, then:
npm run demo:drift

Ten prompt templates and two generated artifacts fail at once. There is no way to change the shape of the data and forget one of the four surfaces — the model won't let the build pass. It takes about ten seconds, and it's the whole thesis in one command.

What that buys you

  • An AI agent can't silently diverge the four surfaces — a half-applied change fails CI, not production.
  • Adding a surface is additive: the SSE protocol is a project-local metadata subtype, not a fork of the core — you extend the model, you don't patch around it.
  • It's clone-and-read. Apache-2.0, live, and small enough to grok in one sitting.

Play it live ↗ · read the source ↗

Where it is now

Since 2026-09-09 it has run MetaObjects 1.0.0, with the rename-one-field gate above wired into CI.

What to read it as

All case studies

Considering MetaObjects for your next platform?

Doug works directly with teams evaluating MetaObjects. Tell us what you're building and we'll tell you, honestly, whether MetaObjects fits.

Email doug@dougmealing.com