Open Source / ALEAPP #1809

Bug report artifact groups and invented fixture values

All bug report tables in ALEAPP sat in one category, device identifiers were left out, and three fixture numbers also occur in real reports. This contribution groups the tables by question, adds a Device Identifiers table that shows values as printed, and replaces the three numbers with invented ones.

  • Daniel Addai, SectraTEK Lab
  • Merged
  • CC BY 4.0

Summary

  • The bug report artifacts merged so far shared one category, Android Bug Report. This change sorts them into six groups named for the question they answer, such as App Usage and Settings and Config. Only the category text changes: it names the report folder and the LAVA category.
  • Serial numbers, IMEIs, SIM card numbers and addresses were left out of the first tables on purpose. The change adds them, as printed, in their own artifact, Device Identifiers: 25 listed properties, the kernel command line and the bootconfig lines.
  • Three fixture numbers that also occur in real bug reports, and that the earlier privacy scan had missed, are replaced by invented numbers of the same shape. A new case, synthetic_identifiers, uses invented values only.
  • The pull request text describes the first commit, which put the identifier rows into Device Facts. A second commit moved them into the Device Identifiers artifact before the merge, and the merged code has that artifact.
  • The pull request was merged on 27 October 2026.
  • 6category groups
  • 25identifier properties listed
  • 7research bug reports row-counted
  • 3fixture numbers replaced

Methodology note

Drafted with AI assistance and reviewed by the author before publication.

The issue

The nine bug report artifacts merged so far all carried one category, Android Bug Report. In ALEAPP the category text names the HTML report folder and the LAVA category, so every table landed in one place, however different the questions were: build and time zone, installed apps, usage, settings, boot. A report folder showed a flat list of nine names (Figure 1).

The first tables also left out serial numbers, IMEIs and similar values on purpose. That is a cautious default, and it has a cost. Examiners commonly tie an evidence item to a handset or a SIM card by exactly these values, and a table that omits them sends the examiner back to the raw text to find them. The change adds them as printed, in a table of their own, and says plainly that serial numbers, IMEIs, SIM card numbers and addresses now appear in the HTML, TSV and LAVA output of that artifact.

The third problem was in the test data. The shared fixture merged with the first reader held two Module Metadata version numbers, and one test file held an epoch number, that also appear in real bug reports. The privacy scan described in the first two pull requests had not caught them. Whether such a number is harmless is a judgment that a project should not have to make about its own fixtures; the rule is invented values only. The change replaces the three numbers with invented ones of the same shape and rebuilds the case zips and baselines that held them. The earlier commits remain in the repository history.

One category before, six groups afterLeft: one category, Android Bug Report, holding nine artifacts. Right: six groups. Device and Build holds Device Facts, Device Identifiers and Sections. Installed Apps holds Installed Packages and Package Times. Processes and Memory holds Process Exit Info. App Usage holds Usage Events. Settings and Config holds Settings and Settings Changes. Boot, Crash and Dropbox holds Boot Reasons.Before: 9 artifacts on mainAfter: 10 artifacts in 6 groupsAndroid Bug Reportone category for every tableDevice FactsSectionsInstalled PackagesPackage TimesUsage EventsProcess Exit InfoSettingsSettings ChangesBoot ReasonsThe category text names the reportfolder and the LAVA category.Device and Build (3)Device FactsDevice IdentifiersSectionsInstalled Apps (2)Installed PackagesPackage TimesProcesses and Memory (1)Process Exit InfoApp Usage (1)Usage EventsSettings and Config (2)SettingsSettings ChangesBoot, Crash and Dropbox (1)Boot Reasons
Show this figure as a table
Bug report artifact groups after ALEAPP #1809
Group (full category text starts with "Android Bug Report - ")ArtifactsCount
Device and BuildDevice Facts; Device Identifiers; Sections3
Installed AppsInstalled Packages; Package Times2
Processes and MemoryProcess Exit Info1
App UsageUsage Events1
Settings and ConfigSettings; Settings Changes2
Boot, Crash and DropboxBoot Reasons1
Figure 1The single category becomes six groups named for the question each table answers. For the nine existing artifacts only the category text changes. Source: ALEAPP #1809 pull request text and admin/test/scripts/test_bugreport_all.py (GROUPS); diagram.

