grit://cooking/changelog← what’s cooking
Tuesday, October 20, 2026 · release v0.5.15

59 changes landed on main

26 roadmap steps across 4 items · 13 issue fixes · 20 other changes

v0.5.15 speeds up status, diff, commit, blame, merge and clone, fixes several path and config bugs, and adds many new grit diff options.

  • ›Fixed macOS subdirectory paths (#1217), repo-relative log/blame paths (#1218), and unknown-revision diff (#1216)
  • ›Faster status/diff/commit on large trees (Windows 50k files, #1230, #1231); stale untracked-cache fix (#1227)
  • ›Faster blame (#1219), merge/pick/revert, HTTPS clone on macOS (#1228); less memory staging and scanning
  • ›grit diff: compact JSON, new -w/-b, -M, --diff-algorithm, --diff-filter, --no-index, --patch-text, --quiet/--exit-code
  • ›Fixed diff --markdown mode/rename output (#1229), worktree remove on Windows (#1232), gitconfig escaped quotes (#1255)
  • ›Pack .idx, commit-graph and MIDX are now memory-mapped; packed-refs single-ref lookup; log/revs share revision selection with --cursor
$ git log 6c302b19..v0.5.15183 commits on GitHub ↗300+ files +13,855 −3,169
Highlightsmeasured by the reviewers, before → after
Follow-up: Library: one DiffOptions type and one line engine
Seeded U0 oracle wall time159× better████████████████████████ 1,721 seconds; before is a measured lower bound because the old subprocess-heavy oracle was stopped █ 10.8 seconds; before is a measured lower bound because the old subprocess-heavy oracle was stopped
Dashboard benchmarks
Paired diff Git-control drift57× better████████████████████████ 416.6 percent █ 7.4 percent
Core repo shapes: small, synth-10k, synth-100k, git-git
Synth100k smoke parent directories33× better████████████████████████ 1,671 directories █ 50 directories
Fair log benchmark: one grit log process
Grit log workload median20× better████████████████████████ 185.3 ms █ 9.3 ms
Merge engine: walk each tree once with a parsed-tree cache
merge-only speedup18× better█ 1 x ████████████████████████ 18.2 x
roadmap · Performance census: every command, every repo shape, time and memory8 steps
  • ›Daily report schema and scenario registry types45c888a2

    Adds typed Rust representations for the factory's versioned daily benchmark report and a stable registry of 17 headline scenarios. It also adds a hidden command that validates report tags, scenario IDs, uniqueness, and peak-memory data before reports are consumed.

  • ›Direct-spawn runner with per-run time and peak RSS56562981

    Adds a shell-free benchmark runner that executes argv directly in an isolated environment, optionally prepares each iteration, alternates git/grit measurements, and records wall time plus descendant-aware peak RSS. The round-2 fix makes its reported statistics reliable for even sample counts, failed iterations, and temporarily unequal ABAB series.

  • ›Core repo shapes: small, synth-10k, synth-100k, git-git88c5bc8f

    Adds deterministic daily benchmark fixture shapes for small, 10k-file, 100k-file, and pinned git.git repositories, including smoke-scaled variants and cache-aware preparation. The round-2 fix gives Synth100k its intended shallow wide topology instead of inheriting the legacy deep L-tier layout.

    Synth100k smoke parent directories: 1,671 directories → 50 directories (33× better)Synth100k full parent directories: 33,401 directories → 1,000 directories (33× better)
  • ›Special repo shapes: many-refs, big-blobs, deep-tree365a80d4

    Adds deterministic benchmark fixtures for packed and loose many-ref repositories, bounded large binary histories, and deeply nested trees. The registry exposes full and smoke variants, while Rust tests verify deterministic tips and interoperability with the system Git client.

    full BigBlobs large-blob versions versus prior reviewed scheduler: 139 blob versions → 60 blob versions (2.3× better)full BigBlobs versions per binary: 7.0 average versions → 3 average versions (2.3× better)
  • ›`grit-bench daily` with the 17 headline scenarios and CI smokea1dd5919

    Adds a daily performance census with 13 runnable local headline scenarios and four explicitly pending network headlines. It records wall time and peak RSS for system git, candidate grit, and optionally a baseline grit, with filters, smoke mode, validation, CI smoke coverage, fixtures, and documentation.

    status/clean@synth-10k median wall: system git vs candidate grit: 51.0 ms → 51.1 ms (0% worse)status/clean@synth-10k peak RSS: system git vs candidate grit: 12,537,856 bytes → 32,632,832 bytes (62% worse)
  • ›Matrix: worktree, index, diff and history commands across shapes8f00e6f4

    Adds the daily worktree/history benchmark matrix and fixes four rows that previously measured the wrong operation or reused mutated state. The resulting smoke run executes 35 worktree, index, diff, blame, and revwalk cases against system Git, validates every report row, and records RSS for both clients.

  • ›Matrix: branching, refs, maintenance and the remaining areas46986683

    Adds the daily benchmark matrix for branching, refs, maintenance, and miscellaneous repository operations, with deterministic special fixtures and Git/grit timing plus RSS capture. The round-3 fix makes commit-graph preflight prove that grit actually wrote a valid graph, while retaining system Git fsck validation.

  • ›Remote scenarios: fetch, pull, push, clone, ls-remote89f2b701

    Adds daily benchmark coverage for the common remote workflows over file and local smart HTTP transports, with Git/Grit ref parity checks before timing. The review fixes make the HTTP mirror used by prepare hooks identical to the server docroot and make incremental push inputs reproducible.

roadmap · Revision selection and commit filtering (log, revs)2 steps
  • ›grit-lib: CommitFilter inside the walk (author, committer, grep, mailmap)56562981

    Adds a reusable compiled commit filter to revwalks for author, committer, message grep, case folding, fixed strings, BRE semantics, inversion, and caller-supplied mailmap mapping. Filtering happens inside bounded and path-limited walks so limits count matching commits while non-matching commits remain traversable, and the round-two fix makes identity matching byte-safe and preserves ODB errors.

  • ›grit-lib: date cutoff helper with injected clockfecbf773

    Adds a public, clock-injected Git date-cutoff parser that returns a typed error instead of silently falling back to now. It validates relative, absolute, ISO 8601, RFC 2822, yesterday, and noon forms against system Git while keeping process-timezone-sensitive tests out of the library hygiene scan.

roadmap · Close the biggest speed and memory gaps from the census9 steps
  • ›Merge engine: walk each tree once with a parsed-tree cache88c5bc8f

    This refactors three-way tree merging to parse each tree once per merge and walk base, ours, and theirs together over touched paths. It also fixes the round-1 empty-subtree regression so an empty directory does not falsely trigger a directory/file conflict, while preserving Git-compatible result trees and conflict stages.

    merge_trees_three_way 2,000-path Criterion median: 1,074 ms → 59.1 ms (18× better)merge-only speedup: 1 x → 18.2 x (18× better)
  • ›Fair log benchmark: one grit log process2cfddd30

    The dashboard’s log benchmark now measures a single capped Grit log invocation instead of ten paged subprocesses. Campaign paging remains unchanged and is described explicitly, while regression coverage proves the dashboard path emits 100 commits from exactly one process.

    Grit log workload median: 185.3 ms → 9.3 ms (20× better)System Git control median: 5.8 ms → 3.5 ms (65% better)Grit/Git median ratio: 32.1 x → 2.7 x (12× better)Timed Grit processes per sample: 10 processes → 1 processes (10× better)
  • ›Memory-map pack .idx files and check them lazilye58816fb

    Pack indexes and reverse-index sidecars can now use memory mappings instead of eagerly copying entire files, while small or unmappable files retain owned-byte fallback storage. Opening performs cheap structural validation; full verification and lookup paths preserve typed corruption reporting, and repack drops cached maps before deleting old pack artifacts.

  • ›Look up single refs in packed-refs without parsing the whole file67839f9f

    Packed-refs now has a read-once indexed view that binary-searches sorted files for exact names and bounded prefixes, while unsorted files retain linear fallback behavior. The files ref store distinguishes partial indexed access from a complete packed map and refreshes the view when the file stamp changes.

  • ›Status and diff memory: no per-entry result slots in the parallel scanf16e1212

    This replaces dense per-index parallel status/diff preload output with sparse worker batches containing only entries that require follow-up work. It also carries the status-performance stack’s compact stat representation, safe deferred index removals, untracked-cache optimization, symlink handling, and memory/performance regression coverage.

    100k clean status peak RSS: 83,898,368 bytes → 39,051,264 bytes (2.1× better)100k clean diff peak RSS: 83,869,696 bytes → 36,261,888 bytes (2.3× better)10k clean status median: 17.0 ms → 15.3 ms (11% better)10k dirty status median: 30.2 ms → 27.7 ms (9% better)
  • ›Load config and repository paths once per Repository05edb275

    This branch resolves repository paths once, holds a per-Repository configuration snapshot with explicit invalidation, caches derived replace-ref state and loose objects, and routes ref-store selection through repository-local state. Round 3 removes an unsafe process-wide stamp-keyed ref-store cache and makes missing local config distinct from other I/O failures.

    trivial log .git/config opens: 21 opens → 11 opens (91% better)
  • ›Add memory: no full index copies when staging8ab284a8

    This change replaces a full-output-vector index merge with a backward adjacent-run merge that stores only the shorter run, and compacts deferred restage jobs to index positions. It also fixes the prior job/prepared-result misalignment by carrying entry indices alongside accepted batch inputs.

    synth-100k add peak RSS (max of 3): 63,119,360 bytes → 104,878,080 bytes (40% worse)synth-100k add median wall time (5 runs): 683.4 ms → 741.7 ms (8% worse)synth-100k add peak RSS vs system Git control: 34,914,304 bytes → 104,878,080 bytes (67% worse)
  • ›Pick, revert and merge: remove redundant passes around the merge6fc9d152

    This change consolidates clean pick, revert, and non-conflicting merge checkout into one precomputed tree-diff path, then applies sparse merge entries and refreshed stats to the existing index. Round-two fixes narrowed implementation helpers back to crate visibility and avoid duplicate index updates during checkout.

    pick-10000 median: 209.4 ms → 194.5 ms (8% better)revert-10000 median: 190.7 ms → 193.1 ms (1% worse)merge-10000 hot-path median: 53.0 ms → 83.2 ms (36% worse)pick-series-10000 median: 566.3 ms → 411.5 ms (38% better)
  • ›Map commit-graph and multi-pack-index files46986683

    Maps commit-graph and MIDX read storage and splits commit-graph opening from full verification so normal history operations avoid owned whole-file copies and expensive graph validation. MIDX direct reads retain checksum rejection and pack fallback, while fsck/verify retain full corruption diagnostics.

    git.git log mean, origin/main to branch: 52.9 ms → 16.1 ms (3.3× better)git.git log peak RSS, origin/main to branch: 61,916 KiB → 38,340 KiB (61% better)git.git revs --count mean, origin/main to branch: 80.5 ms → 47.8 ms (68% better)git.git revs --count peak RSS, origin/main to branch: 65,056 KiB → 40,256 KiB (62% better)
roadmap · Shared diff output (diff, show, log -p)7 steps
  • ›Library: one DiffOptions type and one line engine3e963e56

    This branch consolidates diff configuration into a public `DiffOptions`, routes structured and log-patch output through shared line-hunk generation, and migrates callers and tests. Round 3 restores structured function context and replaces the Minimal/Patience paths, but Histogram still produces different hunk boundaries from Git on a broad deterministic corpus.

  • ›Library: diff selection API (`Diff::files`) and the shared DiffFormatArgs with -U2de15222

    Moves diff target selection and structured file-diff construction into grit-lib, leaving grit-cli focused on argument parsing and rendering. It adds typed targets and argument-resolution errors, a shared `-U/--unified` formatting argument, Git-compatibility coverage, and the requested round-2 correctness/snapshot/API fixes.

  • ›Renames, algorithm and filter: -M[N], --no-renames, --diff-algorithm, --diff-filter2b3196ab

    Adds typed diff-status filtering, configurable line-diff algorithms, rename thresholds, and no-rename behavior through grit-lib, then exposes them in the modern `grit diff` CLI. Round three repairs exact 100% rename handling and attempts to support attached `-M30` without consuming revisions, but that parser repair still has argument-boundary regressions.

  • ›diff --cached alias, --exit-code, --quiet and `changed` in JSONbb5a3a37

    Adds a library-level fast change query and exposes cached/staged aliasing, quiet/exit-status behavior, and a stable JSON `changed` field through the CLI. The round-3 correction ensures normal human, JSON, Markdown, and `--exit-code` output builds the diff once, while only `--quiet` uses the no-hunk query.

    Dirty full diff median, 5,000 files/100 modified/25 runs: 11.7 ms → 11.6 ms (1% better)Clean quiet median: system Git vs branch, 5,000 files/25 runs: 2.7 ms → 9.2 ms (70% worse)Dirty branch full vs quiet median, 5,000 files/100 modified/25 runs: 11.6 ms → 9.3 ms (25% better)
  • ›Whitespace modes: -w, -b, --ignore-blank-lines6db2a451

    Adds typed whitespace comparison modes to grit-lib and exposes `grit diff -w`, `-b`, and `--ignore-blank-lines`. Normalized keys drive alignment while original lines remain available for rendering, and whitespace-only modified files are removed without losing rename or mode metadata.

  • ›diff --no-index A B79a5a8ea

    Adds repository-independent filesystem diffing for files, directories, mixed file/directory pairs, symlinks, executable modes, and renames, then exposes it through `grit diff --no-index` outside repositories. This review revision fixes root-path joining while retaining earlier fixes for unique directory entries, type collisions, mode classification, schema output, performance, and repository `-U`.

    10k-file directory diff median (system Git comparator vs branch grit): 0.249 seconds → 0.106 seconds (2.4× better)10k-file directory diff ratio to system Git: 1 ratio → 0.424 ratio (2.4× better)
  • ›diff --patch-text: plain patches that `git apply` accepts7dd1b0bc

    Adds a library-first Git-apply-compatible patch writer and exposes it as `grit diff --patch-text`, including text/binary bodies, modes, renames, worktree bytes, and documented CLI behavior. Round 3 replaces full ODB scans during abbreviation warmup with indexed prefix lookups, but the limited layered lookup can miss collisions and measured performance remains narrowly above the stated ceiling.

    HEAD~200 patch median, trial 1: 107.3 ms (system git vs grit) → 118.7 ms (system git vs grit) (10% worse)HEAD~200 patch ratio, trial 1: 1.1 x ceiling vs measured → 1.1 x ceiling vs measured (1% worse)HEAD~200 patch median, trial 2: 105.4 ms (system git vs grit) → 118.1 ms (system git vs grit) (11% worse)HEAD~200 patch ratio, trial 2: 1.1 x ceiling vs measured → 1.1 x ceiling vs measured (2% worse)
issues fixed13
  • ›macOS: grit status/diff in a subdirectory print paths like ../../../../private/tmp/repo/sub/f.txt (repo under /tmp)#1217bff9ba21

    This makes repository paths display relative to a subdirectory on macOS even when the cwd uses /tmp or /var while canonical repository paths use /private/tmp or /private/var. Status and diff inherit the corrected library behavior without CLI-specific logic or output-shape changes.

  • ›grit log/revs/blame take paths repo-root relative, not cwd relative: `log -- f.txt` in a subdir says "No commits yet."#1218310303f3

    Revision-walk and blame path operands now resolve from the process working directory while preserving repository-root semantics for `:(top)` and `:/` magic. The CLI remains thin, and the library owns the path resolution behavior for embedders.

    `grit revs --count HEAD -- .` from subdirectory: 3 commits → 2 commits (50% better)
  • ›grit diff <unknown-rev> <rev> prints "No changes." and exits 0 (--json: empty files list) instead of erroring#12164da6d91c

    Tightens `grit diff` positional disambiguation so unresolved names stay revisions instead of becoming path filters that produce an empty successful diff. It also handles a range followed by an unknown token by reporting that second token, while preserving range/commit plus known-path behavior.

  • ›grit diff A B is 1.7-3.4x slower than git; `--json` emits 231 MB (git patch: 28 MB) and takes 3.5s vs 0.47s#1220dc7c31b0

    Diff JSON now writes compact output and stores ordinary line content as one `text` field, retaining segment arrays only when inline emphasis exists. Large human diffs cap word-level work after 64 changed files; round-2 fixes make stash output mode-independent and update all affected snapshots and redaction filters.

    20k-line synthetic diff JSON bytes (debug build): 10,818,142 bytes → 3,017,980 bytes (3.6× better)20k-line synthetic diff JSON median runtime, 5 warm runs (debug build): 0.368 seconds → 0.126 seconds (2.9× better)JSON size relative to system git patch on same fixture: 6.6 ratio → 1.8 ratio (3.6× better)
  • ›v0.5.14 Windows: worktree remove refuses clean linked worktree with a committed CRLF file (autocrlf=true)#12328d6be29c

    Linked worktree add/remove now discovers the linked repository using the parent handle's configuration environment, command runner, diagnostics, and thread policy. Repository-specific discovery overrides are cleared so the linked worktree still resolves its own gitfile, index, worktree, and object location.

  • ›grit blame is 3.5-6.6x slower than git on cargo and git/git; -L range does not help (build_script.rs 1.0s vs 0.17s)#12192c613608

    Partitions pending blame lines into unchanged affix lines and edited-middle lines, allowing tail-churn ranges to cross commits without a full diff. It also adds large-file full/range benchmark fixtures, compatibility checks, perf-target entries, docs, and a committed baseline.

    Cargo full, round2 to round3: 1,388 ms median → 1,434 ms median (3% worse)Cargo -L, round2 to round3: 727.4 ms median → 537.8 ms median (35% better)git.git Makefile, round2 to round3: 4,278 ms median → 5,479 ms median (22% worse)git.git log.c, round2 to round3: 1,843 ms median → 1,947 ms median (5% worse)
  • ›grit diff --markdown drops mode and rename info: exec-bit-only change renders as an empty diff block#1229c68facfb

    Markdown diff sections now always identify the change status and show old/new modes when the sides differ. Empty patches for mode-only and rename-only changes no longer produce empty fences, while human output explicitly identifies deleted and renamed files.

  • ›v0.5.14: grit status/commit miss new files in cached dirs when core.untrackedCache=true (stale UNTR trusted)#1227066476a5

    The UNTR fast path now verifies every cached directory node it will rely on before returning cached untracked paths. A stale node forces the existing refresh path, so newly created files in Git-warmed cached directories are seen by status and commit staging.

  • ›v0.5.14 macOS arm64: grit clone of rust-lang/cargo over HTTPS still 1.8-2.9x slower than git (receive phase)#1228136a8427

    Speeds the large HTTPS receive path by selecting platform TLS on macOS, removing redundant HTTP buffering, and reducing spool synchronization to one handoff sync. It also adds a sideband demux benchmark and documents the transport feature choice; round 3 fixes the Rustls-only lint regression without changing behavior.

  • ›v0.5.14 Windows: grit commit takes 2.2s on a 50k-file tree even with nothing to stage (git: 0.1s), add 5-7x slower#12300dfffb44

    The CLI now stages once and creates the commit from that staged index instead of entering a second worktree-staging pass. The ignorecase fast path resolves index paths to their real on-disk spelling, preserving case-only renames while retaining the tracked-stat scan.

    CLI worktree staging passes per commit (origin/main code path → branch code path): 2 passes → 1 passes (2.0× better)50k clean allow-empty median (system Git reference → branch grit, Linux release build): 71.1 ms → 435.5 ms (84% worse)50k clean allow-empty grit/Git ratio: 1 x → 6.1 x (84% worse)
  • ›Redundant backslashes in gitconfig cause parsing to fail.#1255b9c2e8cd

    This change fixes loading valid Git config values that contain escaped double quotes while otherwise unquoted, including Windows credential-helper commands. It also makes inline-comment detection use the same escape-aware quote tracking, preventing escaped quotes from hiding a following comment.

  • ›v0.5.14 Windows: grit status/diff ~6x slower than git on 50k-file tree (0.32s vs 0.055s), 11-15x after mtime-only touch#1231e1f3162f

    Speeds large-tree status and diff scans by grouping tracked-file metadata work by directory and reusing collapsed untracked-cache subtrees. It preserves correctness for directory-to-symlink replacements and prevents an invalid root-level UNTR collapse, with gated 50k and Git-oracle regression coverage.

    50k clean grit status median: 780.3 ms → 693.7 ms (12% better)50k clean grit/git ratio: 4.4 x → 3.4 x (28% better)
  • ›Follow-up: Fix #1219: grit blame is 3.5-6.6x slower than git on cargo and git/git; -L range does not help (build_script.rs 1.0s vs 0.17s)#1219e75c31e6

    This change restores the pre-affix-partition fallback for blame batches whose pending lines all lie in the edited middle, while retaining prefix/suffix shortcuts for mixed and affix-only batches. It also refreshes the large-tail blame benchmark baseline and fixes all commit attribution policy violations from the previous review.

    Cargo build_script.rs full-file blame: 1,395 ms mean, 7 runs → 1,373 ms mean, 7 runs (2% better)Cargo build_script.rs -L 100,120 blame: 533.9 ms mean, 7 runs → 531.9 ms mean, 7 runs (0% better)Cargo full-file slowdown vs system Git: 5.1 x Git → 5.0 x Git (2% better)Cargo ranged slowdown vs system Git: 3.9 x Git → 3.9 x Git (0% better)
other changes20
  • ›Main keeper: make CI on main green (test-threaded, test, bench-scenarios-smoke)afaaca28

    This change restores the benchmark scenario smoke by writing the GC reset marker immediately after creating its fixture. It also halves the large UNTR test's fixture seeding work through a same-filesystem local clone and adds narrow hygiene fixes required by the CI ratchet.

  • ›Quality #1: Move logic into grit-lib45c888a2

    This moves GitHub's OAuth device-code exchange, polling/backoff, token credential construction, GitHub HTTPS URL classification, and effective credential-helper lookup into reusable grit-lib APIs. The CLI now retains only configuration discovery, prompts, platform helper setup, typed error rendering, and output.

    auth logout, no helper median (origin/main → branch): 2 ms → 2.0 ms (1% worse)auth logout, credential-store helper median (origin/main → branch): 3.7 ms → 3.7 ms (0% better)
  • ›Main keeper: make CI on main green (bench-scenarios-smoke, test, test-threaded)1364d909

    Serializes disk-heavy index fixtures across test binaries with a process-held advisory lock, preventing concurrent large fixtures from exhausting CI disk. The revised helper does not return until the lock is actually held, and a subprocess regression proves a second contender waits until release.

  • ›Dashboard benchmarks3773058a

    This refreshes the public dashboard’s nine release-comparison scenarios and fixes the benchmark runner so each `git diff` and `grit diff` sample sees exactly 48 modified tracked files. The paired v0.5.0/current controls are now comparable, and the reports identify grit 0.5.0 versus 0.5.14 at commit 8d6be29c.

    Paired diff Git-control drift: 416.6 percent → 7.4 percent (57× better)Current-report Git diff median: 26.8 ms → 5.7 ms (4.7× better)Current-report grit diff median: 26.9 ms → 12.4 ms (2.2× better)Live reviewer Git diff median (stored vs fresh run): 5.7 ms → 6.4 ms (11% worse)
  • ›Main keeper: make CI on main green (test, test-threaded)93cf11a5

    Corrects upload-pack's deepen-relative shallow boundary calculation and repairs three independent CI-only breakages in benchmark smoke, rustdoc, and heavy-disk tests. The implementation is narrowly scoped and keeps protocol logic in grit-lib while benchmark/test support stays in supporting crates.

  • ›Main keeper: make CI on main green (rustdoc, test, coverage, test-threaded, miri, bench-scenarios-smoke)2e0edf0b

    This change removes one obsolete argument from each of two parallel worktree-scan regression tests. The test crate now compiles against the production helper's current 10-argument signature, restoring the test, coverage, threaded-test, and Miri jobs that all failed at the same compile step.

  • ›Follow-up: Load config and repository paths once per Repositoryb3021ca6

    Caches repository paths, config cascades, derived config settings, ref stores, and selected ODB/MIDX inputs per open Repository handle, then routes hot consumers through those snapshots. It adds regression coverage for config invalidation and Linux syscall counts, but currently introduces a process-global MIDX config bridge that fails the hygiene gate.

    `.git/config` opens for `grit log --limit 1`: 21 opens → 2 opens (11× better)
  • ›Main keeper: make CI on main green (coverage, test, test-threaded, miri)e73ac748

    This isolates benchmark fixture scratch directories during unit tests so parallel workers cannot delete each other's repositories, and makes legacy example compilation resilient to the runner's transient linker bus errors by serializing links and retrying only recognized crash signatures. It also repairs one strict rustdoc link.

  • ›Follow-up: Library: one DiffOptions type and one line enginec5c2d372

    Unifies line-diff configuration behind one public `DiffOptions` API and routes structured, patch-log, tree, absorb, patch-id, and CLI consumers through one line engine. The follow-ups make Histogram hunk selection match system Git, restore structured-hunk function context, and refresh the generated public API snapshot.

    Seeded U0 oracle algorithm coverage: 3 algorithms across both indent modes → 4 algorithms across both indent modes (33% better)Seeded U0 oracle wall time: 1,721 seconds; before is a measured lower bound because the old subprocess-heavy oracle was stopped → 10.8 seconds; before is a measured lower bound because the old subprocess-heavy oracle was stopped (159× better)
  • ›Main keeper: make CI on main green (coverage, test-threaded, test)f4153c9b

    Minimal diff now keeps repeatedly occurring records eligible during cleanup instead of prematurely collapsing them. This restores the two zero-context hunks expected for the upstream t4071 repeated-anchor fixture and adds a direct unit regression.

    t4071 minimal zero-context hunk headers: 1 hunks → 2 hunks (2.0× better)
  • ›Follow-up: Add memory: no full index copies when staginga24741f8

    This follow-up bounds staging memory by avoiding retained worktree metadata and unconditional index-entry clones, selecting serial restage for campaign-scale indexes, and merging sorted replacement entries with bounded live storage. It also preserves the index blob only when autocrlf cleaning needs the safety comparison.

    synth-100k/20k grit add peak RSS (max of 3): 69,005,312 bytes → 44,351,488 bytes (56% better)synth-100k/20k grit add median wall time: 0.407 seconds → 0.505 seconds (19% worse)synth-100k/20k max RSS: system Git vs reviewed grit: 32,468,992 bytes → 44,351,488 bytes (27% worse)synth-100k/20k median wall time: system Git vs reviewed grit: 0.382 seconds → 0.505 seconds (24% worse)
  • ›Follow-up: grit-cli: shared RevSelectArgs for log and revs; --cursor renamed6f8156d

    This stack gives `log` and `revs` one shared revision-selection model and makes opaque log cursors self-contained across ranges and date cutoffs. The follow-up fixes harden revwalk/ODB edge cases, restore Git-compatible left/right counting and ref order, and make cursor-only continuation work as designed.

  • ›Follow-up: Renames, algorithm and filter: -M[N], --no-renames, --diff-algorithm, --diff-filterb7cdece3

    This change makes attached rename thresholds such as `-M30` work when root global flags precede `diff`, while preserving literal dash-leading pathspecs after `--`. It adds focused unit and CLI regressions and leaves the library and on-disk/wire behavior unchanged.

  • ›Follow-up: Map commit-graph and multi-pack-index filesc2e52512

    Commit-graph layers and multi-pack-index layers are backed by `PackData`, allowing files above the small-read threshold to remain memory-mapped instead of copied into owned buffers. The follow-up preserves exact lookup parity with owned parsing and makes undersized MIDX stubs fall back to ordinary pack reads rather than aborting the chain.

  • ›Quality #3: Simplifye2053182

    This change replaces repeated setup, outcome conversion, rendering, and error-wrapper code across six `grit history` actions with one shared rewrite context and one outcome type. It adds two small `RewritePlan` inspection methods so the CLI no longer reconstructs mappings or rereads HEAD outside the library/ref abstraction.

    grit-cli history.rs lines: 1,043 lines → 673 lines (55% better)history-reword-1000 grit median (system git 6510.3 ms): 159.3 ms → 165.8 ms (4% worse)
  • ›Main keeper: make CI on main green (test, bench-daily-smoke, test-threaded)9a3a0969

    This change makes `grit-bench fixtures prepare --only` accept the comma-separated fixture list used by daily-smoke CI. It adds a focused argv regression test and repairs one stale diff-library rustdoc target; the prohibited histogram implementation from review round 1 has been removed completely.

  • ›Follow-up: Pick, revert and merge: remove redundant passes around the mergedc52d5fd

    Consolidates clean pick, revert, and merge checkout around a precomputed tree merge result, reducing redundant tree/index passes. The round-4 fix removes the unsafe worktree-only index bypass and retains the faster single-pass merge path with full index finalization.

    hot-path merge median: 73.3 ms → 52.7 ms (39% better)isolated merge median: 255.6 ms → 233.1 ms (10% better)hot-path pick/system-git ratio: 1.7 x → 1.8 x (7% worse)hot-path revert/system-git ratio: 1.7 x → 1.8 x (5% worse)
  • ›Quality #2: Deduplicateec83ac96

    Centralizes annotated-tag traversal in two typed `Odb` methods and routes fetch, serving, reachability, refs, porcelain, and `grit show` through them. The round-two revision removes the invalid 64-tag ceiling while retaining cycle protection for pluggable object stores.

    history-show batched smoke: 623.0 ms → 619.7 ms (1% better)ls-remote via grit HTTP (median of 5 smoke suites): 3.5 ms → 3.5 ms (2% better)no-op fetch via grit HTTP (median of 5 smoke suites): 5.0 ms → 4.9 ms (2% better)server clone via HTTP (median of 5 smoke suites): 19.3 ms → 20.1 ms (4% worse)
  • ›Quality #5: Move logic into grit-lib7604a4cb

    This adds a reusable grit-lib model for selecting a branch comparison base and computing its ahead/behind standing, then replaces duplicated CLI implementations in status, shortlog, branch deletion, and absorb. Ref lookup now honors Repository::refs(), including injected and reftable backends, while the rendered CLI output remains unchanged.

    branch/delete@many-refs grit median: 50.7 ms → 50.7 ms (0% better)shortlog/ahead@git-git grit median: 50.6 ms → 50.6 ms (0% worse)status/clean@small grit median: 50.7 ms → 50.6 ms (0% better)branch/delete system-git control median: 50.7 ms → 50.7 ms (0% worse)
  • ›Follow-up: diff --patch-text: plain patches that `git apply` accepts

    This branch adds `grit diff --patch-text` output that system `git apply` accepts, including binary patches, worktree/index content, quoted paths, and unique object abbreviations across layered object storage. The round-3 fixes correctly deduplicate overlapping pack and loose objects and avoid structured line-diff construction for ODB-backed commit ranges, but small-range throughput remains nearly twice Git's.

    13-file patch-text mean: 33.6 ms → 32.7 ms (2% better)13-file grit/git mean ratio: 1.9 x → 1.9 x (1% better)Current-tip one-file patch-text mean: 3.8 ms → 3.8 ms (1% better)
$ git log --oneline 6c302b19..v0.5.15compare on GitHub ↗
89f2b701Merge branch 'factory/daily-remotes-2356'
51f10d42bench: align daily HTTP docroot with network prepare and fix push verify
f21d6ff4fix patch-text quiet/exit-code after rebase
ae87544etest: patch-text worktree git apply round-trip
e0ac9b83fix prefix lookup overlap and speed commit-range patch-text
92a12c99fix patch-text review: worktree patch bodies, abbrev batching, skill snapshot
22251ce1Add diff --patch-text with structured output and git-apply round-trip tests
5b84f597fix: layered ODB prefix lookup for pack+loose abbreviations
46022410bench: implement daily remote headlines and HTTP matrix scenarios
7604a4cbComplete grit-lib public API snapshot refresh
f4b08c49Refresh grit-lib public API snapshot after rebase
641eee06Use the library branch comparison in status, shortlog and branch
1b73f6a6Add branch comparison API to grit-lib branch_tracking
7dd1b0bcFix patch-text perf: ODB prefix lookup and abbrev warm
e069cbf1Fix patch-text review: UTF-8 fallback, ODB abbrevs, worktree hunks
8caab249Add diff --patch-text for git-apply-compatible patches
ec83ac96Merge branch 'factory/peel-tags-once'
dc52d5fdFix merge path and remove skip_index_updates checkout bypass
575601f3Hot-path perf: worktree-only pick checkout and hybrid merge apply
0495c72dAddress review: crate-private helpers, checkout index finalize, merge perf
bcef9421Pick/revert/merge: fix merge regression and single-pass index apply
6e076569Follow tag chains of any length
8badf20aFormat the tag peeling compat test
83070dd7Check Odb tag peeling against git rev-parse
da9c0e67Update the grit-lib public API snapshot for Odb tag peeling
961d9beePeel tags by their object header only
db9e9d23Document tag peeling on the objects guide
0893f489Test that clone-time packed-refs fully peel nested tags
9b9d4c1fSkip the peel lookup for lightweight tags of commits
e3d11495Peel tags through the Odb helpers everywhere
96687ddcAdd Odb::peel_tags and Odb::peel_to_commit
9a3a0969Merge branch 'factory/ci-fix-bench-only-2528'
3e98285fbench: parse comma-separated fixtures prepare --only
e2053182Name history drop in its own planning errors
c93aaab1Collapse duplicated setup and outcomes in grit history
38be4a03Add RewritePlan::replacement and head_change
79a5a8eafeat: diff --no-index for filesystem paths outside a repo
c2e52512Merge branch 'factory/map-cg-midx-2533'
0b020b18tests: restore mapped-vs-owned CG/MIDX regressions on large fixtures
b7cdece3diff: fix argv normalization for global flags and pathspecs
6db2a451Merge branch 'factory/diff-whitespace-modes-2379'
0ed74571Merge branch 'factory/map-cg-midx-2367'
46986683Merge branch 'factory/daily-matrix-branching-2358'
6a579d8ediff: honor diff algorithm when whitespace normalizes lines
765586dcdiff: address whitespace review findings
a809a57cdiff: add -w, -b, and --ignore-blank-lines whitespace modes
d6f8156dlib: preserve ref iteration order for --all tips Stop sorting peeled commit tips by oid so rev-list walks seeded from --all match Git's ref order (fixes grit revs --all vs git rev-list).
6b58a4felib: make single-pack ODB reads reentrant under invalidation Take the thread-local SingleLocalPackReader out of its RefCell slot before read_object so nested cache clears during pack invalidation do not panic. Use try_borrow_mut when dropping the slot on clear.
79831626lib: restore merge-base parent walk metrics and fix walk edges Count parents_of calls before the shared linkage cache so merge-base regression tests observe intersect-walk depth again after repo-wide commit linkage caching.
0fa7fb4ecli: resume log walks from cursor query alone When continuing with --cursor, decode the token and step using the embedded LogWalkQuery instead of rebuilding selection from implicit HEAD. Reject explicit revision, date, and ref-set flags alongside --cursor.
9fb88704cli: shared RevSelectArgs for log and revs; rename log cursor Add RevSelectArgs (ranges, -n, dates, ref sets, path operands) shared by log and revs, mapping to RevWalkListOptions with committer_cutoff_from_date. Rename log paging to --cursor; accept lw1. tokens on deprecated --before with a warning and --before as an --until date alias otherwise.
c190137bstyle: cargo fmt after rebase onto main
d42d73b1revwalk: fix merge since bounded count and speed revwalk paths Use full-graph bounded walks when linear-chain since fast paths hit merges, with a Git-oracle merge DAG regression. Return zero quickly when counting from an ancestor of the hide tip, share commit linkage across parse and count on one repo handle, and speed pack reads via single-pack and monotonic index probes.
f243eac5revwalk: fix review blockers for left/right counts and bounded walks Forward RevWalkListOptions into left_right_counts fast paths, prune hide regions during reachable counting, and prefer first-parent chain walks over full-graph commit-graph counting when tips are linear.
733fa544revwalk: widen RevWalkListOptions and add left/right counts Extend the high-level rev-walk query API with skip, since/until, merge filters, reverse, and ref-set expansion matching rev-list behavior. Add symmetric left/right commit counts and teach the bounded reachable walk to honor committer-date cutoffs so limited --since walks stay bounded.
959dfe80test: commit-graph daily preflight regression coverage
b2b31652bench: preflight grit repack and commit-graph before daily timing
c933eaa2bench: daily matrix for branching, refs, maintenance, and misc
bb5a3a37Add diff has_changes, --quiet/--exit-code, and JSON changed field
66f0e70bgrit-lib: update public-api snapshot for commit-graph verify_on_disk
fcc595degrit-lib: lazy mapped open for commit-graph and MIDX
688bc7degrit-lib: memory-map commit-graph and MIDX read paths
a24741f8Merge branch 'factory/no-full-index-copy-staging'
2b3196abFix -M<n> parsing and bare --find-renames revision safety
dd662d10Fix -M100% rename threshold and refresh public API snapshot
56fad507Format diff rename filter tests after cargo fmt.
689650ceAdd diff rename, algorithm, and filter flags
f4153c9blib(diff): honor XDF_NEED_MINIMAL record cleanup limits
0c2f4e75perf(index): merge staged replacements without tripling index size
8f00e6f4bench: fix daily matrix argv and init prepare correctness
b6907627bench: add daily worktree and history matrix scenarios
6fc9d152Use main merge checkout path; keep consolidated pick/revert apply
15415bbaReview fixes: pub(crate) checkout helpers, skip duplicate index refresh on merge apply
2d523b47Keep full worktree clean check on fast-forward merge
68795a2aPick, revert, merge: one tree diff for checkout and scoped clean checks
c5c2d372Merge branch 'factory/diff-histogram-hunk-2471'
2de15222lib(diff): selection API with DiffTarget, FileDiff, and -U flag
72f5056elib(diff): Git-compatible histogram hunk selection via xdiff compact
a1dd5919bench: fix daily CLI, baseline prepare, and scratch paths
a4131e8bbench: add grit-bench daily headline runner and CI smoke
e73ac748Merge branch 'factory/ci-green-2463'
89824a01docs: fix RevWalkListOptions rustdoc link path
fbfa48e4grit-examples: retry example builds on flaky linker bus errors
4c6a00a1grit-utils: isolate benchmark scratch dir per test thread
365a80d4Merge branch 'factory/special-repo-shapes-2354'
f4fd9811bench: add daily special repo shapes (many-refs, big-blobs, deep-tree)
8ab284a8perf(index): merge with min-aux tail-pop; fix deferred restage zip
df2db28bperf(index): merge staging replacements without a third full index copy
3e963e56lib(diff): git xdiff minimal/patience and structured function context
f6a558bdlib(diff): route structured and log-patch through unified hunk body
b0d52461lib(diff): unify DiffOptions and line hunk engine
2e0edf0bgrit-lib: fix worktree_scan parallel test call arity
05edb275Merge branch 'factory/config-once-2369'
e75c31e6Merge branch 'factory/blame-perf-2341'
5eb6c9a8grit-lib: refresh public-api.txt for config session API
b8c8d7a9grit-lib: remove stamp ref-store cache; propagate local config I/O errors
5d8c335dgrit-lib: drop stale process config caches; validate ref-store by stamp
66e4fcd4grit-lib: route ref storage format from RepositoryFormat via ref_storage
9893ddf7grit-lib: load config and repo paths once per Repository session
93cf11a5grit-lib: fix deepen-relative shallow borders on upload-pack
fee37620grit-utils: dedupe perf-targets.toml and fix blame followup
ddcbaddbgrit-utils: run revwalk lib scenarios through grit-bench lib-op
01b9d540grit-lib: serialize heavy object_write regression tests on disk lock
dc7d40bfdocs: fix rustdoc links for CommitFilter and heavy-disk guard
e1f3162fgrit-lib: fix clippy needless_borrow in worktree stat preload
fbd05166Fix hygiene: warm UNTR test uses grit_test_support::git
2c5f54cbFixes #1231: address review (symlink correctness, UNTR root, perf gate)
0a2f5fb8chore(bench): refresh blame-large-tail baseline timings
733228f6perf(blame): restore pre-round-3 still_pending for all-middle batches
f16e1212Merge origin/main into factory/status-scan-memory-2373
67839f9fSpeed up sorted packed-refs with indexed lookup and session stat cache
e58816fbMerge branch 'factory/pack-idx-mmap-2366'
c3da31a8Refresh grit-lib public API snapshot for pack index Result types
6f20ebd9Apply rustfmt after rebase onto main
f74e71b6Expect build_pack_rev_bytes in pack ingest roundtrip test
d5df8efbFix fallible PackIndex offset call sites in tests and examples
e9b69b54Return typed errors for corrupt pack index offset lookups
36d3f9f6Memory-map pack .idx files with lazy structural validation
62e8a315chore: allow clippy too_many_arguments on sparse blob collect
5499afb3Merge origin/main into factory/status-scan-memory-2373
fecbf773grit-lib: add parse_date_cutoff with injected clock
2cfddd30Merge branch 'factory/fair-log-bench-2365'
b9c2e8cdFixes #1255: parse unquoted \" escapes in gitconfig values
e6067b34Merge branch 'factory/merge-tree-cache'
4da123d9bench: fair dashboard log scenario uses one grit log --limit 100
88c5bc8fMerge branch 'factory/core-repo-shapes-2353'
14282c73fix(status): sparse parallel blob preload for clean 100k scans
3773058aMerge branch 'factory/dashboard-benchmarks-2313'
1364d909Merge branch 'factory/ci-green-2340'
277da40fMerge branch 'factory/daily-runner-2352'
906299cfbench: fix daily runner median, balance ABAB counts, skip failed stats
ee3b9d91bench: use sample stddev in daily runner stats
5dc1c599bench: direct-spawn daily runner with per-run RSS and ABAB policy
56562981grit-lib: update public-api.txt for CommitFilter
d535d08fgrit-lib: byte-safe commit filter identities and propagate match errors
45230c77grit-cli: default RevWalkListOptions commit_filter field
374b4b4bgrit-lib: CommitFilter in rev-list walks (author, grep, mailmap)
e20e5f8fgrit-lib: CommitFilter in rev-list walks (author, grep, mailmap)
da982434Fix empty-subtree dir false D/F descendant metadata
76826a59Merge engine: parsed-tree cache and touched-only walk
fe10aaa0Merge branch 'factory/daily-schema-2351'
33ed33d1bench: daily core repo shapes in fixture registry
ed2a6260fix: serialize disk-heavy index and UNTR campaign tests
5001d5d1chore: refresh public-api after diff structured API reorder
367a2362chore: clippy fixes for worktree scan glue
d4b18520bench: daily census report schema and scenario registry
7ff5d4cabench: refresh dashboard diff and add captures
69468f73fix: restore synthetic diff fixture before each hyperfine sample
70421dd3bench: dashboard numbers for 8d6be29c (v0.5.14)
45c888a2test: cover grit auth logout against real credential helpers
dfb3b4dfgrit auth: drive sign-in through grit-lib's device flow
1353661agrit-lib: add GitHub device-flow sign-in and helper listing
d9e412fafix(status): compact blob scan stats and defer index removals
0dfffb44Fix ignorecase tracked scan paths for case-only renames
dc006f92Fixes #1230: avoid double commit staging and use tracked scan with ignorecase
55d80f7cMerge factory/status-perf-1231 for #1239 tests
5dd2aeccperf(status): sparse parallel worktree scan without per-index slots
136a8427Merge branch 'factory/clone-receive-perf-1228'
066476a5Merge branch 'factory/untr-cache-1227'
c68facfbMerge branch 'factory/diff-markdown-mode-1229'
5211c42fFixes #1228: speed HTTPS clone receive path
8002c4e7Fixes #1227: revalidate UNTR tree before untracked fast path
2c613608perf(blame): affix-partition walk and tail-churn bench guard
bc65a79cfix(blame): drop same-index shortcut and restore full-file perf
44182026perf(blame): pending-aware diffs and -L fast paths
8d6be29cMerge branch 'factory/worktree-remove-autocrlf-1232'
de9935a7Fixes #1229: diff --markdown status and mode metadata
dc7c31b0test: exempt index write inject thread locals in hygiene scan
21a79141fix(diff): review follow-ups for compact JSON snapshots
07c762a2perf(diff): compact JSON and cap word-level on large diffs
1c11b2d1chore: rustfmt import order in worktree core
0c8b5f05Fixes #1232: inherit parent environment for linked worktree discover
37e55918Fixes #1231: speed status and diff on large deep worktrees
afaaca28fix: refs guard test uses store packed-refs path helper
7b64178cfix: mark history merge counters and index inject for hygiene
03011eecfix: hygiene exemptions for history test hooks and index inject
0e2d8b81fix: bench maintenance prepare gc base marker and UNTR campaign disk use
4da6d91cFixes #1216: error when two-arg grit diff has unknown revision
310303f3Fixes #1218: resolve log/revs/blame pathspecs from process cwd
bff9ba21fix: normalize macOS /private paths in relative_path_for_display
b3021ca6Merge branch 'factory/config-once-2447'
85e729b7fix: shallow deepen-relative grafts and config stamp invalidation
9b7b26c5grit-lib: config session caching and ≤2 config opens for grit log