grit://cooking/changelog← what’s cooking
Friday, October 23, 2026 · release v0.5.18

83 changes landed on main

40 roadmap steps across 9 items · 13 issue fixes · 30 other changes

grit v0.5.18 adds hunk and line-level staging, commit, restore and stash, a full rebase command, and many merge, pick, branch, tag and remote options, plus performance and bug fixes.

  • ›Hunk/line selection: add --hunks/--lines, commit --patch-file, restore, stash push, history fixup
  • ›New grit rebase with --onto, --continue/--abort/--skip, --check, -X, --exec
  • ›merge/pick/revert gain --ff-only, --squash, -X, --check, ranges, --continue/--abort
  • ›branch -r/-a/-n and tag list filters/sort/JSON; remote show/set-url/remove; clone --depth/-b
  • ›Fixes: status hang (#1502), commit auto-staging (#1503), detached HEAD commit (#1513), dash-leading -m (#1519), date parsing (#1504)
  • ›Speedups: blame (#1505), Windows 50k-file scans (#1518), staged diff, log, tag list, bundle verify
$ git log b01a954f..v0.5.18283 commits on GitHub ↗300+ files +11,861 −1,599
Highlightsmeasured by the reviewers, before → after
grit status hangs (>60s, 100% CPU) on git/git clone once the branch is 1 commit ahead of upstream
status slowdown relative to system git, 20,001 commits1089× better████████████████████████ 14,238 x █ 13.1 x
Typed error kinds and one exit-code table
std::process::exit sites in grit-cli/src/main.rs29× better████████████████████████ 29 sites █ 1 sites
Speed: commit/paths@synth-10k
commit/paths@synth-10k grit wall14× better████████████████████████ 515.6 ms ██ 36.7 ms
grit clone <local path> summary/--json counts only loose objects when source also has a pack (3 of 18 reported)
mixed clone reported objects6.0× better████ 3 objects ████████████████████████ 18 objects
Main keeper: make CI on main green (test, coverage, rustdoc)
BundleCreateOptions generated API lines recorded5.5× better████ 4 lines ████████████████████████ 22 lines
roadmap · Hunk selection for agents (replacing `-p`)6 steps
  • ›Hunk selection by id and `grit add --hunks`ff677003

    Adds stable hunk-id resolution and partial index staging through grit-lib, exposed as `grit add --hunks` with dry-run and structured output. It also adds compatibility tests, documentation/schema updates, and a daily 50k-line benchmark scenario.

    add/hunks@large-file wall: system git control vs branch grit: 14.3 ms → 99.7 ms (86% worse)add/hunks@large-file peak RSS: system git control vs branch grit: 8,830,976 bytes → 43,532,288 bytes (80% worse)
  • ›Line-range selection and `grit add --lines`509ceac6

    Adds typed, 1-based new-side line-range selection to the library and exposes it through `grit add --lines`, including mixed hunk/range staging and structured JSON output. The final fix makes range validation consume the exact filtered/symlink-aware bytes used by diff construction, eliminating the dangling-symlink regression.

    add/lines large-file median: system Git vs branch grit: 8.9 ms → 53.3 ms (83% worse)
  • ›`grit commit --hunks/--lines/--patch-file`

    Adds selective commits from stable hunk IDs, line ranges, or unified patch files while preserving unrelated worktree edits. Patch-scoped commits reuse the existing commit pipeline for change IDs, hooks, amend, dry-run, index persistence, and structured output.

  • ›`grit restore --hunks/--lines` (discard or unstage selected hunks)cc1954a3

    Adds selective discard and unstage operations driven by stable diff hunk IDs or line ranges. Worktree restores reverse-apply clean content and smudge it back to disk; staged restores reverse-apply to the index, with dry-run and validation before writes.

  • ›`grit history fixup --hunks/--lines`0a686b0b

    Adds selective unstaged hunk/line folding to history fixup and attempts to preserve same-path staged work after the rewrite. The round-two hunk-id fix succeeds, but its line-range complement calculation is incomplete and can erase staged user data after refs move.

  • ›`grit stash push --hunks/--lines`c2f58f83

    Adds selective stash pushes for stable hunk IDs and line ranges while preserving staged index changes and leaving unselected worktree edits in place. Dry-run previews build the same in-memory stash tree without updating refs or files, and all output modes report the selected paths and ranges.

roadmap · Rebase and history editing4 steps
  • ›`grit rebase [--onto <base>] [<upstream>]`: atomic command, docs, skill, benchmarkcd8fda4e

    Adds one atomic replay command exposed as both `grit rebase` and `grit history rebase`, sharing the existing history rewrite planner and renderer. It includes stable human/JSON/Markdown output, system-Git compatibility coverage, command documentation and agent-skill guidance, plus daily synth and git.git performance scenarios.

    git.git smoke median wall time: system Git vs branch grit: 866.2 ms → 663.2 ms (31% better)Synthetic smoke median wall time: system Git vs branch grit: 5.5 ms → 6.5 ms (15% worse)
  • ›`rebase --check` and `-X ours|theirs`6e6ac9ef

    Adds a non-mutating rebase conflict check and selectable conflict favoritism with Git-compatible ours/theirs semantics. The CLI exposes `rebase --check` and `-X`, including structured human/JSON/Markdown results, while the library owns planning and replay behavior.

  • ›`grit rebase --continue / --abort / --skip` and status hints81502897

    This makes a conflicted grit rebase a resumable operation instead of atomically abandoning it. Users and agents can inspect the paused operation in status, resolve and continue it, skip the stopped commit, or abort back to the original branch tip, with equivalent human, JSON, and Markdown guidance.

  • ›`grit rebase --exec <cmd>`d4a6051b

    Adds library and CLI support for running repeatable shell commands against each rewritten rebase commit before the atomic ref update. It also adds rebase documentation, JSON schemas, integration tests, and daily benchmark scenarios, but the reviewed tip does not contain the reported round-two safety fixes.

roadmap · Branches, tags and upstream tracking3 steps
  • ›grit-lib: --contains / --merged / --points-at filters4e2e302f

    Adds library-level contains, no-contains, merged, no-merged, and points-at filters for ref queries, including annotated-tag peeling and batched shared-history traversal. It removes old porcelain tag helpers, adds Git-oracle compatibility coverage and Criterion benches, and wires daily benchmark scenarios and baselines.

    git.git no-graph contains query (system Git median vs Grit lower bound): 7.9 seconds → 597 seconds (99% worse)
  • ›grit tag: list filters, sort and annotation JSON6e301cf1

    Adds a library-first tag listing API that filters by reachability and target, sorts by version/date/name, and returns structured annotation metadata. The CLI exposes those capabilities with bounded list output and stable human/JSON/Markdown rendering, while the daily benchmark matrix gains realistic git.git tag scenarios.

    tag/contains@git-git system git vs branch median: 17.4 ms → 21.6 ms (20% worse)tag/list-sort-version@git-git system git vs branch median: 2.3 ms → 18.5 ms (88% worse)
  • ›grit branch: list flags and rich JSON3f2e7a8a

    Adds a library-first branch inventory/query API and exposes modern branch-list filters plus rich JSON and Markdown output through the thin CLI. The review fixes make upstream display refspec-aware, keep local/remote identities distinct, escape Markdown cells, and lock the generated skill output to its current contract.

roadmap · Conflicts you can work through: merge, pick, revert5 steps
  • ›merge options: --ff-only, --no-ff, --squash, --no-commit, -m/--message-file9b1da44a

    Adds typed merge policies and commit modes to grit-lib, wiring fast-forward-only, forced merge commits, squash, no-commit, and message input through the modern CLI. It also adds structured JSON/Markdown outcomes, pending commit-message lookup, compatibility tests, and command documentation.

    clean merge median (synth-10000): 196.2 ms → 197.3 ms (1% worse)clean merge peak RSS (synth-10000): 23,220,224 bytes → 23,285,760 bytes (0% worse)
  • ›merge -X ours|theirs, --conflict=diff3|zdiff3, --allow-unrelated-historiese7078834

    Adds a typed merge-options API and thin CLI flags for fast-forward policy, squash/no-commit behavior, ours/theirs favoring, conflict-marker style, and unrelated histories. It also makes squash conflict state interoperable and recoverable, preserves custom pending messages, and refreshes the generated agent skill snapshot.

    CLI output snapshot runtime: 4.6 seconds → 4.6 seconds (1% better)
  • ›grit pick: several commits, ranges, --continue/--abort/--skip, -x, --no-commit, --empty

    Adds a library replay-sequence engine with Git-compatible stop/resume files and exposes multi-commit/range pick, continuation actions, origin trailers, no-commit, empty policies, structured output, docs, tests, examples, and a benchmark. The core happy paths work, but several recovery and state contracts are incorrect.

    pick-range-20 median wall time: 190.6 ms (system Git vs branch grit) → 346.8 ms (system Git vs branch grit) (45% worse)pick-range-20 peak RSS: 16,150,528 bytes (system Git vs branch grit) → 24,117,248 bytes (system Git vs branch grit) (33% worse)
  • ›pick/revert --check and -X ours|theirs, --conflictdeba77ad

    Adds in-memory sequence prediction for pick and revert, then exposes it through `--check` with shared merge favor/conflict-style controls and stable human, JSON, and Markdown results. The round-3 correction advances a synthetic HEAD after clean and kept-empty steps so later sources are evaluated against the same evolving history as real replay.

  • ›Benchmark matrix: merge, pick, revert and restore scenarios with baselinesd08bc932

    Adds a benchmark group and campaign rows for clean merge, conflict resolution and continue, a 20-commit pick, and single/mainline revert workflows. Round 3 separates clean and conflicting campaign topology and adds executable coverage proving every row completes with grit and system git.

    Fresh 200-file merge-no-ff smoke (system git → branch debug grit): 8.5 ms median → 18.1 ms median (53% worse)Fresh 200-file merge-conflict-continue smoke (system git → branch debug grit): 16.9 ms median → 58.3 ms median (71% worse)
roadmap · implement tree-sha256 commit/tag headers1 step
  • ›Benchmark tree-sha256 tags against the reference tool and git7c9551a2

    Adds explicit signed tree-sha256 tag creation and a benchmark suite that measures digest verification, signed creation, and signed verification on git.git- and Chromium-shaped repositories, with optional Linux and reference-tool rows. The round-6 corrections keep preparation out of timed verify commands, preserve tagger metadata, and include submodules in the git-only oracle.

    git.git digest verify: git-only pipeline vs grit: 382.9 ms median (dev smoke) → 343.2 ms median (dev smoke) (12% better)Chromium-synth digest verify: git-only pipeline vs grit: 29.2 ms median (dev smoke) → 11.1 ms median (dev smoke) (2.6× better)git.git signed verify: hash-only bound vs full verify: 343.2 ms median (dev smoke) → 341.1 ms median (dev smoke) (1% better)Chromium-synth signed verify: hash-only bound vs full verify: 11.1 ms median (dev smoke) → 14.5 ms median (dev smoke) (23% worse)
roadmap · Inspection extras: blame, reflog, shortlog, resolve3 steps
  • ›reflog JSON: old_oid, new_oid, RFC 3339 date, committere9863d86

    Adds a typed reflog committer signature view in grit-lib and exposes old/new object IDs, offset-preserving RFC 3339 dates, and structured committers in `grit reflog --json` while retaining v1 fields. Round 2 updates the generated skill snapshot to match the newly documented reflog workflow.

  • ›blame: --ignore-rev, --ignore-revs-file and blame.ignoreRevsFile3eb8877b

    Adds typed ignore-revision loading to the blame library and exposes it through repeatable CLI flags and config. Blame output now carries ignored/unblamable attribution markers in human, JSON, and Markdown formats, with system-Git parity coverage.

  • ›shortlog --target and `grit ahead` alias, logic moved into grit-lib

    Shortlog target selection and ahead-walking now live behind a typed `grit-lib` API. The CLI exposes explicit `--target`, adds `grit ahead`, preserves JSON shape, and the campaign matrix measures the new path with an executable scenario.

    Default shortlog median, exact origin/main to branch (100 interleaved debug runs): 22.3 ms → 22.1 ms (1% better)Explicit target median, system Git reference to grit branch (100 interleaved debug runs): 4.6 ms → 23.7 ms (81% worse)
roadmap · Consistency audit, docs and the JSON contract6 steps
  • ›CLI conventions test and conventions page79331790

    Adds a test-only CLI contract that classifies every current leaf command and checks shared limit, dry-run, message, pathspec, and force conventions. Adds the corresponding conventions page and links it from the scripting and automation documentation without changing command behavior.

  • ›Complete schema index and snapshot coverage7aacbf0e

    Completes the published JSON-schema index and enforces that every committed schema and every registry command stays covered by a validated CLI snapshot. The round-2 correction replaces invented structured-error fixtures with four real failing command scenarios, preserving coverage while tying goldens to actual rendering and exit behavior.

    Schema documents listed in the index table: 63 documents → 90 documents (43% better)
  • ›--dry-run for merge and notes, planned in grit-lib4c609163

    Merge can now preview up-to-date, fast-forward, merge-commit, and conflict outcomes without mutating repository state. Notes add/remove similarly expose library plans and CLI dry-run reports while preserving existing real-operation human output.

  • ›Typed error kinds and one exit-code tablec66cac29

    This change replaces stringly JSON error kinds with a serialized enum and routes CLI outcomes through one typed exit-status table and one process-exit site. It also documents the complete exit-code contract and fixes Markdown hunk errors to use the structured stdout renderer.

    std::process::exit sites in grit-cli/src/main.rs: 29 sites → 1 sites (29× better)
  • ›One limit flag: -n/--limit on every list, enforced in grit-lib9cb0a356

    This standardizes bounded list options around `-n/--limit` across log, revisions, branches, tags, notes, bundles, and hooks, while retaining visible `--max-count` aliases where expected. Limits are represented in grit-lib for notes, bundles, and hooks, and affected JSON list responses expose `truncated`.

    Canonical-layout missing-module count: 1 modules → 2 modules (50% worse)
  • ›JSON contract gate: breaking schema changes fail CIa84ce451

    Adds a structural compatibility gate for versioned CLI JSON schemas and refuses destructive updates to a frozen contract. Round 3 makes union matching order-independent and closes numeric and additionalProperties false negatives identified in the prior review.

roadmap · Clone and remote management5 steps
  • ›grit remote set-url [--push] and remote -v76b15e7d

    Adds a typed library operation for changing fetch or push remote URLs and exposes raw plus effective remote metadata. The thin CLI adds `remote set-url`, structured JSON, and effective two-line verbose listings while retaining the existing `url` field.

  • ›Filtered fetch on the wire with promisor packs (library)009ae4c8

    Adds typed blob filters to library fetch/clone, negotiates them over supported Git protocols, marks received packs as promisor packs, persists partial-clone configuration, and reapplies stored filters on later fetches. The round-3 fix extends promisor-aware fsck to index entries, including indexes populated from a blobless tree.

  • ›clone --depth N and -b/--branch (branch or tag)df5d30dc

    Adds bounded shallow cloning and branch-or-tag selection to the linkable clone API and modern CLI. Branch selection creates and configures a local tracking branch; tag selection peels the tag and leaves HEAD detached, with typed outcomes and stable structured output.

  • ›grit remote remove550c849e

    Adds a library-first remote removal operation and exposes it as `grit remote remove`, including dry-run and stable human, JSON, and Markdown output. Removal cleans config, branch tracking, remote refs, and reflogs while preserving refs shared by another remote's fetch mapping.

    remote/remove@many-refs median wall time: Git baseline vs grit branch: 748.2 ms → 28,716 ms (97% worse)remote/remove@many-refs peak RSS: Git baseline vs grit branch: 9,981,952 bytes → 27,656,192 bytes (64% worse)
  • ›grit remote showeb9b74fb

    Adds a library-first remote inspection API and exposes it as `grit remote show`, with bounded human, Markdown, and stable JSON output. It reports rewritten fetch/push URLs, advertised or local HEAD, tracked/new/stale branch state, and branch pull configuration.

    remote/show@many-refs median: system Git before vs branch grit after: 5.0 ms → 17.2 ms (71% worse)remote/show@many-refs peak RSS: system Git before vs branch grit after: 13,869,056 bytes → 13,324,288 bytes (4% better)
roadmap · Workspace extras: stash, worktree, reset, rm, mv, clean, config, init7 steps
  • ›init -b / init.defaultBranch, --separate-git-dir, --object-format sha2566e58b7df

    Adds configurable initial branches, separate Git directories, and SHA-256 repository initialization through a library-first API and thin CLI flags. Reinitialization now reports and preserves the actual existing HEAD/layout/object format, including SHA-256, gitfiles, and detached HEADs.

  • ›stash push -- <paths> and apply/pop --index57333db4

    Adds path-limited stash creation that preserves unrelated staged and unstaged work, including matching untracked files, and adds index restoration to stash apply/pop. The CLI exposes shared pathspec inputs and `--index`, with stable JSON fields, docs, schemas, and Git-interoperability coverage.

  • ›reset --keep, --dry-run and orphaned_commits4f68730d

    Adds a non-destructive reset preview, Git-compatible keep resets, and bounded reporting of commits that a reset would make unreachable. The round-three correction ensures keep dry-runs enumerate both dirty tracked paths and colliding untracked paths together, without changing apply behavior.

  • ›rm --dry-run / --ignore-unmatch, mv --dry-run with moves[], clean filtersbfd3c8cd

    Adds library-first dry-run and selection behavior for rm, batched multi-source mv with structured outcomes, and clean scope/exclude/files-only filtering, then exposes these through thin CLI flags and versioned JSON. Round-two and round-three commits add Git-compat clean cases and forced-move rollback machinery, but one rollback-failure path still destroys source bytes.

  • ›worktree list: complete JSON (is_current, lock_reason, prunable reason)e39646a7

    Worktree listing now identifies the repository’s current worktree and exposes complete lock/prune metadata through the public library API and every CLI output mode. The round-three fix removes the prior list hot-path regression by retaining the old marker/existence checks and parsing gitdir metadata only for missing worktrees.

    worktree list peak memory, 300 runs: 11.3 MiB mean → 11.4 MiB mean (1% worse)system Git comparison, 300 runs: 1.3 ms mean (system git vs branch grit) → 2.9 ms mean (system git vs branch grit) (55% worse)
  • ›stash push --staged, --keep-index, --dry-run5075fcd2

    Adds typed stash push modes for saving only staged changes or keeping the index, plus a side-effect-free preview API and CLI dry-run output. It exposes the modes through the modern CLI, updates stable JSON schemas/docs, and cross-checks stash trees and post-push state against system Git.

  • ›config --local / -f, get with scope and origin, missing key = nullef95ca84

    Adds typed config locations and library-owned read/write helpers, exposes winning config values with scope/file/line origin, and wires `grit config --local` plus `-f/--file`. It also publishes config v2 JSON where missing keys return `value: null` with exit 1 and updates CLI documentation and snapshots.

    config get median-of-batches: 2.0 ms → 2.1 ms (5% worse)config set median-of-batches: 3.0 ms → 3.2 ms (6% worse)
issues fixed13
  • ›grit status hangs (>60s, 100% CPU) on git/git clone once the branch is 1 commit ahead of upstream#1502a0028024

    This change makes branch tracking build the upstream's hidden ancestor region once and use constant-time membership checks while walking local commits. It also adds a deep-history regression that calls the exact ahead/behind API used by status and bounds parent lookups.

    grit status latency, 20,001 commits and one ahead: 26,882 ms → 24.7 ms (1088× better)grit status latency, 3,001 commits and one ahead: 461.1 ms → 4.7 ms (98× better)status slowdown relative to system git, 20,001 commits: 14,238 x → 13.1 x (1089× better)
  • ›grit commit with no message errors out but has already staged every change (silently clobbers a curated index)#1503247184f9

    Commit message validation is made side-effect free by removing CLI-side auto-staging from the missing-message error path. Successful default commits retain their existing behavior because staging remains owned by grit-lib's `commit_with_scope` / `commit_worktree` path.

  • ›grit log --since/--until and commit --date reject date-only and relative dates (2024-01-01, '1 week ago', yesterday)#1504

    Date parsing now uses the existing Git-compatible approxidate engine when strict parsing cannot interpret a value. This makes log cutoffs and commit author-date overrides accept everyday forms such as date-only values, “yesterday,” dotted relative dates, slash dates, and month-name dates while preserving strict and raw-epoch behavior.

    Strict-date grit log median, 20 runs: 10.5 ms → 11.2 ms (6% worse)Date-only log median: system Git versus branch grit, 20 runs: 13.0 ms → 10.4 ms (24% better)
  • ›grit branch cannot list remote-tracking branches (no -r/--remote/--all) and has no -n limit#1506088a1ba5

    Adds bounded local/remote/all branch discovery to `grit branch`, with stable JSON metadata and matching human/Markdown output. The review fixes also correct scope-specific empty states and prevent the expanded clap tree from overflowing default test-thread stacks.

  • ›grit fetch --dry-run lists pending updates then prints "Already up to date with origin."#152023feecff

    Dry-run fetches now end with a truthful pending-update summary instead of saying the remote is already up to date. The correction covers normal, Markdown, and multi-remote rendering while preserving JSON’s distinction between refs written (`updated`) and proposed updates.

  • ›grit commit -m "-text" rejects a message that starts with a dash (git accepts it)#1519a10cfc47

    This adjusts clap parsing so quoted commit messages beginning with `-` are accepted through both positional and `-m` forms. It extends the convention across other user-authored message, author, trailer, message-file, and pathspec-file inputs, with focused CLI regression coverage and a commit documentation note.

  • ›grit clone <local path> summary/--json counts only loose objects when source also has a pack (3 of 18 reported)#151695fb8384

    This change makes local clone and fetch summaries describe only the objects and bytes installed by that operation. It handles mixed linked-pack plus newly packed transfers while preserving null object-type reporting when a linked pack contains more objects than the individually tracked set.

    incremental second-fetch reported objects: 10 objects → 3 objects (3.3× better)mixed clone reported objects: 3 objects → 18 objects (6.0× better)
  • ›grit commit refuses on detached HEAD; no way to commit after `switch --detach` (git allows it)#1513fb10f731

    Detached HEAD commits and amendments now advance only HEAD while leaving branch tips unchanged. The CLI reports `detached HEAD`, dry-run amend reuses the current subject, and both files and reftable ref backends follow the corrected path.

  • ›grit status --ignored lists files inside an ignored directory instead of the collapsed dir (git: sub/tmpdir/)#15151881b7fe

    Normal status now reports ignored directories nested under untracked parents as one directory entry rather than every ignored file. The round-2 adjustment preserves full path enumeration specifically for UNTR check-only cache probes, avoiding the cache-reuse regression identified in the first review.

  • ›grit bundle create has no way to bundle every ref (no --all); tags/branches must be listed by hand#1512fba06590

    Adds a single `--all` path for creating a complete repository bundle. The library writes HEAD and every ref under `refs/` into the bundle header, while the CLI remains a thin argument-forwarding layer.

  • ›grit blame still 5-44x slower than git on big files (cargo parser/mod.rs 750ms vs 17ms; git/git Makefile 3.1s vs 0.5s)#15056a32c117

    Improves blame’s hot path by caching path/blob results across Bloom-filter skips, fast-forwarding unchanged first-parent history, and avoiding unnecessary middle diffs when a requested range lies wholly in an unchanged affix. The round-2 fix removes an unsafe focused sub-window optimization that could misattribute equal-length shifted edits, while adding deterministic Bloom and system-git compatibility coverage plus a cargo-shaped benchmark scenario.

    Synthetic 3500-line/30-commit full blame median: 20.1 ms → 20.1 ms (0% worse)Synthetic full blame ratio vs system git: 2.3 x → 2.3 x (0% worse)Synthetic focused -L blame median: 10.3 ms → 7.9 ms (31% better)Synthetic focused -L ratio vs system git: 1.3 x → 0.974 x (31% better)
  • ›v0.5.17 Windows: 50k-file tree, status/diff 5x, no-op add 1.1s (git 63ms), commit 3x slower than git#151878f0c26f

    This change reduces redundant metadata work in Windows dense worktree scans while preserving files that directory enumeration found but an indexed-path probe could not resolve. It adds a no-op add benchmark scenario and regression/performance coverage for the 50k-file layout.

    50k clean no-op add median: 112.3 ms → 107.6 ms (4% better)50k clean no-op add ratio versus system git: 0.880 x git → 0.843 x git (4% better)
  • ›Linux v0.5.17: `grit log -- <path>` / `revs --count -- <path>` on git/git ~5x slower than git (2.5s vs 0.5s)#151751540c6e

    This change keeps dense path-history walks from accumulating inflated/parsed tree bodies while retaining bounded component lookup memoization. It also restores decoded commit subjects during commit-graph population and adds daily no-commit-graph git.git scenarios so the remaining path-walk gap stays visible.

    git.git no-graph path-count median wall time: 2.5 seconds → 2.3 seconds (5% better)git.git no-graph bounded Documentation log median wall time: 0.051 seconds → 0.044 seconds (16% better)git.git no-graph path-count median peak RSS: 351,674,368 bytes → 351,571,968 bytes (0% better)
other changes30
  • ›Follow-up: Stable hunk ids in grit-lib and `diff --json`cfba711c

    Adds stable, typed hunk identifiers to grit-lib and emits them for staged/unstaged JSON patch output. The review fixes constrain opposite-side peer work to JSON, matching paths, and available worktrees while preserving human diff behavior.

    staged human diff mean, 500 files/1 staged/50 unstaged (debug binary): 12.6 ms → 8.4 ms (50% better)staged JSON diff mean, same fixture (debug binary): 12.1 ms → 12.1 ms (0% better)system git cached-diff control mean: 1.5 ms → 1.5 ms (1% worse)
  • ›Quality #18: Dead code and dependenciesbb303b8c

    Removes orphaned grit-lib APIs and test instrumentation across fetch, pack/ODB, worktree, porcelain, revwalk, cache, and fixture code. The only runtime edit collapses a never-used polymorphic fetch sink to the TempPackReceive implementation it always constructed; the net diff is 14 additions and 654 deletions.

    clone-file-smoke grit (system git 11.969 ms): 10.3 ms median → 10.6 ms median (3% worse)clone-git-http-smoke grit (system git 30.992 ms): 27.1 ms median → 27.5 ms median (1% worse)clone-grit-http-smoke grit (system git 19.135 ms): 14.6 ms median → 14.8 ms median (2% worse)
  • ›Main keeper: make CI on main green (test-threaded, coverage, test)6bee753a

    Updates the rebase-session integration test to construct the current ApplyOptions shape and removes one unused test binding. This restores compilation of the workspace test targets without changing production behavior.

  • ›Main keeper: make CI on main green (rustdoc, test, coverage)58a09080

    Removes an invalid rustdoc field link from the `HunkSelectError::StaleId` documentation and keeps the same meaning as plain prose. This is a documentation-only CI repair with no runtime or API behavior change.

  • ›Main keeper: make CI on main green (test, coverage, rustdoc)738e2203

    Records the complete generated public API surface of `BundleCreateOptions`, including its constructor and derived trait implementations. This is snapshot metadata only; runtime library and CLI behavior are unchanged.

    BundleCreateOptions generated API lines recorded: 4 lines → 22 lines (5.5× better)
  • ›Main keeper: make CI on main green (public-api, test)58973440

    Expands GitHub-hosted runner cleanup and reduces debug-test artifact size so large workspace test links do not exhaust disk. The change is confined to CI workflow configuration and the runner cleanup script.

  • ›Speed: commit/paths@synth-10kbd9089eb

    Partial commits now validate many path arguments with cheap worktree stats and at most one shared index/HEAD scan. Their temporary HEAD-derived index reuses safe stat data and a primed cache-tree, so unchanged files are not rehashed and unaffected directories are not rebuilt.

    commit/paths@synth-10k grit wall: 515.6 ms → 36.7 ms (14× better)commit/paths@synth-10k grit peak RSS: 28,808 KiB → 36,472 KiB (21% worse)commit/paths@synth-10k system git wall: 22.7 ms → 22.2 ms (2% better)commit/dry-run@synth-10k grit wall: 27.4 ms → 28.7 ms (4% worse)
  • ›Quality #19: Move logic into grit-libc807e6f9

    Push argument classification, destination opening, and advertisement-derived planning now live in grit-lib, leaving the CLI as wiring and rendering. Literal path/URL destinations and configured push URLs are planned from the actual push destination, and local sends reuse those advertised tips so the correctness fix does not duplicate a full ref scan.

    10,001 loose refs, literal-path no-op push (80 interleaved runs): 95.3 ms mean → 96.0 ms mean (1% worse)10,001 loose refs, configured-remote no-op push (40 interleaved runs): 146.8 ms mean → 76.2 ms mean (93% better)
  • ›Quality #20: Deduplicateb50abb35

    This consolidates annotated-tag peeling behind Odb APIs and routes revision tips, show, commit-graph reachability, bitmap writing, index tree resolution, ref listing, and local remote advertisement through them. The round-2 amendment deduplicates repeated raw ref and reflog object IDs before peeling, removing the only measured regression while preserving post-peel commit deduplication and sorted output.

    Repeated-tip log --all, current origin/main → branch: 10.5 ms median (60 interleaved runs) → 9.4 ms median (60 interleaved runs) (11% better)Repeated-tip revs --count --all, current origin/main → branch: 9.8 ms median (60 interleaved runs) → 8.8 ms median (60 interleaved runs) (11% better)Official-shaped many-refs log --all, current origin/main → branch: 50.9 ms median (60 interleaved runs) → 22.4 ms median (60 interleaved runs) (2.3× better)Official-shaped many-refs revs --count --all, current origin/main → branch: 49.1 ms median (60 interleaved runs) → 20.7 ms median (60 interleaved runs) (2.4× better)
  • ›Main keeper: make CI on main green (public-api, test)e20cf7c8

    This change prevents a message-less `grit commit` from staging worktree changes before reporting its validation error. It also tightens the local-branch JSON regression test to enforce omission of the false `is_remote` field.

  • ›Speed: log/json-100@git-gitc829890c

    This change avoids materializing and re-peeling packed refs that cannot decorate the requested log page, cheaply rejects ordinary revision names before compiling the describe regex, and buffers non-interactive CLI output. It retains strict packed-refs parsing and adds Git-backed coverage for all packed-refs peel-header variants.

    log/json-100 median: 6.6 ms → 5.5 ms (20% better)log/json-100 peak RSS: 25,108,480 bytes → 24,649,728 bytes (2% better)log/json-100 vs system git: 2.0 ratio → 1.7 ratio (20% better)log/oneline-100 median: 5.6 ms → 4.5 ms (24% better)
  • ›Quality #21: Simplify652127e1

    Removes the dormant core.whitespace parsing/check/fix engine while keeping the two ASCII whitespace predicates used by diff. It also removes only the corresponding public-surface snapshot entries and API coverage tests, replacing coverage for the retained helpers.

    Warmed diff-10000 mean: 9.6 ms → 9.6 ms (1% worse)Warmed diff-10000 peak RSS: 17,281,024 bytes → 16,961,536 bytes (2% better)
  • ›Perf regression 2026-10-22: diff/staged@deep-tree, diff/staged@synth-100ka06e416a

    This change removes the staged-diff regression by making wide cache-tree lookup near-linear, releasing index memory before patch construction, avoiding unnecessary copies, and loading changed blobs in parallel. It also adds compatibility and Criterion coverage and fixes benchmark reports so they identify the commit that produced the timed grit binary.

    diff/staged@deep-tree grit wall: 81.7 ms median → 42.4 ms median (93% better)diff/staged@deep-tree system git companion: 36.0 ms median → 36.6 ms median (2% worse)diff/staged@deep-tree grit peak RSS: 45.0 MiB → 44.6 MiB (1% better)diff/staged@synth-100k grit wall: 127.2 ms median → 55.6 ms median (2.3× better)
  • ›Speed: bundle/verify@synth-10kbe9a8e3e

    Bundle opening now parses only the textual header through a 64 KiB buffered reader and records the embedded pack offset without loading the pack. This removes a 22 MB read from verify and every other Bundle::open caller while preserving the public API and pack handling behavior.

    bundle/verify wall time (20-run median): 16.4 ms → 3.3 ms (5.0× better)bundle/verify peak RSS: 34.1 MB → 11.8 MB (2.9× better)bundle/verify ratio vs system git: 7.4 x → 1.5 x (5.0× better)bundle/create wall time (median of four 3-run medians; 12 runs total): 898.9 ms → 928.2 ms (3% worse)
  • ›Follow-up: pick/revert --check and -X ours|theirs, --conflictdb7a868f

    Replay startup now rejects an invalid first pick/revert step before creating sequencer state. If another first-step apply error occurs before any commit advances HEAD, the startup path removes the just-created replay files, and the compatibility test now locks in that cleanup.

  • ›Quality #22: Library API qualityd8c7a591

    Replaces message-text inspection in mailmap loading, config discovery, branch compare-and-swap, and tree-path diagnosis with typed data and existing typed error variants. It also removes the unused public raw-mailmap loader, updates warning rendering and rustdoc, and adds regression tests for non-blob mailmaps and stale branch tips.

    commit/small@small median: 7.6 ms → 5.6 ms (37% better)commit/small@synth-10k median: 25.1 ms → 24.4 ms (3% better)config/get@small median: 3.3 ms → 3.3 ms (1% better)log/oneline-100@synth-100k median: 4.7 ms → 4.4 ms (7% better)
  • ›Main keeper: make CI on main green (test, bench-daily-smoke)392d61b3

    This change restores uniqueness in the daily benchmark registry. It removes duplicated add scenario descriptors and assigns the non-headline merged-ref query a distinct ID while preserving the existing headline row.

  • ›Follow-up: `grit history fixup --hunks/--lines`cb6dac38

    Adds reliable `history fixup` selection by hunk or line range while preserving pre-existing staged and nearby unselected worktree edits. The round-3 correction fixes inverse-patch construction when selected and unselected replacements share one structured hunk, and keeps restoration failure-safe after refs move.

  • ›Quality #23: Move logic into grit-lib7d2809d0

    Fsck findings now describe their object, location, and detail through one grit-lib implementation. The CLI only maps those typed values into output, while the legacy maintenance wrapper reuses the same severity and line mapping instead of maintaining copies.

    fsck/full@big-blobs grit median: 9,053 ms → 9,344 ms (3% worse)fsck/full@git-git grit median: 26,263 ms → 25,808 ms (2% better)fsck/full@big-blobs peak RSS: 6,996,426,752 bytes → 6,996,385,792 bytes (0% better)fsck/full@git-git peak RSS: 11,374,428,160 bytes → 11,383,848,960 bytes (0% worse)
  • ›Main keeper: make CI on main green (test, bench-daily-smoke)00ad71e4

    This change removes duplicate merge-conflict recovery guidance, refreshes the generated skill snapshot, and documents the uniquely named merged-ref benchmark scenario. The focused changes are already present on current main as clean rebased commits and remain correct under round-two verification.

  • ›Main keeper: make CI on main green (test)ced22367

    Corrects the history conflict regression fixture so the commit being rewritten remains non-empty. That lets descendant replay execute and verifies the intended typed Conflict error includes conflict.txt, instead of aborting earlier with BecameEmpty.

  • ›Speed: tag/list@many-refs5b524ddf

    This change removes repeated object reads from tag listing, reuses per-thread loose-object inflate scratch, narrows filtered pack lookup passes, and replaces a BTreeMap collection path with a sorted Vec. It substantially accelerates tag listing and other many-ref reads, but currently trusts packed peel data too far when the source tag object is missing.

    tag/list@many-refs median (origin/main → branch): 36.8 ms → 12.3 ms (3.0× better)tag/list@many-refs peak RSS (origin/main → branch): 16.7 MiB → 17.3 MiB (4% worse)tag/list@many-refs median (system Git → branch reference): 3.3 ms → 12.3 ms (73% worse)ls-remote/all@many-refs median: 30.3 ms → 21.8 ms (39% better)
  • ›Follow-up: grit pick: several commits, ranges, --continue/--abort/--skip, -x, --no-commit, --empty4f5db4f8

    This follow-up persists replay checkpoints and source/created-record pairing across multi-commit pick sequences, sanitizes continued conflict messages, fixes no-commit empty comparisons, and reduces allocations in replay index/worktree handling. The correctness work is validated, but the performance acceptance criterion is still not achieved.

    pick-range-20 grit median: 108.5 ms → 103.6 ms (5% better)pick-range-20 Git median control: 119.6 ms → 116.1 ms (3% better)pick-range-20 time ratio: 0.907 grit/git → 0.892 grit/git (2% better)pick-range-20 grit peak RSS: 21,164,032 bytes → 22,368,256 bytes (5% worse)
  • ›Quality #24: Dead code and dependenciesa899481c

    Removes a signed-push certificate module that no transport uses, drops unused pack.islandCore bookkeeping, and deletes bitmap-config helper gates that no pack path calls. The reachable delta-island and pack bitmap behavior is unchanged, while grit-lib loses 388 source/test lines plus 44 public-API snapshot lines.

    current origin/main vs branch: commit-graph-write: 3.7 ms median → 3.7 ms median (2% worse)current origin/main vs branch: fetch-incr-file-smoke: 3.0 ms median → 3.0 ms median (1% worse)current origin/main vs branch: push-file-smoke: 3.5 ms median → 3.5 ms median (1% better)current origin/main vs branch: clone-git-http-smoke: 27.2 ms median → 27.1 ms median (0% better)
  • ›Follow-up: `grit rebase --exec <cmd>`2be75989

    On a failed `rebase --exec`, grit now restores every tracked path to the saved pre-rebase HEAD tree, including files the command dirtied whose blob did not otherwise change during replay. Regression coverage exercises the real shell runner and the CLI, and also locks in single-emission error reporting.

  • ›Follow-up: Log, merge-base and rev-parse on deep history

    This branch adds guarded fast paths for one-tip bounded revision pages, retains parsed commits for revs JSON rendering, and restores encoding-aware lazy subject extraction. It also strengthens regressions for encoded subjects, merge and non-commit tips, disconnected merge-base histories, and truly missing commit-graph fallback.

    HEAD~20 limit-1: origin/main to branch median: 3.2 ms → 3.5 ms (8% worse)HEAD~20 limit-1: system Git to branch median: 1.7 ms → 3.5 ms (51% worse)First-1000: origin/main to branch median: 26.6 ms → 25.7 ms (3% better)First-1000: system Git to branch median: 3.3 ms → 25.7 ms (87% worse)
  • ›Main keeper: make CI on main green (public-api, test)a4d3ac2e

    This change preserves a split commit whose tree intentionally matches the newly inserted parent, fixing partial file-to-directory splits. It scopes that exception to SplitBefore and updates the checked-in public API inventory.

  • ›Main keeper: make CI on main green (public-api, test)aededf21

    This changes the history rewrite merge-call instrumentation from one process-wide atomic counter to one counter per test thread. Parallel tests can no longer alter another test’s measurement, while production history planning remains unchanged.

  • ›Speed: diff/worktree@synth-10kdaf17d6a

    Large index files are now read through a short-lived mmap, and indexes over 256 KiB overlap trailer hashing with parsing while preserving checksum-first error precedence. The default worktree diff also reuses one loaded index and one WorktreeRules instance for entry detection and content rendering instead of loading both twice.

    diff/worktree@synth-10k grit time: 12.6 ms → 9.3 ms (36% better)diff/worktree@synth-10k grit peak RSS: 17.8 MiB → 16.1 MiB (11% better)diff/worktree@synth-100k grit time: 125.8 ms → 100.2 ms (26% better)
  • ›Main keeper: make CI on main green (coverage, test)70363a26

    Adds explicit hygiene reasons to two existing history thread-local blocks. This restores the coverage ratchet under `unstable-bench-helpers` while leaving compiled behavior unchanged.

$ git log --oneline b01a954f..v0.5.18compare on GitHub ↗
3228736bFix schema index and CLI contract after rm/mv dry-run
fd9bf11aFix forced move rollback order and parent recreation
92fea7e7Update public-api.txt for MoveDuplicateDestination error variant
9c3fc50fFix review regressions for mv duplicate targets and clean semantics
80f1190eFix rm/mv compat tests and index-write failure unit test
1a042059Fix clippy too-many-arguments on move planning helper
a08242caAdd rm/mv dry-run, move_paths batching, and clean scope filters
df5d30dcchore: regenerate public-api.txt after rebase onto main
d3c4c83dfix(clone): refresh clone_local JSON snapshot for detached field
23c0ba94fix(clone): review blockers for depth zero and MATRIX coverage
8744595cfeat(clone): add --depth and -b/--branch for shallow and tag checkout
4f68730dchore: refresh grit-lib public-api.txt for reset preview API
252105acfix(reset): keep dry-run lists local and untracked blockers
fc2d425ffix(reset): address review on orphans, keep unmerged, dry-run
05754a83Add reset --keep, --dry-run, and orphaned commit reporting
3eb8877bfix(blame): skip absent ignore-revs oids and refresh snapshots
c45a5f45feat(blame): ignore-rev and ignore-revs-file support
57333db4Merge branch 'factory/stash-pathspec-index'
561d9b7afeat(stash): pathspec push and apply/pop --index
c40f1e61fix(hygiene): exempt thread-local and upload-pack spawn for ratchet
daf17d6abench: record diff/worktree daily rows before and after the index load fixes
91b776efdiff: load the index once for the default worktree diff
987778abindex: map large index files and verify the trailer while parsing
6e58b7dftest: regenerate skill snapshot for init section
cbb265ccfix(init): optional object format on reinit, reject bare+separate
e32f4e90test: drop redundant InitOptions initial_branch literals
803190d3feat(init): initial branch config, separate git dir, and sha256 format
009ae4c8Merge branch 'factory/filtered-fetch-promisor'
76b15e7dfix: effective remote -v URLs and set-url edge cases
c768593efeat: grit remote set-url and verbose remote list
3b5022b2doc: disambiguate Error link in partial_clone rustdoc
7aacbf0eMerge branch 'factory/schema-index-snapshots'
bc73560eCapture structured error snapshots from real CLI runs
5d823da6Complete schema index and JSON snapshot coverage
a7c9b00dchore: regenerate public-api.txt for partial-clone API
0c1889fbfmt: transport fetch_remote call wrapping
3764bf4aFix fsck missingObject for promised index blobs
e4d8b21dFix review: mut FetchOptions call sites, partial-clone clippy, promisor when filter dropped
a3fe8b80Add partial-clone filtered fetch with promisor pack support
79331790Add CLI conventions contract test and docs page
e9863d86fix: regenerate public-api.txt from cargo-public-api
1c6cbd0ftests: regenerate skill snapshot for reflog skill row
cb5a7e40reflog: add Signature parsing and richer --json fields
aededf21fix(history): thread-local merge-tree counter for parallel tests
a4d3ac2efix: split rest commit when empty tree matches insert parent
6865ddd3fix(revwalk): limit-2 fast path only for non-merge tips
b8923c09perf(revs): fast single-tip pages and reuse walk commit data
0cdee2b8fix: restore deep-history review fixes on rebased main
2be75989Merge branch 'factory/rebase-exec-3258'
4f5db4f8Merge branch 'factory/pick-rss-3431'
a899481cMerge branch 'factory/unwired-feature-leftovers'
5b524ddfMerge branch 'factory/tag-list-speed'
9d2f28bcRemove the uncalled bitmap config gates
cff42e87delta islands: stop parsing pack.islandCore
fd1f2e1fRemove the unused push-certificate module
2dd59b01fix(rebase): hard-reset worktree on exec rollback
d5f59264refs: index packed-refs peel lines only when enough refs need peeling
a74bba52pack: test object reads with a multi-pack-index across lookup passes
62606de4refs: test tag listing against git for loose, packed and shadowed refs
6109f1ecodb: test loose inflate across read chunks, truncation and lying headers
cf1d3267refs: collect listed refs in a vector instead of a name-keyed map
4207e497pack: keep filtered lookup passes to the packs they select
3a93e85aodb: read a small loose object with one read syscall
b1db237arefs: peel listed refs from packed-refs and read each tag object once
81448768odb: inflate loose objects without zero-filled scratch or per-read zlib state
1b754c11fix(replay): sequencer checkpoints, pick RSS, and compat tests
ced22367test: use non-empty rewrite tree in conflict replay fixture
00ad71e4test: refresh skill snapshot and list merged-ref daily scenario
ccbab177fix: stop duplicating merge conflict next steps in markdown
67a1458ffsck: render issues from the library's FsckIssue accessors
67ce2816fsck: describe issues once on FsckIssue
7b1374c1fix(history): fixup hunk planning, restore, and CLI errors
00f010a3fix: rebase exec integration on main (schemas, CLI stack tests)
f31d8cdddocs: refresh public-api for rebase exec
7597b7c0fix: clean integration artifacts after rebase onto main
ee072569fix(clippy): gate-clean cli_command and completion tests
1fa77bcfchore: cargo fmt exec.rs
2d2c794ffix(clippy): avoid expect in exec failure path
f89eda28fix(cli): build clap command tree on large-stack thread in tests
4e7cb012fix(rebase): address --exec review and maintainer steering
c7a3567efeat(rebase): run --exec after planning with rollback before apply
3e37b464bench: dedupe matrix registry ids and rename merged ref-query scenario
394dd52ddocs: refresh public-api for StashPushResult::w_tree
b25bf583fix: address stash push hunk review feedback
31f57a4dfeat: stash push partial hunks with worktree reverse apply
76b7093eMerge branch 'factory/typed-error-matching'
794be0bcrev-parse: tell tree-path misses apart by type, not message text
09cc7a14refs: typed ExpectedMismatch for branch-commit CAS failures
51fcf7cdconfig: return ConfigError::BadConfigVariable for a valueless negotiationAlgorithm
c4f0654bmailmap: report a non-blob mailmap.blob with a typed warning
b3f02f7cfix: validate replay before sequencer bootstrap
8f312a8bperf(bundle): stream the header instead of reading the whole bundle
57c0594fMerge branch 'factory/diff-staged-wide-cache-tree'
4e680c86bench: record the timed binary's commit in grit-bench daily reports
26df85d7bench: record diff and deep-tree status daily rows before and after
7e6e82e7Load staged diff blobs in parallel
2f18deb6Release the index early and avoid copies in grit diff --staged
e555fb75Look up wide cache-tree nodes in sorted order in the index-vs-HEAD walk
a6ed96d0Remove the unused whitespace-rule engine from grit-lib
dd0e5c42Merge branch 'factory/log-json-speed'
97470d40bench: split clean vs conflict campaign topology for matrix rows
b59aa065bench: wire campaign conflict matrix and fix grit-utils tests
2d0d7f41bench: add merge/pick/revert conflict scenarios and conflicts.json baseline
f2020a29Merge branch 'factory/ci-green-3423'
5e1635b4bench: record log daily rows before and after the decoration and output fixes
34168cb8cli: buffer rendered command output
67758d45log: skip packed refs that cannot decorate the listed commits
9678d32frev-parse: skip the describe-name regex for names that cannot match
77762bb0Merge branch 'factory/odb-peel-dedupe'
f2e6e6a3test(cli): branch list JSON omits is_remote for local branches
0b572391fix(commit): do not auto-stage when message validation fails
1b173029Merge branch 'factory/pick-replay-check-3026'
6155988cfix pick/revert --check: chain no-commit predict tree, schemas, empty-step messaging
9a7db61bpick/revert: in-memory --check and merge strategy flags
4966baf9docs: say what ls-remote peel lines hold for tags of tags
adfecfeaodb: compute tag peel lines from type headers
5f791ef0Peel revision tips to commits through Odb::peel_to_commit
bc47dd6aodb: one helper for tag peel lines and tree peeling
91e27500fix: rebase fixup onto main IndexApplyOptions and skill snapshot
3583993dtest(cli): refresh skill snapshot for history fixup flags
119e72b7fix(history): line-range fixup complement and failure-safe restore
ade9400bfix(history): preserve same-path staged hunks on fixup --hunks apply
484dd7b8feat(history): fixup unstaged hunks with --hunks and --lines
29e8eec8Merge branch 'factory/restore-hunks-3244'
e5dd0c8dtest(cli): refresh grit skill snapshot for partial restore docs
dff67e2bfix(restore): review follow-up for hunks/lines restore
314b33a5Merge branch 'factory/push-invocation-libify'
88c6abaffeat(restore): add --hunks and --lines partial discard
12d7f000chore: refresh public-api.txt after pick integration
9113343aIntegrate factory/pick-sequence-3024: grit pick replay sequences
46daf03fMerge branch 'factory/pick-sequence-3024'
d3bc3c29fix: pick gate docs, replay bugs, and pick-range-20 perf
fe2f3bc8fix: rebase onto main and align replay merge path with origin
a63fb0a4bench: record pick-range-20 baseline and document known perf gap
e3939bfbchore: public-api.txt for ReplayCreated
f70f3810fix: pair multi-commit continue JSON and tune replay hot path
e158b0f2[conflict] fix: pick sequencer review blockers (abort, continue, ORIG_HEAD, clap)
1a962c04docs: fix pick.md internal links for site check
ee1a8574[conflict] grit-cli: pick ranges, sequencer flags, and v2 JSON
0e175733chore: refresh public-api.txt after rebase onto main
3f2e7a8afix: branch list markdown unit test after merge-options rebase
6fb143a2fix: daily headline count 22 and branch list test gone field
78b6493dbranch list: markdown table tests, skill snapshot, docs escaping
621c495fbranch list: resolve upstream through fetch refspecs
4aca71d1branch list: fix upstream ref, -a names, current/worktree, daily registry
7463f24dbranch: list filters, upstream markers, and rich JSON
77c67952push: scan the destination's refs once per push
b8a10a9epush: list literal URL and path remotes when planning
26033befpush: resolve positionals, remote and plan context in grit-lib
c7235857feat: grit commit --hunks, --lines, and --patch-file partial commits
58973440Merge branch 'factory/ci-green-3395'
bd9089ebMerge branch 'factory/commit-paths-speed'
7c9551a2Merge branch 'factory/tree-sha256-tag-bench-2801'
9f48eb86chore(grit-lib): refresh public-api snapshot for tree-sha256 tag create
f3f7decbbench: record commit daily rows before and after the partial-commit speedups
34009714commit: seed partial-commit index stats from the real index and prime its cache-tree
918ada42commit: validate path arguments without reloading the index per path
f16f75e7Wire grit-bench tag-tree-sha256 command and prepare hooks
394fbc04Add explicit grit tag --tree-sha256 create for bench scenarios
51540c6eperf(rev-list): path-limited walks without per-OID tree cache
6e301cf1Fix clippy expect in tag create path and refresh skill snapshot
0822955eAddress review: regenerate tag schema and public-api snapshot
858e9cfcgrit tag: RefQuery list with annotations and list flags
3767610eci: reclaim more runner disk and shrink debug test links
e7078834fix(test): update merge_check oracle calls for merge harness API
2bf211abtest(cli): refresh skill snapshot for merge strategy flags
eb742eaefix(merge): squash conflict abort, dates, and pending message
d8871775feat(merge): add -X, conflict style, and allow-unrelated-histories
9b1da44aMerge branch 'factory/merge-options-3020'
1c8e448ffix(merge): integration follow-ups (clippy, tests, snapshots, public-api)
4e2e302fMerge branch 'factory/ref-query-reachability'
6d386a45cargo fmt: branching imports after rebase conflict
54e3bcadgrit-utils: refresh ref-query baselines after exact contains fix
a16a83a1grit-lib: speed up RefContainsBatch with bitsets and active-tip prune
e7a91fb1grit-lib: exact contains for many tips; skewed-date regression
7d07e0e2grit-utils: wire ref-query daily matrix and baselines
79045632fix(merge): tighten SQUASH_MSG cleanup and squash conflict test
61bf635afix(merge): amend message, squash cleanup, skill snapshot
5b77811bfix(merge): preflight commit identity before mutating tree
339a2efcfix(merge): align Git merge state and schema with review
245fb316feat(merge): add ff-only, no-ff, squash, no-commit and message options
81502897Merge branch 'factory/rebase-continue-3253'
8d0b56edgrit-lib: shared-history contains walk and ref-query perf
599ad917grit-lib: fix ref-query reachability git compat from review
e0417bc4grit-utils: refs-driver ref-query workload for reachability benches
f7921a55grit-lib: RefQuery contains, merged, and points-at filters
c4ec8299fix(grit-cli): run clap-tree unit tests on a larger stack
7d6685defix(grit-lib): report grit rebase as non-interactive in status
df5925dafix: rebase JSON head field, gate stack, and doc checks
f6a6c37efix: run shell completion tests on a larger stack
fd579dddcli: grit rebase --continue, --abort, --skip and status hints
738e2203chore(grit-lib): refresh public-api snapshot for BundleCreateOptions
78f0c26fMerge branch 'factory/issue-1518-win-50k-perf-v2'
6a32c117Merge branch 'factory/blame-mid-churn-perf-3322'
70a441edlib: expose grit rebase in status operation hints
5dce71dbfix: Bugbot follow-ups for #1518 worktree scan
9a346886test: allow extra tracked paths in 50k add perf fixture
ef965bd6Fixes #1518: faster dense 50k worktree scans on Windows
509ceac6fix(add): count line bounds from diff worktree bytes
2ff17c12chore: drop stray insta skill snapshot artifact
ff17bc5ffix(add): line selection pathspec, bounds, and hunk union
f403c512Fix windowed blame diff mis-map for -L ranges
96369e64feat(add): line-range partial staging with grit add --lines
e47f1c73Fixes #1505: blame perf on mid-churn files and merge-heavy walks
58a09080Merge branch 'factory/ci-green-3374'
fba06590Merge branch 'factory/bundle-create-all'
abf0bbc5docs: fix broken StaleId rustdoc link in hunk_select
6e6ac9efMerge branch 'factory/rebase-check-x-3254'
20413719Fixes #1512: bundle create --all with all_refs public API
2cd2d70dfix: refresh skill snapshot, public-api, and disable signing on rebase --check
9afc95fbfeat: rebase --check and -X ours|theirs for replay conflicts
1881b7feMerge branch 'factory/status-ignored-collapse'
fb10f731Merge branch 'factory/fix-commit-detached-head'
95fb8384Merge branch 'factory/clone-transfer-stats-1516'
53cd55f4Fix detached HEAD commit on reftable and review follow-ups
fcab7ca7Fixes #1513: allow grit commit on detached HEAD
a10cfc47Fixes #1519: allow free-text CLI values to start with a dash
95683675fix: report per-fetch local transfer stats, not cumulative packs
2c9d0bb9fix: aggregate local clone transfer stats across linked and ingested packs
90386dffFix UNTR cache probe to always enumerate nested files
fffe28b9Fix ignored directory collapse under untracked parents
23feecffMerge branch 'factory/fetch-dry-run-summary'
6bee753atest: set record_operation on rebase session ApplyOptions
642f3b92Fix fetch --dry-run summary when updates are pending
bb303b8cMerge branch 'factory/dead-pub-fns'
088a1ba5branch: run json_examples_parse on larger test stack
79b1f273branch: fix review blockers for remote list
6fe34db9branch: list remote-tracking refs with --remote, --all, and -n
eca41ca3chore: refresh grit-lib public-api.txt for dead-code removal
d8c956d5grit-lib: remove public functions that nothing calls
3bdb9021grit-lib: drop the unread diff-entry-scan test counter
daf768f8fetch: drop the never-constructed in-memory pack receive sink
697140ffMerge branch 'factory/fix-log-since-date-1504'
ff677003fix(add): always emit staged_hunks in JSON; faster hunk diff path
f1276399fix(add): hunk resolve config, binary errors, perf, schemas
a0ef4ae2feat(add): hunk selection by id and grit add --hunks
cfba711cMerge branch 'factory/hunk-ids-3281'
247184f9Merge branch 'factory/fix-commit-staging-on-error-7412'
b7e5b2f3fix(diff): scope hunk-id peers to JSON and primary paths
a1515562fix(diff): filter peer entries before loading bytes
a6147a53Fix log --since/--until and commit --date approxidate parsing
5593db37fix(diff): load hunk-id peers only for patch output
51a31637fix(diff): avoid expect in duplicate hunk rank lookup
4831f00eFixes #1503: do not auto-stage before commit message validation
a0028024Fixes #1502: precompute hide_set in reachable walks
cd8fda4etest: set record_operation on rebase session ApplyOptions
eda37cb5fix: refresh skill snapshot, HistoryRewriteOutcome schema docs, and skill.md rebase wording
f1b71fa2fix: make rebase/onto@git-git daily smoke runnable (HEAD~10, rebase abort reset)
72da1ef3fix: address rebase review blockers (snapshots, docs, smoke, git-git reset)
70996c8bcli: add grit rebase command with tests, docs, and benchmarks