The essence

Three changes. The categories are now six groups. One new artifact, Bug Report - Device Identifiers, shows the identifier values a report prints. Three fixture numbers are invented.

Groups and artifacts after ALEAPP #1809
GroupArtifactsCount
Device and BuildDevice Facts, Device Identifiers, Sections3
Installed AppsInstalled Packages, Package Times2
Processes and MemoryProcess Exit Info1
App UsageUsage Events1
Settings and ConfigSettings, Settings Changes2
Boot, Crash and DropboxBoot Reasons1

Device Identifiers has five columns: Name, Value, Origin, Source Line and Source File. A row is one of three things: a listed identifier property from the system properties (25 names covering serial numbers, IMEI and MEID values, SIM card numbers, Bluetooth and Wi-Fi addresses and device ids); the Command line header line, which is the kernel command line and is cut at 4,000 characters; or a bootconfig line, up to 1,000 lines with values cut at 400 characters. Origin says which. A property that is not on the list is not read, whatever its name says, and Device Facts no longer carries these rows.

Our methodology

The 25 names are those seen on the research reports and names that other builds are documented or known to use. No property named for an account or an advertising identifier is on the list. A search of the property names on the seven real reports for "account" and "advertis" found only cache keys and a Bluetooth advertising setting, so none was added; an identifier that another build prints under another name is not read, and the notes say so.

The split between the two artifacts is one small test on each fact, shown in Figure 2. A fact read from the header or from a property is first limited to the allow list; the test then sends identifier properties, the command line and bootconfig lines to Device Identifiers, and everything else to Device Facts. That keeps the older artifact free of identifiers, and it keeps the new one from picking up a property just because its name sounds like an identifier.

How device identifiers are separated from the other device factsA flow from left to right. The report text, with its system properties, header lines and bootconfig lines, first passes the allow lists: a property on neither list is not read. The test is_identifier(fact) then sends a yes to the Device Identifiers artifact and a no to the Device Facts artifact.Bug report textSYSTEM PROPERTIES linesheader lines, Command linebootconfig linesNot readany other property,whatever its name saysnot on a listis_identifier(fact)yes: a listed identifier property(25 names), the Command lineheader line, or a bootconfig lineno: one of the 40 state propertiesor another header lineBug Report - Device Factsstate properties (40 listed),header lines, boot reasonproperties, report time andtime zone rowsBug Report - Device Identifiers25 listed identifier properties,Command line (cut at 4,000),bootconfig lines (up to 1,000,values cut at 400)Name, Value, Origin,Source Line, Source Filenoyes
Figure 2One small test splits the facts. Nothing is masked in the identifier table, and a property that is on neither list is never read. Source: is_identifier, PROPERTY_ALLOW and the bugreport_device_identifiers function in ALEAPP #1809 (scripts/dumpstate_reader.py, scripts/artifacts/bugreportDevice.py); diagram.

The identifier rows were compared with an independent count made from the raw text with plain regular expressions, name and value by name and value. Over the seven reports there are 31 identifier property rows (3 to 8 per report), 7 command line rows (one on each) and 306 bootconfig rows (none on the two Android 10 reports, 35 to 105 on each of the other five). All equal. Of the 25 listed names, 16 occur on at least one report, and the other nine are exercised by invented text only (Figure 3). The synthetic case also includes a property named like a serial number that is not on the list, to show that it is not read.

Four extractions in the Lab's research corpus (Android 13 and 14 builds) were also run. They print identifier property rows and a command line but no bootconfig row; one prints a Bootconfig line that holds a read error and no key = value line, which gives no row.

Two unit-test files guard the structure. The new test_bugreport_all.py fixes the group counts (3, 2, 1, 1, 2 and 1, ten in all), checks that every name starts with "Bug Report - ", that every artifact uses the same six path patterns, and that every artifact named in the section index exists. The bug report tests number 92 against 86 before.

