Eleven of the 103 methods have a body that is one reject or resolve and nothing else. They're the easiest actions in the file to "migrate" — the implementation is a string — and migrating one would be a way of making the ratchet lie.
Why this is a guard and not bookkeeping
The ratchet counts actions Zig serves, meaning actions a page gets an answer from Zig for. Moving a refusal across changes which language holds the string and nothing a page can observe. It would lower the count without serving anything.
Worth recording explicitly, because the incentive runs the other way: eleven rows here are eleven easy decrements left on the table, and the next person under pressure to show progress will find them first.
$ # declare startAR in a Zig module's A block
error.DeferralAlreadyMigratedEight honest refusals
purchase · scanQRCode · signInWithGoogle · startAR · placeARObject · removeARObject · sendToWatch · updateWatchContext
Each tells the page plainly that the feature isn't there — "ARCore requires native Activity integration", "Wear OS integration requires companion app setup". That's the opposite of setBadge (#148), and it's why these need no fix, only a reason not to touch them.
Three that answer successfully instead
Same shape, opposite honesty. The AR surface is the sharp case:
| call | answer |
|---|---|
startAR | rejects — "ARCore requires native Activity integration" |
stopAR | resolves {stopped: true} |
getARPlanes | resolves [] |
startAR refuses to open a session, and then two calls report success for operations on the session it refused to create.
The empty array is the one that costs something: a page cannot tell it from "AR is running and has found no planes yet", so the honest failure startAR gave is undone by the next call. Recorded rather than migrated for the setBadge reason — there's no working behaviour to carry across, and porting a fabrication would spread it.
closePDF is the mildest: resolves true and does nothing, with the Kotlin noting PDFs open in an external viewer.
Verified
| mutation | result |
|---|---|
Zig declares startAR, gaming the ratchet | DeferralAlreadyMigrated |
| a row names a method the Kotlin lacks | DeferralNamesNoSuchAction |
zig build test:android → 124 tests, 11/11 steps.