Skip to content

DIAGNOSTIC: AirPods Pro 3 record types (do not merge) - #1

Open
CodeXTF2 wants to merge 11 commits into
mainfrom
diag/airpods-pro-3-records
Open

CodeXTF2 wants to merge 11 commits into
mainfrom
diag/airpods-pro-3-records

Conversation

@CodeXTF2

Copy link
Copy Markdown
Owner

Builds a debug APK of parawanderer#274 plus logging of the BeaconStore record types, to find why AirPods Pro 3 are missing from the iCloud results. Not for merging.

🤖 Generated with Claude Code

Rob Lazzurs and others added 5 commits October 21, 2026 22:53
A C++ port of sacca97/os-findmy-e's adi-core (MIT, see macadi/NOTICE.md): a
Mach-O loader, a Unicorn x86_64 VM with the few pieces of macOS userland the
library calls, and the CoreADI dispatcher framing. Unicorn 2.1.4 (GPL-2.0) is
fetched at build time, pinned by SHA-256, and linked only into libmacadi.so.

The library itself is never in the repository or the build. In iTunes 12.8.3
for Mac the package holding it is stored uncompressed and contiguous, so it is
one HTTP range request of 3.5 MB; scripts/locate_mac_coreadi.py re-derives the
offsets and checks both pinned hashes, and macadi-host.yml builds the core for
the host and loads the library into it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012JDrrt9ff7WwPepHs6B2Gx
Since 2026-10-12 Apple issues searchPartyToken only to Mac- or iPhone-minted
Anisette, and the edge now refuses any client claiming Android, so the Android
ADI path cannot reach Find My. EmulatedMacAnisette fetches the macOS library
from Apple, provisions one emulated Mac with akd's headers, keeps its identity
and store for the life of the install, and is what AppDependencies hands out.

Also: read Grand Slam's hsc 409 without au as a second factor; send the routing
number Apple assigned at provisioning; give CloudKit a UUID, since a Mac's
device id is not one; drop the legacy adi.pb before every session, which
otherwise made a freshly provisioned machine report unprovisioned (ec -80009).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012JDrrt9ff7WwPepHs6B2Gx
Not for merging. AirPods Pro 3 show in Find My but not in the app's
iCloud results, with nothing set aside and no decrypt error logged.
The app never configures Python logging, so the INFO lines that would
say which record types the zone holds were discarded. Logs record
types by count and master-beacon field names only, never values.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… export appends

The phone drops log lines over its quota without saying so, and the
import's Python output went missing from the last export entirely.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Logs each reports request and answer (key counts, HTTP status, Apple's
status code, how many ids came back with reports), the accessory's index
window and alignment before and after, decrypt failures, and tees the
app's own print output into icloud-diagnostic.log. Counts and statuses
only, never keys, ids, tokens or locations.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ession's token names

Decrypts the record types the import skips (OwnedDeviceKeyRecord,
BeaconGroup, LeashRecord) and logs field names, types and sizes, with
links between records shown by type rather than identifier. Values only
for emoji, roleId, product and vendor ids and similar descriptive fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… calling a ring a success

AirPods Pro 3 read from iCloud carry a placeholder emoji (U+1F600, roleId
999) on every part, which Apple's apps never show; the app drew a smiley.
They now get a headphones icon, and an emoji set in this app still wins.

Ringing over DULT disconnected 20 ms after the write and reported
success, so an accessory that answered 'invalid state' (AirPods near
their owner) looked as if it had rung. It now waits up to 3 s for the
Command_Response, logs it, and reports a refusal as one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@CodeXTF2
CodeXTF2 deployed to Android Build October 27, 2026 14:24 — with GitHub Actions Active
@CodeXTF2
CodeXTF2 deployed to Android Build October 27, 2026 14:24 — with GitHub Actions Active
…om does

The network never reports AirPods near their owner's own device; that device reports
them to FMIP instead, which is where iCloud.com's precise, recent location and its
per-bud Play Sound come from. Add an FMIP client (initClient/refreshClient/playSound,
dsid + mmeFMIPAppToken, identity composed per rule 11), merge its location into the
periodic refresh as one more report, and ring AirPods through it before Bluetooth.

Also: a fetch queued behind the Python lock now uses the current account rather than
one a recreated screen already closed, and an RxJava error with no subscriber left is
logged instead of killing the process.

Debug only: ask once for ownedDeviceLocations with the OwnedDeviceKeyRecord keys and
log the shape of the answer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@CodeXTF2
CodeXTF2 deployed to Android Build October 27, 2026 15:42 — with GitHub Actions Active
@CodeXTF2
CodeXTF2 deployed to Android Build October 27, 2026 15:42 — with GitHub Actions Active

This branch was successfully deployed

1 active deployment
Android Build — 1de08fc6 Deployed Oct 27, 2026 by CodeXTF2 via Instrumented tests (emulator) #7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant