Skip to content

Add sanitized M1 AirPods evidence from two capture runs - #4

Merged
mstampfli merged 1 commit into
mstampfli:mainfrom
dberweger2017:evidence/m1-airpods-captures
Oct 23, 2026
Merged

mstampfli merged 1 commit into
mstampfli:mainfrom
dberweger2017:evidence/m1-airpods-captures

Conversation

@dberweger2017

Copy link
Copy Markdown
Contributor

Preserves the two M1/Broadcom AirPods capture runs reported in #3 under evidence/, with an index, a short report and a sanitized JSON summary for each run:

  • 2026-10-18: 18,623 records covering microphone transitions within an established connection.
  • 2026-10-19: 23,767 records covering normal AirPods reconnection and subsequent playback.

The records include setup versions, raw-source hashes, record/opcode counts, selected 0xFD02 fields and responses, 0xFD4B timing, synchronized log observations and interpretation limits. They distinguish observed bytes from unverified Broadcom/H2 command semantics, and document capture errors and the transient microphone change during reconnection.

Adds a README entry and ignores local captures/ and .pklg files. Raw traces, system logs, device addresses, keys, voice recordings and firmware are excluded. No analyzer or runtime implementation changes are included. The raw files remain private, so public readers cannot reproduce their extraction from the summaries alone.

Validation:

  • Independently checked both private files with Wireshark/tshark: source hashes/sizes, every record-type and vendor-command count, selected parameter/response bytes and LMP-dissection results.
  • Validated JSON totals, relative links and the seven-file text-only commit; checked for addresses, serials and personal filesystem paths.
  • git diff --check passes. Runtime tests were not run because this changes documentation and recorded data only.

Refs #3; the issue remains open.

Signed-off-by: Davide Berweger Gaillard <davide@davideb.ch>
@mstampfli
mstampfli merged commit 1d1702c into mstampfli:main Oct 23, 2026
3 checks passed
mstampfli added a commit that referenced this pull request Oct 23, 2026
…ecords rather than quote them

PR #4 preserved two sanitized capture records under evidence/, and only the
first of the two runs was in the documents. The second one answers a question
this project had been asking out loud: it spans a reconnection, so a capture
"across a connection setup" on a Broadcom Mac now exists, and it still holds no
0xFE50. ulla.md section 8 records it with its own limits: the Connection
Complete it contains, the inventory with 0xFD4E in place of 0xFDC1, 0xFD02's
five parameter bytes and first byte 0x00 arriving 10.7 seconds after the
connection, the nearest 0xFD4B 142 ms before it, the six BandSwitchManager
messages that are all configuration, and no ULLA message of any kind.

What the reconnection does not settle is now said plainly instead of being left
to the old "the decisive capture is one spanning connection setup": what is
untested on that host is a first connection after a controller reset or a fresh
pairing, and a provoked band switch, and the N1 host has never been captured
over HCI at all. README and testing.md asked contributors for the capture that
has now been taken, so both now ask for the ones that have not.

Three copies of one superseded sentence are gone. README and testing.md still
said the capture holds "none of the eighteen vendor opcodes this project
documents", which ulla.md itself calls the wrong table to ask, and which is
false as written because 0xFD02 is mapped here and is in both runs. All of them
now enumerate what is actually absent: 0xFE50, the session commands of 6.6, the
feature-bit commands of 5.8, the band commands of 6.1. testing.md also still
counted thirty-four groups of claims; there are thirty-five.

tests/test_evidence.py makes the records data the suite reads rather than prose
it trusts. Each summary has to add up to its own totals, each run's phases have
to account for every synchronous record in its file, each run's record count has
to appear in a document, and the union of the opcodes the captures contain has
to be exactly what 6.8 accounts for as present or absent, so an opcode in a new
capture cannot be filed without being looked up in the firmware. Five mutations
of those inputs were shown red first, one of them the whole reason the check
exists: 0xFD4E dropped from the table.

Signed-off-by: mstampfli <marc.kurt.stampfli@icloud.com>
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.

2 participants