# Changelog 0.24

## v0.24.0 — 2026-10-07

### ♻️ Changed

- CI splits the test suite into six parallel jobs: console, elements, kernel, cli, drivers, and core. One shard failing does not cancel the others.

- Feature pull requests squash into `dev`. The release merges `dev` into `main` with a merge commit, so that history and its `Closes #N` messages land on `main`. A merge into `dev` moves the linked issues to Merged and leaves them open. They close, and the board moves them to Done, when the release reaches `main`.

- Published budgets: `./ai` +644 B (decider, presets, and decider/otherwise checks), `./compiler` +1,660 B (decider extraction and checks, build time only), `./test` and `./testing` +1,651 B (`t.ai.decide` and the `drivers.decide` mock, tests only). Kernel edge stays 14,835 B and client runtime stays 5,218 B.

### 🐛 Fixed

- `pr-meta` treats an issue with sub-issues as an Epic, lets Dependabot skip the issue and milestone rules, and reads labels after it applies them. The GitHub Release waits until npm and JSR publish. Milestone 0.25 is the OKModel release.

### ✨ Added

- Contributor workflow lives in the repository: issue forms, labels, the okengine board, pull-request checks, and a GitHub Release cut from the changelog. Code checks and `pr-meta` are one CI workflow. There is no manifest-diff job: this repository has no app manifest. Runners are pinned to `ubuntu-24.04`. npm and JSR publish on the `v*` release workflow, not on a pull request. See CONTRIBUTING.md.

### 💥 Breaking Changes

#### Runtime

- A decision names a decider. `model`, `driverId`, `review`, and `onUncertain` are gone. `otherwise` is a Gate or `"abstain"`. `oke eval --certify` is removed. A version 1 `oke-decisions.lock.json` fails until you recertify with `oke decide certify`. Before: `ai.decision("triage", { review: ops, model: "typesafe/jev-1.13" })`. After: `ai.decider("jev", { provider: "openrouter", model: "typesafe/jev-1.13-20260917" })` and `ai.decision("triage", { decider: jev, otherwise: ops })`.
