You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
re: clean up TODO.md's stale Phase 3 status, advance non-capture-dependent work
Rewrites 5 stale Phase 3 checklist items to reflect actual current status
(framing resolved per-channel, Message Group/Code register empty by design,
connection lifecycle partially FACT). Cross-references CAP-034's 8 GATT UUIDs
against the decompiled app (clean negative, corroborates ADR-025). Analyzes
RFCOMM channel-opening order across 6 independent reconnects in 3 existing
captures: DLCI 0x02 (libmaestro) reliably opens last, with one honest
exception during a mid-session channel-bounce; maintainer reviewed and kept
this at HYPOTHESIS (strong) rather than promote. Logged as ai-sessions/0004.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxFpZZLKKeVeHvEWjxEA68
frames 1090–1153); steps 3–6 still need a full connection sequence captured
1535
-
end-to-end (see `CAPTURE_BLUETOOTH_HCI_SNOOP.md`).
1619
+
frames 1090–1153); §5.2 above for the channel-opening-order portion (`CAP-036`, `CAP-041` Windows
1620
+
A/B/C, `CAP-037` ×2, full frame numbers/timestamps quoted in §5.2 itself); the Message-Stream-content
1621
+
and user-triggered-command portions still need a full connection sequence captured/analyzed
1622
+
end-to-end with that specific question in mind.
1536
1623
1537
1624
## 6. Open questions
1538
1625
@@ -2453,6 +2540,7 @@ leaving them buried in prose elsewhere.
2453
2540
| 2026-09-08 | **Implementing `ai-sessions/0001_CROSSCHECK_RESULT_2026_09_07.md` Phase 4's proposals, maintainer-approved via `ai-sessions/0002_MAINTENANCE_PROMPT_2026_09_08.md`** (`DECISIONS.md` ADR-025's 2026-09-08 Update notes): **§4.5.2 Multipoint (`qhr` field 11)** and **§4.5.6 Volume EQ (`qhr` field 15)** promoted to 🟢 FACT for full field-number/semantic identity, each forward-traced from a named UI fragment/preference key to its write call site. **§6** — added four items: an informational note on `IFastPairDeviceDetailService`/`IFastPairFmdProxyService` (how the reference app sources battery data and handles Find My Device consent, explicitly out of scope for this project's own implementation); a refinement to the Find My Buds Case/"both" open item (`FmdWorker`/`ijp` construct only ToS accept/skip requests, no ring/play-sound trigger found); a new open item on `MaestroDeviceSettingsProviderService` as a second UI entry point into the `qhr`/`WriteSetting` pipeline; a new open item on `MaestroEndpointService`'s undetermined gRPC service registrations. Also closed the `field 11`/`field 15` entry in the "what do DLCI 0x02's confirmed inner field numbers actually represent" open item | Claude (AI), maintainer-directed sign-off session (prompt `0002`) |
2454
2541
| 2026-09-08 | **`ai-sessions/0003_MAINTENANCE_PROMPT_2026_09_08.md` Phase 2 — external-source validation pass, no new FACT promotion.** **§4.3 Option A** — the "shown ≥8s, auto-hidden after 20s" timing claim re-checked against the base Message Stream spec page (the alternate location proposed 2026-09-03); also absent there, closing both candidate official pages with a clean negative. **§4.4/§6** — the Ring ACK open item sharpened with the acknowledgement spec's exact literal text (the worked example's trailing 2 bytes are explicitly glossed as a channel+timeout state, "ring right and 60 seconds timeout"); checked against both observed ACK variants, neither fits a 2-byte state (one has zero extra bytes, the other exactly one) — the spec's own documented NAK format (a leading reason byte) was also checked and doesn't fit either. **§6** — the DLCI 0x02 Address-field-renegotiation item cross-checked against Pigweed's public `pw_hdlc`/`pw_rpc` documentation directly: neither publishes how HDLC addresses or RPC channel IDs are assigned, so this remains genuinely undocumented upstream, not merely unread. **§2.3** — `pbpctrl`'s own published notes re-fetched in full; confirmed no detail exists beyond the already-quoted transport-framing paragraph and a bare feature list (no opcode/byte-layout detail for any setting). **§6** — `FE2C1238…`'s name and the "Unknown Service" UUID re-checked against the live Fast Pair characteristics page and a web search respectively; both reconfirm the existing negative result (still undocumented) rather than finding anything new | Claude (AI), external-validation task (HYPOTHESIS-level re-checks and negative-result confirmations only — no FACT promotion, no sign-off needed) |
2455
2542
| 2026-09-08 | **`ai-sessions/0003_MAINTENANCE_PROMPT_2026_09_08.md` Phase 3/4 — APK reverse-engineering and capture cross-checks.** **§4.5.5 In-ear detection (`qhr` field 2)** promoted to 🟢 FACT for field-number/category-level identity, maintainer-approved (`DECISIONS.md` ADR-019 Update): the field's existing write site is also reached from the system Settings app's `MaestroDeviceSettingsProviderService` (case `2102`), logged there under the internal category name `"CATEGORY_OHD"` — the specific "In-ear detection" UI-label equivalence stays 🟡 HYPOTHESIS. **§4.2 EQ** — `fyd.d`/`fyd.e`'s call sites traced: field 16 confirmed fed from the slider-drag/preset path; field 18 found reachable *only* via a dedicated "Save EQ" button click handler, directly contradicting (not confirming) `CAP-015`'s own "fires on slider-release" wire-timing hypothesis — recorded as an open tension per the maintainer's own review, not resolved either way. **§6** — `MaestroDeviceSettingsProviderService`'s remaining 5 case IDs traced (field 27, field 11/Multipoint with a new internal-name confirmation and an unreconciled `fpm.ENABLED_HEAD_GESTURES` naming tension, field 5, a non-`qhr` "Feature A" toggle, and a new field 32); `MaestroEndpointService.onCreate()` read via `apktool` smali fallback (a Dagger-multibinding-based, per-call UID-authorization-gated service registry, service names not recovered); `gjv.p()`'s caller re-attempted and still not found (static analysis judged exhausted). **`CAP-041-FINDINGS.md` §8** — full byte-for-byte content diff of the DLCI 0x02 connect-time burst across 4 settings states: content-level clean negative for a settings-state read-back, closing `OBS-007` beyond the prior length-only result. **§6** — a plausible (unconfirmed) structural match found between `CAP-036`'s existing connect-time burst and `qjb`'s `qie`-shaped nested structure; `TrueWirelessHeadset.modelId` confirmed to need the maintainer's own device access, no existing data found | Claude (AI), APK-reverse-engineering + capture-analysis task; one item (`qhr` field 2) maintainer-directed sign-off, prompt `0003` |
2543
+
| 2026-09-09 |**`ai-sessions/0004_MAINTENANCE_PROMPT_2026_09_09.md` — connection-lifecycle analysis on existing captures.****New §5.2**: DLCI 0x02 (`libmaestro`) reliably opens *last* of the five data-carrying RFCOMM channels on a fresh reconnect — 6 independent instances across `CAP-036`/`CAP-037`/`CAP-041`, zero counter-examples in that condition, one honestly-scoped exception during a mid-session RFCOMM channel-bounce (where the order differs). Maintainer reviewed this directly in the chat session that authored this prompt and explicitly chose to keep it at 🟡 HYPOTHESIS (strong) rather than promote, pending more evidence or an explanation for the one exception | Claude (AI), capture-re-analysis task; maintainer-reviewed, kept at HYPOTHESIS (not promoted), prompt `0004`|
Copy file name to clipboardExpand all lines: REVERSE_ENGINEERING.md
+22Lines changed: 22 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2436,6 +2436,28 @@ via a capture, update its status here **and** promote it into `PROTOCOL.md`.
2436
2436
|`25e97ff7-24ce-4c4c-8951-f764a708f7b5` (byte-reversed alias: `b5f708a7-64f7-5189-4c4c-ce24f77fe925`) |`fzd.java:9`, `gbm.java:35`| App's own log label: "pigweed internal rfcomm socket" — SDP-confirmed (`CAP-001`/`CAP-002`/`CAP-032`) as RFCOMM server channel 1 = DLCI 0x02, AGENTS.md §6's Pigweed `pw_hdlc` channel | 🟢 FACT for channel ownership (confirmed by capture IDs `CAP-001`/`CAP-002`/`CAP-032`, `DECISIONS.md` ADR-018, `PROTOCOL.md` §2.2a); 🟡 HYPOTHESIS (strong) that Sent-direction payload content specifically carries `libmaestro`'s settings commands |
2437
2437
|`00001124-0000-1000-8000-00805f9b34fb`|`fxm.java:12`| Bluetooth SIG-assigned HID Profile UUID (public spec, not project-specific) — app checks for it before triggering `fetchUuidsWithSdp()`| 🟢 FACT (that this official UUID is checked for); whether the Buds actually expose it is capture-dependent — cross-reference `CAP-002`/`CAP-016`|
2438
2438
2439
+
**Checked and confirmed absent, 2026-09-09 (`ai-sessions/0004_MAINTENANCE_RESULT_2026_09_09.md`
2440
+
Task 2) — a clean negative, recorded so a future pass doesn't re-attempt the same search assuming it
2441
+
was never tried.**`CAP-034` (2026-09-01) independently resolved a full 15-service GATT UUID mapping
2442
+
via wire capture alone (`PROTOCOL.md` §6, §4.3 Option D): the Fast Pair Service (`0xFE2C`) and its
2443
+
characteristics (`FE2C1233`–`FE2C1239`), Device Information (`0x180A`), Battery Service
2444
+
(`0x180F`)/Battery Level (`0x2A19`), Firmware Revision String (`0x2A26`), Accessory Non-Owner Service
2445
+
(`15190001-12f4-c226-88ed-2ac5579f2a85`), and the still-unnamed "Unknown Service"
2446
+
(`109b862f-50e3-45cc-8ea1-ac62de4846d1`). A case-insensitive search of the entire decompiled tree —
2447
+
`jadx-output/sources/` in full (both exact-case and `grep -li`) and `apktool-output/smali*/` — for
2448
+
every one of these UUIDs, in both their full 128-bit and short 16/32-bit forms, found **zero genuine
2449
+
matches**: the 5 smali hits that did surface (`akm.smali`, `hlf.smali`, `dps.smali`, `pex.smali`,
2450
+
`TestingToolsBroadcastReceiver.smali`) are all coincidental hex substrings inside unrelated numeric
2451
+
constants (a double literal, a resource ID, a hashCode-shaped constant, a `serialVersionUID`, a
2452
+
switch-case hash) — none is an actual UUID reference, individually verified by reading each hit's
2453
+
surrounding line. **This is consistent with, and further corroborates, `DECISIONS.md` ADR-025's
2454
+
existing finding**: this companion app's own decompiled source contains no trace of DLCI 0x04/0x08's
2455
+
GATT/Fast-Pair-service handling at all — that layer is implemented entirely inside Google Play
2456
+
Services, not this APK. No new register rows are added for these 8 UUIDs, per this document's own
2457
+
scope note (APK findings only) — their wire-level identity is already fully established in
2458
+
`PROTOCOL.md` directly from `CAP-034`'s own capture evidence, which does not need (and does not get)
2459
+
a redundant APK-code citation here.
2460
+
2439
2461
## Message Group / Code register (Fast Pair Message Stream)
2440
2462
2441
2463
If the Message Stream framing hypothesis (`PROTOCOL.md` §2.1) is confirmed,
0 commit comments