grit://cooking/changelog← what’s cooking
Wednesday, October 21, 2026 · release v0.5.16

86 changes landed on main

42 roadmap steps across 9 items · 10 issue fixes · 34 other changes

grit v0.5.16 adds change ids on every commit and richer log, show, diff and status output, plus Windows fixes and speedups.

  • ›Change ids: stamped on new commits, kept on rewrites, shown in log/show/JSON, usable as revisions
  • ›log gains --oneline, --decorate, --graph, -p/--stat, author/grep filters, -S/-G; show takes several objects and REV:path
  • ›Windows fixes: build break, slow status after clone (#1304), worktree add (#1306), worktree list (#1307)
  • ›Fixes: gc now deltifies and packs loose objects (#1318, #1320); merge keeps unrelated local edits (#1321); fetch <url> leaves origin refs alone (#1319)
  • ›Status gains typed conflicts, --short, --ignored, paths and renames; commit gains --staged and path scopes; clone gains --shallow
  • ›Faster fetch, local clone, add, restore and branch list; SHA1DC checks, path validation, LTO dist profile
$ git log 4754ad0b..v0.5.16290 commits on GitHub ↗300+ files +12,792 −2,182
Highlightsmeasured by the reviewers, before → after
Speed: fetch/incremental@git-git
grit fetch/noop median (system git 50.7→50.8 ms)29× better████████████████████████ 1,456 ms █ 50.7 ms
commit scope: --staged, -- <paths>, commit.autoStage
commit/staged@synth-100k Git vs grit median11× better████████████████████████ 129.1 ms (before=Git, after=grit) ██ 11.9 ms (before=Git, after=grit)
Speed: clone/local@synth-10k
clone/local@synth-10k wall time (12 runs)9.5× better████████████████████████ 6,562 ms ███ 692.4 ms
Speed: add/modified@synth-10k
add/modified@synth-10k grit median7.9× better████████████████████████ 402.1 ms ███ 50.7 ms
grit gc still writes an undeltified pack (7x larger than git gc / grit repack) in v0.5.15; #1011 only fixed repack
small-repro gc pack size (origin/main → branch)7.7× better████████████████████████ 92 KiB ███ 12 KiB
roadmap · Performance census: every command, every repo shape, time and memory1 step
  • ›Functionality overview MATRIX.md and coverage testd1f7e5d9

    Adds a documented daily functionality matrix tying grit-lib areas and grit commands to benchmark scenario ids, with automated coverage against the live CLI and registry. The larger stack also supplies daily worktree/history/remote scenarios and deterministic fixtures; round 2 makes smoke gaps visible, rejects non-executable selections, rejects failed timing samples, and validates HTTP push parity on remote state.

    status/clean@small system git median: 51.0 ms (one-run smoke) → 50.5 ms (one-run smoke) (1% better)status/clean@small grit median: 50.8 ms (one-run smoke) → 58.8 ms (one-run smoke) (14% worse)status/clean@small grit/git ratio: 0.995 ratio (one-run smoke) → 1.2 ratio (one-run smoke) (14% worse)
roadmap · Shared diff output (diff, show, log -p)3 steps
  • ›diff --stat, --numstat, --shortstat, --name-only, --name-status446cc4ac

    Adds library-level diff detail modes and modern CLI renderings for stat, numstat, shortstat, name-only, and name-status, including totals and rename similarity. The latest fix repairs worktree rename detection and removes duplicate staged/unstaged discovery traversals, but introduces a hygiene-gate failure and does not close the required name-only performance gap.

    name-only mean: system git vs branch grit: 5.5 ms → 14.2 ms (61% worse)name-only median: system git vs branch grit: 5.4 ms → 13.4 ms (60% worse)stat mean: system git vs branch grit: 107.8 ms → 91.9 ms (17% better)stat median: system git vs branch grit: 104.6 ms → 86.2 ms (21% better)
  • ›grit log -p, --stat, --name-only, --name-status with files[] JSON66ff26b8

    Adds patch, stat, name-only, and name-status detail to `grit log`, with stable per-commit `files[]` and totals in JSON and matching human/Markdown renderers. The implementation centralizes file-diff construction in grit-lib, batches ordered commit diffs with serial/parallel policy support, and also consolidates `grit diff` detail rendering.

    origin/main vs branch: log --stat --limit 100 median: 811.5 ms → 223.5 ms (3.6× better)system git vs branch: log --stat 100 median: 238.4 ms → 223.5 ms (7% better)system git vs branch: log -p 200 median: 509.3 ms → 480.7 ms (6% better)
  • ›grit show P1: several objects, REV:path, --diff-merges9c302ceb

    Adds multi-object `grit show`, shared-resolver `REV:path` blob/tree display, and selectable first-parent or structured combined merge diffs. JSON keeps the single-object shape and wraps multiple results, while combined lines expose parent markers and correct line kinds; round-6 fixes restore raw binary stdout and align schemas/snapshots.

    grit show combined merge median: 27.2 ms (origin/main grit → branch grit, 50 runs) → 33.8 ms (origin/main grit → branch grit, 50 runs) (20% worse)Combined merge median versus system git: 15.6 ms (system git → branch grit, 50 runs) → 33.8 ms (system git → branch grit, 50 runs) (54% worse)Branch/system-git median ratio: 1 ratio → 2.2 ratio (54% worse)
roadmap · Close the biggest speed and memory gaps from the census2 steps
  • ›LTO release profile756aa953

    Adds a dedicated fat-LTO `dist` profile for shipped and benchmarked Grit binaries while preserving fast non-LTO `release` builds for development and release-mode tests. Release packaging, Make targets, benchmark binary resolution, and methodology docs are wired to that split.

    CLI file size: 25,537,456 bytes → 18,074,056 bytes (41% better)ELF .text size: 19,634,858 bytes → 17,741,817 bytes (11% better)Dynamic relocations: 28,911 count → 17,321 count (67% better)Trivial status median peak RSS (10 runs): 12,627,968 bytes → 10,610,688 bytes (19% better)
  • ›Re-run the matrix, refresh baselines, and record remaining gaps92cc965d

    Refreshes the dashboard benchmark evidence and adds a polling-independent headline suite with RSS measurements. The latest amendment restores real wall-clock timeout accounting and adds a regression test, but that amendment has not reached the exact Mesh integration source.

    Timeout reproduction outer wall: 1,056 ms → 1,008 ms (5% better)
roadmap · Revision selection and commit filtering (log, revs)6 steps
  • ›grit-cli: shared RevSelectArgs for log and revs; --cursor rename7255e1ce

    This stack adds shared revision-selection arguments to `log` and `revs`, range/date/ref-set support, resumable log cursors, and left/right counts. Round-4 removes a reentrant pack-reader cache and finishes since-cutoff walks correctly, but its cursor validation makes encoded range/date/ref cursors non-standalone.

  • ›grit-cli: --author/--committer/--grep filter flags on log and revs33d16292

    Adds reusable commit author, committer, and message filtering to revwalk and exposes it through modern `log` and `revs` flags, including mailmap handling and typed invalid-pattern errors. It also contains substantial revwalk, commit-graph, pack-index, and ODB hot-path work intended to make bounded filtered logs competitive with Git.

    git.git log-author-n50: system Git vs branch Grit: 2.5 ms median → 13.9 ms median (82% worse)git.git bounded unfiltered log: origin/main vs branch: 12.4 ms median → 11.9 ms median (5% better)
  • ›log display: --oneline, --decorate, --group-by author --count (P1)33d16292

    The review branch is empty: it points at the exact same commit as origin/main, where the log display correctness work is already integrated. The current implementation correctly renders decorations and empty JSON and groups authors compatibly, but its count-only git.git path is still substantially slower than the acceptance target.

  • ›Benchmark baselines and docs page refresh for revision selection63f740f6

    Adds a committed 11-scenario revision-selection benchmark baseline, publishes it through the docs benchmark tables, and registers 9 revision-selection workloads as their own daily census group. The review fixes make smoke runs use the small fixture, give commit-graph and no-graph rows genuinely different repositories, and preserve pending-row filtering coverage with synthetic plans.

    Smoke revs count-since: system Git vs branch Grit: 1.0 mean ms → 3.4 mean ms (70% worse)Smoke author log n=50 with commit-graph: system Git vs branch Grit: 1.5 mean ms → 3.5 mean ms (57% worse)
  • ›grit-lib + log: pickaxe -S and -G (P1)6f8017f3

    Adds library-first pickaxe filtering for revision walks and exposes `-S`/`-G` through `grit log` and `grit revs`, including path and bounded-walk behavior. The round-3 patch replaces Rust leftmost-first regex matching with POSIX ERE semantics and restores Git-compatible relative shallow-fetch boundaries.

    log-pickaxe-S mean wall time (system Git control vs branch grit): 2.5 seconds → 2.9 seconds (13% worse)log-pickaxe-S peak RSS mean (system Git control vs branch grit): 224.1 MB → 232.7 MB (4% worse)
  • ›log --graph (human only) (P1)478b2561

    Adds a library-owned topological graph walk and lane layout, then renders it for human `grit log --graph` output while keeping JSON rejected and Markdown graph-free. It also carries the associated shared commit display/filter/grouping work, schema updates, snapshots, compatibility tests, docs, and benchmark registration present in the reviewed stack.

    log --graph -n 1000 median, system git control vs branch grit: 0.060 seconds → 0.166 seconds (64% worse)grit/system-git median ratio: 1 x → 2.7 x (64% worse)
roadmap · Change ids on every commit9 steps
  • ›grit-lib: ChangeId type, commit-header helpers and policydcb4d9fd

    Adds a public change-ID model for stable logical commit identity, including reverse-hex generation/parsing, deterministic fallback derivation, commit-header read/write helpers, config policy, and injectable randomness. It documents the API and verifies ordinary and SSH-signed commit interoperability with system Git.

  • ›History engine: rewrites keep the change id and store derived idsfa1c2bf4

    History rewrite planning now gives rewritten commits a stable logical identity. Existing primary, legacy, and custom commit headers survive rewrites byte-for-byte except cryptographic signatures; headerless rewrites store the deterministic id of the original commit, while inserted split commits receive a fresh id.

    Criterion history rewrite median: 65.0 ms → 65.3 ms (0% worse)daily history/reword Grit median: 168.0 ms → 165.4 ms (2% better)daily history/reword peak RSS: 46,501,888 bytes → 47,108,096 bytes (1% worse)daily history/reword Grit/system-Git ratio: 0.026 ratio → 0.025 ratio (5% better)
  • ›New commits get ids: commit, initial commit, amend, merge conclusion1351f0eb

    New commits created through the porcelain commit API now receive stable change-id headers, including initial and merge-conclusion commits. Amend preserves an existing ID or derives one from a headerless old tip, while disabling grit.changeIds preserves Git-identical object bytes and auxiliary stash/notes commit writers remain generic and ID-free.

  • ›Show it: change_id in commit JSON, human log and show60df4260

    Commit change IDs now travel from parsed commit data through shared library summaries into log, show, revs, and status JSON. Human and Markdown log/show output expose an eight-character change code while oneline output remains unchanged.

  • ›Merge, pick and revert commits get new ids0d7fc22c

    Clean merges and single-commit replay now stamp commit objects with a newly generated change-id before writing them. Pick never carries the source id, revert gets its own id, pull inherits clean-merge behavior, and command docs state the policy.

    merge/clean@synth-10k wall time: 231.4 ms median (+1.535%) → 234.9 ms median (+1.535%) (2% worse)pick/one@synth-10k wall time (repeat): 197.5 ms median (+1.272%) → 200.0 ms median (+1.272%) (1% worse)
  • ›Re-sign rewritten commits when signing is configured3c940ab4

    History rewrites now optionally re-sign every replacement commit through the same serialization/signing path used by normal commits. CLI dry runs explicitly disable signing, while normal rewrites honor commit.gpgsign and abort planning with a typed error if signing fails.

    history/reword@synth-10k median: 160.5 ms → 156.8 ms (2% better)history/reword@synth-10k peak RSS: 44,838,912 bytes → 44,273,664 bytes (1% better)system Git control median: 6,326 ms → 6,432 ms (2% worse)
  • ›Mutation results report change idscdf9770d

    Mutation outcomes now carry the commit's logical change id through grit-lib and expose it consistently in commit, merge, pull, pick, revert, and history JSON/Markdown output. The review follow-up also preserves derived ids when rewriting headerless Git commits and repairs all enum-pattern, snapshot, schema, and unborn-pull gaps identified in round 1.

  • ›P1: use a change id (or unique prefix) as a revision9649b024

    This adds reverse-hex change ids and unique prefixes as shared revision bases, allowing navigation and ranges to compose through existing rev-parse. It also adds typed ambiguity metadata, CLI rendering in three object-inspection commands, focused tests, docs, and a daily git.git benchmark row.

    resolve/change-id@git-git system-git comparator vs review branch median: 87.1 ms → 729.7 ms (88% worse)resolve/head-n@git-git origin/main vs review branch median: 4.7 ms → 4.6 ms (2% better)
  • ›End-to-end change-id compatibility suite and guide8f03e876

    Adds one end-to-end CLI workflow proving stable change ids survive amend and history rewrites, while pick and revert allocate new ids and change-id prefixes resolve correctly. It also documents the on-disk header, Git/Jujutsu/GitButler/Gerrit interoperability, configuration, JSON fields, and revision syntax.

roadmap · use the SHA1DC library for faster SHA14 steps
  • ›Split checksum hashing from object-id hashing60851513

    This separates corruption checksums from Git object identities while preserving SHA-1/SHA-256 bytes and streaming behavior. The review follow-up closes the two remaining leaks by moving the production index trailer and the large-pack test helper to ChecksumHasher, then adds a source-level regression guard.

  • ›Hash benchmark harness and before-baselines vs system gitb2f47037

    Adds separate Criterion coverage for raw digests, Git object IDs, and hashing-writer checksums, plus a reproducible end-to-end hash benchmark suite against system Git. The follow-up correctly labels the library-driven hash-object row and makes the benchmark executable injectable.

    Raw SHA-1 1 MiB Criterion midpoint: 503.4 µs → 501.0 µs (0% better)
  • ›sha1dc for object ids on ingestion paths, typed collision error049b6991

    SHA-1 object IDs on ingestion now use sha1dc collision detection and return a typed HashCollision error, while checksum-only hashing remains on the accelerated plain SHA-1 path. The round-two fix closes the raw loose-object bypass by parsing serialized objects and checking their typed payload before storage, and records all new public interfaces in the API snapshot.

    hash_object_sha1/64MiB median estimate: 32.0 ms → 38.9 ms (18% worse)hashing_writer_sha1/64MiB median estimate: 32.1 ms → 32.7 ms (2% worse)64MiB object-hash throughput versus system Git: 558.2 MiB/s (Git before, reviewed grit after) → 1,645 MiB/s (Git before, reviewed grit after) (2.9× better)
  • ›grit CLI: render collision errors and fsck findingsf28b4248

    The CLI now emits a stable `hash_collision` JSON error with the colliding digest while keeping grit's own human wording. Repository fsck exposes detected SHA-1 chosen-prefix collisions consistently in human, JSON, and Markdown output, and fetch/pull avoid remapping unrelated remote errors.

roadmap · Research Gitoxide and look for good ideas9 steps
  • ›Fuzz targets for grit-lib parsers1949f7d7

    Adds a standalone nightly cargo-fuzz crate covering 14 grit-lib parser surfaces, real Git-generated seeds, and stable corpus replay so parser crashes become ordinary test regressions. The review follow-up closes the index short-body panic and makes scheduled fuzz failures retain crash artifacts while remaining non-blocking.

  • ›Optional zero-cost tracing spans430359bb

    Adds optional operation-level spans throughout grit-lib and a minimal env-controlled stderr span-tree renderer in grit. With tracing disabled, grit-lib’s normal dependency graph excludes tracing; with `GRIT_TRACE=1`, status and related commands show nested operation durations.

    dist grit binary size: 18,450,776 bytes → 18,439,376 bytes (0% better)
  • ›Path component validator (gix-validate style)89e53623

    Adds a public, typed path-component validator that centralizes ASCII, NTFS, HFS, separator, NUL, and symlinked special-file rules. Tree fsck and porcelain path normalization now consume that shared rule set, with unit and system-Git parity coverage.

  • ›One LockFile type with Git's lock-timeout backoff46945134

    This introduces one reusable grit-lib lock-file abstraction and migrates repository writers to exclusive acquisition with bounded, jittered retry. The round-2 patch corrects Git-compatible timeout units and negative timeout semantics, and makes explicit rollback actually release the owned lock.

    commit-10000 grit mean: 76.5 ms → 73.1 ms (5% better)commit-10000 grit/system-git ratio: 0.408 ratio → 0.384 ratio (6% better)commit-10000 grit peak RSS: 20,320,256 bytes → 20,783,104 bytes (2% worse)
  • ›Borrowed commit view (CommitRef)8a17ee86

    Adds a public borrowed `CommitRef` that parses commit headers and message bytes without owning identity/message strings, then makes owned `parse_commit` a thin conversion. Hot commit-graph-miss paths use the borrowed view, while verbatim header preservation keeps every accepted commit body byte-identical on reserialization.

    100k commit parse: 50.3 ms → 13.0 ms (3.9× better)full topo revwalk without commit graph (confirmation run): 53.0 ms → 49.1 ms (8% better)full topo revwalk with commit graph (confirmation run): 13.6 ms → 13.8 ms (1% worse)first-1000 log without commit graph: 0.463 ms → 0.448 ms (3% better)
  • ›Fast OID hash maps (gix-hashtable style)ac39e486

    Adds specialized ObjectId hash maps and sets backed by hashbrown, then migrates OID-heavy internal caches and graph/pack/fsck/revwalk tables while preserving standard containers at public commit-graph boundaries. It also adds focused API tests and a 1M-key Criterion benchmark, but the insert benchmark currently gives only the new map a reserved capacity.

    1M insert median (submitted asymmetric benchmark): 143.8 ms → 68.2 ms (2.1× better)10k lookup median over 1M map: 411.5 us → 185.6 us (2.2× better)10k contains median over 1M set: 437.8 us → 209.7 us (2.1× better)
  • ›Enforce path validation at index population and checkout9f2883ab

    This change rejects hostile Git tree and index paths before they can populate an index or reach a checkout write, while preserving legitimate add pathspecs and allowing users to switch away from a hostile current index. It also returns a typed path-component error and applies repository `protectNTFS`/`protectHFS` configuration through restore, sparse-index, and related tree walks.

  • ›Zero-copy tree iteration (TreeRefIter)6c25bb41

    Adds borrowed tree entries and a zero-copy iterator over raw Git tree objects, then migrates object-walk, fsck, pack, rev-list, and diff hot paths to consume entries in place. Existing owning parse APIs remain available through the same parser, with malformed input and SHA-256 parity covered by tests.

    parse_tree, 10k-entry tree: 658.7 µs → 614.7 µs (7% better)10k-entry tree iteration: owning parse_tree vs borrowed TreeRefIter: 614.7 µs → 312.7 µs (97% better)
  • ›Read-into-buffer ODB API1353e6fa

    Adds a caller-buffer ODB read API and native loose/pack implementations, then uses borrowed tree iteration in hot object walkers. The round-4 correction fixes delta-frame ordering and avoids unsafe LRU population from reusable buffers while preserving owned-read cache behavior.

    Packed deep-delta owned read: 51.3 µs → 49.4 µs (4% better)Packed deep-delta reusable-buffer path (origin/main owned read vs branch read_into): 51.3 µs → 32.4 µs (58% better)
roadmap · implement tree-sha256 commit/tag headers2 steps
  • ›Preserve extra headers on tag objects31e006df

    Annotated tag objects now retain raw noncanonical headers after the canonical tagger and emit them unchanged. Shared raw-header utilities support iteration, multi-value lookup, replacement, and change-id header manipulation, while all TagData construction sites initialize the new field.

  • ›Signed annotated tags and `grit tag --sign`89a25720

    This adds cryptographically signed annotated tags through the public library API and the modern `grit tag` command. Signed tag objects append armored SSH or OpenPGP signatures after the tag message in Git's on-disk layout, and create JSON now reports whether signing occurred.

roadmap · Precise commits: status, add, commit6 steps
  • ›status: typed conflicts and operation with next_steps277ea2f8

    Status now reports typed conflict objects and a typed paused-merge operation model across the library and all CLI output formats. The round-3 correction separates abort from the ordered completion path, so following `next_steps` can no longer commit a merge and then attempt an invalid abort.

  • ›Shared PathspecArgs backed by one grit-lib resolvere19a8885

    Adds one typed grit-lib resolver for command-line and file/stdin pathspecs, then routes add, rm, restore, and clean through shared CLI arguments. Empty and malformed records now fail before a scoped operation can accidentally target the whole work tree, while LF quoting and NUL literal behavior are covered against system Git.

  • ›status: upstream object separate from target, --no-ahead-behind7cd3c280

    Status now computes branch standing in grit-lib and keeps target and configured upstream as separate comparisons. The CLI renders target counts, a distinct upstream line, and pull hints from that typed result, while `--no-ahead-behind` and config can skip history walks.

  • ›commit scope: --staged, -- <paths>, commit.autoStage88912b71

    Adds explicit commit scopes to the linkable library and exposes them through `grit commit`: auto-stage, staged-index-only, and Git-compatible path-only commits. Partial commits preserve unrelated staged entries, use a temporary hook index, update the real index only after the ref succeeds, and report a stable JSON scope.

    commit/small@synth-100k grit median: 25.2 ms → 24.5 ms (3% better)commit/staged@synth-100k Git vs grit median: 129.1 ms (before=Git, after=grit) → 11.9 ms (before=Git, after=grit) (11× better)commit/paths@synth-10k Git vs grit median: 6.6 ms (before=Git, after=grit) → 35.6 ms (before=Git, after=grit) (82% worse)
  • ›status: paths, -u/-uno, renames with old_path321b1c5f

    Adds config-derived status options, path-limited status across staged/unstaged/untracked/conflict sections, default rename detection with old/new path reporting, and Git-style `-u` forms. Shared pathspec argument resolution remains library-first, while the CLI only normalizes argv, forwards resolved pathspecs, and renders the additive `old_path` JSON field.

    clean status synth-100k median: 158.0 ms (origin/main vs review; system git 61.849 ms) → 157.1 ms (origin/main vs review; system git 61.849 ms) (1% better)dirty status synth-100k median: 156.9 ms (origin/main vs review; system git 64.835 ms) → 157.6 ms (origin/main vs review; system git 64.835 ms) (0% worse)path-limited status synth-100k median: 17.7 ms (system git vs review) → 84.8 ms (system git vs review) (79% worse)
  • ›status P1: --ignored, --short, stash_count260b7d1c

    Adds opt-in ignored-path collection, concise two-column human status output, and stash counts while keeping JSON stable except for the documented fields. The round-five repair makes ignored collection independent of untracked display and represents rename endpoints structurally so filenames containing ` -> ` cannot be reparsed incorrectly.

    status/clean@synth-10k median wall: 17.8 ms → 17.9 ms (1% worse)status/clean@synth-10k ratio vs system git: 2.2 x → 2.2 x (1% worse)status/dirty@synth-10k median wall: 18.7 ms → 19.1 ms (2% worse)status/dirty@synth-10k ratio vs system git: 1.6 x → 1.7 x (2% worse)
issues fixed10
  • ›Windows: grit worktree list inside a linked worktree prints the main worktree path with a \\?\ verbatim prefix#130790e06897

    Worktree enumeration now strips Windows verbatim path prefixes from the main worktree when discovery starts in a linked checkout. All list renderers use a Git-style display path, and detached worktrees receive an explicit human label.

    worktree list --json median, debug build, 300 interleaved runs (system git control: 1.282 ms): 5.3 ms → 5.6 ms (5% worse)
  • ›Windows main: first grit status after a git clone takes 6.5s on cargo (git: 0.14s); stash push -u then 5-14s#13040806cea4

    This change makes Windows worktree scanning reconcile directory-entry metadata with the same path-based stat representation Git records after clone. It also keeps successful scan metadata when the confirmation probe fails and ensures the reconciliation work is absent from non-Windows hot paths.

    10k-file clean status, debug binary, 25 batched medians: 23.2 ms → 21.8 ms (6% better)
  • ›Windows: grit worktree add on cargo takes 3.2-4.4s (git worktree add: 1.06s), ~3-4x slower#1306b3922e9b

    Populated worktree checkout now diffs the empty tree against the target and sends the resulting additions through grit's existing bulk/parallel checkout machinery. It removes the old serial blob-read/write walk and its dedicated progress adapter while preserving index construction and conversion rules.

    Packed synth-10k worktree add median (7 warm-cache alternating runs): 440.6 ms → 158.2 ms (2.8× better)Worktree add ratio versus system Git median: 3.0 x system Git → 1.1 x system Git (2.8× better)
  • ›grit stash pop/apply rewrites CRLF working files to LF with core.autocrlf=true (git restores CRLF)#13050696ac87

    Stash apply and pop now write regular files through the repository's worktree conversion rules instead of copying normalized object bytes directly. This preserves CRLF on disk with core.autocrlf=true for both tracked changes and include-untracked stash contents.

  • ›main does not compile on Windows: grit-lib worktree_scan.rs references undefined `blobs` (E0425/E0308)#1303787a31e5

    Repairs two stale Windows-only worktree scan paths so metadata is converted to the current compact stat type and the one-entry optimization uses the current index-based inputs. It also adds a PR CI check that type-checks grit-lib for the Windows MSVC target from Ubuntu.

  • ›grit gc still writes an undeltified pack (7x larger than git gc / grit repack) in v0.5.15; #1011 only fixed repack#1318396520a5

    This changes gc’s first-pack build from byte-reuse-only packing to normal delta search, so histories with repeatedly edited blobs no longer balloon when maintained. It also makes the full gc command actually silent under `-q` and adds a Git-backed regression test.

    small-repro gc pack size (origin/main → branch): 92 KiB → 12 KiB (7.7× better)small-repro gc runtime (origin/main → branch, debug builds): 0.256 seconds → 0.299 seconds (14% worse)small-repro runtime (system git gc → reviewed grit gc, debug build): 0.026 seconds → 0.299 seconds (91% worse)
  • ›fetch --prune leaves empty refs/remotes/<remote>/<dir>/ so later fetch fails: corrupt ref store (os error 5)#1317b041a515

    Loose ref deletion now removes its transaction lock before walking upward to remove empty ref directories. A regression test exercises pruning `origin/feature/x`, verifies the empty `feature/` directory disappears, then confirms a later fetch can create the file ref `origin/feature`.

  • ›grit gc: 'repack: nothing to pack' leaves 100+ loose objects when repo already has a pack (git gc packs them)#13202c14376f

    Explicit garbage collection now always performs the same full repack as `grit repack`. Loose objects created after an existing pack are folded into the pack and redundant loose copies are removed instead of being silently skipped by auto-maintenance heuristics.

    Tiny one-file GC wall time (system git → fixed grit-lib): 0.027 seconds → 0.013 seconds (2.1× better)
  • ›grit merge refuses any uncommitted change, even in files the merge doesn't touch (git and grit switch allow it)#13210c4d28e0

    Merge now carries unrelated local edits and trusted worktree deletions across fast-forward, clean three-way, and conflicted integrations while still refusing paths the merge would overwrite. Pull inherits the same scoped behavior, replay operations retain their full clean-worktree checkout, and the generated CLI skill snapshot is current.

  • ›grit fetch <path-or-url> overwrites refs/remotes/origin/* with the foreign repo's refs#1319e239b033

    Ad-hoc path, URL, and bundle fetches no longer impersonate `origin`: they fetch objects without assigning configured remote-tracking destinations and write the selected result to FETCH_HEAD. Bundle completion and explicit refspec handling now share matched-ref-based FETCH_HEAD generation.

other changes34
  • ›Fix the v0.5.15 release build336047d1

    Repairs the Windows-only single-entry worktree scan after an earlier refactor left it referring to a removed collection and returning the wrong metadata type. The change reuses the current index-entry helpers and the same metadata conversion as the generic directory path.

  • ›Follow-up: log display: --oneline, --decorate, --group-by author --count (P1)d9131704

    Adds modern log display modes and shared structured commit output, with library-first author grouping and a specialized count-only pack scan. The round-3 fix correctly removes the `-n` lookahead before author grouping and adds a direct regression, but the optimized count path still does not meet its required release performance bound.

    git.git author-group wall time (system Git vs reviewed grit): 651 ms → 1,148 ms (43% worse)git.git author-group slowdown ratio: 1 x → 1.8 x (43% worse)git.git author-group peak memory (system Git vs reviewed grit): 124.2 MiB → 119.5 MiB (4% better)
  • ›Quality #4: Library API qualityd922772f

    This change makes notes operations a repository-scoped, typed library API and routes note ref updates through the configured RefStore. It closes lost-update races by carrying the notes tip into a CAS and by holding all per-update files-backend write-target locks from validation through persistence, including symbolic HEAD updates.

    notes/add median: origin/main grit → branch grit: 50.6 ms → 50.7 ms (0% worse)notes/list median: origin/main grit → branch grit: 50.6 ms → 50.6 ms (0% worse)branch/create median: origin/main grit → branch grit: 50.7 ms → 50.7 ms (0% better)branch/delete median: origin/main grit → branch grit: 50.7 ms → 50.7 ms (0% better)
  • ›Main keeper: make CI on main green (test, test-threaded, public-api, bench-daily-smoke)29417912

    Replaces the previous histogram line selection with a bounded Rust implementation that matches system Git’s hunk boundaries and cannot duplicate indexed line classes. It also fixes one-sided changed-flag tails and minimal repeated-anchor coalescing so zero-context diffs terminate and shape hunks like Git.

  • ›Quality #6: Dead code and dependenciesc6812d0e

    Removes unused dependencies and 537 net lines of private dead code across grit-lib and grit-cli. Test-only helpers are now compiled only for unit tests, stale dead-code suppressions are removed, and one checkout test that lacked #[test] is activated.

    add/modified@synth-10k: 50.7 ms → 50.7 ms (0% worse)gc/pack-refs@synth-10k: 50.7 ms → 50.6 ms (0% better)repack/full smoke: 101.1 ms → 100.7 ms (0% better)status/clean@synth-10k: 50.8 ms → 50.7 ms (0% better)
  • ›Follow-up: grit show P1: several objects, REV:path, --diff-merges5127de02

    This adds multi-object show, REV:path lookup, shared diff-format rendering, and first-parent/combined merge display through grit-lib-backed APIs. The final fixes preserve raw binary blob bytes, correctly expose per-parent combined statuses, handle combined deletions, omit merge log stats like Git, and synchronize the generated JSON schemas.

  • ›Follow-up: Whitespace modes: -w, -b, --ignore-blank-linescbae4394
  • ›Speed: add/modified@synth-10k11420e85

    This replaces repeated linear pathspec validation with a conservative binary-search path for ordinary literal specs, avoids per-comparison allocations in directory-prefix matching, and delays the HEAD tree walk until index/worktree paths cannot answer a spec. The CLI and public API are unchanged.

    add/modified@synth-10k grit median: 402.1 ms → 50.7 ms (7.9× better)add/modified@synth-10k peak RSS: 21.2 MiB → 15.2 MiB (40% better)add/modified@synth-10k system git vs branch: 50.7 ms → 50.7 ms (0% worse)add/all@synth-100k grit median: 753.6 ms → 753.3 ms (0% better)
  • ›Quality #8: Deduplicate6e9dcd42

    Centralizes strict commit/tag identity lines and best-effort reflog identity lines in grit-lib, then turns the CLI helpers into thin forwards. Repository-backed merge, checkout reflog, and notes paths now share the repository clock instead of rebuilding clock and environment logic independently.

    commit-10000 grit median: 78.2 ms → 64.2 ms (22% better)stash-push-pop-10000 grit median: 357.6 ms → 354.3 ms (1% better)switch-10000 grit median: 28.3 ms → 28.0 ms (1% better)switch-wide-10000 grit median: 53.7 ms → 53.0 ms (1% better)
  • ›Main keeper: make CI on main green (rustdoc, test-threaded, coverage, test)abd9a751

    This replaces the histogram unified-diff emission path with Git-compatible changed flags plus the shared unified emitter, while removing the obsolete imara conversion helper. It preserves shifted duplicate-line alignments and clears the clippy blocker found in round 2.

  • ›Follow-up: grit-cli: shared RevSelectArgs for log and revs; --cursor renamee7166a8d

    Log pagination hints now tell users to continue with only the opaque cursor, including on the first page of a revision range. Cursor continuation also rejects repeated revision, date, and ref-set selectors so the token is the sole source of the resumed query.

  • ›Speed: fetch/incremental@git-git592cfc20

    This change removes unchanged local tags from default tag-following before reachability analysis, and makes the remaining commit walk stop once every candidate tag target is found. It also caches ref backend detection and packed refs for the tag scan, eliminating two full-history walks on common incremental and no-op fetches.

    grit fetch/incremental median (system git 151.1→151.0 ms): 1,406 ms → 50.7 ms (28× better)grit fetch/incremental peak RSS: 115.5 MB → 28.8 MB (4.0× better)grit fetch/noop median (system git 50.7→50.8 ms): 1,456 ms → 50.7 ms (29× better)grit fetch/noop peak RSS: 106.0 MB → 12.6 MB (8.4× better)
  • ›Speed: pull/fast-forward@git-git0e99bc62

    Makes grit-bench ignore ESRCH when a process disappears between process-tree discovery and reading `/proc/<pid>/status`. Adds focused errno, exited-process, and high-churn process-tree regression tests; grit-lib and grit-cli behavior are unchanged.

    pull/fast-forward grit wall time (12 runs): 1,355 ms → 1,305 ms (4% better)pull/fast-forward git control (12 runs): 151.1 ms → 151.0 ms (0% better)fetch/incremental grit wall time (12 runs): 1,355 ms → 1,305 ms (4% better)
  • ›Follow-up: log display: --oneline, --decorate, --group-by author --count (P1)7aeecb2f

    This change replaces the slow author-grouping walk with pack-, bitmap-, and commit-graph-aware counting paths while retaining safe ODB fallbacks. The round-four correction ensures deltified commits cannot reuse a previous commit’s cached header bytes, so complete reachable history is counted without sacrificing the measured speedup.

    grit author-group benchmark mean: 1,258 ms → 448.8 ms (2.8× better)grit/system-git time ratio: 1.7 × → 0.612 × (2.8× better)
  • ›Follow-up: Re-run the matrix, refresh baselines, and record remaining gapsd545063b

    Refreshes the committed performance matrix and dashboard data, adds daily headline/worktree benchmark coverage, and records the measured gaps in the docs. The reviewed follow-ups make capped runs report true parent-observed elapsed time and repair the malformed show-head snapshot.

  • ›Main keeper: make CI on main green (coverage, test, public-api, test-threaded)6a4b2f4b

    Adds functional `grit diff --no-index` handling with correct line statistics, differ/error exit-code separation, and dashed-path support after `--`. It also repairs stale diff API tests/snapshots and scopes Clap parsing so ordinary diff flags and path limits are not mistaken for revisions.

  • ›add --shallow to grit clone8831bf36

    Adds `grit clone --shallow` as a depth-1 clone backed by public library depth support, with human/JSON/Markdown output, documentation, and Git compatibility tests. Round 4 correctly restores annotated tags on the fetched tip without putting tag object IDs in `.git/shallow`, but the same logic drops annotated tags on non-tip commits that are still inside a depth greater than one.

  • ›Follow-up: add --shallow to grit clone570be064

    Adds depth-limited clone support through the public library API and the modern `grit clone --shallow` flag. The follow-up makes default tag-following preserve annotated tags anywhere inside the fetched shallow commit closure—such as a depth-2 parent—without importing tags on unreachable history.

    Full clone debug smoke, grit (200 commits): 1,521 median ms over 7 runs → 1,601 median ms over 7 runs (5% worse)Shallow clone debug smoke, grit vs system git baseline: 9.6 median ms (system git before, review grit after; 7 runs) → 1,597 median ms (system git before, review grit after; 7 runs) (99% worse)
  • ›Main keeper: make CI on main green (coverage, scripts, check-windows-msvc, test, test-threaded)6be19b68

    This branch restores the missing patch-text diff path, makes no-index patch output usable, honors worktree rename flags, and fixes the CI-specific canonical-module, Windows ERE, snapshot, schema, and public-API consistency issues. The round-3 addition records the new library API and directly exercises it from grit-lib.

  • ›Quality #7: Move logic into grit-lib67f4639f

    Moves branch and tag listing/deletion policy and ref manipulation from grit-cli into documented grit-lib porcelain APIs. Deletion now uses repository-bound ref stores with compare-and-swap checks and reflog cleanup, including files, reftable, and injected memory backends; the round-3 store optimization removes the transaction overhead that previously made tag deletion unacceptably slower.

    Packed tag delete trial 1 (origin/main → branch): 10.3 ms median, 30 interleaved runs → 10.4 ms median, 30 interleaved runs (1% worse)Packed tag delete trial 2 (origin/main → branch): 9.7 ms median, 30 interleaved runs → 9.7 ms median, 30 interleaved runs (0% better)Loose tag delete trial 1 (origin/main → branch): 2.2 ms median, 30 interleaved runs → 2.3 ms median, 30 interleaved runs (3% worse)Loose tag delete trial 2 (origin/main → branch): 2.3 ms median, 30 interleaved runs → 2.3 ms median, 30 interleaved runs (4% worse)
  • ›Quality #9: Simplify3e5dee67

    Deletes the unused second implementation of branch tracking/status comparison and its embedded Git-style prose. The remaining push-side tracking updater now reads one remote's fetch refspecs once per push instead of reloading config for every pushed ref.

    grit-bench file push, 3 commits: 2.9 ms → 2.8 ms (3% better)grit-bench grit-HTTP push, 3 commits: 11.5 ms → 11.1 ms (4% better)500-tag file push: 1,053 ms → 1,030 ms (2% better)
  • ›Quality #10: Library API quality3d4bd964

    Missing references now have a structured `RefStoreError::NotFound { name }` across every ref backend and public helper. Repository-backed HEAD resolution can therefore distinguish an unborn branch from corruption, while CLI rendering preserves branch-friendly messages without parsing error text.

    status dirty median, 10k files (system git controls: 10.255/10.307 ms): 8.7 ms → 8.9 ms (2% worse)status clean median, 10k files (system git controls: 8.027/7.797 ms): 7.6 ms → 7.7 ms (2% worse)resolve HEAD~20 median (system git controls: 1.234/1.282 ms): 2.8 ms → 2.8 ms (2% better)
  • ›Main keeper: make CI on main green (coverage, test-threaded, check-windows-msvc, test, clippy, rustdoc, public-api, scripts)7a1294d9

    Adds the three missing canonical-module mappings, fixes the Windows-only unused parameter and a private rustdoc link, preserves rustfmt import order, and updates the shared commit JSON shape assertion for change IDs. The changes are mechanical CI repairs with no production behavior change except eliminating a Windows compile warning.

  • ›Follow-up: P1: use a change id (or unique prefix) as a revisione714d4ed

    This change removes stale persisted and in-memory negative change-id probe results, clears legacy `absent` markers, and invalidates probe state after relevant in-process ODB changes. It adds the requested regression proving a stored change id added after a headerless packed-repository probe resolves on both the same and a reopened repository handle.

    packed headerless change-id resolve median: 819.6 ms (15 warmed runs) → 955.3 ms (15 warmed runs) (14% worse)resolve time relative to system-git comparator: 1.3 ratio → 1.6 ratio (14% worse)
  • ›Main keeper: make CI on main green (coverage, fmt, test, scripts, test-threaded)a5e14de8

    This change keeps histogram hunk alignment compatible with stock Git 2.43 when `-w` or `-b` normalizes lines, while preserving the merged-group Myers rediff used by the raw histogram path. It also makes the Git-parity history reword test opt out of change IDs and applies the pending JSON formatting fix.

  • ›Speed: clone/local@synth-10k4842d952

    Local file clone and empty-bare push now serialize exactly the objects still absent after source packs are linked, instead of rewalking loose tag tips and repacking the entire reachable history. Pack lookup and peer-boundary probing are also made scalable by a cached offset-sorted index and one pack-directory refresh per walk.

    clone/local@synth-10k wall time (12 runs): 6,562 ms → 692.4 ms (9.5× better)clone/local@synth-10k peak RSS: 117.1 MiB → 62.7 MiB (87% better)clone/local system git control: 1,006 ms → 986.8 ms (2% better)clone/http@synth-10k wall time (12 interleaved runs): 1,977 ms → 1,397 ms (42% better)
  • ›Main keeper: make CI on main green (public-api, coverage, bench-scenarios-smoke, clippy, scripts, test, test-threaded)a12cc498

    This branch repairs the identified main-CI failures and makes status conflicts visible in human and Markdown output. The round-two patch aligns conflict formatting with other status sections and adds a realistic two-file merge-conflict regression test, including a path containing a backtick.

  • ›Quality #11: Move logic into grit-lib5bddfd8e

    Stash apply and pop now return a library-owned outcome containing sorted, de-duplicated conflict paths, while the existing bool APIs remain thin compatibility wrappers. The CLI only maps that outcome into its unchanged human, Markdown, and JSON shapes, removing its duplicate stash lookup and second index read.

    stash/push-pop@synth-10k mean of two paired rounds: 547.0 ms → 501.8 ms (9% better)stash/list@synth-10k mean of two paired rounds: 3.4 ms → 3.4 ms (1% worse)stash push/pop peak RSS mean: 23,293,952 bytes → 23,257,088 bytes (0% better)stash list peak RSS mean: 11,524,096 bytes → 11,462,656 bytes (1% better)
  • ›Follow-up: Fast OID hash maps (gix-hashtable style)eae17cb8

    Introduces specialized hashbrown-backed maps and sets for ObjectId keys, then migrates object-heavy internal caches to them while preserving standard HashMap/HashSet at public API boundaries. The follow-up also restores collision-safe hashing/fsck reporting and lock waiting that had regressed during the migration, and makes the insertion benchmark capacity-fair.

    Fair pre-sized 1M inserts, SipHash reference → OID/hashbrown: 75.3 ms median → 19.6 ms median (3.8× better)
  • ›Main keeper: make CI on main green (clippy, coverage, scripts, fmt, test-threaded, test)ec680da8

    This change makes the hostile-path coverage test find the instrumented grit binary, refreshes the stale generated-skill snapshot, and limits concurrent links in the debug workspace CI test step. It changes no product behavior, public API, or Git on-disk/wire format.

  • ›Speed: restore/paths@synth-10kf422ac24

    This change prepares literal pathspec lists once and matches index/tree paths with hash lookups instead of reparsing and scanning every pathspec for every entry. Restore keeps the existing general matcher for globs, magic, excludes, Unicode precomposition, and metadata-sensitive contexts.

    restore/paths grit median: 96.8 ms → 14.8 ms (6.5× better)restore/paths ratio vs system git: 7.1 x → 1.2 x (6.0× better)restore/paths peak RSS: 17.6 MiB → 17.4 MiB (1% better)add/modified grit median: 19.4 ms → 19.5 ms (0% worse)
  • ›Quality #12: Dead code and dependencies694e07e4

    Removes an unused EWAH XOR implementation and its dispatch/storage indirection, an ignored files-ref-store reflog setting, and several stale dead-code allowances or genuinely uncalled helpers. The result is 25 additions and 296 deletions across 19 files, with a substantially faster EWAH expansion path.

    Criterion EWAH expand point estimate: 31.8 µs → 19.0 µs (68% better)Criterion EWAH or_into point estimate: 12.9 µs → 12.3 µs (5% better)Criterion EWAH popcount point estimate: 5.8 µs → 5.6 µs (4% better)grit rev-list --count --all median (system git: 77.164 before, 63.611 after): 1,187 ms → 959.3 ms (24% better)
  • ›Main keeper: make CI on main green (coverage, test, test-threaded)71a2b7f1

    This makes histogram diffs with `-w`/`-b`-style comparison produce Git 2.55-compatible hunk bodies after change-group compaction. It also reduces the debug workspace test job to one concurrent Cargo build so lld does not repeat the observed signal-7 crashes.

  • ›Speed: branch/list@many-refs95480426

    This change replaces full packed-refs parsing on sorted prefix lookups with a validated line index and bounded strict scan. It also makes the tail safety check repository-hash-aware, so malformed SHA-256 packed-refs cannot silently produce an empty branch list.

    packed branch-list A/B median: 16.0 ms → 10.5 ms (52% better)packed branch-list peak RSS: 13.2 MiB → 12.8 MiB (3% better)branch-create A/B median: 45.1 ms → 28.6 ms (58% better)branch-create peak RSS: 22.2 MiB → 20.4 MiB (9% better)
$ git log --oneline 4754ad0b..v0.5.16compare on GitHub ↗
6c25bb41Register lockfile, path_validate, and fuzz in canonical module map
fe47cb18Relax trace span test after revwalk setup span removal on main
ee59a5cfDrop unsupported grit show -W assertion from format flag test
20bcfc82Refresh CLI output snapshots for change_id on rebased main
bdb7ba16Align json_output tests with change_id JSON fields on main
57b38d24Add lockfile module rust doctest for public API gate
b9736565Fix rustdoc private link in grit-test-support for gate
8fc0c58dSpeed up parse_tree owning path via shared entry parser
2f76f337Fix tree pathspec kind check and single-pass parse_tree
36ba3c10Add zero-copy TreeRefIter and migrate hot tree walks
fb8d9bbbfix: restore public pathspec module export
a5e14de8diff: match Git 2.55 u0 hunk boundaries
047fdc2dtests: disable changeIds in history reword git parity test
88912b71Merge branch 'factory/commit-scope-2809'
7cd3c280status: separate target and upstream standing
ccce2acffix: preserve index on partial commit hook failure and review follow-ups
9d832404commit: add scope (--staged, paths, commit.autoStage) in grit-lib and CLI
6febf57afix: pathspec-from-file NUL literals, empty records, and Error conversion
e19a8885docs: document pathspec-from-file on add, rm, restore, clean
1caa23dfchore: refresh grit-lib public-api snapshot
abe778e1fix: restore pathspec CLI wiring and error types after rebase
30ba8f54fix(diff): skip assume-unchanged paths in tree-to-worktree diff
b68dff81chore: cargo fmt pathspec import order
d54ce1bcfix: use worktree::pathspec imports and restore canonical map entries
035a1f59test: refresh skill snapshot after status-conflicts rebase
522f1e16chore: extend canonical module map for test imports
77382e89docs: mention StatusHeader in branch tracking guide
aa96299astatus: move header and pull hint into grit-lib
e714d4edMerge branch 'factory/change-id-negative-cache-2846'
89a25720Add signed annotated tags and grit tag --sign
8f03e876Add change-id Git compat e2e test and user guide
b8e234a1Fix change-id probe cache: fingerprint negative results
9f2883abMerge branch 'factory/path-enforce-2752'
0fa44b11test: expect change_id in commit JSON schema stability check
e397448bstatus: libify branch standing and rebase onto main
7a1294d9Merge branch 'factory/ci-green-2835'
daafa722chore: rustfmt change_id imports
5555333bchore: extend canonical-modules map for path_validate and lockfile
3dc1c31btest: enable function_context in structured hunk unit test
2c086ccbtest: refresh show_head snapshot for change_id JSON
fca2165afix: include change_id fields in show JSON commit object
7c7f947fdocs: document -W/--function-context on log and show
7dcbd734test: refresh show JSON schema for patch-text flags
ad36369ccli: wire -W function context and complete patch-text rebase fixes
1c1c12b6test: refresh shallow clone CLI snapshot
e978dc6ctest: refresh pick/revert CLI snapshots after main rebase
619dcb60test: expect change_id fields in shared commit JSON shape
3004ae7fpath enforce: Bugbot tests, protect config, checkout diff-only validation, bench-friendly tree walk
c42346d1Reject NTFS .git backslash spellings in every segment
19c89985Address path validation review: add staging, platform rules, tests
38c06aecEnforce path validation at index population and checkout
6cde1df2Fix CI: canonical fuzz map and Windows required param
3d4bd964refs: report a missing ref as a typed RefStoreError::NotFound
277ea2f8Merge branch 'factory/status-conflicts-2805'
675ea438status: pull hint follows upstream when distinct
8ca1bd5fstatus: fix upstream-without-target and schema drift
1cdab3ccstatus: report target and upstream separately
3e5dee67Merge branch 'factory/branch-tracking-leftovers'
31e006dfFix parse_tag: preserve all bytes after tagger
d303adecPreserve extra headers on annotated tag objects
f28b4248cli: render SHA-1 hash collision errors and fsck findings
189bf848Status: typed conflicts and operation next_steps
9649b024Speed up change-id prefix lookup; rebase gate and diff flag wiring
fbf83e78Merge stored change-id matches when derived prefix hits exist
7091ba4eSpeed up change-id lookup; share ambiguous candidate formatting in CLI
2e8b6e2cCLI ambiguous change-id errors, docs, and resolve/change-id bench row
3f98a798Resolve change-id prefixes in rev-parse with ref-walk lookup
ac39e486style: rustfmt after rebase onto main
e6687c91perf(objects): hashbrown OID maps and sized bulk insert
c0b84e9eperf(objects): fast OID hash maps for hot paths
862947d6branch_tracking: drop grit-git leftovers, load fetch refspecs once per push
478b2561Merge branch 'factory/log-graph-2397'
3097a232log --graph: fix lanes, filtered parents, and snapshot/schema coverage
0f8a1bfblog: add --graph layout and topological walk for human output
46845491log: defer HEAD resolve for plain log; UTF-8-safe group-by; refresh log schema
f2ea959clog display: address review regressions (decorate, config I/O, group-by perf, docs)
c4bacb1flog: --oneline, --decorate, and --group-by author
11fab897grit-cli: author/committer/grep filters on log and revs
c9fca5e8Unify CommitJson across log, show, revs, and shortlog
67f4639fDocument branch and tag listing/deletion in the refs guide
fb5b1e52grit branch/tag: list and delete through grit-lib
5f7f1d60grit-lib: list and delete branches and tags in porcelain
525545cdrefs: trim per-transaction work in the files store
3c8b4262refs: files store deletes leave no empty ref or reflog directories
cdf9770dMerge branch 'factory/mutation-change-id-json-2710'
6be19b68Update public-api snapshot and test write_paths_patch
b8d438bbSet sign: false on RewriteOptions in change_id history tests
2ad7dd92Silence unused change_ids in write_rewritten_commit after rebase merge
3fb6fd80Fix patch-text --quiet and --no-index; honor -M on worktree diffs
86f88e42Fix CI: canonical change_id map, Windows pickaxe ERE, grit diff --patch-text
6bdcf8d9Apply rustfmt to cli_fixture
21dcad74Address review: preserve headerless change ids and fix merge tests
b59ef7f7Report change ids in mutation JSON outcomes
3c940ab4Merge branch 'factory/history-rewrite-resign-2712'
8a17ee86Merge branch 'factory/commit-ref'
049b6991Merge branch 'factory/sha1dc-ingestion-2717'
46945134docs: fix lockfile rustdoc link to private API
838cfe56Update public-api snapshot for lockfile module
f44720b8fmt: rustfmt on lockfile integration files
038738d6Fix lockfile timeout units, rollback, and jitter
847e2a29Add unified LockFile with Git-style lock backoff
77a5892eRun rustfmt on CommitRef integration files
9feaced3Fix CommitRef header round-trip and meet 2x parse benchmark
9246731dAdd borrowed CommitRef commit parser and migrate hot paths
89e53623Merge branch 'factory/path-validate-2751'
fd7e114fFix raw ODB writes skipping payload collision check
f6199f2ahash: sha1dc on SHA-1 object ids with typed collision errors
430359bbMerge branch 'factory/tracing-spans-2759'
0d7fc22cAssign change ids on clean merge, pick, and revert commits
9075bc7bAdd grit-lib path_validate module for Git path component rules
1949f7d7Merge branch 'factory/fuzz-parsers-2758'
61f0a205Address tracing review: tree spans, lean subscriber, crate-private macro
8a4e9c54Add optional grit-lib tracing spans and GRIT_TRACE CLI output
570be064Merge branch 'factory/shallow-clone-tag-depth-2'
de2488e0test-support: make CLI snapshots platform-independent on macOS
b418066eFix index parse minimum size and fuzz review follow-ups
62968109Add grit-lib parser fuzz targets, corpus replay, and weekly workflow
c46939ecFix index parse when input is shorter than the checksum trailer
b89eff53fix(fetch): depth-limited tag following uses full shallow closure
cc1e9978Re-sign history rewrite commits when commit.gpgsign is enabled
8831bf36clone: shallow tip annotated tags and CLI snapshots after rebase
e7335da0clone: keep tag OIDs out of shallow depth computation
f84b389ctests: fix compile after DiffTarget and DiffOptions API changes
1c1e6271clone: single-branch shallow clone matches git --depth=1
59a27395clone: add --shallow and depth for local fetch
60df4260Fix review: daily headline counts, status test, public API snapshot
e87f68aeFix change_id helpers and finish daily matrix registration
29a8fcebShow change_id in log, show, revs, and status JSON and human output
1351f0ebfix: import DiffTarget in diff_detail_git_compat after rebase
3f5d0714style: rustfmt commit_change_id after rebase
06b874b1Review: preserve Git byte-identical commit fixture and refresh CLI OID snapshots
3d27690fAssign change ids in create_commit for new commits, amends, and merges
6a4b2f4bMerge branch 'factory/ci-green-2690'
b0e75fe6site: fix the docs check broken by the change-id and hash-bench merges
1f62b53ffix: do not allow hyphen values on diff commit positionals
a7d701cafix: no-index stat counts, dashed paths, and error exit code
eaaa6b4dfix: restore CI green — diff --no-index, docs, snapshots, schema table check
80fe75b5fix: resolve DiffOptions moves and stale diff compat tests
d545063bMerge branch 'factory/bench-refresh-2375'
189c6e08Merge branch 'factory/site-clone-widget-width'
8fe0f5fcsite: let the blog clone widget use spare width instead of clipping
5bb21b47Fix show_head CLI snapshot JSON field layout
b2f47037Fix hash-object hash suite driver label and use prepare_bin
aea109f1bench: hash criterion groups and grit-bench hash-before baselines
fa1c2bf4Merge branch 'factory/history-change-ids-2706'
ac7d5cccsite: copy button on the home page install command
3b0ffbceFix main's broken gate: test compile errors, snapshot markers, doc gaps
5877181dPreserve change ids in history rewrite planning
60851513Split ChecksumHasher from ObjectHasher for file trailers
dcb4d9fdAdd grit-lib change id type, commit headers, and policy
92cc965dbench: refresh dashboard matrix baselines after perf plan
7aeecb2fMerge branch 'factory/log-group-by-perf'
e3bd2031Merge branch 'release-publish-crates'
0e99bc62grit-bench: tolerate processes exiting while sampling RSS
d5ba0659Speed up log author group-by counts on large pack repos
290ec297clone: overall progress bar with a time-left estimate
592cfc20perf: skip already-local tags and stop early in fetch tag-following
e7166a8dMerge branch 'factory/rev-select-cursor-2681'
9c302cebMerge branch 'factory/show-p1-2384'
0a9b0619fix(cli): reject log selectors when continuing with --cursor
214f76e3Steering fixes: show JSON contract, binary rev:path, Bugbot items, hygiene scanner
f7c733acRebuild grit show P1 on main without #2382 stack
6f8017f3log: pickaxe -S/-G in rev-list and grit log
63f740f6Merge branch 'factory/revision-selection-bench-2399'
abd9a751Merge branch 'factory/ci-green-2654'
a6f50437bench: revision-selection baseline, daily matrix, and census wiring
fddb8acdfix(diff): git xhistogram emit path without same-index flag clearing
7255e1ceMerge branch 'factory/rev-select-args-2391'
6e9dcd42Build CLI identity lines through grit-lib
94113508Resolve identity lines in one place in grit-lib
9f1f5afbcli: RevSelectArgs for log and revs; fix log continuation
756aa953Merge branch 'factory/lto-release-profile-2370'
35c983cdchore: rustfmt after rebase onto main
0575419ebuild: finalize dist profile (opt-level 3, panic unwind) and document RSS
d65a7f6cbuild: split dist profile for shipped grit and fix RSS docs
dfb82d1bbuild: enable fat LTO and single codegen unit in release profile
11420e85Make explicit add pathspec validation sub-linear and allocation-free
cbae4394fix(cli): resolve stash show stat merge markers left on main
a2964814feat(diff): Git histogram parity for -w/-b whitespace modes
5127de02Merge branch 'factory/show-p1-binary-fix-2606'
41626388fix: grit show rev:path, combined merge diffs, and log merge stat parity
c6812d0eGate Windows-only worktree stat helper
cf48b8fcKeep zlib prefix inflation for commit header reads
b22bcc8fRemove unused grit-cli helpers
f93d8b3dRun the orphaned checkout unit test and tidy grit-lib test imports
3d85bc2dRemove dead grit-lib code hidden behind allow(dead_code)
29f8b4dfDrop unused workspace dependencies
66ff26b8fix: clone DiffOptions in tests/benches; scope tests for format flags
d18145b6fix: remove diff blob thread_local; unify diff format scope
130d6b1efix: skill snapshot, stash stat blank line, ThreadPolicy in commit_files_many
1d0ee4eflog/diff: fix review blockers — rename JSON, deleted pathspecs, totals, perf
aa341f73log: add -p and diff detail flags with commit_files_many API
6875cc4fblog: the clone's objects are the post's words, counted as you read
035b32e6blog: highlight the table-of-contents entry for the section being read
414d36fablog: a grit clone under the table of contents that progresses as you read
e82a7009Fix broken intra-doc links in diff::handle
446cc4acFix diff rename prefilter, Bugbot regressions, and single-scan paths
2a09fccbAdd diff stat and name-only detail modes to grit-lib and grit diff
c1a25995Refresh skill CLI snapshot after main skill.md updates
9b84e401Regenerate revs JSON schema after rebase onto main
3a4af494Fix grit-bench revwalk suite clippy after rebase
3463e22aRebase onto main: resolve conflicts and restore log cursor validation
65627826Fix pack reader reentrancy, log cursor validation, and since-cutoff walk
e73dc68aStabilize revs --all git-compat test under parallel runs
64197a6fUpdate grit skill snapshot after log cursor docs
cd9066e2Fix log cursor continuation and review blockers
506eb67acli: shared RevSelectArgs for log and revs; rename log cursor
0903ee58revwalk: fix merge since bounded count and speed revwalk paths
f9cb1012revwalk: fix review blockers for left/right counts and bounded walks
69fbe2c6revwalk: widen RevWalkListOptions and add left/right counts
29659a86blog: two weeks inside the grit factory
0ef96ecdsite: let a blog post load its own figure script and styles
e239b033Merge branch 'factory/fix-fetch-literal-url'
96802233Fix FETCH_HEAD for bundle fetches and explicit URL refspecs
3b350752Fixes #1319: do not rewrite origin tracking refs on literal URL fetch
0c4d28e0Restore replay clean-merge checkout and fix pull/conflict preserve paths
da1d6ad2Fixes #1321: allow merge with unrelated local changes
29417912Merge branch 'factory/ci-main-green-2566'
ddbaf5dbfix(diff): Git histogram and minimal U0 hunk parity with system git
2c14376fFix grit gc skipping repack when a pack already exists
b041a515Fixes #1317: prune empty ref parent dirs after lock removal
396520a5Fixes #1318: gc builds delta-compressed packs from loose objects
d1f7e5d9fix: daily smoke gaps, plan validation, and failed timed runs
dd2476eftest: daily MATRIX registry coverage helpers and tests
578753cddocs: complete daily matrix registry and MATRIX.md
db37d589bench: fix daily matrix argv and init prepare correctness
2d9125a4bench: add daily worktree and history matrix scenarios
d922772fMerge branch 'factory/notes-api-quality'
d9131704Merge branch 'factory/log-display-2396'
5dc61ba5log: fix group-by --count -n and pack author scan perf
694d8ae1log: speed group-by author --count for git.git benchmark
6ee4690flog display: address review regressions (decorate, config I/O, group-by perf, docs)
aa0112b2log: --oneline, --decorate, and --group-by author
787a31e5Merge branch 'factory/fix-worktree-scan-windows-1303'
0696ac87Merge branch 'factory/stash-autocrlf-smudge-cca7'
b3922e9bMerge branch 'factory/worktree-add-checkout-bulk-6dd6'
0806cea4Merge branch 'factory/fix-1304-windows-stat'
8962f0fbHold write-target ref locks from the CAS recheck to the write
d266dd27Use list_with_bodies and the add outcome in grit notes
5571ce5cRoute notes writes through the ref store with typed errors
7088da65grit-cli: author/committer/grep filters on log and revs
02299575Unify CommitJson across log, show, revs, and shortlog
cf9f1875Fixes #1306: use parallel bulk checkout for populated worktrees
90e06897Fix worktree list main path on Windows linked checkout
29b07892Fixes #1304: trust git clone index stats on Windows worktree scan
fbac8ab9Fixes #1305: smudge stash apply/pop worktree writes with autocrlf
909f94bcFixes #1303: repair Windows worktree_scan compile errors
33d16292grit-lib: honor filters in revwalk count and bounded rev-list walks