v1.23.0
Added
- Support Enter key to close the live dashboard once a run has finished, and support g and G keys for first and last row navigation in the launcher.
- Support Tab and Shift-Tab pane switching, Ctrl-W word deletion, and Ctrl-U line clearing while typing in the launcher review filter (
gauntlet pick), and automatically focus the first matching review on Enter. - Support Page Up, Page Down, and Space keys in the live dashboard feed view and help overlay.
- Support Page Up and Page Down keys (
pgup,pgdown) in the interactive launcher (gauntlet pick) across reviews, agents, options, and filter search. - Ship template configuration files
agents.example.jsonand.env.examplewith documented options and placeholder values.
Security
- Require reload handoff state file paths via
GAUNTLET_STATEto be absolute, preventing relative path resolution and deletion in the working tree. - Validate provider and model identifiers in dsh configuration overlays, preventing YAML injection and directory traversal.
- Validate reload handoff state files before reading or removing, refusing non-regular files and symlinks via
GAUNTLET_STATE. - Reject oversized responses in self-update checksum downloads instead of silently truncating.
- Separate git branch names and patterns with
--across merge, rename, and branch deletion operations. - Isolate
--usage-cmdprocess execution and PATH resolution from the reviewed
working tree, running the probe in the system temporary directory with
cwd-relative PATH entries dropped. - Constrain self-update asset downloads to HTTPS endpoints on authorized GitHub
release hosts, preventing plaintext transfers or untrusted third-party hosts. - Validate HTTP redirect target URLs in self-update against authorized release hosts.
- Strip authorization bearer tokens on self-update requests whenever redirected away from GitHub hosts to prevent token leakage.
- Use constant-time comparison for self-update asset checksum verification against timing side-channels.
- Reject unclean and path-traversal state file paths via
GAUNTLET_STATE. - Shell-quote git conflict resolution hint commands with POSIX single-quoting to prevent shell injection via untrusted commit subjects.
- Isolate agent, indexer, and dsh probe execution with absolute-only PATH environments and clean working directories to prevent relative binary resolution.
Fixed
-
Reject explicit empty
--agents,--bin, and--agent-cmdflags with a usage error rather than silently ignoring them or falling back to auto-detection. -
List scheduled and available reviews across all target directories under
--listwhen multiple directories are configured via--dirs, and search all target trees for--show-prompt. -
Adapt agent lane column widths for narrower terminals (<90 cols) so metrics are not clipped off in the live dashboard.
-
Document the Escape reset shortcut (
esc:live) in the dashboard footer whenever the feed is paused at the live edge. -
Show
:changeinstead of:open/closefor arrow keys in the launcher footer when focused on the options pane. -
Prevent space and arrow keys from modifying inactive options (suggest agent when suggest is off, merge target when commits are off) in the launcher.
-
Explain that no agents are installed when viewing the agents pane hint with an empty agent pool.
-
Abort git rebase on pull conflicts to avoid leaving repositories in an uncleaned mid-rebase state.
-
Fall back to subsequent agents in the pool when command building fails for an agent candidate.
-
Preserve error context when resolving binary paths and checking baseline revisions during trailer stripping.
-
Strip trailing carriage returns in git status porcelain parsing, worktree cleanup, and UI block padding to prevent path corruption and rendering issues with CRLF line endings.
-
Expand tildes and environment variables in custom agent executable paths at launch, and reject unresolvable variables.
-
Validate that GAUNTLET_HOME and --prompt-dir name directories and --log names a file at startup.
-
Align documented
GIT_SSH_COMMANDdefault in.env.examplewith the runtime default (ssh). -
Reject mismatched placeholders across custom agent
model,effort,stream, andcontinueconfigurations. -
Do not count opt-in agents launchable only via bunx (
dsh) as usable auto-detectable CLIs in the doctor report, correctly reporting missing agents and exiting 1. -
Separate revision arguments and branch names with
--across git worktree operations, diff statistics, trailer stripping, and commit subject extraction to prevent option injection and file name collision ambiguity. -
Validate JSON key types when decoding custom agent definitions (
agents.json), returning an error on non-string keys instead of panicking on type assertion. -
Handle incomplete octal escape sequences without consuming invalid digits or malforming bytes in git filename unquoting (
unquoteC). -
Populate line metrics, review status, and subjects when recovering stacked PR layers.
-
Serialize stream sink and token usage callbacks during agent execution, retry interrupted lock note updates on EINTR, and synchronize watcher teardown during runner shutdown.
-
Normalize custom agent names and definition keys to NFC, rejecting duplicate keys across NFC and NFD spellings and aligning lookup forms.
-
Handle non-positive column budgets and 1-column cuts in terminal cell trimming, reserving width for the ellipsis and returning empty strings on non-positive bounds.
-
Use canonical review names when expanding review sets and displaying review prompts, preventing unnormalized names from reaching prompt composition.
-
Block the launcher (
gauntlet pick) from starting an unconstrained run when an active review filter matches no reviews, displaying a clear warning. -
Reject unresolvable environment variable references in
GAUNTLET_HOMEat startup and degradegauntlethome.Dirsafely instead of resolving unexpanded paths against the working tree. -
Reject empty argument strings in custom agent
model,effort,stream, andcontinueconfigurations, and reject whitespace-only usage suffixes. -
Normalize available review names to NFC in suggestion parsing, matching decomposed names against agent suggestions.
-
Normalize pull request body text to NFC before rune truncation, preserving combining characters on decomposed filenames and descriptions.
-
Recognize Unicode whitespace when stripping agent output noise, gutters, and trailing spacing in the line normalizer, and in launcher filter word trimming.
-
Distinguish complete Unicode replacement characters from incomplete multi-byte sequences at process output chunk boundaries.
-
Surface Escape cancel and live-feed reset keys in the dashboard footer and help overlay, and display active filter queries and clear shortcuts in the narrow launcher fallback.
-
Prevent Escape from abruptly terminating an active run when quit is armed in the dashboard; Escape now cancels the quit prompt and resets paused or scrolled feeds to live output.
-
Make git worktree removal idempotent on already-removed checkouts, and prune git metadata when the checkout directory has already been deleted.
-
Clean orphaned worktree directories and prune stale metadata during worktree preparation, ensuring worktree creation and removal converge across interrupted runs.
-
Strip UTF-8 byte-order marks (BOM) when loading custom agent definitions (
agents.json), preventing parse errors on Windows-formatted files. -
Pad clipped lines with trailing spaces in dashboard panel formatting when multi-column wide characters are truncated, preventing misaligned panel borders.
-
Count Unicode code points instead of bytes when checking for short-flag misses, preventing single non-ASCII flags from triggering typo suggestions.
-
Normalize file paths to NFC when correlating file notes to git changes in stacked PR summaries and commit subjects, matching decomposed macOS filenames with NFC text.
-
Strip relative build directory paths from release SBOM inventory headers to match asset filenames, and clean scratch files and stray binaries on make clean.
-
Prevent auto-update from repeatedly re-applying the already-installed release tag during an active run.
-
Unlock git worktrees before removal during merge cleanup, preventing leftover locked worktrees on failure.
-
Format branch listings cleanly when deleting matching review branches.
-
Derive journal date shards from the run ID timestamp instead of the local clock so midnight UTC crossings place journals in the matching shard, and validate run IDs on open.
-
Synchronize stacked PR head and publication state with the runner mutex, guard worktree branch renaming, and force-kill stalled command groups on drain timeout.
-
Check write errors on command output streams across subcommands (
gauntlet doctor,gauntlet runs,gauntlet show, andgauntlet pick), exiting 1 on failure instead of reporting success. -
Propagate cancellation exit code 130 when the interactive launcher or review planning is interrupted by context cancellation.
-
Record loop line changes in parallel worktree mode (
--jobs > 1) and preserve line metrics on pull request events in stacked-PR mode (--stacked-prs) across the journal, history, and dashboard. -
Correct documentation in CLI and runs reference for
--usage-cmdexecution directory, custom agent definition fields and validation rules, and missing--checkand--limitoption tables. -
Reject empty string arguments for
--show-prompt,--merge-into,--pr-base,--suggest-agent,--usage-cmd, and--excludeat startup instead of silently accepting them. -
Enforce placeholder validation on custom agent definitions (
modelrequires{model},effortrequires{effort}, and forbid{prompt}instreamorcontinue). -
Abort and reset in-progress merges cleanly even when interrupted by a cancelled context, preventing unmerged index state from persisting.
-
Preserve the underlying error on retry failure when removing git worktrees.
-
Include unmerged-path inspection error context when squashing conflicted branches.
-
Warn on snapshot worktree cleanup failures and guard against nil repository references.
-
Abort prompt discovery directory traversal early when context is cancelled.
-
Parse duration flags with 64-bit integer precision so values above 2^31-1
nanoseconds parse without overflow on 32-bit platforms. -
Format missing run start timestamps as
n/ainstead of0001-01-01in
gauntlet runs. -
Generated commit subjects clip at whole grapheme boundaries within the 72-rune
limit, preserving combining accents, flags, and emoji sequences. -
Filenames in generated commit subjects strip C1 controls, bidi overrides,
zero-width spaces, and Unicode line breaks, preventing terminal spoofing. -
Display text sanitization strips Unicode line and paragraph separators (U+2028
and U+2029), preserving line integrity in output feeds and summaries. -
Distinguish internal prompt read failures from bad review arguments in
--show-prompt, exiting 1 on I/O error instead of 2. -
Distinguish interactive launcher runtime errors from usage errors in
gauntlet pick, exiting 1 on TUI failure instead of 2. -
Exit 1 on directory lock acquisition errors other than existing locks instead
of reporting them as usage errors. -
Ensure flag-requested help is rendered to stdout when
flag.ErrHelpis returned
during parsing. -
Reject empty model specifications when a colon delimiter is provided in agent
specifications, and reject colons for tools that do not support models. -
Validate custom agent definitions to require exactly one
{prompt}placeholder
inargv, forbid{prompt}insidemodeloreffortoptions, and reject
empty directory entries inusage.roots. -
Expand leading
~and environment variables inGAUNTLET_HOME, and treat
whitespace-only values as unset. -
Recognize boolean false values (
false,no,off,0) inGAUNTLET_NO_ANIMATION,
CLICOLOR_FORCE, andFORCE_COLORinstead of treating them as truthy. -
Resolve the defined executable rather than the custom agent name when validating
and auto-detecting custom agents, allowing custom agents whose names differ from
their binary to run without "tool not found" errors. -
Correct the installed agent count in
gauntlet doctorso custom agent binaries,
override paths, and fallback launchers are counted accurately in the inventory. -
Preserve
--prompt-dirin the composed command line generated bygauntlet pick.