# PR #23624 captures (step 3)

> **AFTER-side problems:** R1b skip-worktree: **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97; R11 skip-worktree: **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97; R12 skip-worktree: **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97; R19 cone-sparse skip-worktree: **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97

- AFTER: `cfee52fc24f56169ed4c0ce48759ad1ff9a7f655`; BEFORE: `8d3b061121fe65669d5d43d011b48cd3027a4108`
- `git version 2.43.0`; `Linux 6.1.102 x86_64`
- driver sha256 `95c72e8b34420ee159a4e39dc49fdaab52a7b19aa41bdf4368092ceca0f732c4`
- Driver appends `core.filemode=true`, because `testUtils/gitConfig.setup.ts` exports `core.filemode=false` to every git child. Without it, R2 rows fail on both sides for reasons unrelated to the PR.

| row | side | tree match | index before → after (sha256) | timing | note |
|---|---|---|---|---|---|
| R1b skip-worktree | before | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | 89cf38fb84 → 89cf38fb84 (same) | 206 ms | reused index (fresh read-tree 0, flagged re-add 0) |
| R1b skip-worktree | after | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | 6c91a1eee8 → 6c91a1eee8 (same) | 154 ms | reused index (fresh read-tree 0, flagged re-add 0) |
| R1b assume-unchanged | before | MATCH (1 sparse-excluded ignored) | b4c7ae01d7 → b4c7ae01d7 (same) | 117 ms | fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R1b assume-unchanged | after | MATCH (1 sparse-excluded ignored) | 5bc6230d64 → 5bc6230d64 (same) | 116 ms | reused index (fresh read-tree 0, flagged re-add 1) |
| R2a skip-worktree | before | MATCH | e264e5b9ee → e264e5b9ee (same) | 99 ms | flagged f chmod +x; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R2a skip-worktree | after | MATCH | 8470413ad5 → 8470413ad5 (same) | 108 ms | flagged f chmod +x; reused index (fresh read-tree 0, flagged re-add 1) |
| R2a assume-unchanged | before | MATCH | 1a633d27a4 → 1a633d27a4 (same) | 81 ms | flagged f chmod +x; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R2a assume-unchanged | after | MATCH | ab169b8cd4 → ab169b8cd4 (same) | 105 ms | flagged f chmod +x; reused index (fresh read-tree 0, flagged re-add 1) |
| R2b skip-worktree | before | MATCH | bbbe789fc9 → bbbe789fc9 (same) | 84 ms | unflagged f chmod +x, g flagged; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R2b skip-worktree | after | MATCH | ecba22e31a → ecba22e31a (same) | 109 ms | unflagged f chmod +x, g flagged; reused index (fresh read-tree 0, flagged re-add 1) |
| R2b assume-unchanged | before | MATCH | cf2e6320b0 → cf2e6320b0 (same) | 124 ms | unflagged f chmod +x, g flagged; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R2b assume-unchanged | after | MATCH | 819289161c → 819289161c (same) | 186 ms | unflagged f chmod +x, g flagged; reused index (fresh read-tree 0, flagged re-add 1) |
| R4 skip-worktree | before | MATCH | 888e04b95c → 888e04b95c (same) | 90 ms | flagged old renamed to new; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R4 skip-worktree | after | MATCH | 5154426f88 → 5154426f88 (same) | 117 ms | flagged old renamed to new; reused index (fresh read-tree 0, flagged re-add 1) |
| R4 assume-unchanged | before | MATCH | ea3056cdb9 → ea3056cdb9 (same) | 106 ms | flagged old renamed to new; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R4 assume-unchanged | after | MATCH | 6889e82920 → 6889e82920 (same) | 94 ms | flagged old renamed to new; reused index (fresh read-tree 0, flagged re-add 1) |
| R5 skip-worktree | before | MATCH | 09433aa892 → 09433aa892 (same) | 107 ms | HEAD head-1, staged stage1, wt work-1 (same size+mtime); fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R5 skip-worktree | after | MATCH | f755cb7367 → f755cb7367 (same) | 111 ms | HEAD head-1, staged stage1, wt work-1 (same size+mtime); reused index (fresh read-tree 0, flagged re-add 1) |
| R5 assume-unchanged | before | MATCH | 1580267724 → 1580267724 (same) | 100 ms | HEAD head-1, staged stage1, wt work-1 (same size+mtime); fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R5 assume-unchanged | after | MATCH | 206afe5d77 → 206afe5d77 (same) | 95 ms | HEAD head-1, staged stage1, wt work-1 (same size+mtime); reused index (fresh read-tree 0, flagged re-add 1) |
| R9 skip-worktree | before | MATCH | 8031ba6fec → 8031ba6fec (same); sharedindex.216870… 30d8a028b7→30d8a028b7, sharedindex.632a3e… b70749df8c→b70749df8c | 104 ms | split index + flagged same-size edit; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R9 skip-worktree | after | MATCH | 1c9825d53e → 1c9825d53e (same); sharedindex.2d92d6… 4237d7a479→4237d7a479, sharedindex.b22f33… f9e21ed629→f9e21ed629 | 110 ms | split index + flagged same-size edit; reused index (fresh read-tree 0, flagged re-add 1) |
| R9 assume-unchanged | before | MATCH | 24cde462cd → 24cde462cd (same); sharedindex.87a081… beea5a00ad→beea5a00ad, sharedindex.c4f9ae… 945981e02a→945981e02a | 102 ms | split index + flagged same-size edit; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R9 assume-unchanged | after | MATCH | b04556b747 → b04556b747 (same); sharedindex.02895d… 9a3ae5b0dc→9a3ae5b0dc, sharedindex.4dfd50… fc6946bf07→fc6946bf07 | 111 ms | split index + flagged same-size edit; reused index (fresh read-tree 0, flagged re-add 1) |
| R11 skip-worktree | before | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | 27b0f0dd4e → 27b0f0dd4e (same) | 103 ms | reused index (fresh read-tree 0, flagged re-add 0) |
| R11 skip-worktree | after | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | 1eb61dd4bc → 1eb61dd4bc (same) | 106 ms | reused index (fresh read-tree 0, flagged re-add 0) |
| R11 assume-unchanged | before | MATCH (1 sparse-excluded ignored) | 67a41f46fd → 67a41f46fd (same) | 201 ms | fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R11 assume-unchanged | after | MATCH (1 sparse-excluded ignored) | db66ada023 → db66ada023 (same) | 101 ms | reused index (fresh read-tree 0, flagged re-add 1) |
| R12 skip-worktree | before | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | 1c7d2af8c2 → 1c7d2af8c2 (same) | 103 ms | reused index (fresh read-tree 0, flagged re-add 0) |
| R12 skip-worktree | after | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | ec863f077e → ec863f077e (same) | 92 ms | reused index (fresh read-tree 0, flagged re-add 0) |
| R12 assume-unchanged | before | capture failed: VcsProcessExitError: VCS process failed in GitVcsDriver.checkpoints.captureCheckpoint: git read-tree (/tmp/ev-23624/cap/repos-before/r12-gEFSzf) exited with 1 - Cannot rebuild a checkpoint index for non-cone sparse checkout. |     at /tmp/ev-23624/wt-main/apps/server/src/vcs/GitVcsDriver.ts:963:31 | 5a47817c5d → 5a47817c5d (same) | 60 ms | reused index (fresh read-tree 0, flagged re-add 0) |
| R12 assume-unchanged | after | MATCH (2 sparse-excluded ignored) | 568579477f → 568579477f (same) | 116 ms | reused index (fresh read-tree 0, flagged re-add 1) |
| R13 skip-worktree | before | MATCH | 8d2ce30a56 → 8d2ce30a56 (same) | 97 ms | flagged gitlink, sub HEAD moved; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R13 skip-worktree | after | MATCH | 6a5ffbd584 → 6a5ffbd584 (same) | 89 ms | flagged gitlink, sub HEAD moved; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R13 assume-unchanged | before | MATCH | 6271f9c4d7 → 6271f9c4d7 (same) | 102 ms | flagged gitlink, sub HEAD moved; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R13 assume-unchanged | after | MATCH | ae7e881829 → ae7e881829 (same) | 97 ms | flagged gitlink, sub HEAD moved; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R14 skip-worktree | before | MATCH | 124704b085 → 124704b085 (same) | 117 ms | 4 flagged odd paths, same-size edits; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R14 skip-worktree | after | MATCH | 5ca36bffcc → 5ca36bffcc (same) | 102 ms | 4 flagged odd paths, same-size edits; reused index (fresh read-tree 0, flagged re-add 1) |
| R14 assume-unchanged | before | MATCH | 5d63c92a97 → 5d63c92a97 (same) | 96 ms | 4 flagged odd paths, same-size edits; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R14 assume-unchanged | after | MATCH | 7e07fcd999 → 7e07fcd999 (same) | 81 ms | 4 flagged odd paths, same-size edits; reused index (fresh read-tree 0, flagged re-add 1) |
| R15 skip-worktree | before | MATCH | 67f2eaee04 → 67f2eaee04 (same) | 95 ms | flagged path b\xffa, same-size edit; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R15 skip-worktree | after | MATCH | 8b59d98e01 → 8b59d98e01 (same) | 103 ms | flagged path b\xffa, same-size edit; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R15 assume-unchanged | before | MATCH | 38564b1a5b → 38564b1a5b (same) | 104 ms | flagged path b\xffa, same-size edit; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R15 assume-unchanged | after | MATCH | af6cd665d6 → af6cd665d6 (same) | 91 ms | flagged path b\xffa, same-size edit; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R16 skip-worktree | before | MATCH | 30cd195f3e → 30cd195f3e (same) | 422 ms | 5000 flagged ~200-char paths (>1 MiB of records); fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R16 skip-worktree | after | MATCH | a70c0585a7 → a70c0585a7 (same) | 396 ms | 5000 flagged ~200-char paths (>1 MiB of records); fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R16 assume-unchanged | before | MATCH | d368832077 → d368832077 (same) | 390 ms | 5000 flagged ~200-char paths (>1 MiB of records); fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R16 assume-unchanged | after | MATCH | 5ee5b3389e → 5ee5b3389e (same) | 361 ms | 5000 flagged ~200-char paths (>1 MiB of records); fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R17-sparse both-bits | before | MATCH (1 sparse-excluded ignored) | f44053d40a → f44053d40a (same) | 129 ms | fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R17-sparse both-bits | after | MATCH (1 sparse-excluded ignored) | ad626fa718 → ad626fa718 (same) | 120 ms | reused index (fresh read-tree 0, flagged re-add 1) |
| R17-nonsparse both-bits | before | MATCH | 2918a1fda9 → 2918a1fda9 (same) | 118 ms | 's' tag on non-sparse checkout; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R17-nonsparse both-bits | after | MATCH | ba1c4c75b7 → ba1c4c75b7 (same) | 107 ms | 's' tag on non-sparse checkout; reused index (fresh read-tree 0, flagged re-add 1) |
| R21 skip-worktree | before | MATCH | e383c2ae9c → e383c2ae9c (same) | 98 ms | racy unflagged file.txt (index mtime == file mtime) + flagged g; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R21 skip-worktree | after | MATCH | 57013cad54 → 57013cad54 (same) | 117 ms | racy unflagged file.txt (index mtime == file mtime) + flagged g; reused index (fresh read-tree 0, flagged re-add 1) |
| R21 assume-unchanged | before | MATCH | 66e173f294 → 66e173f294 (same) | 106 ms | racy unflagged file.txt (index mtime == file mtime) + flagged g; fresh-index fallback (fresh read-tree 1, flagged re-add 0) |
| R21 assume-unchanged | after | MATCH | bbc8cf7ee9 → bbc8cf7ee9 (same) | 101 ms | racy unflagged file.txt (index mtime == file mtime) + flagged g; reused index (fresh read-tree 0, flagged re-add 1) |
| R19 nonsparse skip-worktree | before | MATCH | ba77e00709 → ba77e00709 (same) | 125 ms | fresh-index fallback (fresh read-tree 1, flagged re-add 0); restore MATCH; tags after restore [] |
| R19 nonsparse skip-worktree | after | MATCH | f5eadfda31 → f5eadfda31 (same) | 763 ms | reused index (fresh read-tree 0, flagged re-add 1); restore MATCH; tags after restore [] |
| R19 nonsparse assume-unchanged | before | MATCH | 5ad08ec8c4 → 5ad08ec8c4 (same) | 120 ms | fresh-index fallback (fresh read-tree 1, flagged re-add 0); restore MATCH; tags after restore [] |
| R19 nonsparse assume-unchanged | after | MATCH | 77f21724aa → 77f21724aa (same) | 109 ms | reused index (fresh read-tree 0, flagged re-add 1); restore MATCH; tags after restore [] |
| R19 cone-sparse skip-worktree | before | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | 272bd42ad4 → 272bd42ad4 (same) | 132 ms | reused index (fresh read-tree 0, flagged re-add 0); restore **DIFF**  "in/a": restored 100644 0c0c03e2d9 vs wt 100644 366226fb97; tags after restore ['S in/a', 'S out/'] |
| R19 cone-sparse skip-worktree | after | **DIFF**: "in/a": tree 100644 dcc27807b2 vs wt 100644 366226fb97 | 30273e34d1 → 30273e34d1 (same) | 99 ms | reused index (fresh read-tree 0, flagged re-add 0); restore **DIFF**  "in/a": restored 100644 0c0c03e2d9 vs wt 100644 366226fb97; tags after restore ['S in/a', 'S out/'] |
| R19 cone-sparse assume-unchanged | before | MATCH (1 sparse-excluded ignored) | 580c3b67d0 → 580c3b67d0 (same) | 120 ms | fresh-index fallback (fresh read-tree 1, flagged re-add 0); restore MATCH; tags after restore ['S out/'] |
| R19 cone-sparse assume-unchanged | after | MATCH (1 sparse-excluded ignored) | ac5d94f4a9 → ac5d94f4a9 (same) | 127 ms | reused index (fresh read-tree 0, flagged re-add 1); restore MATCH; tags after restore ['S out/'] |
| R20 old-mtime none | before | MATCH | 760bce375b → 760bce375b (same) | 342 ms | 25000 files, edited d00/f00007; reused index (fresh read-tree 0, flagged re-add 0); rehashed 2: d00/f00007, d00/f00007 |
| R20 old-mtime none | after | MATCH | 96eb1af62f → 96eb1af62f (same) | 294 ms | 25000 files, edited d00/f00007; reused index (fresh read-tree 0, flagged re-add 0); rehashed 1: d00/f00007 |
| R20 old-mtime skip-worktree | before | MATCH | 4d1ac8dc37 → 4d1ac8dc37 (same) | 138733 ms (over 60 s budget) | 25000 files, edited d00/f00007 (skip-worktree); fresh-index fallback (fresh read-tree 1, flagged re-add 0); rehashed 25001: .gitattributes, d00/f00000, d00/f00001… |
| R20 old-mtime skip-worktree | after | MATCH | 8519cd0e55 → 8519cd0e55 (same) | 358 ms | 25000 files, edited d00/f00007 (skip-worktree); reused index (fresh read-tree 0, flagged re-add 1); rehashed 1: d00/f00007 |
| R20 old-mtime assume-unchanged | before | no record: hit vitest's 180 s test timeout (see run-before.log) | | >180000 ms | fresh-index fallback expected, same as the other flagged main rows |
| R20 old-mtime assume-unchanged | after | MATCH | 301a521443 → 301a521443 (same) | 400 ms | 25000 files, edited d00/f00007 (assume-unchanged); reused index (fresh read-tree 0, flagged re-add 1); rehashed 2: d00/f00007, d00/f00007 |
| R20 fresh-mtime none | before | MATCH | e8b6ebb79b → e8b6ebb79b (same) | 472 ms | 25000 files, edited d00/f00007; reused index (fresh read-tree 0, flagged re-add 0); rehashed 2: d00/f00007, d00/f00007 |
| R20 fresh-mtime none | after | MATCH | 5162042cef → 5162042cef (same) | 380 ms | 25000 files, edited d00/f00007; reused index (fresh read-tree 0, flagged re-add 0); rehashed 2: d00/f00007, d00/f00007 |
| R20 fresh-mtime skip-worktree | before | MATCH | 0a7e88b466 → 0a7e88b466 (same) | 171321 ms (over 60 s budget) | 25000 files, edited d00/f00007 (skip-worktree); fresh-index fallback (fresh read-tree 1, flagged re-add 0); rehashed 25001: .gitattributes, d00/f00000, d00/f00001… |
| R20 fresh-mtime skip-worktree | after | MATCH | 456258056b → 456258056b (same) | 455 ms | 25000 files, edited d00/f00007 (skip-worktree); reused index (fresh read-tree 0, flagged re-add 1); rehashed 2: d00/f00007, d00/f00007 |
| R20 fresh-mtime assume-unchanged | before | MATCH | cf37e09fcd → cf37e09fcd (same) | 154496 ms (over 60 s budget) | 25000 files, edited d00/f00007 (assume-unchanged); fresh-index fallback (fresh read-tree 1, flagged re-add 0); rehashed 25001: .gitattributes, d00/f00000, d00/f00001… |
| R20 fresh-mtime assume-unchanged | after | MATCH | 6283e1076e → 6283e1076e (same) | 630 ms | 25000 files, edited d00/f00007 (assume-unchanged); reused index (fresh read-tree 0, flagged re-add 1); rehashed 1: d00/f00007 |

