grit://cooking/bench
← cookingraw data

grit vs git, every day

Each day one agent builds main and times every supported grit command on every repo shape against the system git in the same sitting, recording median wall time and peak memory. Ratios are grit / git: below 1× grit is faster.

$ cat daily/2026-10-27.jsongrit 8dbc58e77 (grit 0.5.23) · git version 2.43.0
# linux · x86_64 · Intel(R) Xeon(R) Processor · 4 cores · 15.628128051757812 GB
scenarios171171 timed against git
faster / par / slower76 / 13 / 82
everyday ops (geomean)0.81×22 headline scenarios
all scenarios (geomean)0.85×
memory > 1.5× git100
failures0
notes: Measured by `grit-bench daily` (unmodified main 8dbc58e77228a2061bcf92997becf61f9dcc8682, cargo release profile, system git 2.43.0; no baseline grit release; no source changes, nothing landed on main). Task day is 2026-10-27 (the run was dispatched 23:00 UTC); a first full pass (started 23:06 UTC) aborted at clone/http@synth-10k because grit-http-server had not been built, so it was discarded, grit-http-server was built, and the full pass whose results are published here started 2026-10-28T00:09:30Z and finished about 01:17Z (the timestamp field is that start). All 171 daily scenarios were run in a single invocation with the runner's defaults (3 warmups, adaptive 5-20 samples). Published fields rename median_wall_ms to median_ms and convert peak_rss_bytes to max_rss_kb (bytes/1024); each scenario's detail object (setup, prepare, commands, correctness, phases) is carried unchanged from the runner. Functional areas are mapped to the public schema (blame/revwalk->history, bundles/notes/odb/packs->objects, config/hooks->other, diff/ignore/index/worktrees->worktree, remotes->remote). Headline flags/names are carried from the runner's registry, which also flags branch/list-json, branch/merged, log/json-100, pull/rebase and push/force-with-lease as headline in addition to the 17 required ones. Repo metadata was recounted from the cached/scratch fixtures (files = HEAD tree entries, commits = reachable from all refs, refs = for-each-ref, pack_mb = .pack bytes/1024^2); large-file is synth-10k plus the committed large.txt; wide-120k holds loose objects (0 pack MB). Fixtures are on ext4 on a 4-core Intel Xeon VM with 15.6 GB RAM, a different machine and git version (2.43.0) than the 2026-10-26 report (AMD EPYC, git 2.55.0), so day-over-day ratios are not directly comparable; notably git's push/pull enumerate-objects phases are far slower on 2.43.0. Noise check against the 2026-10-26 report (>20% worse time ratio or >30% worse peak-memory ratio): 20 scenarios were re-run three additional times with `daily --only <id>` and the published median/stddev use all concatenated samples, runs is their count, min/max span all invocations, max_rss_kb is the maximum observed: add/dry-run@synth-10k, clean/untracked@synth-10k, commit/staged@synth-100k, config/set@small, diff/staged@deep-tree, diff/worktree@deep-tree, diff/worktree@synth-10k, fsck/full@git-git, init/empty@small, merge-base/branches@git-git, rebase/onto@synth-10k, remote/remove@many-refs, remote/show@many-refs, reset/hard@synth-10k, rm/dir@synth-10k, status/clean@synth-10k, status/renamed@synth-10k, switch/branch@synth-100k, switch/delete-heavy@wide-48k, switch/large-blob@big-asset. First-pass detail objects (including phases) are unchanged. Failures: 0 (none). No scenarios were skipped.
Regressions since the previous run2026-10-26 → 2026-10-27
▲ [time] commit/staged@synth-100k: grit/git 0.72× → 1.01× (grit 79ms → 72ms, git 71ms)
▲ [time] diff/staged@deep-tree: grit/git 0.84× → 1.04× (grit 51ms → 37ms, git 36ms)
▲ [time] diff/worktree@deep-tree: grit/git 1.59× → 2.12× (grit 389ms → 196ms, git 92ms)
▲ [time] reset/hard@synth-10k: grit/git 0.97× → 1.51× (grit 43ms → 23ms, git 15ms)
▲ [time] switch/branch@synth-100k: grit/git 0.44× → 0.60× (grit 105ms → 83ms, git 138ms)
▲ [time] switch/delete-heavy@wide-48k: grit/git 0.88× → 1.12× (grit 199ms → 123ms, git 109ms)
▲ [time] switch/large-blob@big-asset: grit/git 0.57× → 0.89× (grit 482ms → 738ms, git 828ms)
Biggest gaps to gitwhat the speed agents work on next
1.reset/sparse@sparse-unique-120k: time 16.48× git (grit 889ms, git 54ms); memory 4.16× git (grit 91MB, git 22MB)
2.branch/merged@many-refs (headline): time 1.77× git (grit 2.3ms, git 1.3ms); memory 2.45× git (grit 15MB, git 6.0MB)
3.switch/sparse@sparse-unique-120k: time 10.12× git (grit 761ms, git 75ms); memory 3.27× git (grit 57MB, git 17MB)
4.reset/undo-commit@git-git: time 5.99× git (grit 12ms, git 2.0ms); memory 5.36× git (grit 44MB, git 8.3MB)
5.branch/list@many-refs (headline): time 1.59× git (grit 2.1ms, git 1.3ms); memory 2.06× git (grit 14MB, git 6.7MB)
6.branch/list-json@many-refs (headline): time 1.56× git (grit 2.3ms, git 1.5ms); memory 1.96× git (grit 15MB, git 7.5MB)
7.show/head@git-git (headline): time 1.45× git (grit 2.8ms, git 1.9ms); memory 2.18× git (grit 18MB, git 8.4MB)
8.fetch/deepen@git-git: time 8.26× git (grit 5.41s, git 655ms); memory 0.29× git (grit 76MB, git 259MB)
9.log/json-100@git-git (headline): time 1.50× git (grit 4.6ms, git 3.1ms); memory 1.65× git (grit 24MB, git 14MB)
10.log/oneline-100@git-git (headline): time 1.39× git (grit 4.3ms, git 3.1ms); memory 1.66× git (grit 23MB, git 14MB)
Repo shapes
repofilescommitsrefspackshape
big-asset2230 MBLarge loose text asset, plus README; other branch deletes the asset
big-blobs200120403330.27 MB200 paths with large binary blobs and multiple blob revisions
deep-history20,00050,00015.487 MB50,000-commit linear synthetic history; no commit graph in measured worktree
deep-history-cg20,00050,00015.487 MBSame deep-history fixture; verified commit graph in measured worktree
deep-tree5,0003006045.243 MB5,000 files nested across 30–40 directory levels
git-git4,52575,031954242.564 MBUpstream git/git pinned at v2.47.0, full history
git-git-10k-refs4,52575,03110,957242.564 MBFull git/git history plus 10,000 distinct packed branch tips
large-file10,0011,00180021.422 MBsynth-10k extended by one committed 50k-line large.txt, modified into 500 hunks; file/commit counts derived from recounted base plus that setup step
many-refs2001,00010,0001.044 MB10,000 packed refs
many-refs-loose2001,00010,0001.044 MB10,000 loose refs
small10050600.138 MB100-file synthetic repository
sparse-120k120,000230.307 MB120,000-file repository with a 300-file visible sparse workset; sparse reset/switch scaling
sparse-240k240,000230.602 MB240,000-file repository with a 300-file visible sparse workset
sparse-unique-120k120,000235.103 MB120,000-file repository with unique blobs and a 300-file visible sparse workset
synth-100k100,0001,0001,20052.277 MB100,000-file synthetic repository; canonical cached shape
synth-10k10,0001,00080021.422 MB10,000-file synthetic repository; canonical cached shape, scenario variants documented by the runner
wide-120k120,000320 MB120,000-file tree with 3,000 edits stashed, for stash pop
wide-20k20,000424.345 MB20,000-file tree; both sides edit every file for content merge
wide-48k48,000232.22 MB48,000-file baseline tree; other branch deletes 2,000 files
Every command, every repo shape8 days of history · Δ vs previous run (grit/git ratio)
case @ repogitgritgrit / gitgit peakgrit peakmem / gittrendΔ
worktree/
$ grit add
all @synth-100k144 ms126 ms0.87×28 MB47 MB1.66×−9%
all-ignorecase @synth-100k140 ms179 ms1.28×29 MB64 MB2.26×——
dry-run @synth-10k7.2 ms11 ms1.47×13 MB21 MB1.67×+24%
hunks @large-file12 ms22 ms1.79×10 MB27 MB2.72×——
lines @large-file12 ms35 ms2.85×10 MB33 MB3.24×——
modified @big-blobs213 ms115 ms0.54×78 MB88 MB1.12×−43%
modified @synth-10k ★16 ms11 ms0.65×12 MB25 MB2.11×−32%
patch-file @large-file13 ms11 ms0.88×10 MB23 MB2.24×——
patch-file @synth-10k6.4 ms7.4 ms1.16×9.3 MB20 MB2.15×−9%
update @synth-100k97 ms90 ms0.93×28 MB43 MB1.52×−11%
update-ignorecase @synth-100k92 ms120 ms1.30×29 MB57 MB1.98×——
$ grit clean
only-ignored @synth-10k4.3 ms5.5 ms1.28×8.5 MB17 MB1.98×——
untracked @synth-10k4.3 ms5.3 ms1.24×8.6 MB17 MB1.95×+19%
$ grit commit
dry-run @synth-10k11 ms23 ms2.06×14 MB28 MB1.97×±0%
paths @synth-10k21 ms23 ms1.08×16 MB29 MB1.82×−30%
small @small5.1 ms4.8 ms0.93×12 MB19 MB1.64×−10%
small @synth-100k896 ms143 ms0.16×37 MB48 MB1.31×−42%
small @synth-10k ★26 ms18 ms0.67×13 MB25 MB1.86×−27%
staged @synth-100k71 ms72 ms1.01×36 MB44 MB1.22×+41%
$ grit diff
staged @deep-tree36 ms37 ms1.04×41 MB48 MB1.18×+23%
staged @synth-100k68 ms36 ms0.53×30 MB67 MB2.27×−22%
stat @synth-100k100 ms64 ms0.64×29 MB57 MB1.96×−17%
worktree @big-blobs296 ms92 ms0.31×182 MB191 MB1.05×+17%
worktree @deep-tree92 ms196 ms2.12×39 MB70 MB1.82×+33%
worktree @synth-100k116 ms69 ms0.59×29 MB67 MB2.32×−9%
worktree @synth-10k ★6.4 ms6.4 ms0.99×9.5 MB27 MB2.83×+16%
$ grit ignore
check-1000 @synth-10k2.3 ms6.8 ms3.01×6.5 MB16 MB2.55×+16%
$ grit init
branch @small2.2 ms3.2 ms1.44×6.5 MB14 MB2.14×——
empty @small2.4 ms3.5 ms1.46×6.6 MB14 MB2.09×+32%
$ grit mv
file @synth-10k5.5 ms8.9 ms1.61×8.5 MB19 MB2.29×−7%
$ grit reset
hard @synth-10k15 ms23 ms1.51×11 MB24 MB2.28×+56%
hard-delete-heavy @wide-48k225 ms236 ms1.05×21 MB52 MB2.48×−6%
keep @synth-10k11 ms13 ms1.27×11 MB23 MB2.10×——
mixed @synth-10k8.0 ms10 ms1.25×9.1 MB20 MB2.16×+11%
sparse @sparse-120k28 ms24 ms0.87×12 MB20 MB1.68×——
sparse @sparse-240k37 ms24 ms0.66×17 MB20 MB1.19×——
sparse @sparse-unique-120k54 ms889 ms16×22 MB91 MB4.16×——
undo-commit @git-git2.0 ms12 ms5.99×8.3 MB44 MB5.36×——
$ grit restore
hunks @large-file7.0 ms21 ms3.05×8.1 MB27 MB3.39×—
paths @synth-10k12 ms11 ms0.97×12 MB22 MB1.86×−8%
$ grit rm
dir @synth-10k11 ms13 ms1.20×9.3 MB21 MB2.28×±0%
dry-run @synth-10k6.1 ms7.7 ms1.25×9.1 MB19 MB2.08×——
$ grit stash
pop-index @synth-10k61 ms36 ms0.58×20 MB29 MB1.43×——
pop-sparse @wide-120k340 ms118 ms0.35×54 MB49 MB0.92×——
push-paths @synth-10k72 ms31 ms0.43×19 MB28 MB1.47×——
push-pop @synth-10k ★193 ms125 ms0.65×18 MB25 MB1.41×−33%
$ grit status
clean @deep-tree1.06 s642 ms0.61×38 MB70 MB1.82×±0%
clean @small1.8 ms2.9 ms1.65×7.2 MB18 MB2.48×±0%
clean @synth-100k62 ms55 ms0.89×29 MB36 MB1.25×+5%
clean @synth-10k ★6.7 ms7.6 ms1.13×9.3 MB22 MB2.40×+26%
dirty @deep-tree1.13 s676 ms0.60×39 MB77 MB1.95×+9%
dirty @small1.8 ms2.9 ms1.61×7.1 MB18 MB2.51×±0%
dirty @synth-100k97 ms57 ms0.58×29 MB41 MB1.43×−13%
dirty @synth-10k ★10 ms7.9 ms0.77×9.4 MB22 MB2.31×±0%
paths @synth-100k44 ms49 ms1.12×29 MB41 MB1.42×−39%
renamed @synth-10k6.6 ms7.7 ms1.15×9.1 MB20 MB2.17×+29%
$ grit switch
branch @synth-10k ★21 ms16 ms0.78×10 MB21 MB2.09×+9%
sparse @sparse-120k42 ms23 ms0.56×7.8 MB20 MB2.60×——
sparse @sparse-240k62 ms24 ms0.39×8.1 MB20 MB2.51×——
sparse @sparse-unique-120k75 ms761 ms10×17 MB57 MB3.27×——
$ grit worktree
add @synth-10k139 ms152 ms1.09×16 MB26 MB1.68×+11%
list @synth-10k1.5 ms2.9 ms1.88×6.4 MB14 MB2.15×+15%
remove @synth-10k112 ms108 ms0.96×6.3 MB14 MB2.15×+10%
history/
$ grit blame
file @deep-tree409 ms112 ms0.27×82 MB60 MB0.73×−15%
file @git-git ★289 ms245 ms0.85×233 MB260 MB1.11×−14%
$ grit cat
blob @git-git1.5 ms2.9 ms1.92×6.6 MB16 MB2.36×+18%
$ grit log
all @git-git48 ms57 ms1.19×20 MB37 MB1.88×−14%
author @git-git2.4 ms3.9 ms1.64×12 MB21 MB1.80×−10%
author-n50 @deep-history1.6 ms3.0 ms1.89×8.7 MB19 MB2.24×±0%
author-n50 @deep-history-cg1.9 ms3.2 ms1.70×12 MB22 MB1.84×±0%
json-100 @git-git ★3.1 ms4.6 ms1.50×14 MB24 MB1.65×−6%
json-filter @git-git2.2 ms4.4 ms2.04×11 MB23 MB2.14×±0%
json-n10-loose-tags @git-git12 ms13 ms1.13×17 MB26 MB1.56×——
json-n10-packed-tags @git-git10.0 ms2.9 ms0.29×17 MB19 MB1.12×——
limit-path @git-git18 ms14 ms0.79×32 MB38 MB1.19×−6%
oneline-100 @git-git ★3.1 ms4.3 ms1.39×14 MB23 MB1.66×±0%
oneline-100 @synth-100k2.2 ms3.3 ms1.46×9.1 MB19 MB2.07×+11%
path @git-git330 ms348 ms1.05×250 MB271 MB1.08×−14%
stat-n50 @git-git94 ms160 ms1.71×39 MB79 MB2.05×−55%
$ grit merge-base
branches @git-git15 ms3.9 ms0.26×19 MB23 MB1.24×+28%
$ grit patch-id
commit @git-git2.0 ms2.6 ms1.28×13 MB17 MB1.34×+5%
$ grit reflog
list @synth-10k4.4 ms3.3 ms0.75×9.2 MB16 MB1.72×±0%
$ grit resolve
change-id @git-git666 ms668 ms1.00×62 MB110 MB1.78×—
head-n @git-git1.2 ms2.2 ms1.93×6.0 MB14 MB2.42×±0%
$ grit revs
author-n50 @deep-history1.6 ms3.0 ms1.86×8.6 MB20 MB2.27×−5%
author-n50 @deep-history-cg1.9 ms3.0 ms1.63×12 MB22 MB1.85×−7%
count @git-git501 ms606 ms1.21×60 MB125 MB2.08×−19%
count-author @deep-history110 ms125 ms1.13×21 MB28 MB1.37×−69%
count-author @deep-history-cg116 ms125 ms1.08×24 MB28 MB1.20×−44%
count-path @git-git383 ms375 ms0.98×240 MB269 MB1.12×——
count-range-commit-graph @git-git2.3 ms2.8 ms1.21×18 MB21 MB1.12×——
count-since @deep-history1.5 ms2.3 ms1.62×8.1 MB16 MB1.93×±0%
left-right-count @deep-history2.4 ms4.0 ms1.70×8.5 MB18 MB2.09×−28%
$ grit shortlog
ahead @git-git16 ms2.2 ms0.14×19 MB12 MB0.64×−15%
behind @git-git18 ms2.2 ms0.12×19 MB12 MB0.64×+10%
$ grit show
head @big-blobs1.4 ms2.4 ms1.68×7.3 MB17 MB2.27×+7%
head @git-git ★1.9 ms2.8 ms1.45×8.4 MB18 MB2.18×±0%
head @synth-10k1.9 ms3.2 ms1.64×8.5 MB19 MB2.21×±0%
branching/
$ grit branch
contains @git-git-10k-refs29.83 s27 ms0.00×63 MB34 MB0.55×−100%
contains-json @git-git-10k-refs29.93 s28 ms0.00×63 MB35 MB0.55×−100%
create @many-refs1.6 ms2.5 ms1.59×7.4 MB16 MB2.14×±0%
delete @many-refs3.8 ms4.3 ms1.14×7.7 MB15 MB1.98×−71%
list @many-refs ★1.3 ms2.1 ms1.59×6.7 MB14 MB2.06×±0%
list @many-refs-loose1.3 ms2.0 ms1.52×6.7 MB13 MB1.91×−5%
list-json @many-refs ★1.5 ms2.3 ms1.56×7.5 MB15 MB1.96×±0%
merged @many-refs ★1.3 ms2.3 ms1.77×6.0 MB15 MB2.45×+11%
merged-ref @many-refs0.8 ms1.9 ms2.46×6.0 MB11 MB1.76×+12%
rename @many-refs1.7 ms3.2 ms1.92×7.4 MB11 MB1.44×−46%
$ grit history
reword @synth-10k6.39 s129 ms0.02×28 MB23 MB0.84×—
$ grit merge
clean @synth-100k281 ms145 ms0.52×44 MB54 MB1.23×−8%
clean @synth-10k ★98 ms56 ms0.57×14 MB24 MB1.80×−14%
content-both-sides @wide-20k1.30 s1.13 s0.87×48 MB82 MB1.70×−30%
$ grit pick
one @synth-100k192 ms139 ms0.72×37 MB47 MB1.25×−18%
one @synth-10k ★111 ms56 ms0.51×9.0 MB24 MB2.70×−29%
$ grit rebase
onto @git-git561 ms6.7 ms0.01×66 MB25 MB0.39×+14%
onto @synth-10k42 ms13 ms0.30×14 MB18 MB1.34×+55%
$ grit revert
one @synth-10k107 ms59 ms0.55×9.0 MB25 MB2.80×−17%
$ grit stash
list @synth-10k2.6 ms2.5 ms0.94×10 MB12 MB1.16×+12%
$ grit switch
branch @synth-100k138 ms83 ms0.60×36 MB43 MB1.19×+37%
delete-heavy @wide-48k109 ms123 ms1.12×22 MB34 MB1.55×+28%
large-blob @big-asset828 ms738 ms0.89×307 MB19 MB0.06×+56%
$ grit tag
contains @git-git6.21 s535 ms0.09×61 MB73 MB1.20×−11%
create @many-refs1.5 ms2.5 ms1.71×6.0 MB14 MB2.35×±0%
list @many-refs3.1 ms4.0 ms1.29×7.7 MB15 MB1.96×±0%
list-sort-version @git-git1.8 ms3.0 ms1.64×6.7 MB15 MB2.15×+6%
remote/
$ grit clone
bare @synth-10k824 ms762 ms0.92×35 MB25 MB0.72×−18%
blobless @git-git8.71 s7.23 s0.83×71 MB63 MB0.89×+6%
checkout @synth-100k2.99 s2.20 s0.73×44 MB76 MB1.73×+15%
full @git-git15.64 s8.76 s0.56×116 MB144 MB1.25×+10%
http @synth-10k771 ms702 ms0.91×35 MB32 MB0.90×−22%
local @synth-10k ★955 ms929 ms0.97×35 MB31 MB0.89×−20%
shallow @git-git1.57 s1.64 s1.04×38 MB53 MB1.39×——
shallow-depth1 @synth-10k186 ms186 ms1.00×31 MB30 MB0.96×+6%
shallow-depth1-http @synth-10k187 ms190 ms1.01×31 MB30 MB0.97×+7%
$ grit fetch
deepen @git-git655 ms5.41 s8.26×259 MB76 MB0.29×—
dry-run @git-git108 ms44 ms0.41×68 MB48 MB0.71×−56%
incremental @git-git ★110 ms46 ms0.41×68 MB48 MB0.70×−70%
incremental-http @git-git1.12 s519 ms0.46×144 MB47 MB0.33×−37%
noop @git-git25 ms11 ms0.44×54 MB18 MB0.33×−18%
noop-local @many-refs21 ms20 ms0.93×23 MB19 MB0.84×±0%
noop-local-no-tags @many-refs20 ms15 ms0.75×23 MB19 MB0.83×+6%
one-branch @git-git109 ms47 ms0.42×68 MB48 MB0.71×−70%
$ grit ls-remote
all @many-refs15 ms14 ms0.94×27 MB18 MB0.67×+6%
$ grit pull
check @git-git108 ms45 ms0.41×68 MB48 MB0.71×−70%
fast-forward @git-git ★123 ms51 ms0.41×73 MB48 MB0.66×−67%
rebase @synth-10k ★71 ms19 ms0.27×37 MB24 MB0.66×−31%
$ grit push
force-with-lease @git-git ★2.15 s1.13 s0.53×319 MB72 MB0.22×−94%
incremental @git-git ★2.15 s1.46 s0.68×319 MB87 MB0.27×−94%
incremental-http @git-git1.61 s944 ms0.58×318 MB86 MB0.27×−97%
refspec @git-git1.05 s1.15 s1.09×96 MB74 MB0.78×——
$ grit remote
list @small1.2 ms2.2 ms1.84×6.0 MB13 MB2.20×+13%
remove @many-refs745 ms338 ms0.45×9.6 MB25 MB2.60×−63%
rename @many-refs55.38 s3.19 s0.06×9.2 MB81 MB8.82×——
show @many-refs34 ms20 ms0.59×30 MB19 MB0.65×+31%
$ grit reset
blobless @git-git2.56 s2.34 s0.91×70 MB53 MB0.76×−18%
objects/
$ grit bundle
create @synth-10k254 ms228 ms0.90×42 MB54 MB1.31×−14%
create-all @git-git4.30 s6.90 s1.61×506 MB659 MB1.30×−13%
verify @synth-10k1.4 ms2.7 ms1.86×6.0 MB13 MB2.15×+9%
$ grit notes
add @synth-10k1.8 ms2.8 ms1.56×7.2 MB17 MB2.35×−10%
list @synth-10k1.3 ms2.2 ms1.66×6.5 MB14 MB2.19×±0%
list-n100 @synth-10k2.1 ms2.6 ms1.28×7.3 MB16 MB2.20×±0%
refs/
$ grit gc
pack-refs @synth-10k1.6 ms3.4 ms2.08×6.7 MB15 MB2.28×+15%
maintenance/
$ grit fsck
full @big-blobs16.47 s3.53 s0.21×3462 MB3792 MB1.10×+11%
full @git-git27.28 s12.53 s0.46×574 MB554 MB0.96×−17%
$ grit gc
default @synth-10k324 ms247 ms0.76×47 MB52 MB1.10×−11%
$ grit repack
commit-graph @git-git632 ms1.02 s1.61×72 MB106 MB1.48×−13%
full @git-git4.42 s5.34 s1.21×454 MB529 MB1.17×−7%
other/
$ grit config
get @small1.2 ms2.0 ms1.69×6.0 MB12 MB2.08×±0%
get-origin @small1.2 ms1.9 ms1.59×6.0 MB13 MB2.16×−8%
set @small1.3 ms3.0 ms2.37×6.2 MB13 MB2.11×+28%
$ grit hooks
list @small2.0 ms2.0 ms0.99×6.1 MB13 MB2.09×±0%
★ everyday operation shown on the cooking page · click a case for how it's measured · trend: grit/git time ratio, log scale, dashed line = par