Releases: razroo/iso
iso v0.2.1
Transitive bump: picks up @razroo/iso-harness@0.5.0 (Codex/OpenCode merge with iso-route output) and @razroo/isolint@1.4.1 (cross-reference paths resolved from repo root when linting a subdirectory).
@razroo/iso v0.2.0
Composes `@razroo/iso-route`
When the project has a `models.yaml` at its root (or `iso/models.yaml`),
`iso build` now inserts an `iso-route build` step before the
`iso-harness build` step — so the resolved role map lands on disk in time
for iso-harness 0.4.0's Claude emitter to stamp per-subagent `model:`
frontmatter automatically.
Full pipeline:
- `agentmd lint` (structural check on `agent.md`)
- `agentmd render` → `iso/instructions.md`
- `isolint lint` (portable prose)
- `iso-route build` — new, runs when `models.yaml` exists
- `iso-harness build` (fan out to all four harnesses)
New flag
`--skip-iso-route` opts out of step 4 explicitly. The step is also
skipped automatically when no `models.yaml` is present, so existing
projects see no behavior change. `--dry-run` now propagates to both
`iso-route` and `iso-harness` writes.
Dep bump
`@razroo/iso-harness` is now pinned at `^0.4.0` to pick up the
resolved-map consumer (shipped in iso-harness 0.4.0).
Closes INTEGRATIONS.md #2.
@razroo/iso-trace v0.1.0
Initial release of @razroo/iso-trace — local observability for AI coding agent transcripts.
Parses Claude Code JSONL sessions (Codex / OpenCode additive) into a harness-agnostic event model so you can ask:
- Which rules ever actually fired?
- Which tools does my agent reach for most?
- Which captured sessions would make good regression fixtures?
v0.1 scope
- Claude Code JSONL parser → normalized event stream
- `stats` CLI for tool-use frequency, turn counts, session summaries
- `fixtures` CLI to lift interesting sessions into reusable regression fixtures
- Zero upload. Everything is local reads and user-controlled output — your transcripts never leave your machine
Install
```bash
npm install -D @razroo/iso-trace
iso-trace stats --source ~/.claude/sessions/
```
See the package README for the full event model and library API.
@razroo/iso-route v0.3.1
Patch — `standard` preset Codex default
The `standard` preset now pins `default.targets.codex` to
`openai/gpt-5.4`, so a Codex user running `extends: standard` with
no further overrides gets a natively-routable OpenAI model instead of
the Anthropic default flattened as-is. A Codex setup with no
overrides previously needed the user to remember to add a codex
override for the default tier to get anything usable.
Also tightens the preset header comment to cite the specific
harness/provider docs used to verify each pick: Claude Code model
config, Cursor models, Codex models, OpenCode models.
Content-only change — no API, no CLI, no parser changes.
Upstream dep ranges (`@razroo/iso` pins `^0.3.0`) accept this
release automatically.
iso-route v0.3.0 — bundled preset system
Bundled preset system — `extends: standard` + `iso-route init`
Ships an opinionated cost-tiered preset so newcomers don't have to know that OpenCode takes `opencode/*` prefixes, Codex accepts Anthropic natively, or which Haiku variant to pin. The decision is centralized in iso-route and evolves with releases.
`extends:` in models.yaml
Pulls in the named preset as the base layer, then deep-merges the user's fields on top. User wins at every key. `targets.` sub-objects merge atomically per harness. Explicit `null` on a target removes the preset's override.
```yaml
extends: standard
Everything below is optional — override only what differs:
roles:
quality:
targets:
codex:
provider: openai
model: gpt-5.4
```
`iso-route init`
```
iso-route init # writes ./models.yaml (extends: standard)
iso-route init --preset standard # explicit
iso-route init --out custom/path.yaml
iso-route init --force # overwrite existing
```
Preset content — `standard`
Verified against 2026-04 provider catalogs (Anthropic, OpenAI, OpenCode Zen/Go):
| Role | Anthropic (Claude Code) | OpenCode | Codex (OpenAI) |
|---|---|---|---|
| default | `claude-sonnet-4-6` | `opencode/glm-5.1` | — |
| `fast` | `claude-haiku-4-5` | `opencode/big-pickle` | `gpt-5.4-mini` |
| `quality` | `claude-opus-4-7` (high reasoning) | `opencode-go/kimi-k2.5` | `gpt-5.4` (high reasoning) |
| `minimal` | `claude-haiku-4-5` | `opencode/minimax-m2.5-free` | `gpt-5.4-nano` |
Cursor has no programmatic model binding, so it gets the advisory README with resolved picks users select manually in the Cursor UI.
Backwards-compatible
A `models.yaml` without `extends:` behaves exactly as before.
Deferred follow-up
An optional cron-scraper that auto-bumps the preset when upstream ships new model versions. Until then, preset maintenance is a normal release-cycle concern.
10 new tests cover preset loading, scalar overrides, atomic target replacement, null-to-remove semantics, unknown preset rejection, and adding-new-roles-alongside-preset.
iso-route v0.2.0
Per-harness model overrides
A single `models.yaml` can now express different model picks on each harness:
```yaml
default:
provider: anthropic
model: claude-sonnet-4-6
targets:
opencode:
provider: opencode
model: opencode/glm-5.1
roles:
general-free:
provider: anthropic
model: claude-haiku-4-5
targets:
opencode:
provider: opencode
model: opencode/big-pickle
codex:
provider: openai
model: gpt-5-mini
```
When emitting for harness X, iso-route uses `targets.X` if present, otherwise it falls through to the role's generic policy. Resolution is flattened before each emit runs, so existing emitters keep seeing a plain `{ provider, model, reasoning }` on every role — they don't need to know `targets:` exists.
New `opencode` provider
Adds `opencode` to the `Provider` union with passthrough semantics:
- The OpenCode emitter skips the `[model_providers.opencode]` block (no SDK package — OpenCode handles proxy routing natively)
- The qualified model is emitted verbatim, so `provider: opencode` + `model: opencode/big-pickle` produces `opencode/big-pickle` rather than double-prefixing to `opencode/opencode/big-pickle`
Backwards compatibility
Fully backwards-compatible — `models.yaml` files without any `targets:` subkeys behave identically.
Tests
Adds 8 regression tests across the parser, the resolver, and each of the four emitters.
@razroo/iso-route v0.1.0
Initial release of @razroo/iso-route — one model policy, every harness.
Declare a default model plus named roles once; iso-route compiles that policy into each harness's native config:
.claude/settings.json(default model) + a resolved role map (.claude/iso-route.resolved.json) thatiso-harnessconsumes when stamping per-subagent frontmatter.codex/config.tomlwith[profiles.<role>]blocksopencode.jsonwith provider-qualified models + per-agent overrides.cursor/iso-route.mdadvisory README note (Cursor has no programmatic model binding)
Scope (v0.1)
- Config emission for Claude Code, Codex, OpenCode; README note for Cursor
- Role-level reasoning effort (low / medium / high)
- Fallback chains recorded in the resolved map, but not encoded into harness config — runtime routing belongs in proxy layers (OpenRouter, LiteLLM, Portkey), not a build-time transpiler
Honest about ceilings
Warns loudly where a harness can't express a construct: non-Anthropic roles under Claude Code, fallback chains anywhere, Cursor entirely.
Install
npm install -D @razroo/iso-route
iso-route build models.yaml --out .See the package README for the full policy shape and fan-out mapping table.
iso-harness v0.6.0
OpenCode emitter falls back to iso-route resolved map
Mirrors the Claude emitter's resolution pattern on the OpenCode target. When an agent source file has no inline `targets.opencode.model` (and no top-level `model:`), the OpenCode emitter now reads `opencode.json`'s `agent..model` field — written by `@razroo/iso-route` before iso-harness runs — and stamps that onto the generated `.opencode/agents/.md` frontmatter.
Resolution order (OpenCode)
- `targets.opencode.model` (inline on the iso agent source)
- Top-level `model:` on the iso agent source
- iso-route's resolved map (`opencode.json`'s `agent..model`)
- Nothing — no `model:` stamped on the emitted agent file
This matches the Claude emitter shipped in 0.4.0. Agents that hard-pin a model continue to own that decision; agents that delegate model choice to `models.yaml` no longer need their inline override duplicated.
Backwards compatibility
Behavior when iso-route hasn't run (no prior `opencode.json`) is unchanged — no model stamped unless the agent source provides one.
Also collapses a duplicate `opencode.json` read inside `emitOpenCode`: the file is now loaded once at the top and reused for both the per-agent lookup and the later merge-write.
iso-harness v0.5.0
Merge — not overwrite — shared config files with iso-route
@razroo/iso-route writes model routing config to .codex/config.toml (model, [profiles.*], [model_providers.*]) and opencode.json (model, agent.*). Previously iso-harness's Codex and OpenCode emitters wrote those same files from scratch, stomping everything iso-route had put there. The @razroo/iso wrapper runs iso-route first and iso-harness second, so the net effect was that Codex and OpenCode users lost all model routing config on every composed build.
Codex: the emitter now reads any existing .codex/config.toml, strips only the [mcp_servers.*] sections (iso-harness's domain), preserves everything else, and appends the freshly-rendered MCP block.
OpenCode: the emitter now reads any existing opencode.json, preserves every field except $schema and mcp, and layers its own $schema + mcp + user-declared extras on top.
Behavior when no prior file exists, or when running iso-harness standalone without iso-route, is unchanged.
@razroo/iso-harness v0.4.0
Composition with `@razroo/iso-route`
When `@razroo/iso-route` writes its resolved role map to
`/.claude/iso-route.resolved.json` (run `iso-route build` into
the same output directory), iso-harness now picks it up automatically
and stamps `model:` onto each Claude subagent's frontmatter.
Resolution order per subagent, highest to lowest:
- Per-target `targets.claude.model` from the agent's frontmatter
- Inline `model:` from the agent's frontmatter
- `roles[agent.role ?? agent.slug].model` from the resolved map
- Nothing — the emitted frontmatter has no `model:` field
So an author can hard-pin a model in the source file, let iso-route drive
it from policy, or leave it to Claude Code's session default — without
editing the agent body.
Non-Anthropic roles in the resolved map are skipped (Claude Code
subagents only run Anthropic models) and logged on stderr. Missing
roles are silent — not every agent needs a role entry.
New frontmatter field: `role:`
Agent source files can now declare a `role:` field in frontmatter to
bind to a role whose name differs from the filename slug:
```markdown
name: planner-agent
role: planner
description: plans the work
```
This pairs with `@razroo/iso-route`'s `models.yaml` `roles:`
section: `iso-route` declares the role's provider/model, `iso-harness`
stamps it onto the matching subagent.
Backward-compatible
Builds without a resolved map on disk emit exactly as before. This is a
pure additive change — drop in 0.4.0 and nothing changes until you
also start running `iso-route build`.
Closes INTEGRATIONS.md #1.