0.3.2
Corpses and Gods
This release is purely about clean-up and bugfixes. Split up some god objects in the TUI. Fixed two bugs related to finishing and merging runs. Deleted 2,370 lines of code.
126 commits by Gantry runs
68% of the release
59 commits by non-Gantry sessions
32% of the release
Gantry 0.3.2 covers the four days from the 0.3.1 tag to the 2026-08-26 content boundary: 185 commits in 17 entries - 5 gantry runs contributing 126 commits, and 12 hand or interactive-agent sessions and standalone commits contributing the other 59.
The largest work removed dead code and split large Rust source files. The dead-code lint is active again for the shipped binary configurations, and it removed the frozen goal snapshot, retired diagram layout engines, a scenario-coverage helper, unused harness identifiers and old pattern-language residue. src/commands.rs became src/commands/, and src/tui/mod.rs, src/tui/state.rs and src/tui/render.rs became directories of smaller modules. The TUI split was code motion proved by scripts/code-motion-neutrality.py.
The compiled documentation source set now has one owner. The old docs/manual/ source tree, src/engine/manual.rs and gantry agents <topic> are gone; gantry agents init remains. The binary embeds the root manual/ source set through src/engine/config.rs, which is the same source set the website renders. gantry --help is a usage message again. The 2026-08-23 docs sweep corrected compiled reference strings, bundled pattern comments, the agent-prompt roster and an install command.
Recovery changed two stop classes a customer could hit. A run that resumed after an unresolved merge now discards the unresolved merge and redoes it, preserving the rule that uncommitted work is discarded at resume. A run whose top-level tasks were already DONE, whose gate was green and whose branch was contained in master can now finish instead of stopping on every resume. The boundary commit stages its resolution, task projection avoids duplicate task counts, and the event tape no longer records the replayed journal.
The visible interface changed in smaller pieces. The TUI projection is folded once per frame and the drain is bounded, fixing the freeze found during a shaped replay. Task-list announcements name when a task-list directory binds and when a later step binds an output. Rejecting review cards render as rejection, a bare gantry in a terminal prints the plan hint instead of opening a runless assistant chat, and run labels no longer break a word.
Distribution work made this the first release cut by release/cut_release.toml. The source archive is now named gantry-<version>-source.zip, with a compatibility alias for the old name, and it ships code with comments. The licence allow-list now names files under config/, and TERMS-OF-SALE states that a licence is bought per named seat.
No plan described by these entries needed more than one gantry run. The one-set-of-documentation-03a93262f429 run kept its binary half and had its website half reverted by hand; the changelog covers only the binary half. The release input names no known issue for a reader of the release to encounter.
Dead Code And Source Structure
Dead-code linting returned, and the largest Rust source files were split.
-
32 commits,
36b1e533e12f3ddf13runthe-lint-fires-againreplayDead-code linting returns for shipped binary configurations
A gantry run made the dead-code lint useful again for the shipped binary. `src/` had 217 `#[allow(dead_code)]` attributes, roughly 150 of which silenced nothing, and real dead code had accumulated behind them: the frozen goal snapshot in `src/engine/goal.rs`, the `SugiyamaLayout` and `EmptyLayout` diagram layout engines with the layout registry, `scenario_coverage_report.rs`, `Harness::id()` and retired pattern-format residue in `pattern_language.rs`. The run removed the unused code, split `src/commands.rs` into `src/commands/`, and moved the simulation mock agent into `src/engine/mock_agent.rs`. `bin/test` now has a stripped shipping-lint tier that runs clippy over the binary target in the `paid` and `demo` configurations, so code reachable only from tests is no longer enough to keep an item alive.
-
40 commits,
d9d48f296da71f6b96runthe-tui-is-a-directoryreplayThe largest TUI files are split into modules
A gantry run split the three largest TUI source files into directories. `src/tui/mod.rs`, `src/tui/state.rs` and `src/tui/render.rs` had carried the largest churn in the repository; they now have smaller modules and each file's tests live beside the production module. The run first added `scripts/code-motion-neutrality.py`, which compares normalized function bodies across revisions, then used it to prove the split preserved the moved code. The resulting source tree is easier to audit in the source archive without changing the TUI's behaviour.
Compiled References
The binary embeds one manual source set, and compiled reference strings were corrected.
-
24 commits,
19ceb17a16a8071557sessionThe 2026-08-23 docs sweep corrected compiled references
Hand and interactive-agent sessions ran the 2026-08-23 docs sweep over sixteen units. Several corrections changed compiled artifacts: `reference_vocabulary.rs` fixed thirteen journal emission strings, twelve menu vocabulary strings, six configuration precedence chains and a backwards CLI flag description; the bundled pattern comments for `sprint`, `milestone`, `build`, `map` and `until` were corrected; the agent-prompt roster was repaired; and an install command that failed for every buyer was fixed. The entry covers only the source set and reference data the binary ships.
-
28 commits,
a89d2fb2e464fad885runone-set-of-documentationreplayThe binary and website share one manual source set
A gantry run removed Gantry's second compiled manual source tree. `docs/manual/`, `src/engine/manual.rs` and `gantry agents <topic>` are gone; `gantry agents init` stays. The binary now embeds the root `manual/` directory through `src/engine/config.rs`, and that is the same source set the website renders. `gantry --help` is a usage message again instead of the old command reference, and every standard spelling of the request reaches it. The run's website replacement was reverted by hand because its generated tables made `/docs/patterns` worse; the released binary keeps the manual source set change.
Run Recovery
Resume can get a stranded run to completion, and related records stay consistent.
-
16c36fbe4commitThe event tape does not record replayed journal events
An interactive-agent commit stopped recording the replayed journal in the event tape. A resume still reads the journal for identity bookkeeping, but the tape no longer gains duplicate replay records for work that did not execute again.
-
2 commits,
626885a44b8a1d0b4esessionThe boundary commit stages the merge resolution
An interactive-agent session fixed the boundary commit after merge resolution. The boundary commit now stages the resolved files before committing them, so a resolved merge cannot proceed with an empty or stale index. The same session retired the plan that produced the fix.
-
2 commits,
38854ef7b7fd437e7bsessionTask projection counts each task once at its depth
An interactive-agent session changed run projection so each task is projected once and each count names the depth it counts. This keeps the run record and TUI task counts consistent when nested task lists are present.
-
10 commits,
d44e0f0b4ad533e7berunno-run-is-strandedreplayResume can finish runs stranded by a merge or completed tasks
A gantry run fixed two ways a run could become impossible to finish. A run whose merge back conflicted and whose resolver did not finish first time could land in a state no `gantry` command could leave, because the rollback aborted a merge in the shared checkout while the merge was in the run worktree and the resume guard refused to start there. Resume now discards the unresolved merge and lets the run redo it, on the operator's 2026-08-24 ruling, preserving the rule that uncommitted work is discarded at resume. Separately, a run whose top-level tasks were all `DONE`, whose gate was green and whose branch was contained in `master` stopped on every resume with `pattern 'build' completed without planning or building any work`; a run's completeness is now read from its record rather than from what the current session announced.
User Interface
TUI event drain, task-list cards, review cards, bare invocation and labels changed.
-
6 commits,
5824852ee5f35dfc30sessionTask-list announcements name binding and depth
Hand and interactive-agent commits changed how task-list records appear. Gantry announces a task list when its directory binds and announces it again when a later step binds an output, while the two reference surfaces now name both emitters. A resumed run keeps every recorded task-list depth even when the current session enumerates fewer lists.
-
3 commits,
b6769c2bffaf2347dfsessionThe TUI folds projection once per frame
An interactive-agent session diagnosed and fixed an 8.33-second freeze cycle during a shaped replay. The TUI drain loop was starving the draw while `Live::view` re-read the run directory per event. It now folds the projection once per frame and bounds the drain, so a burst of events cannot indefinitely postpone drawing.
-
4 commits,
40d6f03586de8bc30csessionA rejecting review card renders as rejection
An interactive-agent session fixed a TUI card that rendered a rejecting review as `Pass`. A review card now says it is rejecting when the review rejected the work, so the card state matches the run record. The session also archived the plan and report that led to the fix.
-
f491c75cecommitBare gantry prints the plan hint instead of opening chat
An interactive-agent commit changed a bare `gantry` in a terminal to print the plan hint instead of opening a runless Gantry Assistant chat. The change deleted `ChatEngine`, the `AgentPrompt::GantryAgent` mission prompt, the bundled `config/agent-prompts/gantry-assistant.md` and the `gantry-agent.md` legacy-stem fallback. The build-run assistant pane and the `gantry assistant` diagnostic remain.
-
c3ade770bcommitRun labels do not break inside a word
An interactive-agent commit changed run label rendering so a label is not cut in the middle of a word. The TUI keeps the label readable when it wraps.
Release And Licensing
Release automation, source archive naming and shipped terms changed.
-
9 commits,
8a44a105968ac9464bsessionA release can be cut by one Gantry run
Hand work replaced five release runbooks and the old replay configuration with `release/cut_release.toml`, the pattern that cuts this release. The pattern itself is not shipped, but the work changed release build automation and the release checks under `scripts/release` and `bin/test`. This release is the first one cut by that pattern.
-
2 commits,
1e8b273c83f9d6d797commitTerms of sale state the named-seat licence
Hand commits changed `TERMS-OF-SALE`, which ships beside the binary in the release tarball. The terms now state that a licence is bought per named seat, and the follow-up commit records why that clause exists.
-
4 commits,
af5c344b98ee7bd26esessionThe source archive name drops review
Hand and interactive-agent commits renamed the per-release source archive to `gantry-<version>-source.zip`. The previous `gantry-<version>-source-review.zip` name came from a superseded review-only grant, and `ReleaseAsset::KIND_ALIASES` keeps old download links working. The source archive now ships code with comments, and the licence allow-list names files under `config/` rather than the directory.
Maintenance
-
16 commits,
93eb91233e91a08c6arunan-assertion-names-an-interface-noreplayAssertion cleanup reaches the source archive
A gantry run finished the second layer of the 2026-07-30 prose-assertion sweep. It handled the two categories the first sweep left undecided: runtime message copy and script or workflow text matching. The run censused 346 candidate assertion sites across `src/`, `tests/`, `screencast/src/` and `tools/`; the source-archive effect is in `src/`'s inline `#[cfg(test)]` modules, which ship to auditing customers even though they do not compile into the binary.