## Notes

- **The sparse skip-worktree misses (R1b, R11, R12, R19-cone-sparse) are the same on main.** Capture forces `-c sparse.expectFilesOutsideOfPatterns=false`. When Git reads the scratch index, it then clears `SKIP_WORKTREE` on the present in-cone file, so `ls-files -v` shows `H in/a` where the real index has `S in/a`. The PR's in-cone `S` re-add never sees it (flagged re-add 0, both sides). The entry keeps a stat cache that matches the same-size, same-mtime edit, so `add -A` skips it. The fixture sets `sparse.expectFilesOutsideOfPatterns=true` in the repo, like the existing SPARSE2 `manual-skip` test. SPARSE2 deletes the file, so it never hits this. R19 restore then writes the stale blob (`0c0c03e2d9`) back over `edit\n`. Probe: `cp .git/index X; GIT_INDEX_FILE=X git -c sparse.expectFilesOutsideOfPatterns=false ls-files -v --sparse` gives `H in/a`, while plain `ls-files -v` gives `S in/a`.
- **R20 on main does not time out at 30 s here.** Flagged captures run to completion in 138.7 s, 171.3 s and 154.5 s, rehashing all 25,001 files (25,000 plus `.gitattributes`). The 60 s `Effect.timeout` in the driver did not cut them short, and the old-mtime assume-unchanged row exceeded vitest's 180 s limit. The counting filter spawns one `sh` per file, so this fixture is slower per file than the PR body's.
- **"2 files rehashed" counts one path read twice by the clean filter**, not two files. The counting filter logs `%f`, and both reads are `d00/f00007`. `add -A` first content-compares an entry whose stat data cannot prove a change (racily clean, or emptied by the re-add), then hashes it again to stage it. The count follows timing, not the flag: in the old-mtime variant assume-unchanged reads twice and skip-worktree once, and in fresh-mtime it is the other way round. Unflagged `none` reads twice on main and in fresh-mtime on the branch. No unflagged file is rehashed on the AFTER side.
- R13 (gitlink) and R15 (invalid UTF-8) on AFTER, plus R16 (over 1 MiB) on both sides, take the fresh-index fallback as designed and capture correctly. R17 `s` takes the reuse path on sparse and non-sparse alike and captures correctly. R12 non-cone with an `h` flag fails on main ("Cannot rebuild a checkpoint index for non-cone sparse checkout") and passes on AFTER.
