0.1.0
Hello, World!
The first ever release covered work from the project start June 9, 2026 through the first six weeks of development. This version of Gantry was essentially complete and ran successfully hundreds of times, but it lacked flexibility and polish.
1,571 commits by Gantry runs
82% of the release
351 commits by non-Gantry sessions
18% of the release
Gantry 0.1.0 is the first release, covering the whole history of the project from git init on 2026-06-09 to the release on 2026-07-21 — the v0.1.0 tag, cut four days later, added only release plumbing. It is 1,922 commits in 122 units of work: 101 gantry runs contributing 1,571 commits, and 21 hand or interactive-agent sessions contributing the other 351. The product was called loom for most of this period; it was renamed to Gantry on 2026-07-18, three days before the release. From its first day, Gantry was building itself: four fifths of the commits described here were written by its own runs.
The first version shipped in one day on 2026-06-09: a Rust binary with a live TUI monitor and a real
orchestration engine driving a coding agent through a plan, implement, gate pipeline — and the
first autonomous run landed on the repo the same day. The rest of June grew the engine around
that loop: milestone runs that split large plans into phases with their own gates, a design
mode, headless and --detach operation for planning agents, transient-failure retries,
resumability for every job type, and a per-repository gate lock. July hardened it after real
incidents — a work-loss audit produced a bounded replan-capable retry ladder and resume that
stops discarding completed work — and two of the largest runs of the release moved harnesses
and drivers behind registries (78 commits) and derived the parser, the settings form, and the
docs from one declarative config schema (54 commits); that run died at its own merge stage and
was finished by hand, the incident that motivated resume-in-place.
The drivers arrived in sequence: the map job type on 2026-06-19, and the goal and loop drivers
in a 55-commit run on 2026-07-10, later given unlimited cycles and the --ralph alias.
--map learned to take a prose plan and generate its own spec. Harness support was pluggable
from 2026-06-16 — claude, codex, opencode, and gemini — and grew reset-aware usage-limit backoff, deferred model
selection, and a global config tier with defined precedence. The merge machinery was rebuilt
across eight runs: partial resumable merges, conflict reconciliation that preserves both
sides, merges gated in the worktree before landing, autonomous conflict resolution, and a
unified recoverable finalize.
The Gantry Assistant was built in one 2026-06-22 burst of six runs — a bidirectional engine/UI channel, an MCP server for querying and controlling runs, the chat pane, ownership locks with a live attach transport — then renamed from "brain", made strictly opt-in, and polished in a 55-commit run. The TUI gained a menu bar, pager, and clipboard, a shared modal system, artifact tags, and unified casing and hover states. Behind all of it, and across 100 commits of its own, Gantry's test suite was split into tiers, measured for flakes and root-caused, and rebuilt around injectable seams — none of it in the binary, but it is what the gate's verdicts, and so every run's ground truth, rest on.
Every run records a lossless event tape from 2026-07-03, and captures per-turn token usage into normalized sidecar files, so a finished run can be read back and costed afterwards. The demo edition arrived in July: the licensing gate and unlock flow in the binary, and demo identity by verified email rather than a personalized build.
Distribution went from GitHub Releases to locally built, signed artifacts. A release now ships
a source-review archive, an SBOM, and third-party notices alongside the binary, is checked by
a license-compliance gate, and rebuilds byte-for-byte from the published source with a
verifier the customer runs themselves — proven at release time before anything is signed.
gantry doctor and a startup dependency check tell a fresh installation what it is missing.
Development-only surfaces were put behind cargo features and stripped from distributed builds.
The release closes with the rename: two runs moved the product, the source tree, and the orchestration paths from Loom to Gantry on 2026-07-18. The last substantial work landed on 2026-07-21; the v0.1.0 tag was cut on 2026-07-25, with only release plumbing in between.
The first days: an orchestrator from nothing
Two weeks in June: the first engine, the first TUI, and the gate that grounds every agent.
-
24 commits,
7fbac2ed781c50733dsessionDay one: orchestrator engine, TUI monitor, sandboxing, and auth
A Claude Code session built the whole first version of the product in a single day: a Rust binary with a live TUI monitor, then a real orchestration engine driving the coding agent through a plan→implement→gate pipeline, verified end to end. The same session kept iterating on that core: it split gate construction into its own agent stage, made re-plan and conflict-resolve first-class stages, added graceful abort, headless auth loading, an opt-in (then default) sandbox for agents, process reaping via the kill(2) syscall, retry annotation in the ledger, and a money-free end-to-end smoke test against a stub agent. Nearly every subsystem the product still has traces back to this cluster.
-
9 commits,
3fbefa01b5620ee25drunplan-card-detailFirst autonomous run: the card-detail modal with live transcript tail
The first real gantry run on gantry's own repo. Working from the day-one plan, it built the TUI's card-detail view in five sprints: streaming the agent transcript to a log file, carrying the log path through the pipeline, card selection and modal state, the modal renderer and transcript formatter, and a live tail of the running stage. All five sprints finished green, with a re-plan after the first sprint along the way.
-
7 commits,
603a6a589dcdca79e2runplan-card-metricsA run adds per-stage token and cost metrics to the TUI
A gantry run executed the day-one metrics plan in four green sprints: the pipeline now captures per-stage metrics, cards and the status line show stage figures and run totals, active stages display live token counts, and the session modal gained a metrics strip in its footer.
-
6 commits,
c146f70123e65426carunplan-worktree-confinementA run closes the absolute-path sandbox escape
Agents in the sandbox could still write to the main checkout through absolute paths. A gantry run built the fix from its own plan in three green sprints: the bubblewrap sandbox now binds the main checkout read-only, the orchestrator detects any absolute-path escape that slips through, and an integration test verifies the write confinement.
-
5 commits,
1956e56ef35e48b053sessionRun-complete card, Haiku commit messages, and engine hardening
A Claude Code session fixed a batch of early rough edges: a run-complete summary card and commit messages written by a Haiku call, git's local environment variables cleared before hook-run tests, chunk diffs no longer sliced mid-codepoint, the terminal restored on panic so error output stays readable, and the baseline gate re-verified on restart after a red baseline.
-
13 commits,
a5793c59912887e8d7sessionTUI visual overhaul, content-hash run identity, and gate on resume
A two-day Claude Code session in two threads. On the TUI it did the flat, near-monochrome visual overhaul via a theme module — feed margins, card padding, a generated project-name sidebar header, and scroll-to-selection. On the engine it added --clean/--remove for tearing down a botched run, derived run identity from plan content instead of filename so same-named plans don't collide, gave a red-after-review gate one bounded fix attempt before stopping, gated the baseline on every resume, and ran the worktree-escape check after the fix and review stages too.
-
6 commits,
c6c7fa69c928142b89sessionActivity journal with replay; card layout fixes
A Claude Code session made the engine persist an activity journal and replay it — both when resuming a run and when reopening a finished job, the origin of today's replay surface. On the TUI side it fixed early layout gaps: a placeholder card before the first stage, flexible per-stage card heights, the scan card kept in the feed, and chunk numbers in card footers.
The build pipeline
Sprints, milestones, gates, review, recovery, and the prompts and config that steer them.
-
9 commits,
7632a57827d8aa64c5rundocs-haiku-maxx-ux-planStatus cards get model-written titles and blurbs
A gantry run built the readable status dashboard: every sprint card in the monitor gets a short title and blurb written by a cheap-model one-shot, with dedicated decoration prompts and a sidecar file that persists the generated text per unit. The decoration step was wired into the build loop so cards are titled as the run progresses, and gate, review, and replan cards got stage summaries of their own.
-
13 commits,
7f7e25dc3a90c46bf5sessionScoped gates, red-baseline halt, and --harness selection flags
A Claude Code session hardened the engine around the gate and harness selection: the gate-builder agent now receives the plan, the gate is scoped to it, and a red baseline halts the run at gate-build instead of letting a broken start proceed. Harness selection moved to explicit --harness / --harness-<role> CLI flags, dropping the old environment variable tier. The session also unified the four cheap-model one-shots behind one helper, fixed headline drift between the TUI and headless logs, cleaned up per-frame card formatting in the TUI, and updated the Codex harness default model.
-
12 commits,
5688cc0c07d21c42b6rundocs-in-process-milestones-planMilestone runs: large plans split into phases with their own gates
A gantry run built the in-process milestone driver, the engine's move from flat sprint lists to a two-level structure: a large plan is split into milestone phases, each planned, executed, and reviewed in sequence with an advisory review between phases. The work restructured the per-unit context for milestone attribution and a shared journal, introduced the Job dispatch seam and extracted the sprint pipeline, ported milestone planning and review prompts, added disk-based resume detection, and gave both the headless output and the TUI sidebar a two-level milestone/sprint hierarchy.
-
28 commits,
591e3f7b5c2f4f101frundocs-design-mode-convergence-planDesign mode lands: --design and --redesign drivers
A two-day, four-milestone gantry run built design mode end to end: two bundled design prompt sets, a design seam in the engine with its own namespacing, fields, and preambles, the additive design driver behind --design for incremental visual work, and the clean-slate --redesign driver. The run's own record shows several replans along the way — one on gate constraints in the first milestone and two more inside the additive driver — before all four milestones passed.
-
15 commits,
2c85ecf30f53592ee5runplans-headless-for-agents-planHeadless mode made watchable, with docs for planning agents
A gantry run made headless mode something an agent can drive and watch: a readable run stream with durable per-event timestamps, plus documentation for using gantry as a planning agent's execution backend — Claude Code hook examples, per-harness headless guides (including Gemini auth guidance), and a validation gate over the examples. One mid-run clippy fix was committed by hand.
-
7 commits,
36af7b8ad50ccef304runplans-transient-retry-planreplayTransient agent failures are classified and retried with backoff
A gantry run added the transient-failure layer planned after 529 overload errors killed runs: a classification step that tells transient errors from real failures, and a bounded retry loop with escalating backoff around agent execution, so a flaky API response no longer ends a multi-hour run.
-
9 commits,
8e8bdcacfc6cdb91a4session--detach and `gantry logs` for handing a run to an agent
A Claude Code session across four days: added --detach and a logs verb (then `loom logs`) so a planning agent can start a run and cleanly hand it off, stopped the confinement backstop from flagging the user's own concurrent edits, steered the gate-build prompt away from absent tools and dormant guarded branches, and fixed resume so staged-uncommitted files no longer leak into a re-run. TUI side work made the sidebar tree independently scrollable with the mouse wheel.
-
7 commits,
69f81f32f1162a5124runplans-review-completeness-and-truncationreplayReviews track incomplete scope; truncated streams stop passing
A gantry run made the review stage honest about what it did not see: reviews now track whether the full sprint scope was covered, an incomplete review triggers a scoped re-run instead of a silent pass, and a truncated agent stream yields a new Indeterminate outcome rather than an implicit pass.
-
8 commits,
03722be31bf8f2a455runplans-wall-clock-timeout-salvage-and-noreplayNo-progress guard replaces the fixed timeout; timed-out work salvaged
A gantry run replaced the fixed wall-clock timeout with a stall guard that watches for actual build progress, and added salvage for execute stages the ceiling kills: if the work already passes the gate, it is kept as ground truth instead of discarded. Driver and systemic-failure detection were aligned with the new semantics, and the mechanics were documented.
-
7 commits,
b17fe26d36262c529erunhandover-gate-concurrency-lock-planreplayPer-repository gate lock serializes concurrent runs
A gantry run built the per-repo gate lock planned after two concurrent runs shared a test database and produced spurious red gates: a crash-safe lock primitive, gate executions routed through it with a visible waiting state, and capture of the merge-resolve gate log on both pass and fail.
-
7 commits,
fd832bc7f0fc37cf85runhandover-resume-all-job-typesreplayEvery job type becomes resumable
A gantry run fixed resume for the newer job types: the job kind is now persisted with the run so resume re-derives the right driver, design and map jobs got per-driver resume guards, and each driver's resume path was checked for idempotence. Before this, resuming a design or map run could restart it as the wrong kind of job.
-
12 commits,
003d90933c164a330fsessionIdentity and polish: the ⋈ symbol, chat pane, and cleaner run list
A mixed Claude Code session on one day: adopted ⋈ as the project symbol throughout, put live run progress in the terminal window title, and made `list` hide finished runs by default. It fixed the Codex harness writing its answer file inside the worktree where it could leak into commits, refined the TUI chat pane (collapsed by default, phosphor amber/green accents from the web design system, wheel-only mouse tracking so native text selection works).
-
7 commits,
f87fce2a13c1b1f904runplans-resume-reset-interrupted-chunkreplayResume discards an interrupted sprint's partial work
A gantry run added the resume-time reset: when a run is resumed over a sprint that was interrupted mid-execution, the worktree is hard-reset to the last good state and the sprint re-executes from scratch, instead of building on half-finished work. The recovery is narrated durably in the run journal so a later reader can see the reset happened; the map driver was documented as outside this observability.
-
30 commits,
dec88f137eef4dcf3brunplans-refactor-dedup-corereplayCore deduplication: one driver core, one event fold, one codec
A two-day, four-milestone gantry run consolidated the engine after months of accretion: a single per-stage driver core shared by the flat and map drivers, one event-fold shared by the TUI and headless front-ends (with display-title, time-format, and dispatch consolidation), a serde-derived attach codec plus harness config and auth dedup, and a final hygiene pass over the worktree contract, git error handling, and CLI/TUI helpers. At 30 commits it was one of the largest pure-refactor runs of the release, with one mid-run replan to pin serde key ordering.
-
7 commits,
688d6d16a085d44f71runplans-fast-map-resume-scanreplayMap runs resume in one fast parallel scan
A gantry run sped up resuming wide --map jobs: instead of classifying completed units one by one, resume now does a single parallel pre-scan across a thread pool and burst-emits already-finished units as Skipped, so the front-ends show the resumed state at once without flicker.
-
13 commits,
a730d97d98b2ab8d04sessionDemo mode, run.pid cleanup, and the two-column TUI layout
A Claude Code session in one day: made `--demo` an endless milestone-structured showcase run with a merge finale and STOP modal, rebuilt the TUI sidebar as stacked about + sprints cards in a floating rail and split the body into equal rail and feed halves, and let a resumed map run re-widen its worktree pool with a bare --jobs. It also made the run lock unlink run.pid on clean release — first gitignoring the runtime state files, then reverting that in favor of not leaving them behind at all — and scrubbed author identity env vars from the post-commit rebuild hook.
-
9 commits,
dca5906483a4f8f4b4runplans-replay-past-runsEvery run records a lossless event tape
A gantry run gave each run a durable event tape that persists its event stream losslessly, and a fallback that reconstructs a playable stream from the run journal when no tape was recorded. The tape is what any later reader of a finished run works from. The playback tooling built on it in the same run is development tooling and is not part of a distributed build.
-
9 commits,
7e0af10a496293845bsessionCodex waits out weekly usage limits instead of failing the run
A Claude Code session taught the Codex harness to park until the weekly usage-limit reset rather than give up, and detached the post-commit rebuild hook into its own session so it cannot hold the commit hostage. A TUI pass tightened card padding and made the sidebar/feed divider draggable.
-
4 commits,
66bf9b6847e5ed6067runplans-collapsed-milestone-run-hides-milereplaySingle-milestone runs drop milestone wording from the feed
A small gantry run made collapsed single-milestone runs read as plain runs: feed cards no longer mention milestones when there is only one, so the two-level vocabulary appears only where the structure is real.
-
5 commits,
286d20641a6a421a45runplans-replan-reenumerate-sprint-loopreplayThe build loop picks up mid-run replans as new sprints
A gantry run made the sprint build loop re-enumerate the sprint spec after each unit, so sprint files inserted by an in-run replan are actually picked up and executed instead of being ignored by a roster fixed at start. A new RosterUpdated event carries the mid-run roster change, and the monitor, headless output, and replay all show the inserted sprints.
-
12 commits,
6bbf143c86f6c5dbe1runinline-per-turn-usage-capturereplayCapture per-turn token usage into normalized sidecar files
A gantry run added per-turn usage capture across harnesses: a normalized sidecar record format, a finalization hook, and extractors that pull usage from Claude session references, Codex rollout files, and opencode session logs, with a degraded-capture fallback for Gemini. Analysis tooling was switched to prefer these sidecars over its previous fallback sources. The cluster's commits are the run's own plan and progress records; the extractor code landed alongside them over 2026-07-10 to -11.
-
16 commits,
6f08ce9f15bceaa11eruncli-convention-aliasesreplayResume aliases, an interactive resume picker, and a Recent runs menu
A gantry run brought the CLI's conventions in line with Claude Code and Codex: `--resume`/`-r`, `--last`, and `-p/--print` aliases, an interactive newest-first resume picker when no run is named, and a Run menu entry listing recent runs for reopening from the TUI. It also renamed agent session history to stage logs in the docs.
-
10 commits,
0b5990fcc7ac65892erunsprint-replan-recoveryreplayIncomplete sprints get a bounded, replan-capable retry ladder
A gantry run built sprint-level recovery for reviews that come back incomplete: the review's disposition routes the sprint into a bounded retry loop that can also replan the current sprint, attempt state is persisted in the job pin so retries survive interruption, sprint briefs are restored before resume, and recovery attempts show up in status and the event stream.
-
6 commits,
d092e019cb56670c26runhandover-2026-07-13-fix-resume-reset-disreplayResume no longer discards uncommitted sprint completion state
A gantry run fixed the root cause of the falsely-reported no-work halts: resume's hard reset was discarding uncommitted sprint DONE ledger rows, making finished work look undone. Resume now preserves orchestration state through the reset, and a sprint re-run that finds nothing left to do completes as an idempotent no-op instead of an error. Companion to the no-file-changes recovery run from the same day.
-
8 commits,
56029ab11ff46583c6runno-file-changes-recoveryreplayNo-file-changes halts reconcile against the gate before stopping
A gantry run replaced the blunt \"agent produced no file changes\" halt: a no-op sprint is now reconciled against the real gate — green means the work was already done and the sprint completes, red routes through the bounded recovery path instead of stopping the run. The sprint completion ledger is also committed on normal finish so the state resume depends on is durable. Built from the halt catalog and root-cause work recorded the same day.
-
78 commits,
38dbcd3b36ccad3a9drunplugin-seamsreplayHarnesses and drivers move behind registries and a service surface
The largest engine refactor of the release: a 78-commit gantry run executed the revised plugin-seams plan across five milestones, putting harness metadata behind a compiled registry, driver selection and job dispatch behind a registered-driver seam, and the build pipeline's roster, gate, partial-merge, and read-side helpers behind a DriverServices surface with documented contracts. Missing harness or driver implementations now fail explicitly instead of silently. The run replanned its sprints repeatedly along the way, and Martin intervened once by hand to defer visibility enforcement from milestone 03 to 05.
-
25 commits,
da8bd119fe3c34a576runenvironment-bootstrapreplayRuns gain an environment stage that briefs every agent
A gantry run added an environment-build stage: a run produces an environment briefing artifact, validated on render, and injects it into every worker's preamble prompt — map workers included — so agents start knowing the project's build and test facts instead of rediscovering them. Malformed preamble prompts now fail loudly, and the prompt set was consolidated and reworded.
-
10 commits,
81c9a776603e141076sessionBootstrap rework, SBOM in tarballs, and preserved stage logs
A Claude Code session made a batch of engine and release fixes by hand: it reworked the environment bootstrap to be plan-aware, unverified, and non-fatal; preserved an earlier attempt's stage logs across a re-run; shipped the SBOM inside every binary tarball; stripped documentation comments from the release tree; stopped a hung test suite from silently disabling the rebuild hook; nudged the sprint planner toward preparatory refactorings; and gave the TUI menu model its own identity apart from the screencast code.
-
11 commits,
f6609b0cf565c9b8e5runblockers-flow-as-messagesreplayBlockers arrive as chat messages with inline action buttons
A gantry run moved run blockers into the assistant pane's conversation: a blocker now renders inline as a markdown message with relabeled action rows, operable both by keyboard focus and by mouse click, instead of interrupting with a separate prompt surface.
-
54 commits,
4dde3bd93533748d6crunconfig-schema-and-settings-formreplayOne config schema drives parsing, the settings form, and its docs
A large gantry run built the schema-driven settings system: a declarative config schema from which the global-config parser, an effective-config snapshot, a modal settings form with stateful sessions and paste handling, a settings-write engine command, and the generated settings docs are all derived, plus role-specific effort and timeout budgets. The run itself became a story: it reached all units done but died at the merge stage on a resolve failure, Martin staged a sprint split replan and reconciled test fixtures by hand, and filed the bug that the assistant pane could not finish a stalled run — the incident that motivated the resume-in-place work.
-
14 commits,
d34952aa7e7f1f2515runresume-in-placereplayA stopped run resumes with a keystroke, without quitting the TUI
A gantry run built resume-in-place: an owned, stopped run can be re-entered from the front end that is already on screen — no quit, no retyped resume command in a host shell. The engine distinguishes in-place front-end restarts from ordinary resumes, restores the TUI session after one, and covers the lifecycle with regression tests. Built from the plan written after the config-schema run died at merge with the fix known but unreachable from inside the application.
-
5 commits,
a82212b25c8aba3716sessionAgent prompts become named instructions; the planner stops setup
A Claude Code session tightened the shipped agent prompts: every prompt in config/agent-prompts/ is now named as an instruction, the sprint planner is told to plan setup work rather than do it itself, and the executor's naming rule lost its Gantry-specific wording and padding. A follow-up commit greened the gate by vetting a Brakeman warning and dropping assertions on a removed component.
Drivers beyond the default build
The map, goal, and loop job types, and the first swappable prompt set.
-
6 commits,
0ad9e4e84e4e486eafsessionA web-design prompt set turns the planner into a design-brief author
A Claude Code session added the first swappable prompt set: pointed at a web project, the planner reads that project's own design system and writes design briefs instead of build plans. It shipped with a wrapper script and its own --help and README entries, and is the ancestor of the design drivers that arrived later in the release.
-
6 commits,
d7596beab4c4257b68rundocs-job-management-planRuns get names: list, status, enter, resume, and remove by name
A gantry run added name-addressed run management. It created a persistent run registry with a forgiving name resolver, then wired CLI verbs on top of it — list, enter, status, remove, and resume — so a run can be managed by its name instead of a path, and documented the new commands. The main commit added the command layer in src/commands.rs and rewired main.rs around the registry.
-
21 commits,
74821fe251c74cb133runplans-jobs-triage-and-sprints-planTriage agent at the front of the run, and chunks become sprints
A gantry run refactored the job-planning layer in three milestones: it cleaned up the three-job system and fixed clarity problems in the job definitions, added a triage agent that organizes jobs at the front of a run, and renamed "chunks" to "sprints" throughout the codebase. The rename milestone had a rough patch — chunk 02 failed, was replanned, and re-executed — but the run finished the same day. It also made the TUI sidebar label dynamic and the plan-card text outcome-neutral.
-
24 commits,
a38d37b66e6b88cdcfrunplans-map-job-typereplayThe map job type — fan work out over many items, then concurrently
A gantry run built the map job type in two milestones. The first implemented the sequential core end to end: a spec-driven fan-out that runs one agent per work item. The second added concurrent execution, sampled checkpoint QA, and live fan-out monitoring. One sprint needed a retry and the run replanned twice along the way, but both milestones completed in a single day.
-
4 commits,
f541955e5ad305fd19runplans-adaptive-split-default-planreplayTUI sidebar/feed split gets an adaptive default width
A small single-sprint gantry run gave the TUI an adaptive default for the sidebar/feed split: when the user has not dragged the divider themselves, the split position now follows the terminal size instead of a fixed value. The change lives in the TUI render and state code.
-
55 commits,
91828f45b4f2612c83rungoal-jobreplayThe goal and loop drivers: verification-driven runs beyond milestones
The largest driver run in the release: a gantry run built the goal and loop drivers on a shared verification pipeline, in five milestones — verification foundations, campaign and build refactors, the goal campaign driver, the loop iteration driver, and the web/docs surface. Fix commits along the way hardened the new machinery: goal verdicts persist across resume, synthesized campaign files keep the original run's identity, frozen goal output is escaped with dynamic fences, and a final goal review is guarded before merge. Martin intervened once mid-run to re-scope a sprint to the progress-descriptor rendering code, and the run replanned the goal driver after a cycle-cap review.
-
13 commits,
1987fab696fa6501a6rungoal-unlimited-cyclesreplayGoal runs lose their cycle cap and default to unlimited
A gantry run made the goal driver's cycle ceiling optional: goal runs now iterate without a cap by default, and a ceiling, when set, survives resume. The run also surfaced registry progress in the run-management commands and updated the help text and docs to describe goal runs as unlimited.
-
11 commits,
27e311e4f21ee3f153runloop-becomes-the-goal-driver-ralphreplay--loop becomes the goal driver's name; --ralph is the alias
A gantry run reorganized the driver command surface: it renamed the goal loop driver, added the --ralph alias, and made --loop, --goal, and --ralph route to the right owner. It also added front-matter guards that reject a prompt whose front matter belongs to a different driver, so a plan cannot run under the wrong mode, and refreshed docs, prompts, help text, and site copy to match.
-
40 commits,
b52a1f35d754718769runmap-driver-takes-prosereplay--map takes a prose plan and generates its own spec
A gantry run made the map driver accept prose like every other driver: a prose plan is turned into a generated map spec by a planning agent, so the user no longer has to hand-write the spec. Most of the run's weight went into validating what the planner produces — generated specs are checked against real enumerators, shell-dependent and statically-listed work lists are rejected, support files and template placeholders are verified, and a bounded repair loop fixes a bad spec before fan-out. Resume keeps the original prose identity.
-
22 commits,
cf12db10f023b1da82sessionMap runs get an environment briefing; harness choice survives resume
An interactive Claude Code session fixed two gaps in the map driver: a map run now builds and injects the same environment briefing every other run gives its agents, and its workers get unique test scratch directories so concurrent units stop colliding. A resumed run also keeps the harness it was started with instead of falling back to the default. TUI menu dividers were fixed the same day.
Harness support
Running claude, codex, opencode, and gemini agents, and surviving their usage limits.
-
13 commits,
593c254dee6d879f47rundocs-multi-harness-planPluggable harnesses: Claude, Codex, OpenCode, and Gemini agents
A gantry run made the agent runner harness-agnostic and added the three non-Claude harnesses in one day. It extracted a Harness interface from the Claude-specific runner code (argv construction, stream-json parsing, usage feed, sandbox capability flags) and refactored Claude as the first plugin, then implemented the Codex, OpenCode, and Gemini plugins on top of it, with role-based harness selection, per-harness system-prompt delivery variants, and exit-code threading for Gemini's parser. The run also documented the new configuration surface, a Gemini authentication caveat, and the env-scrubbing design decision.
-
7 commits,
b2b2c157c8caf6dcddrunplans-usage-limit-reset-aware-backoffreplayRetries wait for the Claude usage-limit reset time instead of guessing
A gantry run replaced blind exponential backoff with reset-aware waiting when a harness hits a subscription usage limit. It reclassified subscription and session limit errors as transient rather than terminal, added optional wait hints that the retry loop honors, parsed Claude's usage-limit reset times to set the wait, and rendered the reset-wait distinctly in the headless frontend. A hand fix during the run deflaked a chat test by also waiting for the RunStarted event.
-
4 commits,
e1c61554c574043075runplans-gantry-handover-stream-json-verbosereplayFix claude 2.1.191+ invocation by pairing --verbose with stream-json
A small gantry run executed a single-sprint compatibility fix: claude CLI 2.1.191+ requires --verbose alongside --output-format stream-json, so the Claude harness now always passes it. Four commits, one real change.
-
5 commits,
d49afd3f3c0f234bferunplans-codex-usage-limit-backoffreplayCodex harness gains reset-aware usage-limit backoff
A gantry run extended the reset-aware backoff (built earlier for Claude, entry c041) to the Codex harness. It first threaded the agent's stdout JSON into the harness parse layer via a ParseInputs type, then taught the Codex parser to recognize usage-limit reset times from that stream so the retry loop can wait until the limit actually lifts.
-
8 commits,
3d1414a54f289e5088runplans-usage-limit-cardreplayUsage-limit waits get their own TUI card with a live countdown
A gantry run gave usage-limit reset waits a dedicated Waiting card in the TUI that counts down to the resume instant, instead of the run appearing silently stalled. It captured the absolute resume instant (with local offset for display), built the card lifecycle, and rendered the ticking countdown; a follow-up sprint specified the edge cases. Executed from the plan written the same day (entry c051).
-
7 commits,
628e02d2ce07ddfb7brunplans-codex-single-sandbox-layerreplayOne sandbox layer for every harness; agents aimed at their worktree
A gantry run collapsed the per-harness sandbox exemptions into one rule: claude, codex, opencode, and gemini all run inside gantry's bwrap when a sandbox is configured, and native-sandbox harnesses (codex, gemini) disable their own containment via a new AgentSpec flag so exactly one filesystem isolation layer applies. A second sprint fixed agent working directory targeting, guarding the cwd in the preamble and setting it to the worktree instead of the main checkout.
-
9 commits,
dd941351de23de09eerunplans-harness-model-on-every-cardreplayEvery TUI card footer shows which harness and model ran the agent
A gantry run, structured into five sprints, threaded a harness+model AgentTag through the whole system so each agent card can say what ran it. The tag is emitted at spawn, carried across the attach wire protocol, persisted and re-parsed in the history journal, held in TUI card state, and rendered in a new two-line card footer alongside the metrics. Executed from the card plan in entry c051.
-
8 commits,
53f64dde697341377brunplans-defer-harness-model-selectionreplayModel choice defers to the harness CLI unless explicitly pinned
A gantry run made the main-model setting optional across harness config, harness info, and the AgentTag, so gantry omits the model flag when no model is pinned and lets each harness CLI pick its own default. It also fixed the utility small-model override to work without a main pin and documented the deferral policy. Executed from the plan Martin rewrote the same morning (entry c089).
-
10 commits,
3be8a847f6b2d30c56runglobal-default-harnessreplayGlobal default harness and a repo-free `gantry config` command
A gantry run added persistent global configuration for the default harness: a global config store, startup fallback resolution when no per-project setting exists, precedence rules between build roles, and a new `gantry config` command that works outside any repo. It kept a legacy role-resolver wrapper for compatibility and documented the new surface.
-
8 commits,
ee8da5f0f1e836461brunglobal-config-harness-and-modelreplayGlobal config covers harness settings with defined env precedence
A gantry run, in two sprints, expanded global config preference parsing beyond the default harness and merged global `[harness.*]` settings into harness configuration with defined precedence: plugin defaults, then global preferences, then environment overrides, including legacy environment aliases declared by registry entries. Tests cover the merge precedence, malformed args, and unknown harness tables.
Worktrees and the merge machinery
Isolated run worktrees, conflict resolution, and a finalize that holds.
-
8 commits,
825eb140fc30e91cd2runplans-merge-partial-resumablereplayPartial, resumable mid-run merges via the merge command
A gantry run added checkpointing to builds: a MergePartial command in the engine, wired through the attach transport, that merges the work completed so far back to the main branch and leaves the run in a resumable state. It also added the user-facing `gantry merge <name>` verb, working against both live-attached and offline runs, and documented the workflow.
-
8 commits,
f7da9c38b4099b73a0runplans-merge-preserves-both-sidesreplayMerge reconciliation that preserves both sides of a conflict
A gantry run built the merge-reconciliation layer: delta-classifier primitives that analyze what changed on the main branch versus the run branch, automatic repair of unambiguous cases where a merge dropped one side's content, and an autonomous adjudicator-repairer for the residue where main dropped content in regions the run branch also rewrote. Clean merge-backs now emit a Reconciled event so integration is auditable.
-
13 commits,
0e08ac2b037856a673runplans-shared-checkout-safe-finalizereplayFinalize made safe in shared checkouts
A gantry run hardened run finalization for the case where the primary checkout is shared with other work: archive commits are scoped to explicit pathspecs so unrelated uncommitted changes are never swept in, `.gantry/` run-state is excluded from the confinement diff, and a crash-safe checkout lock serializes concurrent finalizes that mutate master. It also retired the snapshot-based restore_main_state rollback in favour of a non-destructive merge abort that leaves the checkout at its live tip, and added a post-merge gate run on master to catch semantic conflicts between concurrent runs.
-
6 commits,
d7d22073ce482efa6brunworktree-locate-from-linked-worktrreplayRuns launched from linked worktrees find the primary checkout
A short gantry run fixed primary-checkout resolution so a run started from a linked git worktree (where the git dir lives elsewhere) resolves the real primary checkout root, and audited the run entrypoint for linked-worktree handling.
-
8 commits,
dd19e17d06b8e0bb20runaggressive-merge-resolutionreplayMerges are gated in the worktree before landing on main
A gantry run tightened the merge flow: a clean merge is now test-gated inside the worktree before it lands on the main branch, semantic breaks introduced by a merge are repaired before main advances, and partial merges go through the same resolve path as full ones instead of a separate code path. It also clarified the resolution prompts and failure-handling documentation.
-
10 commits,
ec41eb979acb3aaa17runhandover-autonomous-conflict-resolve-thereplayMerge conflicts are resolved autonomously before asking the user
A gantry run, planned from a handover document, changed conflict handling to try an autonomous resolution first: an agent attempts the merge repair on its own, and only when that stalls does the flow fall back to a prompt offering the user a choice of recovery paths, including an assistant-guided retry loop. Tests cover the fallback recovery paths.
-
11 commits,
7ab66ab15b02bd5fcbrunrock-solid-merge-finalizereplayMerge finalization unified and made recoverable
A gantry run consolidated merge finalization onto one shared path with a single completion condition all routes must satisfy. Finish now distinguishes a merge that actually landed from stale merge residue, handles already-merged runs and residue left by earlier failures, and routes semantic merge repair through the normal resolve_conflict path; offline partial merges against a dirty main checkout are pinned by tests. The run closed by archiving the merge incident documents that motivated it and retiring a stale plan.
-
14 commits,
be0d5f9cd46416341drunpin-and-name-the-home-branchreplayRuns merge back to a pinned home branch, named in the UI
A gantry run made the branch a run was started from an explicit, persisted fact: the home branch is captured at launch, survives run resume, merges route back to it rather than to an assumed main/master, and user-facing screens name the actual target branch. Docs were renamed from main-branch to home-branch vocabulary. One test spec that drifted during the run was reconciled by an interactive Codex session.
The Gantry Assistant
The in-run agent: chat pane, MCP server, and agent diagnostics.
-
6 commits,
98d01bcc6d8a970b2erungantry-agent-p1-worktree-conflict-resolutireplayMerge conflicts get resolved inside the disposable worktree
A gantry run built conflict resolution that never dirties the main checkout: a first sprint added five merge primitives with safe rollback, and a second moved the actual conflict-resolution step into the disposable worktree. This is the groundwork that lets an agent fix a conflicted merge without touching the user's own working copy.
-
9 commits,
e13474d46c8da900e4runloom-agent-p2-bidirectional-ui-engine-chThe engine and TUI get a two-way prompt/answer channel
A gantry run built the bidirectional channel between the engine and the interface: a prompt/answer contract with an engine command back-channel, a text-input widget and prompt modal for the TUI, non-interactive resolution for headless runs, and design-mode confirmation routed through the new in-run prompt channel. This is the mechanism every later interactive feature — chat, blocker prompts, investigations — sends its questions through.
-
13 commits,
38b7f3f1a0b1cecc4drungantry-agent-p3-gantry-job-mcp-serverreplayAn MCP server lets agents query and control gantry runs
A gantry run built the gantry MCP server in two milestones: first a read surface of tools for querying run status and metadata, then action tools — bash execution and run control — gated behind sandbox containment. This server is what the in-run assistant and any externally attached agent use to see and steer a live run.
-
23 commits,
38cd057f70ed7693a4rungantry-agent-p4-gantry-agent-chat-panereplayThe Gantry Assistant arrives: chat backend, chat pane, blocker routing
A gantry run built the first version of the in-run assistant across three milestones and 23 commits: a conversational backend (harness selection flag, transcript store, chat loop runner, MCP plumbing, engine integration), a collapsible chat pane in the TUI, and first-line support routing that sends the run's halts and conflicts to the assistant for a decision. The run re-planned itself once mid-milestone and finished with all gates green.
-
14 commits,
ab8cd067fcca46db99rungantry-agent-p5-session-process-modelreplayRuns get exclusive ownership locks and a live attach transport
A gantry run established the session process model in two milestones: process-aware locking that gives each run exactly one owner, and an attach transport — endpoint, client, lifecycle, and codec — that lets front-ends subscribe to a live engine, with the MCP server integrated on top. This is the one-owner run lifecycle and the attach layer later web-view work builds on.
-
4 commits,
985d84a5d1994e651crunhandover-wire-chat-console-into-enginereplayThe chat console is wired into the live engine
A short gantry run, started from a handover, connected the previously stubbed chat console to the execution engine: user messages route to streamed replies, prompt answers forward to the engine's prompter, and runs without messages skip the assistant entirely, with an owned driver materializing the console on the demux thread. After this the assistant built in the chat-pane run actually talks to a running build.
-
10 commits,
a9a41f91450583faddrunplans-harness-aware-mcp-deliveryreplayMCP registration is delivered natively to each harness
A gantry run replaced unconditional MCP config writes with harness-aware delivery: a harness-neutral server spec on the agent, then per-harness renderers that register the server the way each tool expects — Claude's config file, Codex's command-line flags, Gemini's and OpenCode's settings files — and finally migrated the assistant driver onto the new path. Martin added the plan files by hand mid-run.
-
7 commits,
39503af871a7975ee3sessionChat delivery fix, agent diagnostic, and small run-machinery fixes
A stretch of Claude Code sessions across late June and early July fixed assistant replies arriving only after the engine finished and grew the `agent` verb into a multi-turn diagnostic for chat roundtrips. The same stretch added a post-commit hook that pushes a fresh green binary to the atlas machine, fixed the run identity on --no-ff merge commits, and adjusted chat prompt spacing in the TUI.
-
8 commits,
d6bd670d5c36be6776runplans-bare-loom-chatRunning bare `gantry` in a terminal opens the assistant chat
A gantry run made a bare invocation with no plan or verb open the Gantry Assistant chat directly: a start-in-chat signal, empty-build chrome so the TUI has something sensible to show without a run, and a shared production console setup extracted for both the chat and build paths. The behavior was later revisited twice — withdrawn on 2026-07-13, then restored with a greeting on 2026-07-16.
-
14 commits,
cdb297cb7cec48d6e0runrename-brain-to-assistantreplayThe in-run agent is renamed from brain to assistant
A gantry run renamed the product vocabulary from "brain" to "assistant" in two milestones: first the code paths and chat-facing surfaces, then the live documentation and help text. A pure rename with no behavior change; the current Gantry Assistant name dates from here.
-
8 commits,
2531264d370026fe48runassistant-input-strictly-opt-inreplayAssistant input becomes strictly opt-in
A gantry run stopped recovery prompts from grabbing the keyboard: recovery prompts are tagged as a distinct prompt kind and stay passive until the user focuses the pane, a nonintrusive overlay explains that input is waiting, and bare-invocation chat starts visible but unfocused. Typing into the assistant is now always an explicit choice, never something a run forces on you.
-
7 commits,
b0cef48d4d28b1d4abrunenter-agents-guidereplaygantry enter writes an orientation guide into the run worktree
A gantry run made `enter` leave a guide behind: a renderer produces an orientation document with the run's status and safe aliases, the files are written into the run worktree when it is opened, and the behavior is documented. An agent or human dropped into a run's worktree now finds instructions on what the place is and what is safe to do.
-
9 commits,
79ddf4e0e43aec1d70runinvestigate-with-agentreplayBlockers can be investigated by launching an interactive agent
A gantry run renamed the blocking-snag recovery flow to "investigation" and rebuilt it: blocker prompts share one choice contract and fold into the standard prompt modal, and a new action suspends the TUI to launch an interactive harness session in the run's worktree so a person can debug the blocker with an agent at their side, with harness options and launch helpers behind it.
-
18 commits,
b353f06ffbe96c89a9sessionAgent prompts condensed, bare invocation reverted, snag renamed
A day of Claude Code sessions across several threads. The shared agent prompts were condensed to one-to-three tight paragraphs and re-grounded with real context and structured escalation. Bare `gantry` was changed to print a terse two-line hint instead of opening the assistant chat (reversing the earlier bare-chat run; itself reversed three days later). The word "snag" was purged for "blocker" throughout, oversized merge prompts were externalized to avoid E2BIG at spawn, and licensing and copyright were settled.
-
55 commits,
54e1e0e929dc0d5710rungantry-agent-p11-perfect-the-assistantreplayAssistant polish: pane sizing, model menu, blockers, MCP docs
The largest assistant run — 55 commits over four milestones — refined the whole experience: the composer grows and wraps with layout-driven focus and explicit resize actions; a model submenu switches the assistant's model for the next turn; blocker prompts route through the assistant pane with an inline stop action; turn failures surface as chat events and the assistant's identity threads through its turns; and the MCP server gained scoped run listing while the assistant and MCP documentation was aligned with the code and reorganized. Martin intervened by hand mid-run to drop a narrated menu-tour requirement and park a menu/screencast decoupling plan.
-
42 commits,
733ebb883e8bcbd403sessionAssistant chat polish, markdown replies, and prompt-pipeline studies
A dense single-day Claude Code session spanning three threads. Assistant chat polish: agent replies render as markdown, the composer gained recall, paging, and paste, a waiting indicator shows while a reply is in flight, the divider bar and modal rendering were reworked, bare `gantry` opens the chat again with the assistant greeting first, and assistant commits get their own git identity. Prompt-pipeline work: an environment briefing authored ahead of the sprint planner, agents told they may read the orchestration directory, and fleet studies of opening tool calls, planner reading depth, and the bounded-fix stage.
-
8 commits,
ce5574be60bd01f154runspec-available-to-every-agentreplayEvery worker agent can read the durable plan artifact
A gantry run made the original plan document visible to every worker agent in a build: the shared agent preamble gained an optional plan-artifact reference, and each driver supplies a worker-visible path to it. Workers no longer act only on their sprint brief; they can consult the plan the whole run is executing.
The terminal UI
Cards, sidebar, menus, modals, and the theme.
-
32 commits,
d9a2bd91643aa76ac3runplans-menu-makeover-planreplayMenu bar, pager, clipboard, and live stats built into the TUI
A gantry run executed the plans-menu-makeover plan across four milestones, rebuilding the TUI's command surface from scratch: an action registry and seven-menu bar with View and Help menus, a shared read-only pager, clipboard support, Tools and Chat menus, then Run, Agents, and Stats menus backed by a new statistics aggregation layer for agent-run tracking, and finally cross-cutting behaviours — bar ticker, Prompt menu, empty-state display, recent events, and a demo mode. The run replanned sprint 03 of milestone 02 mid-flight to also surface worktree metadata and the plan-source path.
-
5 commits,
a9f3c44b65f3678ee1runhandover-reinstate-reverted-tui-changesreplayTwo-column layout with stacked sidebar cards restored after bad merge
A gantry merge had reverted three TUI changes, so a follow-up gantry run was launched from a handover document to put them back. It reinstated the two-column layout with stacked sidebar cards in the renderer, then pinned the layout and sidebar stacking with render tests so a later merge could not silently drop them again.
-
23 commits,
0721b1d3e243199503runplans-stats-panel-planreplayStats panel, upgraded pager, and git activity view for the dashboard
A gantry run built the plans-stats-panel plan in three milestones. It first upgraded the shared pager component — line wrapping, scrolling, search, input handling and paging, and source threading with refresh — then implemented the stats panel itself, and finished with a git activity view showing commits and repository changes inside the dashboard. The run replanned one milestone after review over a cross-repo dependency, and along the way fixed fallback-backoff accounting to exclude mid-stage sleep.
-
9 commits,
92458e53d7e84a2cc4runplan-text-selectionreplayMouse text selection and clipboard copy across panes and overlays
A gantry run added text selection to the TUI: it wired in the mcurses-select crate and any-event mouse tracking, registered visible text in the feed, sidebar, and chat as selectable blocks, registered overlay text with modal z-order so selection scopes to the open modal, routed mouse gestures through an extracted, testable route_mouse_event function with copy on release, and painted the selection highlight as a post-pass over the rendered frame.
-
19 commits,
d366dcf7ccaae5d9afsessionCard gutter restyled; Loom source-available license replaces MIT
A day of Claude Code session work with three threads. The largest was an iterative restyling of feed cards: a left gutter tried first as arrow glyphs, then as aligned box-drawing characters (a bar through body and wrapped lines, a corner on the footer), the footer collapsed to one line showing only the harness, future milestones rendered as top-level names, and width caps raised. A second thread replaced the false MIT declarations with the Loom Source-Available License v1.0 and a binary EULA. Smaller commits kept the sandbox active for codex and gemini, fixed a concurrent-run build break, and wrote the script-first narrated-screencast design plan.
-
7 commits,
ae6bb005af3e5d00f4runplans-smooth-card-animationreplayCard animation timing primitives and half-row feed slide
A gantry run started the smooth-card-animation plan: it extracted the TUI's animation timing primitives, added half-row feed slide rendering, and marked replayed run events explicitly so replays could be told apart from live ones. Much of the run's output is the plan scaffolding itself; the fade-in and tail-follow sprints landed as later work.
-
10 commits,
9487451ccb8c79a21esessionFeed slide on card growth; gantry list sorted, counted, and trimmed
A three-day stretch of Claude Code session work across a few threads. The TUI thread made the feed slide when an in-place card growth moves the tail and made the sprint sidebar tail-follow the newest sprint. The list command was repaired: milestone runs no longer misclassified as empty, chronological sorting with a DATE column, unit counts read from the authoritative ledger (SPRINTS renamed to UNITS), and the TITLE column dropped. Smaller fixes covered SHA256SUMS coverage for the release ingestor, a merge card that said "sprints" regardless of unit, and demo unlock-token claim handling.
-
15 commits,
a141ddb868e76c515druntui-casing-cleanupreplayTUI text casing unified across cards, statuses, metrics, and prompts
A gantry run executed a four-sprint casing cleanup: it unified the casing of shared agent cards, aligned live-status and empty-state text, normalized state and metrics display strings, and rewrote decoration prompts into sentence case. The visible commit subjects are almost all run bookkeeping; the actual string changes ride inside the sprint-completion commits touching the renderer, state, and theme modules.
-
9 commits,
ea489e618f9753e146rungantry-list-sprint-countsreplayRun list shows sprint counts, split into state and display totals
A gantry run (started under the pre-rename name loom-list-sprint-counts) added sprint counts to the run list: each run row shows how many sprints it holds, with the internal state count kept separate from the displayed total, and the MCP list_runs tool reporting both. The run replanned once after its first sprint and finished with a test pinning the state/display separation.
-
8 commits,
8c144e98503858afedrunhalt-modal-full-content-scrollreplayStop modal sized to its content, scrollable, with inline diagnosis
A gantry run reworked the halt modal in three sprints: halt modals are now sized from their content instead of a fixed frame, the stop overlay scrolls when the content is longer than the window, and STOP diagnosis reports render inline in the modal rather than pointing at a file.
-
6 commits,
40e8945b5092e73e9bruntui-casing-cleanup-detail-stringsreplayBuild stage detail strings switched to sentence case
A small single-sprint gantry run, a follow-up to the wider casing cleanup (see the tui-casing-cleanup entry), that capitalized the engine's build stage detail strings so status text reads consistently.
-
5 commits,
bc7f9a6774339b7679runsidebar-follow-active-sprintreplaySidebar follows the active sprint instead of the tree tail
A single-sprint gantry run changed the sidebar's scroll behaviour to follow the currently active row rather than always tracking the tail of the tree, keeping the running sprint in view.
-
33 commits,
b256b25a648b6f5f2esessionThe monitor is made panic-free at any window size
A dense single-day Claude Code session hardened the terminal interface: the sidebar renderer and the monitor as a whole no longer panic at any window size, milestones draw as milestones from the first frame instead of appearing once the structure is known, and a flat run's sprint arrow-line is headed by the run title.
-
8 commits,
a8005a5f191f7b1c87runall-cards-count-and-state-durationreplayBuild view shows counts and final durations on every card
A gantry run improved the build view's progress display: the feed's gate stage was retitled to plain testing language, finished cards keep their measured final duration instead of losing it when progress ticks stop, and mechanical gate stages emit live progress heartbeats that survive into the finished record. The work also covered attach and demo viewing of that progress.
-
43 commits,
6a8b1c49f425b7471drunmodal-reworkreplayAll dialog overlays moved onto one shared modal system
A gantry run executed the modal-rework plan in three milestones: it refreshed the vendored mcurses-menu modal and added a shared Gantry modal boundary module, migrated every dialog-shaped overlay — the stop overlay, pager, and git diffstat drill among them — onto the shared modal path with shared input dispatch and key fallthrough, and made dismissed modal events reopenable as read-only snapshots persisted in recent events. It also reordered recovery prompts to offer Gantry and external harnesses before the shell.
-
13 commits,
83509f352b5cede340runcard-artifact-tagsreplayCards show artifact tags that open in the TUI artifact viewer
A gantry run built card artifact tags in four sprints: a tag data model, tag rendering on visible cards, opening a tag's artifact from the feed in the TUI viewer, and suppression of raw file paths from card prose now that the tags carry them.
-
29 commits,
32f26913f4cf0f1fa4runmenu-system-coherencereplayMenu system consolidated; run journal surface added
A gantry run stabilized run operations and then reshaped the menu bar into a coherent four-title structure. It hardened the operations the menu exposes — the merge menu gated on declared partial-merge support, durable plan artifacts persisted for open-plan, live worktree artifacts preferred for run viewers — added a Run journal surface to the TUI, surfaced the configured retry policy in stats views and blocked state in collapsed chat, renamed the build-run menu surfaces to Inspect, and realigned the menu inventory docs with the shipped bars.
-
31 commits,
3ca0ea793e0aa54d34runtui-hover-affordancesreplayHover and focus states across menus, modals, and dividers
A gantry run added hover affordances throughout the TUI in two milestones. Gantry-side work gave the sidebar/feed divider, chat divider, composer, and inline blocker buttons hover states, applied the Gantry palette to modal chrome and buttons, and tracked hover targets during mouse routing with overlay mouse events routed through the frontmost modal; the upstream-backed milestone refreshed menu hover styling, including hover foreground theming for menu selections and highlighted menu and modal-close states.
Test-suite reliability
None of this is in the binary; it is what the gate's verdicts — and so every run's ground truth — rest on.
-
22 commits,
b1ffcf6e605d8704c3runtest-suite-speed-and-tiersreplayTest suite split into tiers; display E2E moves behind LOOM_E2E
A gantry run reorganized the Rust test suite for speed: it moved the display end-to-end coverage into its own tier gated by an environment variable, added committed nextest profiles for the default and E2E tiers, tightened polling waits in the slow integration tests, and consolidated the default integration tests into one binary. Martin recovered two sprints by hand mid-run, and the consolidation commit itself was his.
-
32 commits,
0b6e29aa5fa9f8c45frunflaky-test-eradicationreplayFlaky tests measured, root-caused, and fenced with guardrails
A gantry run worked through test flakiness end to end: it measured a flake baseline with a stress runner, fixed the confirmed offenders — stub-executable isolation in build tests, a PATH-sensitive overlay probe, auth bootstrap leaking process env, scratch-path collisions between concurrent runs — and then added a guardrail scan for flaky antipatterns plus a test-reliability guide and evidence reports. Martin reframed four late sprints to a bounded verify/lock/document scope partway through.
-
10 commits,
ffb02cc610906c4a87rundriver-loop-concurrency-flakereplayDriver loop hardened against concurrency stress and git contention
A gantry run chased a driver-loop concurrency flake: it first built a first-class stress reproduction, then routed git calls through a worktree helper to avoid lock contention under parallel load, made loop iterations distinguish real red verdicts from infrastructure failures (treating git baseline and gate launch failures as infrastructure), hardened rollback and invariant handling, and recorded after-fix stress evidence in a closeout.
-
36 commits,
9a9d4a6604f7de8d43runtest-suite-redesignreplayTest suite redesigned around injectable seams and structural asserts
A gantry run restructured how the suite tests the drivers: it introduced injectable "world" seams for the driver loop, goal startup, and the sprint pipeline so driver logic runs against fakes without spawning git, bounded the test tiers with explicit timeouts and per-workspace process locks, split the root gate into default and heavy tiers, and replaced exact-copy pinning in the web tests with structural assertions (moving the legal-copy checks into quarantine). Martin rescoped two sprint briefs mid-run to split goal-mode into its own unit, and filed a bug report on an adjudicator argv E2BIG halt hit at the final merge.
The demo edition
The licensing gate in the binary, and demo identity by verified email.
-
19 commits,
6887a2cacf074cd84frundemo-gatingreplayDemo edition gating in the gantry binary itself
A gantry run built the Rust side of the demo edition in three milestones: a demo identity layer, the runtime gate and unlock flow, and demo release artifacts proven end to end. Along the way it preserved HTTP error statuses from failed unlocks, tightened gating around the build lifecycle, and added demo license regression tests. It ran the same day as the website-side demo-gating run (c095), the two halves of one plan pair.
-
28 commits,
19c2b32390dc7cc7cfrundemo-identityreplayDemo builds identified by verified email, not personalized binaries
A gantry run reworked demo identity: instead of stamping personalization into each demo binary, the demo now asks for the user's email — via a modal prompt in the TUI and a plain prompt in headless runs — verifies it, and caches the verified identity and license email hashes locally. The personalization stamp was removed from the demo gate, completion identity handling was hardened, and counted demo builds got end-to-end test coverage. The run spanned two days with a mid-run replan.
Packaging and release
Release builds, signing, the source-review archive, and the reproducible release.
-
19 commits,
e0b8ad78d737bc0b11runplans-refactor-build-rsreplaybuild.rs split from one monolith into a module hierarchy
A gantry run refactored the orchestrator's monolithic build.rs into a module hierarchy over two milestones, extracting the driver, gate, agent, finish, and commit clusters and splitting the build tests into tests/ modules. The run was interrupted mid-chunk: Martin finished the last chunk's test split by hand and left a handover on resume-time interrupted-chunk recovery, also making the post-commit hook skip linked worktrees.
-
16 commits,
4a52ad60d682b6bcf7runplans-distribution-and-preflightreplaygantry doctor, dependency preflight, and a four-target release CI
A gantry run built the dependency preflight system and the first release pipeline in two milestones: a doctor verb that checks required external tools, startup dependency validation, a version-check, an installation guide, verified vendoring, and a CI pipeline producing release binaries for four targets.
-
20 commits,
232cc707787629b785runplans-source-review-distributionreplaySource-review archive, SBOM, signing, and license compliance in CI
A gantry run made releases auditable: the release job now generates an SBOM and a source-review archive, produces detached signatures and a full checksum set, and includes THIRD-PARTY-NOTICES in release tarballs. A license-policy CI workflow keeps the notices fresh.
-
7 commits,
d396bef33c75052f8frunlocal-release-buildreplayReleases are built locally; GitHub Releases retired
A gantry run replaced GitHub-hosted releases with self-hosted distribution: a build-local-release.sh script produces the release artifacts on Martin's machine, the GitHub Actions release workflow was removed, and the distribution and installation docs were rewritten around the website download model.
-
10 commits,
15a73c6585161ebda8sessionRelease-script fixes accumulated across the 0.1.0 release period
A thread of small release-pipeline fixes from 2026-07-10 to release day, mixing hand work and Claude Code sessions. Early fixes made the scripts run outside the repo root, installed the real minisign and demo-unlock public keys, and corrected the minisign self-verify target; later ones pinned the linker toolchain the reproducibility check builds under, stopped emitting the retired installer script, adopted the final 0.1.0 legal texts with the right licensor named, and pointed publishing at the storage volume production actually has.
-
11 commits,
fd5f8c903021df1b8erundistribution-feature-exclusionreplayDevtools and screencast tooling stripped from shipped builds
A gantry run put development-only code behind cargo features: devtools entrypoints and the replay/screencast tooling each sit behind a default-on feature, distributed release builds strip those defaults, and bin/test grew a matrix that compiles and tests the stripped configurations. Martin added one hand fix cfg-gating the demo/devtools boundary tests to their feature set.
-
29 commits,
aa6469465af8bef3fbrunsource-available-01-reproducible-releasereplayReleases build reproducibly from the published stripped source
A gantry run made the source-available release verifiable: a comment-strip workspace member and strip-tree CLI remove comments (preserving copyright and license headers) from the published tree, the release binary is built from that stripped tree byte-reproducibly with a pinned SOURCE_DATE_EPOCH, and a verify-build.sh ships in the customer archive. A release-time gate unpacks the source-review zip, runs the shipped verifier, and refuses to ship unless it reports a byte-for-byte match — proving the customer's own verification path before anything is signed.
-
19 commits,
c4f26053b03723b0e2runsource-available-02-mechanized-code-stanA mechanized code-standards gate cleans the shipped Rust source
A gantry goal run (three cycles) drove the shipped source toward a mechanized standards gate, scripts/source-standards-gate.sh — part of the source-available series after the reproducible release (c133). It centralized unix syscalls behind safe helpers, tightened source-safety checks across shipped code, hardened engine run-state and harness wiring, made harness and timing fallbacks explicit, and simplified the demo unlock-token validation flow.
The loom → gantry rename
The product was called loom until 2026-07-18.
-
7 commits,
b257b654e84066fe0erunremove-triagereplayThe triage stage removed from the build pipeline
A gantry run deleted the build-triage stage and its job-selection plumbing from the pipeline, along with legacy sprint flags, leaving one default milestone-first build path, and documented that single flow. The matching website-copy cleanup ran the same day.
-
8 commits,
4bf9d9cdabc936e2b4rungate-to-test-renamereplayCore docs and agent prompts renamed from gate to test
A gantry run renamed the pipeline vocabulary in the core repo: the public overview prose, the core and design-mode agent prompts, and the live documentation now say test where they said gate, and validator language became check. The website's copy got the same rename in a parallel run.
-
9 commits,
1a5fb4bf2d9a12d040runnaming-cleanupreplayIdentifiers renamed for readers: BuildContext and orchestration
A gantry run codified the name-for-the-reader convention and applied it to the code: build-pipeline context references became BuildContext, clipped orch identifiers became orchestration, and the naming guidance in the agent-facing docs was clarified to forbid invented abbreviations of the project's own vocabulary.
-
51 commits,
91df9496c269744f1erunbrand-gantry-renamereplayThe product renamed from Loom to Gantry
A gantry run executed the brand rename from a hand-written plan: LOOM_* environment variables became GANTRY_*, the package, README, legal pages, TUI branding, and window titles now say Gantry, the emblem glyph changed from ⋈ to ⨝, orchestration paths moved from `.loom` to `.gantry`, and the website's legacy loom hosts redirect to the canonical gantry.software origin with host policy centralized. The plan deliberately left run history, applied migration filenames, and the one-shot screencast migration scripts untouched; runtime name helpers mark the rename boundary for anything that must still read old artifacts.
-
48 commits,
5309fc71adf4367449runsource-tree-product-renamereplaySource tree renamed to gantry, with a compatible wire contract
A gantry run — the first to commit under the gantry author name — executed the last and largest part of the rename: roughly 5,300 product references across 533 source files, including gantry_jobs artifact paths, the LoomJob→GantryJob model, the job-summary pipeline, ignore rules, and runbooks. The one behaviour-bearing piece, the demo API's loom_version request key, was handled as a permanent compatibility window: the server accepts both keys and the client sends gantry_version. Martin intervened by hand mid-run to drop an unmeetable fleet-closure-zero requirement from the gates and to fix the registry verifier, and the run repaired a merge that had dropped main's changes before finalizing on 07-19.
Maintenance
-
65 commits,
1ffff28585ab237000sessionA global configuration tier joins harness and model resolution
Two runs landed their build commits directly on master over this week: a source-standards pass that adopted the workspace readability lints across the engine, and the global-config work that put a global tier into harness and model role resolution — command line first, then the project's harness.toml, then global config, then the built-in fallback — with the resolution source tracked so a surprising choice can be explained. The rest of the cluster is Gantry's own record keeping after each run's merge.