Upgrade to 1.0
This is for anyone coming from a 0.x release. 1.0 adds no features over the last 0.x; it decides what 1.x promises not to break, writes it down and tests it. See compatibility.
Steps
- Install the new igris the way you installed the old one:
brew upgrade igris,go install github.com/drilonrecica/igris/cmd/igris@latest, or a signed binary. Check withigris version. - In each project, run
igris config migrateonce. It removes settings a release removed, shows the lines, asks first and keeps a backup in.igris/config/. Today that is one key,claude.command, which everyigris initbefore 0.7 wrote.--yesskips the question. - Run
igris doctorandigris check. Both should be clean.
That is all. Plans need nothing. A run interrupted under the old version resumes: its state is read and upgraded on the next save, and the config keeps its hash, so you don't see a "config changed" notice.
What changed on the way to 1.0
These came in 0.7 and the 1.0 release candidates. They are the last breaking changes: from 1.0 on, 1.x only adds.
claude.commandwas removed fromigris.toml. Until you runigris config migrate,check,ariseanddoctorstop withclaude.command was removed in 0.7.--jsonoutput changed (the last time). Every output starts with"v": 1;doctor --jsonis an object,{"v": 1, "checks": [...]}, instead of a bare array;status --jsonleaves out a task'srankandmodewhen the cell has none, instead of"—"; thecountskey"in progress"is now"in_progress"; and pending signals are{"task", "action"}objects. Each output has a JSON schema indocs/json/.- Exit codes settled. A malformed task ID in
igris doneandigris skip, and an unknownigris notify test --event, are usage errors now (exit2, was1).igris adaptstopped with Ctrl-C exits0. Exit codes3–9are reserved. .igris/state.jsonis version 3. igris reads 1, 2 and 3 and upgrades them. A newer version is refused with a message to upgrade igris.- The plan format has a name: format 1.
<!-- igris:format 1 -->is optional, forever. A plan declaring a format igris doesn't know is refused with "plan format N needs a newer igris". - New:
igris config migrate, andigris help COMMANDshows that command's help.
The CHANGELOG lists every release in full.
If you script igris
- Read
doctor's checks from.checks, use thein_progresskey, read signals as{task, action}objects, and treat a missingrankormodeas none. - Test for a non-zero exit code, or for
2(a usage error), never for exactly1: a 1.x release may give a failure its own code from3to9. - Read
--json, the run log and the webhook ignoring fields and event types you don't know. 1.x adds them. - Text output is for people and may change.
Going back
A config that uses a key added in a later 1.x fails on an older igris as an unknown key; the fix is to upgrade. igris 0.6 and older can't read a version-3 state.json: finish the run first, or delete .igris/state.json to start a new one.
From 1.0 to 1.1
Install the new igris and you are done: 1.1 only adds to 1.0, and nothing in your plan, igris.toml, scripts or .igris/ needs to change. A run interrupted under 1.0 resumes.
What is new, all additive:
- Plan approval in igris for plan-mode tasks, with
plan:accept-style Modes and[plan_mode]settings. See usage and plans. - Token usage and the rank audit.
igris usage, a counter on the run card and arank_mismatchnotification, which is now a default event. Turn the reading off with[usage] enabled = false. - Subscription quota, off until you set
[usage] statusline = true. - A parallelism report in
igris phasesandarise --dry-run. - New
--jsonfields and ausageschema, new run-log events and aplans/andquota.jsonin.igris/. Read all of them ignoring what you don't know, as 1.0 already asked.
From 1.1 to 1.2
Install the new igris and you are done: 1.2 only adds to 1.1, and nothing in your plan, igris.toml, scripts or .igris/ needs to change. A run interrupted under 1.1 resumes. state.json stays version 3.
What is new, all additive:
- Side sessions.
Sopens a Claude Code session of your own next to a run. New[side]settings (model,mode), a.igris/side/directory, andIGRIS_SIDEin the session's environment, with whichigris done,skipandresetrefuse. - Split plans.
<!-- igris:include PATH -->in a plan that declares<!-- igris:format 2 -->. A plan without includes is unchanged and stays format 1. - Plan templates.
igris init --template go-cli|web-app|library, and Plan from template… on home. - Updating igris.
igris update [--check] [--yes]anduon home check GitHub for a newer release and, after asking, update igris with Homebrew orgo install. From 1.2 on, that is the easiest way to the next release. - Usage. A model an attempt used is counted once under each model it ran on, and a run with no
usagelines says why. Side sessions have a table of their own inigris usage. - New
--jsonfields (fileon each phase and afileslist incheck,phasesandstatus; asidearray inusage), three new run-log events (side_opened,side_closed,side_usage) with asidefield. Read all of them ignoring what you don't know, as 1.0 already asked.
One thing to plan for: a split plan needs igris 1.2 on every machine that runs it. igris 1.0 and 1.1 refuse a format-2 plan with plan format 2 needs a newer igris rather than run only the main file's phases. Going back to 1.1 is fine as long as no plan declares format 2.
From 1.2 to 1.4
There is no 1.3 release: igris draft and serve/attach ship together as 1.4. Install the new igris (or run igris update) and you are done: 1.4 only adds to 1.2, and nothing in your plan, igris.toml, scripts or .igris/ needs to change. A run interrupted under 1.2 resumes. state.json stays version 3.
What is new, all additive:
- Draft a plan.
igris draft goal|spec|import|extend, and Draft… (D) on home: a session writes a proposal, you review it as foradapt, and only Accept writes your plan. New[draft]setting (model, defaultopus) and a.igris/draft/directory. - Detach and attach.
igris arisenow starts the run in a backgroundigris serveand attaches to it, so closing the terminal only detaches. New commandsigris serve,igris attachandigris stop, a socket.igris/igris.sockand a log.igris/serve.log.arise --no-tuiand--dry-runwork as before, in one process.
Two things to know: q in the run view now asks Detach · Stop run · Cancel (Detach is focused) instead of leaving at once, and a run started by arise has a serve process that outlives your terminal: igris stop ends it. After igris update during a run, an attached view says served by igris X.Y.Z and the run keeps that igris until it ends.
Going back to 1.2 is fine: the plans a draft wrote are ordinary plans, and 1.4 changes no file format, so 1.2 can resume a run 1.4 left (stop it first with igris stop).
From 1.4 to 1.5
Install the new igris (or run igris update) and you are done: 1.5 only adds to 1.4, and a plan without the new marker runs exactly as before. A run interrupted under 1.4 resumes.
What is new, all additive:
- Parallel phases. Mark a phase
<!-- igris:parallel -->in a plan that declares<!-- igris:format 3 -->and its independent tasks run at the same time, each in its own git worktree, merged back in the order they finish with your verify run on the merged tree. New optionalGroupcolumn,[parallel]and[parallel.ranks]inigris.toml,--parallel Nonariseandserve,IGRIS_SLOTin a task's environment, and the run-log eventsintegrated,integration_failedandoverlap. - A run view for several tasks: one card per active task, one Needs-you queue, aggregated notifications.
Three things to know: parallel costs more than it looks (your limits burn N times faster, every worktree needs its own caches, a dependency the plan leaves unsaid becomes a conflict: what it costs); state.json is now version 4, which igris 1.0 to 1.4 refuse, so finish a run (or igris stop and delete its state) before going back; and igris 1.0 to 1.4 refuse a format-3 plan with plan format 3 needs a newer igris.
From 1.5 to 1.6
Install the new igris (or run igris update) and you are done: 1.6 only adds to 1.5, and nothing listens on the network until you set an address. A run interrupted under 1.5 resumes.
What is new, all additive:
- Control from your phone.
[serve] http = "ADDR:PORT"(origris serve --http) makesigris servealso answer on HTTP: a web UI for your phone that follows the run and answers its questions, plusigris serve tokento pair a device by URL or QR code (--rotateunpairs all). Loopback and Tailscale addresses bind directly; any other needs--listen-publicandtls_certandtls_key. New file.igris/serve-token. - ntfy answer buttons.
actions = trueunder[notify.ntfy]adds buttons to a question's message whose links answer that one question, once, for 10 minutes. - The commit question is now notified as
needs_input, like every other question, so a run left alone says that it waits.
Two things to know: whoever holds the pairing token controls the run (short of skip-permissions mode, which is never set remotely) until you run igris serve token --rotate; and the web UI's pages are not part of what 1.x promises, only the HTTP API is. state.json stays version 4 and plans need no change, so going back to 1.5 is fine (it ignores .igris/serve-token).
From 1.6 to 1.7
Install the new igris (or run igris update) and you are done: nothing in your plan, igris.toml, scripts, --json or .igris/ changes, and a run interrupted under 1.6 resumes. state.json stays version 4.
What is new: one design language across the terminal UI, the web UI and the command line's text, a run screen and home that lead with what needs you, an end-of-run summary, a phone page whose Stop stays reachable, grouped help with next: hints, notifications that lead with the status word, and the Tokens column igris report always promised.
Three things to know: the TUI's keys and mode picker moved (the TUI is not part of what 1.x promises): a is the one way into the run on home and t is Details everywhere, q leaves the screen you are on and ctrl+c quits igris from anywhere, A accepts and x rejects in the adapt and draft review, the mode picker lists plan, auto, accept, manual and default first with the rest under More modes…, and Cancel is always a dialog's last option; the command line's text output changed (tables, glyphs, help), so read --json in scripts; and task_overdue and rank_mismatch notifications are no longer high priority, only Needs you is. The webhook payload and your templates are unchanged. Going back to 1.6 is fine.