Changelog
Oodle is v0. Until 1.0, a minor version (0.x.0) can change the catalog format or the CLI; this file says when one does, under Changes. A patch version (0.x.y) only fixes things.
The GitHub Action follows the newest release through the v0 tag (uses: oodlc/oodle@v0).
0.8.0 (2026-10-06): schemas at oodlc.com, docs for agents
- The catalog and config schemas are published at
https://oodlc.com/schema/v0/catalog.jsonandhttps://oodlc.com/schema/v0/config.json, and their$ids say so. - Every YAML file
oodle initandoodle proposewrite starts with a# yaml-language-server: $schema=…line, so editors with the YAML language server complete and check the catalog as you type. - Fix: an approval from an org member whose membership is private counts. GitHub labels them
CONTRIBUTORto the workflow's token, so the Action now looks up the approver's permission on the repository (write,maintainoradmin). - The docs are readable on oodlc.com/docs, and as markdown for agents at oodlc.com/llms.txt.
0.7.0 (2026-10-06): a real database in the simulation
database:inoodlc/config.yamlruns Postgres in process (PGlite) and pointsDATABASE_URLat it. Your own driver connects as in production: no Docker, no port.- Every run starts from the schema plus
given.db. Each row the app writes is an effect on the newdataboundary (db.<table>.inserted,updated,deleted), and constraints see the tables asdb. - SQL built from request input is refused before it runs and blocks as
oodle.sql-injection. initanddoctorfind the driver, the migrations and the env var. See 0009.
0.6.0 (2026-10-06): a first outcome in five minutes
initfollowsapp.listen(),createServer(app)orserve({ fetch: app.fetch })back to the module that builds the app.initnames the outbound hosts it finds (URLs in the source, SDKs like Stripe inpackage.json) undereffectsand gives each a placeholder stub.initprobes each route nothing describes and saves a proposed outcome tooodlc/proposed.yaml.oodle propose --routesdoes the same later.init --ciin an existing project writes only the workflow.- A failing run names a missing stub first, and an effect whose call failed says so instead of "got 0".
doctorchecks that every effect the app names has a stub. - Proxy environment variables can't carry a call past the effect rules.
- New guide: Your first outcome in 5 minutes.
0.5.0 (2026-10-06): Next.js apps
@oodlc/oodle/nextexportsnextApp(), which runsapp/**/route.tsand the middleware in process, inside Next's own route module, with no build and no server. Next 15 and 16. See 0008.initdetects Next.js and writesoodle.app.tsaroundnextApp.mutatestarts from every route file and the middleware.
0.4.4 (2026-10-06)
- Hints and help name the command that works where you are (
pnpm exec oodle run,npx oodle run), not a bareoodlethat isn't on the PATH.
0.4.3 (2026-10-06)
init --cireads the lockfile and writes the matching install step for npm, pnpm, yarn or bun.
0.4.2 (2026-10-06)
- Calls through
node:httpandnode:httpsagents become effects, not justfetch: axios, got, node-fetch and SDKs on their default clients (Stripe, Twilio, AWS) are stubbed and recorded. - Releases publish to npm from CI with provenance.
0.4.1 (2026-10-05)
- Published to npm as
@oodlc/oodle. Imports are@oodlc/oodle/adapterand@oodlc/oodle/contract. The command is stilloodle.
0.4.0 (2026-10-05): adoptable in CI for existing services
- Changes: approvals. A change to a promise gets an
id@fingerprint, and a maintainer other than the author approves it with/oodle approvein a review. See 0007. @oodlc/oodle/adapter:httpApp()runs an existing Express, Koa, Hono,http.Serveror(req, res)app in process.initwraps the service already in the repo;--ciwrites the workflow.doctorfails when Oodle runs the starter instead of your service, or the app reaches the network.- The pull request that adds Oodle reports every outcome as new instead of failing.
0.3.0 (2026-10-05): Oodle for coding agents
- Changes: conditions carry their own expectations with
when(0004), andstatus: proposedon intents, outcomes and constraints runs and reports but never blocks (0006). - The built-in
security.*conditions, and probes of every route no outcome describes. - The sealed simulation: a call to a host nobody named blocks as
oodle.sealed(0005). oodle mutate,oodle propose,oodle draft,oodle mcp, and the Claude Code plugin.
0.2.0 (2026-10-05): one visible oodlc/ folder
- Changes: a project is the directory that holds
oodlc/.oodlc/config.yamlsays how to run the app and every other YAML file in it is catalog.oodle init --migratemoves a 0.1 project in withgit mv. See 0003.
0.1.0 (2026-10-05)
- The OODLC v0 catalog,
oodle run,check,diffandlint, readable effect diffs, and the GitHub Action.