grit://cooking/changelog← what’s cooking
Saturday, October 24, 2026 · release v0.5.19

49 changes landed on main

27 roadmap steps across 5 items · 12 issue fixes · 10 other changes

v0.5.19 adds many options to blame, reflog, clone, config, worktree, stash, remote and resolve, and fixes Windows performance and several correctness bugs.

  • ›New --dry-run for bundle, gc subcommands, auth logout, rm, mv, worktree prune, reflog expire
  • ›Clone gains --bare, --no-checkout, --single-branch, --no-tags, -o, --blobs; promised objects fetch on demand
  • ›Blame adds -L ranges, -w, -C, positional rev, and JSON original_path with --group hunks
  • ›Windows scans use directory-entry metadata (#1612, #1622); switch no longer spawns worker pools by default (#1613)
  • ›Fixes: commit with conflict markers (#1617), push --delete of missing ref (#1616), nested .gitattributes CRLF (#1609), dangling empty tree on merge (#1614)
  • ›log --since stops at its date cutoff (#1611); tag create and pick/revert speedups; commit/tag JSON dates now RFC 3339 (#1615)
$ git log bddf92f8..v0.5.19159 commits on GitHub ↗300+ files +13,207 −1,990
Highlightsmeasured by the reviewers, before → after
grit log --since walks all history: 12-31x slower than git on git/git and cargo (1.0-1.7s vs 30-130ms)
slowdown versus system Git on same fixture61× better████████████████████████ 546.5 x █ 9 x
grit blame credits ~30% of lines of builtin/add.c differently from git; 180 lines blamed on merge commits
builtin/add.c lines attributed to merge commits20× better████████████████████████ 180 lines out of 699 █ 9 lines out of 699
Benchmark scenarios for the new common paths
diff stat smoke wall: system git → grit14× better████████████████████████ 161.4 ms ██ 11.5 ms
blame JSON: original_path and grouped hunks
500-line/5-commit JSON size: default to grouped7.0× better████████████████████████ 72,989 bytes ███ 10,406 bytes
Speed: tag/create@many-refs
tag/list daily (system git about 3.29 ms)2.5× better████████████████████████ 38.3 ms median ██████████ 15.3 ms median
roadmap · Consistency audit, docs and the JSON contract6 steps
  • ›--dry-run for bundle, gc subcommands and auth logout

    Adds non-mutating plans for bundle creation and unbundling, exposes dry-run behavior across every GC maintenance subcommand, and previews auth logout without erasing a credential. Human, JSON, and Markdown output plus schemas, docs, public API coverage, and compatibility tests are updated together.

    bundle/create@synth-10k median wall time: 963.7 ms → 888.1 ms (9% better)bundle/create@synth-10k peak RSS: 229,875,712 bytes → 219,701,248 bytes (5% better)system git benchmark control: 268.2 ms → 267.4 ms (0% better)
  • ›Docs contract: exit status on every page, JSON examples validated7ed84866

    This change gives every command page an explicit exit-status contract and validates documented JSON examples against the committed command schemas. It also enforces real Markdown examples and preserves schema-selecting flags while mapping documented command lines to schemas.

  • ›Benchmark scenarios for the new common paths9c2fd260

    Adds six daily common-path benchmark rows covering diff stats, log stats, JSON filtering, notes listing, and shallow clone over file and HTTP. The benchmark harness records dist-profile wall time and peak RSS and now rejects semantically wrong output, including full clones masquerading as shallow clones.

    shallow HTTP smoke wall: system git → grit: 39.3 ms → 38.8 ms (1% better)shallow file smoke wall: system git → grit: 23.5 ms → 29.8 ms (21% worse)diff stat smoke wall: system git → grit: 161.4 ms → 11.5 ms (14× better)
  • ›One message input group: -m, -F/--message-file, --authore3895987

    This change gives commit, merge, pick, revert, annotated tag, notes add, and history message edits one `-m`/`-F` input contract, with shared author parsing where supported. Message cleanup is centralized in grit-lib, while file/stdin reading remains in the CLI, and round 2 restores the positional commit-message conflict that had silently discarded `-m`.

  • ›Shared pathspec group on diff, show, log and revs; drop the log --before cursor1f9f6ff0

    Diff, show, log, and revs now share the trailing pathspec argument group, including file and NUL-delimited inputs. The old log cursor interpretation through --before is gone, while bare-repository and range-diff routing regressions from earlier rounds are fixed.

  • ›Rewrite `grit skill` with recipes that run in CI7b7be002

    Rewrites the embedded `grit skill` guidance around five copyable, CI-executed workflows and validates every documented command and flag against clap. The round-2 safety fix makes stale force-with-lease recovery reconcile the newly fetched upstream before retrying and teaches rebase planning to fast-forward a branch that is strictly behind upstream.

roadmap · Inspection extras: blame, reflog, shortlog, resolve9 steps
  • ›reflog filters: -n, --since/--until, --grep and an action fieldfb66178d

    Adds typed reflog querying by count, entry timestamp, and message, plus best-effort action extraction and additive JSON metadata. Round 2 fixes zero-count behavior, JSON schema/API snapshots, malformed-line numbering, and removes parsed full-entry materialization, but the loose-file path still allocates the entire reflog.

    10k reflog median wall time: system Git vs branch grit: 3.4 ms → 4.8 ms (29% worse)10k reflog peak RSS: system Git vs branch grit: 12,660 KiB → 13,692 KiB (8% worse)1M reflog median wall time: system Git vs branch grit: 245.7 ms → 351.7 ms (30% worse)1M reflog peak RSS: system Git vs branch grit: 184,784 KiB → 164,548 KiB (12% better)
  • ›resolve --abbrev-ref and --symbolic-full-namecd82f97e

    Adds ref-name resolution as a public library capability and exposes it through modern resolve output modes. Human output can print either the shortest unambiguous or full symbolic ref, while JSON consistently carries short, full, and selected display forms.

    resolve HEAD median (origin/main to branch): 2.4 ms → 2.4 ms (1% worse)branch resolve HEAD to --abbrev-ref median: 2.4 ms → 2.1 ms (11% better)--abbrev-ref median, system Git to Grit: 0.834 ms → 2.1 ms (61% worse)
  • ›blame JSON: original_path and grouped hunksf3d59277

    Blame results now retain each line’s path in its originating commit and can group adjacent attributions into Git-compatible hunks. JSON callers can opt into compact `hunks[]` output with `--group`, while default JSON and human/Markdown presentation remain line-oriented.

    500-line/5-commit JSON size: default to grouped: 72,989 bytes → 10,406 bytes (7.0× better)10,000 one-line hunks wall time: system git porcelain to branch grit grouped (debug): 0.006 seconds median of 5 → 0.132 seconds median of 5 (95% worse)
  • ›reflog list and expire --dry-runc92417be

    Adds bounded reflog discovery and non-mutating expiry previews to the modern CLI while exposing typed per-ref expiry results from grit-lib. The round-three fixes keep documented result ordering deterministic and refresh the generated grit skill snapshot.

  • ›blame: -L start,+N / /regex/ / :funcname and positional [rev] -- file

    Adds a public library parser/resolver for Git-style blame line ranges, including numeric, relative, BRE, and function-name forms, and resolves them once against the starting blob. The CLI gains an optional positional revision with explicit `--` disambiguation while remaining a thin caller of grit-lib.

  • ›resolve --verify and --quieteb075f16

    Adds strict single-object verification to the library and exposes it through `grit resolve --verify`, with output-free `--quiet` yes/no behavior. It also completes ref-name resolution modes, including detached/unborn HEAD and ambiguous-name handling, with compatibility tests, docs, schemas, snapshots, and benchmark matrix coverage.

  • ›shortlog -n, --behind, --stat/--name-onlyeb075f16

    Adds bounded ahead/behind commit comparison to grit-lib and exposes shortlog limits, behind listings, stats, and changed-file output through the modern CLI. The follow-up fix restores human log stats and shares Markdown per-commit diff rendering across log and shortlog; round three cleanly rewrites the feature commit message identity without changing the verified behavior.

  • ›blame: -w ignore whitespacea784d385

    Blame can now ignore all Git whitespace through the public `BlameOptions` API and `grit blame -w/--ignore-all-space`. Attribution compares normalized line keys but retains original text for output and indentation scoring, including whitespace-aware change compaction across Myers, patience, and histogram algorithms.

    Default blame median, 30 interleaved dist runs: 114.8 ms → 114.9 ms (0% worse)Ignore-all-space median: system Git vs branch grit, 15 dist runs: 69.7 ms → 199.1 ms (65% worse)
  • ›blame: -C copy detectionc87398b1

    Adds typed blame copy-detection levels to the linkable library and exposes repeatable `-C` in the modern CLI. Attribution now matches Git for modified-file copies, creation-time copies, older-source copies, and original paths across one- and two-hop renames.

    blame-deep-2000 median, copy detection off: 27.0 ms → 26.7 ms (1% better)blame-large-tail-full median, copy detection off: 39.5 ms → 40.6 ms (3% worse)blame-large-tail-range median, copy detection off: 7.6 ms → 7.8 ms (2% worse)single -C median, system Git vs reviewed grit: 1.8 ms → 4.0 ms (54% worse)
roadmap · Workspace extras: stash, worktree, reset, rm, mv, clean, config, init5 steps
  • ›worktree add -B / --lock [--reason] / --no-checkout / --track, prune --dry-run02c6d349

    Adds typed linked-worktree branch selection and exposes force-reset, early locking with reasons, no-checkout, remote tracking, and prune dry-run through the library-first API and thin CLI. The round-two fixes resolve existing branches from their own tip, validate checkout exclusivity before ref writes, roll back later branch mutations on failure, and make implicit-HEAD tracking non-fatal.

    worktree/add@synth-10k median wall time (mean of two 12-run medians): 139.1 ms → 143.3 ms (3% worse)worktree/add@synth-10k peak RSS (mean of two runs): 36,620,288 bytes → 36,513,792 bytes (0% better)system git control median wall time during paired runs: 125.4 ms → 124.7 ms (1% better)
  • ›stash show --stat / -u, stash branch, stash clear --force29bf8518

    Adds a complete modern stash inspection/branch/clear surface backed by grit-lib: optional untracked-file display, branch creation from a stash base with index restoration, and force-gated clearing. Round-2 corrections close the no-reflog deletion edge case and a subtle Git parity gap where an untracked parent path overlaps the base tree, while synchronizing schemas and generated skill output.

  • ›Daily benchmark rows for the new workspace paths0c9e1265

    Adds eight daily benchmark comparisons for common workspace operations and makes the executable daily matrix discoverable with `grit-bench daily --list`. It also corrects reset/keep’s fixture so the timed operation preserves a real unrelated tracked edit, and records the smoke baseline in the docs benchmark inventory.

    clean/only-ignored wall (RSS 2.03x): 2.2 ms (Git → Grit) → 4.4 ms (Git → Grit) (50% worse)config/get-origin wall (RSS 2.26x): 2.2 ms (Git → Grit) → 3.3 ms (Git → Grit) (32% worse)init/branch wall (RSS 2.18x): 2.2 ms (Git → Grit) → 6.5 ms (Git → Grit) (66% worse)reset/keep wall (RSS 2.52x): 4.4 ms (Git → Grit) → 5.5 ms (Git → Grit) (20% worse)
  • ›config --system/--worktree/--all/--add/--unset-all/--type/--default/--list <prefix>/sections051bdb5d

    Adds advanced, scoped configuration operations to grit-lib and exposes them through the thin `grit config` command: system/worktree scopes, typed values, multi-value actions, section operations, prefix listing, defaults, and dry-run previews. Round-3 fixes align worktree reads with Git's extension gate and reject inapplicable CLI flag combinations instead of silently ignoring them.

  • ›worktree move and repair4ea5826c

    Adds linked-worktree move and repair to grit-lib, thin CLI commands with human/JSON/Markdown output, schemas, docs, and system-Git compatibility coverage. Follow-up commits fix destination handling and preserve symlinks during Unix cross-device copy, but the attempted Windows directory-link fix still selects the wrong symlink API.

roadmap · Clone and remote management6 steps
  • ›clone --single-branch, --no-tags, -o/--origin1af6874d

    Adds deliberate clone controls for branch scope, tag handling, and custom remote names across grit-lib and the thin CLI. Round 3 synchronizes the generated skill snapshot with the already-reviewed command documentation, resolving the previous review failure.

  • ›On-demand fetch of promised objectse3895987

    Adds repository-scoped, on-demand retrieval of objects promised by partial clones and batches missing checkout blobs into one fetch. The CLI installs the default fetcher so diff, show, switch, restore, and clone checkout transparently work in blobless repositories, while ordinary repositories retain their inline ODB read fast path.

    loose_object_read Criterion median estimate: 31.9 ns/op → 30.5 ns/op (5% better)
  • ›grit remote rename47ac5891

    Adds a library-first remote rename operation that moves remote-tracking refs in one transaction, preserves reflogs and symrefs, then updates local configuration. Exposes it through `grit remote rename` with human, JSON, and Markdown output, compatibility coverage, schemas/docs, and a many-ref benchmark scenario.

  • ›clone --bare and --no-checkout; library owns checkout6915678e

    Clone now supports bare repositories and fetch-without-checkout while making grit-lib responsible for normal worktree population and checkout statistics. The round-3 fixes preserve typed hostile-path rejection at the new clone boundary and ensure checkout obeys the caller's thread policy.

  • ›remote prune --dry-run, set-head --auto, add --fetch07bc5286

    Adds modern remote maintenance operations: prune stale tracking refs with dry-run, manage a remote HEAD automatically/by branch/by deletion, and optionally fetch when adding a remote. The round-three update refreshes generated skill output after prior fixes aligned negative refspec pruning, dangling HEAD deletion, and set-head usage reporting with expected behavior.

  • ›grit clone --blobs none|<size>

    Adds `grit clone --blobs none|SIZE` as a Git-compatible promisor partial clone with stable JSON fields and distinct human wording for blobless versus size-limited clones. It also adds system-git round trips, documentation, and a daily git.git comparison whose correctness and timing path now uses the intended sidecar destination.

    blobless clone median wall time (system git control vs branch grit): 9,080 ms → 8,959 ms (1% better)manual blobless clone wall time (system git control vs branch grit): 8,734 ms → 8,809 ms (1% worse)post-clone pack bytes (system git control vs branch grit): 108,023,786 bytes → 108,023,773 bytes (0% better)
roadmap · Performance census: every command, every repo shape, time and memory1 step
  • ›Docs site: performance overview page from the daily baseline16dfb37f

    Adds a generated performance overview to the documentation site, backed by committed daily benchmark reports and the command-area matrix. The stacked benchmark work captures and compares stable daily time/RSS rows, while the round-3 fix refreshes the two stale CLI snapshots and cleans commit metadata.

issues fixed12
  • ›Windows main: grit status 4.4-5.4x, commit ~4.7x, add -A 1.9x slower than git on git/git and cargo (#1518 not fixed)#16123ba62237

    This changes the Windows tracked-file scan to consume metadata already returned by directory enumeration instead of opening every listed path again. A fallback path stat remains for names absent from the listing, directory-entry errors, and directory-stat/index disagreement.

  • ›grit blame credits ~30% of lines of builtin/add.c differently from git; 180 lines blamed on merge commits#1610ee845dc8

    Blame now respects Git's compacted diff boundaries for ambiguous equal-text moves instead of relocating inserted lines deep into history. The review follow-up preserves the existing `-CCC` copy-source path by attempting copy attribution before the new xdiff hard stop.

    builtin/add.c attribution mismatches vs system git: 210 lines out of 699 → 24 lines out of 699 (8.8× better)builtin/add.c lines attributed to merge commits: 180 lines out of 699 → 9 lines out of 699 (20× better)
  • ›clone/switch checkout ignores .gitattributes in subdirectories: binary files get CRLF (core.autocrlf=true), status dirty#1609a2e9c82f

    This change makes checkout find nested `.gitattributes` entries using Git's slash-separated index paths, preventing binary files from being CRLF-smudged under `core.autocrlf=true`. It also preserves the checkout fast path when attributes do not change and adds clone-populate, bulk, and switch compatibility coverage.

    checkout_between_trees/L_0.01 Criterion mean: 3.7 ms/iteration → 3.7 ms/iteration (1% better)
  • ›grit merge of diverged branches leaves a dangling empty tree (4b825dc) in the object store#1614bdc9273f

    This change stops merge and replay machinery from writing an empty tree merely to obtain its object ID. It makes the virtual empty-tree object readable for both SHA-1 and SHA-256 repositories, preserving clean object stores while retaining normal materialization when an empty tree is actually persisted.

    hash algorithms exercised by issue regression: 1 algorithms → 2 algorithms (2.0× better)
  • ›grit push --delete of a nonexistent remote ref exits 0 with 'already up to date'#161660850453

    Absent remote delete targets now become a typed library rejection rather than an up-to-date success. The CLI renders that rejection in all output modes, exits 1, and short names resolve to a surviving local tag when the remote tag is already gone.

    missing-delete debug CLI median latency: 7.6 ms over 100 interleaved runs → 8.2 ms over 100 interleaved runs (7% worse)
  • ›grit log --since walks all history: 12-31x slower than git on git/git and cargo (1.0-1.7s vs 30-130ms)#1611ed82a839

    Routes simple log walks with limits through the resumable bounded walker so a recent `--since` window stops at its date frontier instead of scanning all reachable history. The follow-up preserves one-shot `-n` JSON semantics and prevents a continuation cursor when every pending commit is below the since cutoff.

    20k-commit recent --since log mean: 1,005 ms → 16.5 ms (61× better)slowdown versus system Git on same fixture: 546.5 x → 9 x (61× better)
  • ›Windows: error messages print \\?\ verbatim paths (branch -d current branch, not a git repository)#16185f65e430

    User-facing repository and checked-out-branch errors now strip Windows extended-length path prefixes and render slash-normalized paths. Deleting HEAD's branch gets a dedicated typed error and clearer wording instead of pretending the branch is checked out in another worktree.

  • ›v0.5.18 Windows: 49k-file deep tree, 100 files touched: diff 3.1-4.8x, add 3.1x, commit 2.4x slower than git#1622363a4268

    Windows directory-grouped worktree scans use metadata from the matched directory entry first, avoiding an unconditional second path stat for every indexed file. A gated 49,152-file nested fixture covers clean staging, 100-file diff, and no-op add probe budgets.

  • ›--json dates inconsistent: commit uses "<epoch> +0000", tag list uses epoch int, log/show use RFC 3339#161516eab2a9

    This standardizes identity dates emitted by commit and tag-list JSON on the same RFC 3339 Person shape already used by log and show. Tag JSON advances to v2 while preserving frozen v1, and documentation, schemas, skill snapshots, and regression coverage move together.

    Committed schema documents: 101 files → 102 files (1% better)Current tag JSON schema version: 1 version → 2 version (2.0× better)
  • ›Windows main: grit switch tag<->master on git/git takes 0.9-18s, highly erratic (git: 1.5s steady); #1193 not fixed#16133fab5a65

    This change stops Windows switch/checkout from creating worker pools unless `checkout.workers` is explicitly configured, while preserving Git-compatible explicit zero as automatic CPU selection. It also restores the normal checkout threshold and carries small post-rebase fixes needed for the current main test expectations.

  • ›grit commit (default auto-stage) records unresolved conflict markers as a merge commit, exit 0#16178ce4d16a

    This change prevents default auto-stage commits from collapsing unmerged index entries while parseable conflict markers remain. The round-3 update restricts marker-byte reads to regular files so symlink and gitlink resolutions continue through their existing staging paths.

  • ›Follow-up: Fix #1617: grit commit (default auto-stage) records unresolved conflict markers as a merge commit, exit 0#1617

    Unresolved merge markers can no longer be silently staged by explicit `grit add`, falsely advertised by `--dry-run`, or collapsed by commit auto-staging. Marker detection respects each path’s `conflict-marker-size` attribute and leaves symlink/gitlink handling unchanged.

other changes10
  • ›Main keeper: make CI on main green (test, test-threaded, scripts)84c3e6b0

    Restores CI bookkeeping and CLI wiring after remote-remove and list-limit work landed incompletely. It indexes the remote-remove schema/snapshot, registers canonical modules and the missing benchmark scenario count, and makes hooks/notes limits parse and dispatch correctly at both accepted command positions.

  • ›Follow-up: config --local / -f, get with scope and origin, missing key = nullcb0659ee

    Adds scoped config locations and origin metadata to grit-lib, exposes them through grit config --local/-f and structured outputs, and returns a JSON null with exit 1 for missing keys. The follow-up hot path preserves existing human performance, honors GIT_DIR for get/set/unset, propagates the shared process environment, and rejects invalid --unset key value invocations before mutation.

    Default human config get: exact origin/main to branch: 2.3 ms median-of-five batch medians → 2.0 ms median-of-five batch medians (13% better)Default human config set: exact origin/main to branch: 3.3 ms median-of-five batch medians → 3.2 ms median-of-five batch medians (6% better)Config get: system Git to branch reference: 1.1 ms median-of-five batch medians → 2.0 ms median-of-five batch medians (47% worse)Config set: system Git to branch reference: 1.2 ms median-of-five batch medians → 3.2 ms median-of-five batch medians (61% worse)
  • ›Follow-up: reflog filters: -n, --since/--until, --grep and an action fieldc270353c

    Adds bounded, filterable reflog queries to grit-lib and exposes them through the modern grit reflog command, including stable action metadata and truncation reporting. The follow-up fixes ensure malformed records do not shift Git-compatible selectors, zero-entry limits do no work, and omitted actions stay omitted in both JSON and schema.

    Bounded 10k-entry reflog median wall time: system Git baseline vs branch grit: 4.3 ms → 3.3 ms (31% better)Bounded 10k-entry reflog peak RSS: system Git baseline vs branch grit: 9,175,040 bytes → 10,809,344 bytes (15% worse)
  • ›Follow-up: rm --dry-run / --ignore-unmatch, mv --dry-run with moves[], clean filterse16150aa

    Adds safe, previewable path removal and movement plus scoped cleaning while closing the remaining rollback data-loss edge case. Forced multi-source move rollback now keeps moved destination content whenever a reverse directory rename fails, and clean respects nested excludes before deleting collapsed directories.

  • ›Quality #25: Move logic into grit-liba754ccca

    Revert commit selection now lives behind a documented grit-lib API instead of being implemented inside the CLI. The change also deletes two orphaned revert helpers and adds public-API compatibility tests against system Git for range spellings, ordering, and invalid commit specs.

    revert-single-1000 paired median: 20.0 ms → 20.5 ms (2% worse)revert-mainline-1000 paired median: 20.0 ms → 20.3 ms (1% worse)revert-single grit/system-git ratio: 0.555 ratio → 0.550 ratio (1% better)revert-mainline grit/system-git ratio: 0.540 ratio → 0.533 ratio (1% better)
  • ›Follow-up: Hunk selection by id and `grit add --hunks`aa77a729

    Adds stable hunk ids and selective `grit add --hunks`/`--lines` staging through a library-first diff/apply path, with JSON output, docs, compatibility tests, and a registered large-file benchmark. At the reviewed tip, the feature still mis-stages tracked empty files as deletions and does not meet its required performance, test, or clippy gates.

    add/hunks@large-file median wall: system git vs branch grit: 13.1 ms → 46.0 ms (71% worse)add/hunks@large-file peak RSS: system git vs branch grit: 10,502,144 bytes → 41,857,024 bytes (75% worse)
  • ›Follow-up: worktree move and repair4c0cf9d9

    Adds linked-worktree move and repair APIs and exposes them through the modern worktree CLI, including dry-run and structured outputs. Follow-up commits preserve symlinks during cross-device copies, locate manually moved worktrees, and keep each registered admin directory authoritative during no-path repair.

  • ›Follow-up: Docs site: performance overview page from the daily baselined551d910

    Adds a generated performance-overview page backed by the committed daily census, grouped against MATRIX.md with time and peak-memory ratios. It also dispatches benchmark JSON by schema so daily reports never enter the legacy hyperfine parser, including daily-common-paths.json, daily-workspace-extras.json, and daily/latest.json.

  • ›Speed: tag/create@many-refs52b44d0a

    This change removes repeated packed-ref indexing, redundant tag-object reads, and zero-filled inflate buffers from tag operations. It also fixes listed tags so only commit targets populate the documented peeled-commit field, while preserving Git-compatible packed/loose ref behavior.

    tag/create direct paired (120 runs; daily system git 2.219 ms): 3.2 ms median → 3.1 ms median (4% better)tag/create daily (system git 2.219 ms): 4.3 ms median → 4.4 ms median (0% worse)tag/create peak RSS: 14.5 MiB → 15.0 MiB (3% worse)tag/list daily (system git about 3.29 ms): 38.3 ms median → 15.3 ms median (2.5× better)
  • ›Perf regression 2026-10-23: pick/one@synth-100kfaa7e89d

    Pick and revert now retain the parsed index cache-tree and pass the cleanliness-check snapshot directly into replay. This avoids a second index parse and prevents the staged-change check from flattening a 100k-entry HEAD tree, while preserving Git-compatible TREE/UNTR/FSMN extensions on the resulting index.

    pick/one@synth-100k median: 224.3 ms → 151.8 ms (48% better)pick/one@synth-100k peak RSS: 63.8 MiB → 47.6 MiB (34% better)pick/one@synth-100k grit/git ratio: 1.2 ratio → 0.823 ratio (49% better)pick/one@synth-10k median: 63.7 ms → 59.1 ms (8% better)
$ git log --oneline bddf92f8..v0.5.19compare on GitHub ↗
faa7e89dMerge branch 'factory/pick-keep-cache-tree'
52b44d0aMerge branch 'factory/tag-create-many-refs'
28169bebbench: refresh many-ref tag results on current main
1095394btag: select listing detail by output contract
3f9b6544bench: record tag and branch daily rows on many-refs before and after
09313ac3tag: create tags through the repository's ref store
ce9e9552tag: classify listed tags from packed-refs peel lines
c4f73b0crefs: answer in-order packed peel lookups without a binary search
4722de8cfix(daily): clone blobless verify and bench into clone_dest sidecar
47c91ae9fix(clone): align --blobs JSON schema, reject overflow, fix blobless bench
9054f4c1feat(clone): add --blobs for partial clone
d551d910Merge branch 'factory/po-3767-daily-detect'
a449bd21Merge branch 'factory/fix-add-conflict-markers-3752'
10e3e884bench: refresh hot-path baseline after the pick cache-tree fix
989d04c5pick: test that the cleanliness snapshot keeps the cache-tree
28ba5878pick: keep the cache-tree and load the index once
64303fb3Merge pull request #1643 from gitbutlerapp/factory/ahead-behind-paint
f1e2975bfix: unbreak main CI (rustdoc links, canonical-modules key, site check)
42fff966fix(site): skip grit-daily-bench/1 baselines by schema in loadBundle
e916a3f1fix: honor conflict-marker-size attribute in marker detection
25d4bbc9fix: refuse explicit add and auto-stage while conflict markers remain
c0a1dd19Merge branch 'release-tagger'
fb149bccperf(revwalk): two-sided paint for ahead/behind and hidden-commit checks
c87398b1Merge branch 'factory/blame-copy-c-bd57'
16dfb37fMerge branch 'factory/po-2361-main'
0d015fa4docs: daily performance overview from committed census baseline
b732ea50Merge branch 'release-tag-tree-sha256'
8f4f34d7fix(blame): preserve original_path across multi-hop exact renames
4fcdf01bfix(blame): address -C copy detection review feedback
1e24f837feat(blame): add -C copy detection in library and CLI
4c0cf9d9fix(worktree): keep registration admin authoritative on repair
8c8160d8fix(worktree): repair moved trees and copy junctions
f912eff2fix(worktree): use is_symlink_dir for Windows copy
aa77a729feat(add): grit add --hunks staging with fair bench arms
07bc5286Update grit skill output snapshot for remote commands
ef4d5732Fix remote prune negative refspecs and set-head delete
5b31be03Add remote prune, set-head, and add --fetch
a754cccaMove revert commit selection into grit-lib
7b7be002Fix lease-retry recipe and rebase fast-forward when behind upstream
f4cde565Rewrite grit skill with CI recipes and flag contract tests
8ce4d16aMerge branch 'factory/fix-commit-conflict-markers-3710'
ab07d129fix: refuse auto-stage commit while conflict markers remain
3fab5a65Fix post-rebase test regressions from origin/main
f0c269c3Align checkout.workers policy with maintainer contract
a827fc60Address review: preserve checkout.workers auto on Windows
62feffe9Fixes #1613: serial Windows switch checkout and Git parallel threshold
4ea5826cfix(worktree): preserve Windows directory symlink kind on copy
1456e7e6fix(worktree): preserve symlinks on cross-device move
f7ddf217feat(worktree): add move and repair for linked worktrees
16eab2a9Fix #1615: standardize --json identity dates as RFC 3339
363a4268Merge branch 'factory/fix-1622-windows-deep-tree-stat'
5f65e430Update public-api snapshot for path and branch error API
d5c7a795Fix Windows verbatim paths in repository and branch errors
ed82a839Fix one-shot log -n JSON contract and since false truncation
c11b960bFixes #1611: stop date-cutoff log walks at --since
1f9f6ff0fix(cli): use ErrorKind::Usage for log --before cursor rejection
81a7cd9ffix(cli): canonical grit_lib pathspec imports; range from-file test
f6cf23b8fix(diff): read --pathspec-from-file=- once for worktree diffs
d83ef45dfix(cli): bare-aware pathspec tokens for log, diff, and show
789a2aecchore: map grit_lib::ident in canonical-modules.toml
257806a6docs: index remote.set-url JSON schema after main rebase
005ee8c4cli: shared TrailingPathspecArgs on log, revs, diff, show; drop log --before cursor
60850453Fixes #1616: reject push --delete when remote ref is missing
6915678eMerge branch 'factory/clone-bare-no-checkout'
5c14ee1aclone: add --bare and --no-checkout; library owns checkout
bdc9273fMerge branch 'factory/issue-1614-empty-tree'
a2e9c82fMerge branch 'factory/nested-gitattributes-autocrlf-29bb'
7855505fFix SHA-256 virtual empty-tree reads for merge sentinels
0ab3ee6eFixes #1614: avoid writing dangling empty tree on merge
ee845dc8Merge branch 'factory/blame-alignment-3681'
f5536f87Fixes #1622: prefer DirEntry stat on Windows worktree scans
2f6a682dRestore checkout attribute fast path after review
4e559035Fix nested .gitattributes on checkout with core.autocrlf
051bdb5dfeat: extend grit config and grit-lib configuration API
a784d385Merge branch 'factory/blame-ignore-whitespace-w'
a24968a3blame: refresh skill snapshot and test non-Myers -w
0c9e1265Merge branch 'factory/daily-workspace-extras-db7a'
b6a6c05dblame: use whitespace-aware change compaction with -w
4b1e0417blame: ignore whitespace with -w and BlameOptions.whitespace
47ac5891fix: regenerate remote schemas after rebase onto main
08689ed4fix: require local remote section; schema index and rename snapshot
2b2872fafix: remote rename review — config cascade, schemas, bench prepare
6c334530feat: grit remote rename with batched ref transaction
83a6bb18Address daily review: --list and reset-keep prepare
4ff79075Register daily workspace benchmark rows and baseline capture
b73d751cRun copy detection before xdiff-None blame stop
7b127819Fixes #1610: align blame with git on ambiguous hunks and moved lines
3ba62237Merge branch 'factory/win-status-scan-perf'
eb075f16Merge branch 'factory/shortlog-flags-3539'
8ca8e3aaAdd resolve --verify and --quiet with strict verify_object
c30f7fc2Fixes #1612: prefer DirEntry metadata on Windows worktree scan
453797a1fix: restore human log --stat and shortlog markdown diffs
4c695439shortlog: -n, --behind, --stat and --name-only
e3895987Merge branch 'factory/message-input-3507'
b23b3179Merge branch 'factory/promisor-on-demand-fetch-9510'
d0b32100Unify -m/-F/--message-file and --author across mutating commands
93685695fix(blame): address -L review (BRE, funcname, CLI, layout)
c346b8ecfeat(blame): parse Git -L ranges in grit-lib and extend CLI
c92417befix: wire reflog.list contract, snapshots, and doc examples
8bc3f517Restore inline Odb::read fast path for loose hits
9d5832caFix promisor lazy fetch per review
7a54bf6bAdd on-demand promisor object fetch for partial clones
881207b1chore: refresh public-api snapshot after rebase
060abbe5chore: sync remote JSON schemas after rebase onto v0.5.18
02db3f25test: refresh grit skill snapshot for reflog docs
57d56ef2fix: regenerate reflog.list schema and sort expire refs
0936fa7dreflog: add list subcommand and expire dry-run
29bf8518fix: drop hooks and notes.list CLI contract exceptions after rebase
4887dadefix: map stash branch and clear doc JSON examples to schemas
23673e1dfix: drop CLI contract exceptions fixed on main
9cc8c1c5fix: dedupe remote CLI contracts and drop stale reset exception
f06342e6fix: align schema backward-compat count with indexed schemas
ca8185d6chore: register remote snapshots and drop stale CLI contract exceptions
2cd0a86dchore: sync remote schemas, contracts, and output snapshots after rebase
9784bb7afmt: apply rustfmt after rebase onto main
11fff895Fix review: clear ref without reflog, stash show -u parity, skill snapshot
4859db22stash: show -u, branch, and clear --force
f3d59277fix(clippy): allow blame run arity after ignore-rev flags
d2c3195dfix: grouped blame JSON with line ranges and schema
969c2d5ctest: refresh blame JSON output snapshots for original_path
24e45341blame: original_path in JSON and grouped hunks via --group
1af6874dfix(clone): publish JSON schema v2 and refresh clone snapshots
afc50f9etest: refresh grit skill snapshot for clone flags
1ba5dfeefix(clone): validate remote name after dest guard
32832046feat(clone): single-branch, no-tags, and custom origin
cd82f97eAlign resolve schema, strict git parity, and JSON ref fields
853180daFix reftable cache, ref-name JSON, ambiguous and unborn HEAD
cf4cf41eUse git-init reftable fixture for resolve ref compat test
2f7ba09dAddress review: symref peel, config bool, snapshots
28a86fedAdd resolve --abbrev-ref and --symbolic-full-name
02c6d349worktree: fix Existing start resolution and branch rollback on failed add
2b86f815worktree: add -B, lock, no-checkout, track, and prune dry-run
fb66178dFix rebase fallout: restore main tree, keep reflog filters only
e16150aaFix review: directory rollback backups, clean excludes, snapshots
9999a3a9Add rm/mv dry-run options and fix forced multi-source mv rollback
9c2fd260Merge branch 'factory/bench-common-paths-3516'
c270353cMerge branch 'factory/reflog-filters'
cb0659eeMerge branch 'factory/config-perf-3611'
84c3e6b0Fix auth logout render snapshot after LogoutOutcome gained dry-run fields
bc951d1cComplete remote.show schema coverage after rebase onto v0.5.18
064550berustfmt: hooks list limit dispatch
90be9fe2Fix hooks/notes list limit wiring and stale CLI contract exceptions
ab6f5890Fix CI: remote.remove schema index, ident canonical map, and CLI contract gaps
7ed84866Merge branch 'factory/docs-exit-json-contract-3514'
13e2522bdocs: exit status on command pages and validated JSON examples
85e5061atest(grit-cli): enforce doc contract for exit status and JSON schemas
4a11e97afix: align reflog action JSON schema with omitted optional field
ab984edefix: skip unparseable loose reflog lines when assigning indices
8eafef26Reflog query: chunked EOF read, no full-file DWIM count
9ebe61d6Address reflog review: bounded query, limit zero, schema and public API
e5517b48Add reflog query filters (-n, dates, grep) and action field
676d0532Address review: regenerate public-api snapshot and dry-run UX
f859df52config: reject --unset with a trailing value on hot path
ca7b802bconfig: honor GIT_DIR on human set/get/unset hot path
ccb27e3dconfig: restore default in-repo hot path performance
0309a3ecconfig: scoped locations, get origin, and config v2 JSON (base from factory/config-local-3525)
701e647cAddress review: shallow verify, output equivalence, dist baseline
e1bc453dAdd daily benchmark scenarios for roadmap-2 common paths
a2f5f444Add --dry-run for bundle, gc subcommands, and auth logout