Skip to content

Commit a0fd8d9

Browse files
tedsluisclaude
andcommitted
re: 0025 structural-index pass — gcp/gcn and gbb/gbc resolved, gag trigger corrected
Using the new structural_index tool plus lambda_dispatcher_resolver's resolve-all: confirmed esk's default-branch gcp/gcn is the same device_info DAO as the already-known gcl/gck/eht (item F); found gbb/gbc each have exactly one construction site (item J); corrected a prior "~7-day staleness gate" reading on GetSoftwareInfo's trigger — that literal belongs to an unrelated HearingWellnessNotificationWorker throttle, the real OTA-apply-completion trigger site is gjy.java:38. Narrowed items B/G/H with new leads; a manifest re-review (item L) surfaced a new BluetoothPriorityReceiver component. Cross-checked against PROTOCOL.md, DESKRESEARCH_FINDINGS.md, existing CAP-NNN findings, and TODO.md — no contradictions found. Also formally adopts ai-sessions/0024's tooling-priority and workflow-process proposals in BACKLOG.md/APK_REVERSE_ENGINEERING_PROCEDURE.md, citing this session as the sign-off event (tooling/process only — no PROTOCOL.md FACT promoted, no DECISIONS.md ADR touched). ai-sessions/0025_MAINTENANCE_{PROMPT,RESULT}_2026_09_16.md; Status: partial — resumed (tools 2-4 of BACKLOG.md's top-4 not yet built). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent a85bba5 commit a0fd8d9

10 files changed

Lines changed: 1146 additions & 30 deletions

.gitignore

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ local.properties
2323
reverse-engineering/apk/
2424
*.apk
2525

26-
# Lambda Dispatcher Resolver tool (reverse-engineering/tools/lambda_dispatcher_resolver/):
27-
# its own Python source is tracked normally (original tooling code, not derived APK content),
28-
# but its virtualenv/caches are not, and — same rule as above, same reason — it must never gain
29-
# a committed copy of decompiled smali/JADX output under its own tests/ directory either; its
30-
# test suite runs against the maintainer's local reverse-engineering/apk/<version>/ tree instead
31-
# and skips itself when that tree isn't present (see that tool's own SPEC.md §11 and tests/).
26+
# APK-analysis tools under reverse-engineering/tools/<tool-name>/ (lambda_dispatcher_resolver,
27+
# structural_index, and any future one built the same way): each tool's own Python source is
28+
# tracked normally (original tooling code, not derived APK content), but its virtualenv/caches
29+
# are not, and — same rule as above, same reason — none of them may ever gain a committed copy
30+
# of decompiled smali/JADX output under its own tests/ directory either; every tool's test suite
31+
# runs against the maintainer's local reverse-engineering/apk/<version>/ tree instead and skips
32+
# itself when that tree isn't present (see each tool's own SPEC.md §11 and tests/).
3233
reverse-engineering/tools/*/.venv/
3334
reverse-engineering/tools/*/*.egg-info/
3435
**/__pycache__/

APK_REVERSE_ENGINEERING_PROCEDURE.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ anything is recorded in `REVERSE_ENGINEERING.md`.
142142
one-line note on why it looked relevant. **[Maintainer decision]** which candidates get written up
143143
in `REVERSE_ENGINEERING.md`, and at what confidence tier.
144144

145-
### 4a. Resolving an R8-merged lambda dispatcher (added 2026-09-16, `ai-sessions/0024`)
145+
### 4a. Resolving an R8-merged lambda dispatcher (added 2026-09-16, `ai-sessions/0024`; adoption confirmed 2026-09-16, `ai-sessions/0025`)
146146

147147
If step 4's keyword search (or any other reading) surfaces a class matching the shape in
148148
`reverse-engineering/tools/lambda_dispatcher_resolver/SPEC.md` §3 (a `synthetic final` class, one
@@ -157,6 +157,14 @@ pass, which found only 1 of 20 and 3 of 21 cases respectively were Bluetooth-rel
157157
unrelated app-wide code, and that is a legitimate, recordable checked-negative result, not a reason
158158
to stop reading partway through.
159159

160+
**Adoption note (2026-09-16, `ai-sessions/0025`):** this step's own text was applied directly by
161+
`ai-sessions/0024` as normative procedure (never carried a "proposal"/"awaiting sign-off" tag in
162+
this file's own text, unlike `reverse-engineering/tools/BACKLOG.md`'s separate priority-order
163+
blockquote) — this note records that `ai-sessions/0025` re-read and exercised it for real
164+
(`resolve-all --class gag`, per that session's own Phase 1/Phase 3 write-up) with no need for
165+
substantive change, per `AI_SESSION_LOG_PROCEDURE.md` §4a's citation requirement for this class of
166+
workflow-process decision.
167+
160168
### 4.1 Exclusion list — noise to skip past, not to investigate
161169

162170
A fully decompiled app exposes far more surface area than any single capture. The following are
@@ -224,7 +232,12 @@ Account-Linking/Non-Owner traffic in captures) and move on — do not follow the
224232
invoke-descriptor grep, `Lgiz;->p(`, for an inline-chained call that was never stored in a field —
225233
structurally invisible to the first strategy by construction, not by bad luck). Two different
226234
search strategies for the same question is cheap; a third session re-deriving the same failed
227-
strategy from scratch is not.
235+
strategy from scratch is not. **Adoption note (2026-09-16, `ai-sessions/0025`):** confirmed
236+
practiced, not just documented — this same session found `qhr` field 6's own caller
237+
(`REVERSE_ENGINEERING.md`'s `qhr` entry's 2026-09-16 update) using exactly this technique
238+
(`fyo.m`'s own zero callers → retrying against the abstract interface type `fya` instead of the
239+
concrete class → finding the real caller immediately), an independent second confirmation beyond
240+
`gjv.p()` that this discipline generalizes.
228241
- **A class or method existing in the APK does not prove it's exercised by any specific action** in
229242
`TESTPLAN_BLUETOOTH_HCI_SNOOP.md` — treat every static finding as 🟡 HYPOTHESIS until a capture
230243
shows the corresponding traffic (`REVERSE_ENGINEERING.md`'s own "Known limitations" section).

PROTOCOL.md

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2314,6 +2314,21 @@ leaving them buried in prose elsewhere.
23142314
itself is a direct code-reading result (no ADR needed); the interpretive reading above (that
23152315
this narrows away from, rather than confirms, `gjv.p()` as the connect-time burst's trigger)
23162316
is accepted for recording at 🟡 HYPOTHESIS.
2317+
**Confirmed from the trigger side, 2026-09-16 (`ai-sessions/0025`, `lambda_dispatcher_resolver
2318+
resolve-all --class gag`, implementing `ai-sessions/0024`'s own recommended "free win").**
2319+
`gag`'s own discriminator-15 construction site (the branch feeding `ftw(_,9)`/`gjv.p()`) is now
2320+
found: `gjy.java:38`, inside a `gjy` method operating on a local variable literally named
2321+
`otaApplyWorker2` — an independent, second confirmation (from the construction/trigger side,
2322+
not only the `ftw.smali`/response side already documented) that this whole chain is
2323+
OTA-apply-lifecycle-scoped throughout. **Also corrects a separate, previously-recorded static-
2324+
analysis misattribution** (2026-09-13, `REVERSE_ENGINEERING.md`'s same entry): a `604800000`ms
2325+
(~7-day) staleness-check literal, earlier associated with this same discriminator-15 branch via
2326+
a partial JADX fragment, actually belongs to a structurally different `gag` branch
2327+
(discriminator 10, `HearingWellnessNotificationWorker`'s own unrelated notification throttle)
2328+
`gag`'s discriminator-15 branch itself contains no staleness check of any kind. No periodic/
2329+
weekly gate exists on the `GetSoftwareInfo`/`fxm.i()` OTA-completion path; that reading is
2330+
withdrawn. See `REVERSE_ENGINEERING.md`'s `frb`/`fuh`/`glk`/`gjv` entry's 2026-09-16 update for
2331+
the full trace (command + smali evidence, all 21 of `gag`'s cases read, no sampling).
23172332
**Byte-level correlation against existing capture data, 2026-09-08
23182333
(`ai-sessions/0003_MAINTENANCE_RESULT_2026_09_08.md` Phase 4 item 2) — a plausible structural
23192334
match found, not a confirmed one; full closure still needs a fresh capture.** Per this
@@ -2433,11 +2448,25 @@ leaving them buried in prose elsewhere.
24332448
category, `CATEGORY_RV_BLOCK_AUTO_TEST`). Case 2104 also fires a second, non-`qhr` write to the
24342449
same "Feature A" mechanism as case `2115` — 🟡 plausible, unconfirmed lead that toggling
24352450
Multipoint here disables a mutually-exclusive feature (Spatial Audio is a plausible, unevidenced
2436-
candidate). **Head gestures (field 29) is NOT among these 6 mappings** — none of the 6 cases
2451+
candidate). **Update (2026-09-16, `ai-sessions/0025`, cross-referencing `ai-sessions/0024`'s
2452+
own `esk` discriminator-18 finding against this item):** the "Feature A" mechanism's own write
2453+
call site is now located at the code level — `ftf.java:312` (`esk` discriminator 18), logging
2454+
`"Disabling Feature A for %s"`/`"Failed to disable Feature A for %s"` and writing through
2455+
`ftf.f.f(deviceId, false)` — the same accessor class (`ftf`) already used throughout this
2456+
pipeline. This is the same mechanism this item already names, now with a concrete file+line
2457+
citation rather than only case IDs 2104/2115 — still 🟡 HYPOTHESIS/code-level, no wire capture
2458+
has observed this specific write firing; see `REVERSE_ENGINEERING.md`'s `esk` entry.
2459+
**Head gestures (field 29) is NOT among these 6 mappings** — none of the 6 cases
24372460
route to `fyo`'s field-29 write path; this specific lead is now a checked negative, not merely
24382461
still open. Two `qhr` field-register corrections surfaced as a byproduct: field 6 has a real
2439-
write site (previously wrongly recorded as "not found"); field 32 (new) is now registered. Full
2440-
trace: `REVERSE_ENGINEERING.md`'s `MaestroDeviceSettingsProviderService` entry. Field 2's
2462+
write site (previously wrongly recorded as "not found"); field 32 (new) is now registered.
2463+
**Field 6's own caller, left unfound by this update, was found 2026-09-16 (`ai-sessions/0025`,
2464+
`structural_index refs`): `guy.java`'s `b()`/`c()` OOBE-mode lifecycle toggle, logging
2465+
`"Enable OOBE mode"`/`"Disable OOBE mode"`** — 🟡 HYPOTHESIS (code-level only): field 6 is
2466+
plausibly a transient "OOBE mode active" state flag, distinct from field 3's already-documented
2467+
completion flag; see `REVERSE_ENGINEERING.md`'s `qhr` entry's own 2026-09-16 update for the full
2468+
trace (via the same abstract-interface-indirection technique that found `gjv.p()`'s caller).
2469+
Full trace: `REVERSE_ENGINEERING.md`'s `MaestroDeviceSettingsProviderService` entry. Field 2's
24412470
promotion above and the case-2104/`fpm.ENABLED_HEAD_GESTURES` naming tension were both reviewed
24422471
directly by the maintainer in the chat session that authored this task's own prompt
24432472
(`ai-sessions/0003_MAINTENANCE_PROMPT_2026_09_08.md`); the naming tension was left open, not
@@ -2476,6 +2505,24 @@ leaving them buried in prose elsewhere.
24762505
`com.google.android.apps.pixel.dcservice` — a genuinely new, incidental finding, out of scope
24772506
for this project's own Bluetooth focus). Full trace: `REVERSE_ENGINEERING.md`'s
24782507
`MaestroEndpointService` entry.
2508+
**Update (2026-09-16, `ai-sessions/0025`, `structural_index refs`) — the multibinding assembly
2509+
site remains unfound; a promising-looking new lead checked and ruled out.** `ofd`'s 3
2510+
implementations (`mie`/`oex`/`ofb`) are confirmed to be the only ones in this APK version, and
2511+
3 new classes holding `ofd`-typed fields were found (`ofh`/`ofi`/`ofj`) — but reading them
2512+
shows they are generic `io.grpc`-shaped transport-builder plumbing (a default-policy field on
2513+
a transport factory), not `MaestroEndpointService`'s own specific service-registration map.
2514+
🔴 still open. Full trace: `REVERSE_ENGINEERING.md`'s `MaestroEndpointService` entry's own
2515+
2026-09-16 update.
2516+
- [ ] **Added 2026-09-16 (`ai-sessions/0025`, Phase 3 item L — full `AndroidManifest.xml`
2517+
re-review).** A previously-uncatalogued exported broadcast receiver,
2518+
`com.google.android.apps.wearables.maestro.companion.phone.bluetoothpriority.BluetoothPriorityReceiver`,
2519+
handles a custom action (`ACTION_TRIGGER_CLASSIC_CONNECTION_PRIORITY`, extras `EXTRA_BD_ADDR`/
2520+
`EXTRA_PRIORITY`/`EXTRA_DATA_DIRECTION`) and holds a direct field of type `fzd`
2521+
(`InternalRfcommUuidRegistry`, already used by `gbm`'s socket-selection logic, `PROTOCOL.md`
2522+
§2.2a). 🔴 **OPEN QUESTION**: what sends this broadcast, what it accomplishes on the wire, and
2523+
whether it relates to Multipoint or RFCOMM-channel-priority behavior — none of this determined
2524+
by static analysis alone; no capture correlation attempted. See `REVERSE_ENGINEERING.md`'s new
2525+
`BluetoothPriorityReceiver` entry.
24792526

24802527
### Behavior
24812528

0 commit comments

Comments
 (0)