The ratchet says 65 Android actions are unmigrated. Fifteen had a recorded reason; the rest read as work nobody has got to. Thirteen of them are not.
No behaviour changes here — this is the table that stops the number lying in the other direction.
The background-task quartet schedules nothing (#178)
All four resolve success and do no work.
registerBackgroundTask's comment says "just track them" — nothing is tracked; there is no field, no map, no set.scheduleBackgroundTaskcalls itself "a placeholder that shows the API structure", and theandroidx.workdependency it names in a comment is not in the generatedbuild.gradle.kts.- Both cancels report success for work that was never enqueued.
A page that schedules a nightly sync is told it succeeded, and the only signal that it did not is that the work never happens.
Two more refusals, one of which looks first
scanNFC reads the adapter to decide which refusal to send — "NFC not available" versus "NFC requires activity integration" — so unlike the other eight it does something before refusing. Both outcomes are still refusals.
isWatchReachable returns false unconditionally, with a comment naming the CapabilityClient that would answer it.
State the natives cannot reach
watchPosition and clearWatch share locationCallback, fusedLocationClient and watchId; the auth trio shares authSessionExpiry (#162). Both are the wall setFlashlight/toggleFlashlight already sit behind: CraftNative has no reference to the CraftBridge instance that owns the fields, so migrating one half leaves the other reading state nobody maintains.
Writing those rows turned up a bug of their own (#179): a second watchPosition overwrites the first's callback and orphans it — the first keeps waking the app for location updates and can never be removed — and clearWatch never reads its argument, so it clears the most recent watch whatever id it is handed. craft.d.ts declares the W3C shape, where ids identify individual watches.
The voice pair
Established in #169, now recorded where the ratchet can see it.
The prose no longer undercounts itself
The header said "eleven rows here are eleven easy decrements". It is seventeen now — eight refusals, three fabricated successes, the four background tasks, and the two above — and the sentence says so rather than aging into a number that used to be right. That rot is the thing this file exists to prevent, so it should not start in the file's own comments.
Testing
zig build test:android passes. The table's anti-rot guards were exercised: renaming a row's action to something CraftBridge.kt does not expose fails with DeferralNamesNoSuchAction, and a row whose action Zig later serves fails with DeferralAlreadyMigrated.