sync.getRepo, sync.getCheckout, sync.getBlocks, sync.getRecord, and sync.getBlob return CAR/binary bodies, not JSON; output-shape assertions don't apply, so the generator currently skips them.
They need CAR-decode assertions instead: parse the response with @atproto/repo (readCar), assert the roots rule (first root is the commit CID), and for getRepo run verifyRepoCar (commit signature, MST structure, rev). getBlob should additionally assert the CSP/nosniff headers per spec.
This is likely a new generated variant kind (binary/car output) rather than hand-written checks, so the checks regenerate on pin bumps.
Done when: the five endpoints have generated checks that pass against the oracle.
Done. All five are generated checks now and green against the oracle (commit 0db7612 on main).
Went with a new generated variant kind, like the issue guessed. There's a runCarContract runner next to runContract, and the generator emits a CAR/blob-decode contract when outputKind says the endpoint returns bytes instead of JSON. So they regenerate on pin bumps with everything else.
The per-endpoint split:
Two things that took a bit of digging. getBlob needed a permanent blob: a fresh uploadBlob stays quarantined and 404s until a record references it, so the runner writes a record pointing at the blob first. That's also why getBlob is mutate while the four CAR reads stay readonly. And I added @atproto/lex-data as a direct dep for parseCid, it was already in the tree transitively.
Full e2e passes, 54 checks, no failures. The one spec warn is the pre-existing www-authenticate thing.