This is a big release. It’s been in progress for months, and it’s something I’m very proud of. As graph matures, it’s becoming clearer what role it can and should play.Graph’s goal is to make it fast, cheap and easy to build robust agent networks, measure them and improve them. Improving doesn’t just mean less hallucination. It means optimizing token usage, speed and accuracy. It means building systems you can run your business on.This release is the first major step toward making that real and there’s a lot more to come.
The
Agents are first-class
Agents now have their own file format, with its own version, and with it a set of new capabilities for building agent networks that scale.Handoffs and subagents
An agent can now list the agents it may hand the whole thread to. A handoff passes the context and message history to the new agent.Subagents work like pure functions: they have isolated context and take only a prompt. They’re great for well-scoped, non-deterministic work where a specific outcome is expected. Think of a deep research assistant that has search and crawl tools and does nothing but return its findings.A taste of our own medicine
The first versions of the graph CLI and workbench shipped built-in agents implemented in Rust. As the system matured, it became clear that those agents should use the same files every other agent, plan and tool uses. The result is a smaller, better-defined binary that focuses on the runtime, and built-in agents that run on the same runtime as everything else.New tool_drafter and agent_drafter agents
So many agents. The workbench now covers the entire authoring process. Ask it to create an agent, and it works through building the agent and identifying the tools and plans it needs. If something is missing, it offers to write the missing tools too.Override built-in agents
We spent a lot of time running the new drafting agents through an iterative test harness focused on speed and cost, and thanks to that, they work really well. If you need something the built-ins don’t do, you can override one with your own version. Need a tool for searching your internal wiki? Have the workbench write the tool, then copy the drafting agent and add the tool to it.Packs
With standard formats for agents, plans and tools, graph now has packs. A pack is any combination of agent, plan and tool files, installed straight from the official packs repository or from your own. Want to write your own? Start from the pack template.Deferred tool loading
Plan drafting now loads tools as they’re needed. Instead of carrying the whole catalog in its context, it searches for the tools each part of the goal needs, so a large catalog no longer costs context window. That makes context use more efficient and makes smaller models more productive. I’ll soon be adding this capability to all agents.Decision models
The new System One model paradigm fits many graph workloads, and decision models are now supported through a dedicateddecider role.Decide gates
Gates have a newdecide kind that asks the decider role for a well-defined decision. Decide gates are available on exit, route and filter steps.builtin__decide
The newbuiltin__decide tool takes some state and a set of typed questions, and returns a calibrated answer to each one.Tool search
When a decision model is configured, tool search uses it to choose tools, both for plan drafting and for the drafter agents. In our testing, this was significantly more accurate than the keyword lookup it replaces.decide is now route
The decide step is renamed route, and it now supports routing to any number of branches.Migration required — a prompt for your coding agent
Migration required — a prompt for your coding agent
Existing plans may need updating. Copy this prompt into your coding agent in the repository that carries your plans:
Breaking
- rename llm_call events to model_call and tag each with its model kind
- workbench agents work on plans through the same artifact tools as agents and tools, with 17 workbench tools folded into 7 (#146)
- plans state how they finish with a required finish key, success exits return the plan’s result shape, and failed plan calls return one standard error — plan version 2 files need
finish; plan-tool results for exited runs and empty-data failures changed shape. - the github and slack tools leave the binary for installable packs, and [tools].packs becomes [packs.<name>] entries (#163) — the github and slack tools are no longer part of graph.
Added
- config version 4 adds the systemone provider type, the decider role, and context_window
- a systemone decision provider speaking the Jev wire API, routed to decision roles with startup kind checks, failover, context_window, and decision traces
- named agent files with graph agents list, show, validate and migrate
- one override model: built-in plans and pack tools are replaced by files that name them, and show reports the source
- plan drafting runs as built-in plans you can override, plan steps can call named agents, and decide and exit steps work inside any body
- threads keep every agent’s history as authored entries, with an owner and an active agent
- graph chat [agent] and graph ask —agent run named agents that hand off and delegate
- the workbench runs a network of agents that draft, load and edit plans with you
- drafting offers only the tools a plan needs, found by a built-in search_tools plan that asks a decision model when one is configured
- compose_plan drafts a whole plan in one call from the tools search finds, stops when no tool can do part of the goal, and fixes only the steps that fail validation
- builtin__reshape accepts a single template string and returns that value, and compose_plan rejects references to fields a tool’s declared or observed output doesn’t have
- map steps take onError: skip, leaving failed items out of results and listing them in failed instead of failing the plan
- the workbench answers an ask step in a form generated from its answer schema, with a question per field, and an ask step’s output_schema can be built from earlier results
- graph plan draft, MCP graph_plan_draft and the workbench draft new plans with compose_plan, which asks about guessed values in one form and can ask for tools it wasn’t shown; the step-by-step drafting overlay and its draft_* progress events are gone
- built-in tool_drafter and agent_drafter write tools and agents with you, test-running a tool before it is saved, and drafting one in the workbench is a mode with the draft in the pane
- graph wb opens the workbench at a front desk, graph wb plan|agent|tool go straight to a mode, orchestrator is renamed plan_drafter, and tool env values take ${VAR:-default}
- plan validate and plan run check literal step inputs against the called tool’s input schema
- infer, decide and reshape are plain built-in tools instead of the always-on llm and data packs (#149)
- installed packs load per config layer and serve their tools, plans and agents under <pack><kind><name> names (#152)
- pack include/exclude narrow a pack’s public interface, so only the pack’s own plans and agents can call excluded items (#153)
- graph pack add, list, update and remove install and manage packs from git as plain copies per config layer (#156)
- packs declare graph, OS, binary, env and MCP server requirements that install, load, config check and runs enforce (#160)
- graph pack new, check, run, test and release let authors scaffold, validate, try, migration-test and semver-tag a pack (#161)
- graph pack update —major crosses majors one at a time, running each major’s migration as a dry run, then applying it once confirmed (#162)
- CLI commands use singular nouns (graph tool, agent, thread, shape), with plural spellings kept as hidden aliases (#165)
- packs live in subdirectories of a repo with per-pack tags, and bare names install from tylerdavis/graph-packs (#166)
- graph pack add, update and list refuse a release tag that moved since it was installed (#168)
- graph pack check requires pack.toml to declare the systems a pack runs on (#170)
Changed
- share one task-agent loop between the agent step and named agents; add stop tools, call sites and allowlisted registries
- pack remove restores a set-aside copy through one type, and refusals without problems use one helper (#159)
Documentation
- rebuild the docs around agents, plans and tools, with reference pages generated from the code and fuller —help text (#154)
- the workbench screenshots show the github pack’s tool names, and a stale screenshot fails the tests (#169)
- examples call the github pack’s tools as github__tool__<name>, and this repo’s checks run on the installed pack (#171)
- a Packs section explains installing, updating and writing packs, with a pack.toml reference generated from its schema (#172)
Fixed
- builtin__infer runs as a non-interactive plan step, reporting empty data instead of asking for it
- gh_pr_ticket no longer reads prose such as “every 2” as a ticket, matching uppercase keys in titles and bodies and skipping standard names like UTF-8
- graph pack commands have help text for every argument and pages in the generated CLI reference (#158)
Migration required — a prompt for your coding agent
Migration required — a prompt for your coding agent
Existing plans may need updating. Copy this prompt into your coding agent in the repository that carries your plans:
Breaking
- draft outlines from a coarse outliner role and a sectioned catalog; MCP servers take a description (config version 4) — config version 4 (graph config migrate)
Breaking
- decide gates on exit, route and filter steps, and route steps with named cases chosen by a decision model; version 1 decide steps migrate to route — plan version 2 (graph plan migrate)
Breaking
- decision tools and builtin__decide, answered by a decision model — tool version 2 (graph tools migrate)
- Introduced with graph v0.16.0.
Breaking
- opening a data directory written before agents converts its threads to entry logs in place, and older graph versions then refuse it — store version 2
Breaking
- pack.toml and packs.lock are versioned file formats, and config accepts [packs.<name>] entries (#150) — pack version 1 and lock version 1 are new file formats
- Introduced with graph v0.16.0.
Edit plans visually from the workbench
The plan workbench’s plan tab now lets you edit steps and plan metadata directly in a form, without hand-editing YAML.OTLP telemetry export for run traces and logs
Config now supports a[telemetry] section for exporting run traces and logs via OTLP. This is a breaking config format change: config moves to version 3, and existing config files must be migrated with graph config migrate.Migration required — a prompt for your coding agent
Migration required — a prompt for your coding agent
Existing plans may need updating. Copy this prompt into your coding agent in the repository that carries your plans:
Added
- edit steps and plan metadata in a form from the workbench plan tab (#128)
Breaking
- OTLP telemetry export for run traces and logs via [telemetry] (config version 3) (#129) — config version 3 (graph config migrate)
Added support for config v2
Config v2 now treats all models uniformly: the[models.<role>] table replaces the old fixed role slots and [models.named] section. This is a config format change that requires a migration. See the Config v2 entry for details.Every model is now a role
Config now treats all models uniformly: the[models.<role>] table replaces the old fixed role slots and [models.named] section. This is a config format change (version 2) that requires migration.Migration required — a prompt for your coding agent
Migration required — a prompt for your coding agent
Existing plans may need updating. Copy this prompt into your coding agent in the repository that carries your plans:
Breaking
- every model is a role: [models.<role>] replaces the fixed role slots and [models.named] (#125) — config version 2 (graph config migrate)
Configuration file schemas are now versioned
Config, plan, tool, and store documents each carry their own schema version (starting at v1), separate from thegraph binary version. This lets file formats evolve on their own schedule going forward, while ensuring your binary remains up to date.Migration required — a prompt for your coding agent
Migration required — a prompt for your coding agent
Existing plans may need updating. Copy this prompt into your coding agent in the repository that carries your plans:
Added
- version the config, plan, tool, and store file formats independently of the binary (#121)
Fixed
- keep the tool rules out of
[prompts].workbenchso an override can’t break the agent (#120)
- Introduced with graph v0.13.0.
- Introduced with graph v0.13.0.
- Introduced with graph v0.13.0.
- Introduced with graph v0.13.0.
Know what a run costs
Every run now reports the calls and tokens it spent, and the dollar cost too once you configure[pricing] — with no pricing table, you get token counts and no invented figures. The numbers reach you at the seams you already read: --json envelopes, an MCP body field, a line on stderr under a TTY, and two JSONL events.Agent steps that answer even when the budget runs out
An agent step is now shown itsoutput_schema up front and spends its final round producing a conforming result, so exhausting max_iterations degrades to a partial answer instead of an empty one. Prompt caching is on by default rather than opt-in per call site.See what each step promises
The plan workbench’s detail pane shows each step’s output contract, so you can check what a step is expected to produce without leaving the TUI.A missing key says so at first use
A missing environment variable is now explained when something first needs it, instead of failing silently and leaving you to guess which credential was absent.Added
- show each step’s output contract in the workbench detail pane
- token usage and cost tracking, prompt caching, and a turn-key agent step (#115)
Documentation
- restore themed prose in the v0.11.0 changelog summary
- add use-graph, the general entry-point skill (#107)
Fixed
- explain missing env vars at first use instead of dying silently
Keep review comments alive across runs
Thegithub pack adds gh_pr_review_threads and gh_pr_thread_sync, so a plan can read a pull request’s existing review threads and update them in place. A plan that runs on every push can carry its findings forward — resolving what got fixed and leaving what still stands — instead of posting the same comment again.Added
- add gh_pr_review_threads and gh_pr_thread_sync to the github pack
Documentation
- publish a release changelog page, generated in lockstep with releases
- correct the escaping-mechanism comment in cliff-docs.toml
- infer a per-release summary and migration prompt via a graph plan
- keep inferred summaries MDX-safe
- drop the changelog page description and intro line
- replace the changelog shell scripts with graph plans
- place the migration prompt between summary and commit lists
- restyle changelog summaries as themed prose
- reference changelog snippets instead of embedding them
Fixed
- release script keeps the docs release_version in step
Run plans from anywhere
graph now serves its plans over MCP, so editors, agents, and other MCP clients can run and author plans without touching the terminal.Smarter control flow
Plans can pause to ask a person for input — and declare what happens when nobody is there — and can narrow a list down before working through it, which keeps automations from tripping over items they can’t handle.Sharper diff awareness
Changed-file listings now say what happened to each file, not just that it changed.A cleaner scripting surface
Command output is structured and consistent across the CLI; scripts that scraped the old text output should switch to--json.Migration required — a prompt for your coding agent
Migration required — a prompt for your coding agent
Existing plans may need updating. Copy this prompt into your coding agent in the repository that carries your plans:
Added
- add —json to graph tools list
- add —json to graph tools show
- serve graph’s plans and authoring commands over MCP
- stream progress and honor cancellation
- ask steps — put a question to the user from inside a plan
- filter steps — partition a list with a per-item gate
- per-file change objects on git_changed_files
Changed
- return outcomes from the plan commands instead of printing
- convert the remaining commands and make —json uniform
Documentation
- add a plan authoring skill for the CLI commands
- point the authoring loop and quickstart at the plan authoring skill
- make the authoring skill draft-first
- frame the skill around the whole plan lifecycle
- document graph as an MCP server
- close out the MCP roadmap and point the skill at the server
- explain why the draft arm cannot use and_then
Fixed
- write every plan field in snake_case, at every depth
- remove revision-by-redraft from both authoring surfaces
- don’t load a project the user never pointed at
- honour the documented ask retry budget
- serve the control steps from the tool catalog
- keep MCP writes inside the server’s own config layer
Ride out provider outages
Model entries can declare fallbacks, so a failing provider fails over to the next instead of failing your run.Let a step figure it out
The new agent step runs a bounded tool-calling loop inside a plan for the parts you cannot script ahead of time — and still returns typed results the rest of the plan can reference.More places to plug in
GitHub release and log tools, a Slack pack for posting messages, and full plan management from the command line.Breaking
- draft plans one validated step at a time, always — a config carrying
[planner]now fails to load;
Added
- model fallbacks for provider outage failover (#67)
- add the agent control step
- add gh_release and git_log to the github pack
- add slack pack with slack_post_message
- manage plans from the command line
Changed
- lift plan authoring rules into graph-core
Documentation
- rework intro/quickstart, add project-setup skill, tidy release asset names (#65)
- escape curly braces in template-language frontmatter (#66)
- reorganize the docs — plans-first IA, one owner per fact
- coherence pass after the reorg — catalog table parity, models links
- restructure the workbench page; split the exit-gates opener
- generate workbench screenshots from executed sessions
- inline Frame embeds — Mintlify snippets don’t interpolate props into JSX attributes
- place workbench screenshots across the reorganized pages
- rewrite quickstart manual setup to mirror the fast path
- replace the introduction’s plan-run snippet with a workbench hero shot
- document the agent control step
- document the plan authoring commands
- ship an app manifest and a one-click create-app button
Fixed
- show never-run steps as skipped after a fired exit gate
- add fallbacks field to the shots harness ModelChoice
- close the agent step’s validation, path, and boundary gaps
- carry exit codes back to main instead of exiting in place
- keep plan list and validate off stdout
- stop re-rendering caller-supplied reshape shapes
A plan’s root node in the workbench now shows its metadata, inputs, and finish up front, alongside a handful of scrolling and selection fixes.
Added
- show plan metadata, input schema, and finish on the root node (#61)
Fixed
- wheel over steps/tool list moves selection (#60)
- gh_pr_ticket default pattern requires a separator (#62)
- wheel scrolls the steps/tool list view (#63)
- hide list highlight when selection scrolls out of view (#64)
Steadier plan drafting
Drafts are built incrementally — an outline, then one validated step at a time — and invalid drafts can be edited or repaired instead of discarded.Pick the right model per call
Prompt tools, inference steps, and gates can each name a model, so cheap checks stay cheap and hard calls get the strong model.Sturdier CI reviews
The PR-review building blocks grew marker-keyed comments, ticket extraction, and file reading at a ref, and tool resolution is now checked before a plan spends a single step.Added
- write the built-in system prompts into the config init starter (#44)
- steer check plans to explicit exits and list inference to map (#45)
- named models selectable from prompt tools and builtin__infer (#46)
- marker-keyed PR comments, ticket extraction, and file/grep at a ref (#47)
- catalog-aware tool resolution before any step runs (#49)
- incremental draft strategy — outline, then one validated step per inference (#50)
- edit input_schema, requires_servers, and silent finish via update_metadata (#51)
- mouse support — click to focus, switch tabs, select rows, wheel-scroll (#55)
- add data pack with builtin__reshape for shape projection (#58)
- optional per-gate model override on exit/decide infer (#59)
Documentation
- add graph-github-actions-setup skill for coding agents (#42)
Fixed
- render sub-text and borders with the terminal’s dim modifier (#43)
- PR reviewer no longer emits absence false positives on truncated diffs (#40)
- paste literally, edit invalid drafts, repair bad drafts, fence agent-only tools (#48)
- separate outline and drafting phases in workbench trace (#52)
- show span start time on the left and duration on the right; surface outline call duration (#53)
- order trace chronologically so draft_plan brackets its phases; fix outline duration origin (#54)
- carry failing tool error into aborted run result (#56)
- default output_schema type + reset workbench iteration budget on progress (#57)
A workbench for plans
A dual-pane TUI for drafting and test-running plans: research the project, make precise step-level edits, and watch runs unfold without leaving the terminal.Simpler storage
Plan and thread state now lives in plain files — nothing to install or run alongside graph.Projects carry their setup
Config discovery is project-first, so a repository can ship its own graph setup, and step ids can be any descriptive identifier.Breaking
- replace LadybugDB with file-based storage (#24)
Added
- plan workbench — dual-pane TUI for drafting and test-running plans (#25)
- workbench debug logging to <data_dir>/workbench.log (#28)
- workbench step view shows body sub-steps and the finish stage (#30)
- workbench read_file/grep/glob tools for researching the project (#29)
- step ids are any unique identifier, not just E-numbers (#31)
- workbench tools for precise plan edits: update_metadata, add_step, update_step, delete_step (#33)
- [prompts] config overrides for the chat prompt and workbench addendum (#37)
- project-first config — config init and default search paths target ./.graph (#38)
- draft safety, control-step guidance, turn-failure recovery (#36)
Documentation
- cookbook covers a custom bot identity for the CI reviewer (#23)
- add @emichy to special thanks (#26)
- require worktrees for all coding work in CLAUDE.md (#39)
Fixed
- scrolling reaches wrapped content; PgUp/PgDn is the one scroll binding (#27)
- draft saves can no longer overwrite a different plan’s file (#32)
- section-scoped bare keys are not roots in plan validation (#34)
- a broken plan file no longer takes down the whole catalog (#35)
Branch execution with decide steps
Plans can now includedecide steps that fork execution into then and else branches based on a gate, letting you author plans with conditional logic instead of separate plans per outcome. The gate keyword for a decide step is if.Iterate over lists with map and reduce
map and reduce steps run a body of steps over each item in a list, so repetitive per-item work no longer needs to be unrolled manually in the plan.Inline PR review comments
Thepr_review tool now anchors its findings as inline diff comments on the pull request, rather than only surfacing them elsewhere.Added
- decide steps fork plan execution into then/else branches (#15)
- decide gates read if/then/else — the logical gate keyword is now if (#17)
- map and reduce steps iterate a body over a list (#18)
- pr_review anchors findings as inline diff comments (#20)
Run graph without building it
Published container images make graph drop-in for CI and containerized environments, and search extensions are vendored into the binary so nothing needs installing alongside it.Built-ins, organized
Bundled tools now live under one namespace with a dedicated docs page, and new cookbook sections collect worked examples by solution.Added
- publish a container image with each release (#4)
- vendor lbug fts/vector extensions into the binary (#9)
- builtin__ namespace for bundled tool packs, Built-ins docs page (#10)
Documentation
- CI cookbook — the dogfooded plans and workflow, annotated (#7)
- cookbook as a section — pages by solution category (#8)
Bundled tool packs and CI failure annotations
graph now ships with tool packs included, so plans can call common tools without separate setup. Running plans in GitHub Actions also produces failure annotations, making it easier to spot what went wrong directly in the workflow run.Added
- bundled tool packs and GitHub Actions failure annotations (#2)
Fixed
- portable version bump in release.sh; align workspace version with v0.2.0
End plans early, on purpose
Plans can now use exit gates to stop execution with an explicit success or error state, instead of running to the end or failing on an unrelated step.Build plans from other plans
Plans can now call other plans, so you can compose larger workflows out of smaller, reusable pieces rather than duplicating steps across files.Added
- exit gates — end a plan early with success or error state
- plan composability — plans call plans
Documentation
- bring CLAUDE.md current — composability, exit gates, storage, build story, conventions
The first release of graph: author plans — YAML pipelines of tool calls with data flowing between steps — validate them, and run them from the terminal. A built-in agent loop backs
ask and chat for conversational work, tools come from your own definitions or any MCP server, and configuration is layered so a repository can carry its own setup.Added
- ladybug spike (validated) + layered config crate
- clap command tree, tracing, working config show/init/path
- provider trait, Anthropic + OpenAI-compat providers, structured output with repair, role router
- rmcp manager — stdio + streamable-http transports, lazy connect, tool discovery with namespacing and overrides, ToolRegistry impl
- ReAct loop + ask/chat/tools commands
- thread persistence + observed-shape cache (phase 3)
- unify thread continuation under —thread
- strict typed template engine for the {{Ex.path}} dialect
- plan pipeline — planner/validation/execution/solver with bus-driven replanning
- YAML plan docs, plans-as-tools, plan_and_execute (phase 4 complete)
- JSON input documents for plan run and tools test
- nested tool display, pipeline progress, streamed solver
- optional solver — plans can render structured output or run silently
- backend abstraction — dyn Store everywhere, memory backend
- user-defined tools — exec, cypher, and prompt kinds
- schema defaults for plan/tool inputs; fmt fixes
- codify release process — semver bump, git-cliff changelog, tag-driven binaries
- run traces — tools_used in ask envelope, GRAPH_EVENTS=jsonl event stream
Documentation
- Mintlify documentation site (25 pages) + CLAUDE.md
- point repository URLs at the real remote
- fix clone directory in installation
- touch content to trigger first build
- remove build-trigger scratch line
- plans-first framing of core concepts
- quickstart — freeze-into-a-plan step
- plan-first nav order and README framing; drop unverified heading anchors
Fixed
- shut down servers before runtime teardown; silence child stderr
- read the shape cache at each planning attempt
- steps_executed excludes the input root
- replace RUSTFLAGS with per-target build.rs link directives