Releases: Agent-Pattern-Labs/iso
Release list
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.
@razroo/iso-eval v0.1.0
Initial release of @razroo/iso-eval — behavioral eval runner for AI coding agents.
agentmd lints prompt structure, isolint lints prompt prose, iso-harness fans out the compiled source into every harness file layout. None of them answer did the agent actually do the task? — that's what iso-eval scores.
You give it a suite of tasks (baseline workspace + prompt + checks); it snapshots the workspace per trial, hands it to a runner, and verifies the resulting filesystem / command state against your checks.
v0.1 scope
- Deterministic `fake` runner (executes `$ …` lines as shell in the snapshotted workspace) — exercises the orchestration layer offline and in CI
- Checks: `command`, `file_exists`, `file_contains`, `file_not_contains`, `file_matches`, `llm_judge`
- Real-agent runners (`claude-code`, `codex`, `cursor-agent`) coming in v0.2; the library API already accepts any `RunnerFn` today
Install
```bash
npm install -D @razroo/iso-eval
iso-eval run eval.yml
```
See the package README for the full suite shape and library API.
iso-v0.1.1
Full Changelog: iso-harness-v0.2.0...iso-v0.1.1
iso-harness-v0.3.0
Full Changelog: iso-harness-v0.2.0...iso-harness-v0.3.0
iso-harness v0.2.0
What's new
iso-harness validate
Schema-check the iso/ source directory without writing anything:
iso-harness validate --source iso/
iso-harness validate --source iso/ --format json
Catches: missing command on an MCP server, non-string env values, duplicate agent names, unknown target-override keys (typos like cursor: skip written as Cursor: skip), non-string model fields, and empty descriptions/bodies.
build now gates on validation
iso-harness build runs the validator first and refuses to write output if the source has schema errors. Warnings (empty description, empty body, unknown-harness overrides) are surfaced in the build summary but do not block.
This is a behavior change: if your iso/ source had a latent schema bug, previous versions would silently generate wrong output across all four harnesses. 0.2.0 fails fast instead.
Test coverage
18 unit tests (was: 1 smoke-build script). Covers validation, build, source loading, frontmatter skip rules, TOML escaping, and the refuse-to-emit-on-error guarantee.
Full changelog: packages/iso-harness/CHANGELOG.md
agentmd v0.3.0
What's new
lint --format sarif
agentmd lint can now emit SARIF 2.1.0 for upload to GitHub code scanning. Same dialect as isolint --format sarif — driver name agentmd, rule IDs are the L-codes, severities map to error / warning / note.
agentmd lint prompts/*.md --format sarif > agentmd.sarif
# then upload with github/codeql-action/upload-sarif@v3
Full changelog: packages/agentmd/CHANGELOG.md
agentmd v0.2.0
Highlights
lintaccepts multiple files, shell globs, and stdin (-).- Machine-readable lint output:
--format json(for CI tools) and--format github(workflow annotations). render -reads source from stdin for pipeline composition.--flag=valueworks anywhere alongside--flag value.test --timeout <ms>kills hung backends instead of stalling.- New:
agentmd --version.
Parser
- Strip UTF-8 BOM and normalize CRLF / bare CR so Windows and editor-exported files parse correctly (previously the
# Agent:heading would silently fail). - Flag duplicate
# Agent:headings as warning L12 instead of silently dropping them.
Linter
- L9 split into L9a (agent heading), L9b (procedure), L9c (at least one rule) — each check is now individually filterable.
- L3 duplicate-ID diagnostics now carry a line number and point at the first definition.
Tests
- 85 tests (was 69). New subprocess CLI coverage for stdin, multi-file, globs, JSON/github formats,
--flag=value.
agentmd v0.1.0
First release of @razroo/agentmd — a structured-markdown dialect for authoring agent prompts, with a linter for structure and a fixture-driven harness that measures per-rule adherence against a target model.