Identifier rows compared with raw-text counts, and which listed names occur on real reportsLeft: horizontal bars for rows over seven research bug reports that equal a raw-text count: 31 identifier property rows, 7 Command line rows and 306 bootconfig rows. Right: a grid of the 25 listed identifier property names, 16 drawn solid because they occur on at least one of the seven reports and 9 drawn dashed because they occur on none and are tested with invented text only.Rows equal to a raw-text count (7 reports)0100200300Rows over seven reportsIdentifier property rows31Command line rows7Bootconfig rows306Listed identifier names (25)16 occur on atleast one report9 occur on none:invented text only
Show this figure as a table
Validation counts for the Device Identifiers rows (ALEAPP #1809)
QuantityValue
Identifier property rows over seven reports31 (3 to 8 per report)
Command line rows7 (1 on each report)
Bootconfig rows306 (none on the two Android 10 reports; 35 to 105 on each of the other five)
Listed property names occurring on at least one report16 of 25
Listed names occurring on none9 of 25
Figure 3The identifier rows equal an independent count of the raw text, name by name and value by value, on all seven reports. Nine of the 25 listed names were never printed by these reports, so only invented text exercises them. Source: ALEAPP #1809 pull request text and the Device Identifiers notes in scripts/artifacts/bugreportDevice.py. Counts only; the grid is a diagram.

The other eight artifacts are unchanged in code. On the five earlier reports their counts equal those recorded in the first two pull requests. On the Samsung A07 and A26 reports they ran without error; an independent raw-text count was made there for Process Exit Info only. Two different reports staged together gave rows equal to the sum of the two single runs, and the same report staged twice is read once.

The privacy scan covered all changed files, with zip members opened, the commit message and the commit author, against the tokens and lines of the seven reports. It found no device-specific value; what matches is platform vocabulary. The earlier scan of the same kind had missed three numbers, and LAB-TR-0001 draws the lesson that a leak scan should be run independently of whoever builds the fixtures.

The value

For an examiner, the groups make a report folder readable by question, and the identifier table puts the values that tie a report to a handset or a SIM card in one place, each with its source line. Where a report prints a value in a property, in the command line and in the bootconfig, each is its own row, so the examiner can see how many places the text repeats it.

For a project, the change fixes a convention: bug report artifacts go into these six groups, and fixtures hold invented values only. The test file checks the first half automatically. Figure 4 shows what the identifier view looks like with invented values.

What a Device Identifiers view looks likeA table with columns Name, Value, Origin and Source Line. Five rows with invented values: a vendor serial number property, an IMEI-style property, a Bluetooth address property, the kernel command line and a bootconfig line. Values are shown exactly as printed.NameValueOriginSource Linero.vendor.boot.serialnoSYNTH0002EXAMPLEgetprop413ro.ril.oem.imei000000000000001getprop417ro.boot.btmacaddr00:00:5e:00:53:01getprop421Command lineloglevel=1 androidboot.serialno=SYNTH0001EXAMPLEheader9androidboot.example1bootconfig12Shown exactly as printed; nothing is masked. Treat an export of this table as holding device identifiers.
Show this figure as a table
The five synthetic rows of Figure 4
NameValueOriginSource Line
ro.vendor.boot.serialnoSYNTH0002EXAMPLEgetprop413
ro.ril.oem.imei000000000000001getprop417
ro.boot.btmacaddr00:00:5e:00:53:01getprop421
Command lineloglevel=1 androidboot.serialno=SYNTH0001EXAMPLEheader9
androidboot.example1bootconfig12
Figure 4A Device Identifiers view with invented values (SYNTH... markers, zero-filled numbers and an address from the documentation range 00:00:5e:00:53:xx). The row for the command line shows why it is read: it can hold a serial number. Source: column names from scripts/artifacts/bugreportDevice.py; value styles follow the synthetic_identifiers case; values are a synthetic example, invented values.

The behavior change is the main point to carry into a case. An export of Device Identifiers contains serial numbers, IMEI-style numbers, SIM card numbers and addresses exactly as printed. Handle the export as you would the report itself, and think before it leaves the case file. Anyone with scripts that match the old category name, Android Bug Report, must update them to the group names.

Limits: the list is not exhaustive, a printed identifier shows what the report says and not that it is the handset in front of you, and the nine unseen names have only invented-text tests. The Device Facts sample_data counts for four corpus extractions were recorded before the identifier rows moved and were not re-run; the notes say so. Android 11 to 14, vendors beyond the four, and the Shell app's finished bug report zip in a file system extraction were not examined for these rows.

Where this sits in the Lab's research

The change supports Lab Technical Report LAB-TR-0001, "Making Silent Failures Visible: A Single-Pass Section Reader for Android Bug Reports". Its artifact availability section lists this pull request among the seven that released the work. Its table of agreement checks reports the 31, 7 and 306 identifier, command line and bootconfig rows as equal to raw-text counts on all seven reports. Its reproducibility section records the two module version numbers replaced here and the lesson about independent leak scans.

Cite: Addai, D. (2026). Making Silent Failures Visible: A Single-Pass Section Reader for Android Bug Reports. Lab Technical Report LAB-TR-0001, version 1.1. Zenodo. doi:10.5281/zenodo.23719508. Read it on this site at LAB-TR-0001.

The public article Android bug reports, category by category (LAB-0002, early research) sorts the sections of a bug report into 22 categories by the question they answer. The six groups here are a coarser grouping of artifacts, not of sections. A further Lab report on validating community parsers, covering fixtures, independent recounts and leak scans, is in preparation (LAB-TR-0014) and has no page yet.

Sources

Every number and claim in this post, and where it comes from. Numbers that could not be sourced were left out.

Sources for the numbers and claims in this post
Claim or numberSource
One category before; six groups after, with group names and counts (3, 2, 1, 1, 2, 1; ten artifacts)Pull request text; test_bugreport_all.py (GROUPS) and category values in bugreportDevice.py and bugreportActivity.py
The category text names the HTML report folder and the LAVA category; no test baseline holds itPull request text, "Categories"
Identifier rows first added to Device Facts; moved to Bug Report - Device Identifiers by a second commitCommit headlines of the pull request; Device Identifiers entry in scripts/artifacts/bugreportDevice.py
25 listed identifier properties (names in the artifact notes); Command line cut at 4,000 characters; bootconfig lines up to 1,000, values cut at 400IDENTIFIER_PROPERTIES, COMMAND_LINE_CHARS, MAX_BOOTCONFIG_LINES in scripts/dumpstate_reader.py; artifact notes
40 state properties remain in Device FactsSTATE_PROPERTIES in scripts/dumpstate_reader.py; Device Facts notes ("each of 40 properties")
Search of property names for "account" and "advertis" found cache keys and a Bluetooth advertising setting onlyDevice Identifiers notes in bugreportDevice.py
Identifier property rows 31 (3 to 8 per report); Command line rows 7; bootconfig rows 306 (none on the two Android 10 reports; 35 to 105 on the other five); all equal to raw-text countsPull request text, "Proven on real reports"; Device Identifiers notes
16 of 25 names occur on at least one report; 9 occur on nonePull request text; Device Identifiers notes
Corpus extractions: identifier and command line rows only; one Bootconfig line holds a read error and gives no rowDevice Identifiers notes (evidence tiers)
Fixture numbers: two Module Metadata version numbers and one epoch number replaced; the earlier scan had not caught them; new case synthetic_identifiers with invented valuesPull request text, "Fixture values"; bugreport_fixture.py diff (IDENTIFIER_LINES)
Earlier commits keep the old numbers in the repository historyLAB-TR-0001, Reproducibility and Data Handling
73 passing cases against 72; 92 bug report tests against 86Pull request text, test record
Eight artifacts unchanged in code; counts equal earlier counts on five reports; A07 and A26 ran without error; independent count for Process Exit Info only on those twoPull request text, "Proven on real reports"
Two reports staged together equal the sum of single runs; same report staged twice read oncePull request text, "Second input"
Privacy scan of changed files, commit message and author: no device-specific value foundPull request text, test record
Sample_data counts for Device Facts on four corpus extractions are stale and were not re-runPull request text, "Anything reviewers should know"
Export of the identifier artifact now contains serial numbers, IMEIs, SIM card numbers and addressesPull request text, "Anything reviewers should know"
95 files, 1,521 lines added and 145 removedGitHub summary of the pull request
LAB-TR-0001 DOI and statements; LAB-TR-0014 in preparationLab DOI list (DOIS.md); LAB-TR-0001; Lab series plan (INVENTORY.md)
LAB-0002 sorts sections into 22 categoriesPublic article LAB-0002 (summary and figure 1)
Merged 27 October 2026GitHub merge record (mergedAt)
Figure 4 valuesInvented by the author for illustration (synthetic example)