Skip to content

Android SDK 7.3.1 and Gradle plugin 4.0.8 - #68

Open
krassx wants to merge 7 commits into
mainfrom
chore/android-7.3.1-plugin-4.0.8
Open

krassx wants to merge 7 commits into
mainfrom
chore/android-7.3.1-plugin-4.0.8

Conversation

@krassx

@krassx krassx commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Adopts Bugsee Android SDK 7.3.1 (Maven Central) and Bugsee Android Gradle plugin 4.0.8.

Pins and everything derived from them

  • native-versions.json: android.sdk 7.3.1, android.gradlePlugin 4.0.8.
  • Derived from them: the bare example's plugins block and its guard, plugin/build/native-versions.baked.json, the regenerated android-options-manifest.json (from v7.3.1; only sdkVersion/generatedAt change, and option-keys.json/option-enums.json are byte-identical), the single-source tests, the design/plan version lines, and the README's manual plugins block. A new test keeps that README line on the pin.
  • The bare example sets no ndk.debugSymbolLevel. With 4.0.8 the native upload reads the unstripped merged_native_libs, whatever the level is (gradle-plugin feat: Phase 5 — attributes and identity #10/feat: Phase 6.9 — iOS privacy checks and wrapper at module init #13).

Gradle plugin 4.0.8: #8, #9 and #10 confirmed in the published artefact

The Plugin Portal's 4.0.8 marker POM points at com.bugsee:bugsee-android-gradle-plugin:4.0.8. Its jar has bugsee-plugin-version.txt = 4.0.8, CliBinaryResolver.DEFAULT_VERSION = "0.8.1" (#8, floor ≥ 0.7.12), --force in CliUploader (#9), and NativeUploadTask.useMergedNativeLibs/mergedNativeLibsDir (#10). The release-branch tree f24023c equals main@9139989 apart from version.txt, so #11, #12, #13 and #15 are all in it.

Fixed Android bugs: pins flipped (iOS pins untouched)

Test Was Now Fix
lifecycle itDelete it.failing both plain it on Android (iOS stays, cocoa#195) android#214 (#222)
feedback itGreeting it.failing on Android it android#215 (#225)
exceptions case 10, "no second report" it.failing on Android it #192 (unhandled exception files a crash only)
launch-options enum witnesses expected ordinals 0/2/4 expect values 1/3/21 android#216 (#223)

After #63 landed (rebased onto d957f55), its Android pins are flipped as well:

Test (#63) Fix
report-dialog-keys RA-02 actionBarColor android#217 (#224)
feedback-keys FA-01 / FA-11 / FA-20 android#218 (#226). FA-19 inputTextColor was only visible through 7.3.0's buggy hint; it now types into the input (1524 px of #0000ff)
sdk-breadcrumbs FLOW-15 android#219 (#228)
options-readback environment record android#216 (#223): values, not ordinals
option-effects OPT-025 (native crash, detect.crash=false) android#220 (#227)
option-effects OPT-081 (out-of-process report) android#221 (#229)
option-effects OPT-002 was pinned on #219. With crumbs back, capture.breadcrumbs.extras adds no crumbs on Android: it copies the intent extras into system crumbs' data.extras (BreadcrumbSystemEvents), which is now the witness (1 vs 0)

Each of these was first run unchanged on 7.3.1. Every pin above failed with "Failing test passed", and then the flipped tests passed.

Still pinned on Android: exception labels (still ignored), plus the two new SDK issues below.

Behaviour changes found (tests adjusted only where 7.3.1 is the correct behaviour)

  • performance.json is now OTLP/JSON (android#207 via #208; bugsee/specs sdk/reporting/bundle/performance.md). span-lifecycle and apm read transactions, which no longer exists. scripts/performance-capture.ts reads both layouts (legacy, and OTLP by the spec's profile-2 reader rules) into the fields the tests already assert. The assertions themselves are unchanged. Focused Stryker: 98.41%, with 2 equivalent survivors.
  • The feedback action bar is now painted (android#218): OCR reads the back arrow into the title ("< Feedback"). A leading arrow glyph is dropped before the exact match.
  • Network (#231–#243): an oversized body is dropped whole with size_too_large. That is correct, and Android's custom-option now asserts it directly. Regression: a POST that fails before its body is written is recorded without the body (no_data); on 7.3.0 it kept the body. Filed bugsee/bugsee-android#246, pinned it.failing on Android.
  • The feedback greeting (#215 / #225) is still not shown on this flow (set right before showFeedbackActivity, offline). The prefs hold it. Filed bugsee/bugsee-android#245, pinned again on Android.
  • Request supplements (isOverride) reach the network filter. The Android snapshot exposes a read-only override (cursor[bot] P2).

Device: WOD_LX1, Debug arm64, Bugsee Android SDK 7.3.1 [0aa9ae1ff] (= v7.3.1)

Suite Result
network / network-filter / add-network-event 3/3, 2/2, 2/2
lifecycle (delete-data) 6/6
span-lifecycle / apm (OTLP reader) 4/4, 2/2
feedback 3/3 (greeting it.failing, #245)
exceptions 13 passed, 21 skipped (case 10 plain it)
launch-options 38 + custom-option and failed-POST (re-run)
smoke 12 passed, 1 skipped
report-dialog-keys / feedback-keys / sdk-breadcrumbs / options-readback / option-effects 22/22, 41/41, 2/2, 81/81, 16 passed + 10 skipped

Release + R8 launch smoke (7.3.1 banner, status=2, relaunch, no fatal): WOD_LX1, emulator bugsee_api24 (SDK 24), bugsee_api36 (SDK 36).

Release + R8, and the native symbol upload (loopback stub only)

assembleRelease -PbugseeE2eMinify=true, 4 ABIs, no debugSymbolLevel anywhere in the app, a non-placeholder fake token, and plugin.endpoint on a 127.0.0.1 stub that records every request (BUGSEE_CLI_AUTO_UPDATE=0):

  • uploadBugseeReleaseNative ran bugsee-cli 0.8.1 on build/intermediates/merged_native_libs/release: "collected native libraries libraries=64 uploadable=64", 66 symbol POSTs plus 66 PUTs (139 MB). The 2 extra are the source map and the R8 mapping.
  • Every arm64 library's GNU build-id matches its stripped copy in the APK. Sent as dwarf: libbugsee_e2e_native.so (this app's NDK crash library, 3c73ec05…), libappmodules, libreactnative (7e70f59e…, 140 MB unstripped vs 6.9 MB in the APK), libjsi, libfbjni. Sent as symtab: the stripped ones (libhermesvm, libc++_shared, the Bugsee SDK's own). Every POST has replace_if_richer: true.
  • AGP's own native-debug-symbols.zip (.so.sym) was not used.

🤖 Generated with Claude Code

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Deep review: Android SDK 7.3.1 / Gradle plugin 4.0.8

Reviewed 908380d against surrounding pins, the Expo plugin, the JS/Android network-filter bridge, 7.3.1 release notes, and specs PR 42 (OTLP profile 2). Did not run tests locally (no node_modules in this environment). GitHub CI lint, typecheck, unit was green at review time; the PR body’s device section is still in progress.

Findings

P2 High — JS network filter cannot see 7.3.1 isOverride

  • Location: packages/react-native/android/src/main/java/com/bugsee/reactnative/NetworkFilterBridge.java (snapshot, ~414–444); packages/react-native/src/network/filter.ts (NetworkFilterEvent)
  • Problem: 7.3.1 can deliver a second start event for the same request (NetworkEvent.isOverride() == true) that carries the request body. The RN snapshot never includes that flag, so JS filters cannot implement the contract in the 7.3.1 notes (“redact each event by what it carries; the body may be on the additional event”).
  • Impact: A filter that only rewrites the first before — including this repo’s installNetworkFilter in examples/bare/scenarios/network-filter.ts — leaves the override event’s URL/body in the report. Per-event {...event, body: redact(event.body)} still works; first-event-wins filters that were correct on 7.3.0 do not.
  • Scenario: setNetworkFilter redacts URL/body on the first before. OkHttp/HttpURLConnection then offers an additional start with the body. JS returns that event unchanged (no override field to branch on). The capture keeps the original URL and body.
  • Fix: Put override: event.isOverride() on the Android snapshot (read-only; apply already mutates the same native object). Add override?: boolean to NetworkFilterEvent. Document that every event must be redacted on its own. Extend the network-filter e2e past GET-without-body so a second start would fail toHaveLength(1) if left unrewritten.

P3 Low — README still says debugSymbolLevel is required for Bugsee upload

  • Location: packages/react-native/README.md (manual android/app/build.gradle block, ~215–230)
  • Problem: That block still says AGP extracts none by default, “so there would be nothing to upload”, and requires debugSymbolLevel 'SYMBOL_TABLE'. This PR’s example and plan state that plugin 4.0.8 uploads from merged_native_libs regardless of the level. The new README test only locks the plugins { version } line.
  • Impact: Manual-setup docs contradict the reason for 4.0.8. Following the README is harmless (Play symbols still help). Copying the example while overriding gradlePluginVersion back to 4.0.7 would skip native upload.
  • Scenario: A reader of the 4.0.8 README vs the example comments gets opposite instructions for the same pin.
  • Fix: State that 4.0.8 uploads from merged_native_libs without debugSymbolLevel, and that SYMBOL_TABLE is optional (Play Console), matching the example. Keep the Expo plugin injection if Play symbols are still wanted.

Not bugs

  • Pins are consistent (native-versions.json, baked JSON, example Gradle guard, options-manifest sdkVersion, pin tests). option-keys.json unchanged matches 7.3.1 “No new options”.
  • performanceTransactions matches the profile-2 rules from specs PR 42 (local-root 0x200, hex case, snapshot vs complete dedup, url.full / db.query.text / file.path / bugsee.description). Unit tests cover the mutants that matter. iOS still takes the legacy transactions path.
  • Android it.failing → it flips match 7.3.1 notes: delete-all-generations (#222), feedback greeting (#225), unhandled exception is one crash (#192), enum options recorded by spec value (#223).

  1. Overall risk: Medium
  2. Merge recommendation: Request changes — expose override on the JS filter snapshot before this pin ships. Do not merge until the WOD_LX1 device section is filled in; 7.3.1’s network changes are the part this PR does not cover with new e2e.
  3. Most important to fix: P2 network-filter isOverride gap.
  4. Positive: Tight single-source pin update; OTLP reader is scoped to e2e and well tested; it.failing flips are tied to named Android fixes rather than weakened.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

Comment thread native-versions.json
Comment thread packages/react-native/README.md

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Deep review: Android SDK 7.3.1 / Gradle plugin 4.0.8 (re-review)

Re-reviewed fd60cbc (prior 908380d) against the JS/Android network-filter bridge, the published 7.3.1 AAR on Maven Central, the Expo plugin, and the new device pins. Did not run tests locally (no node_modules). GitHub CI for this head is still queued; the previous ci run was cancelled by this push.

fd60cbc does not touch the wrapper filter snapshot or the README debugSymbolLevel block. Both prior findings still stand.

Findings

P2 High — JS network filter cannot see 7.3.1 isOverride (not addressed)

  • Location: packages/react-native/android/src/main/java/com/bugsee/reactnative/NetworkFilterBridge.java (snapshot, 414–444); packages/react-native/src/network/filter.ts (NetworkFilterEvent)
  • Problem: Maven Central com.bugsee:bugsee-android:7.3.1 adds NetworkEvent.isOverride() / setOverride(boolean) (absent from 7.3.0). The concrete capture entry and OkHttp interceptor implement them; the interface defaults are false / no-op. NetworkFilterBridge.snapshot() still serializes id/url/method/body/headers/type only — no override — and NetworkFilterEvent has no such field.
  • Impact: A filter that only rewrites the first before — including this repo’s installNetworkFilter in examples/bare/scenarios/network-filter.ts — leaves the override event’s URL/body in the report. Per-event {...event, body: redact(event.body)} still works; first-event-wins filters that were correct on 7.3.0 do not.
  • Scenario: setNetworkFilter redacts URL/body on the first before. OkHttp then offers an additional start with the body (isOverride() == true). JS returns that event unchanged. The capture keeps the original URL and body. This head’s custom-option e2e already iterates every before of the 64-byte POST, which is the shape that produces the extra start.
  • Fix: Put override: event.isOverride() on the Android snapshot (read-only; apply already mutates the same native object). Add override?: boolean to NetworkFilterEvent. Document that every event must be redacted on its own. Extend the network-filter e2e past GET-without-body so a second start would fail toHaveLength(1) if left unrewritten.

P3 Low — README still says debugSymbolLevel is required for Bugsee upload (not addressed)

  • Location: packages/react-native/README.md (manual android/app/build.gradle block, ~215–230)
  • Problem: That block still says AGP extracts none by default, “so there would be nothing to upload”, and requires debugSymbolLevel 'SYMBOL_TABLE'. This PR’s example and plan state that plugin 4.0.8 uploads from merged_native_libs regardless of the level. The new README test only locks the plugins { version } line.
  • Impact: Manual-setup docs contradict the reason for 4.0.8. Following the README is harmless (Play symbols still help). Copying the example while overriding gradlePluginVersion back to 4.0.7 would skip native upload.
  • Scenario: A reader of the 4.0.8 README vs the example comments gets opposite instructions for the same pin.
  • Fix: State that 4.0.8 uploads from merged_native_libs without debugSymbolLevel, and that SYMBOL_TABLE is optional (Play Console), matching the example. Keep the Expo plugin injection if Play symbols are still wanted.

Not bugs (this head)

  • fd60cbc correctly puts itGreeting back on it.failing for this flow (greeting in preferences, empty chat, android#245) and pins control’s refused POST body as it.failing (no_data, android#246). Those are native SDK gaps, not wrapper defects.
  • Android custom-option now witnesses #232 directly (before + size_too_large) instead of comparing against a control that 7.3.1 no longer fills. iOS still uses the shrink-against-control check.
  • Pins remain consistent (native-versions.json, baked JSON, example Gradle guard, options-manifest sdkVersion). option-keys.json unchanged matches 7.3.1 “No new options”.
  • performanceTransactions still matches the profile-2 rules (local-root 0x200, hex case, snapshot vs complete dedup, url.full / db.query.text / file.path / bugsee.description). iOS still takes the legacy transactions path.
  • Android it.failing → it flips that remain: delete-all-generations (#222), unhandled exception is one crash (#192), enum options recorded by spec value (#223).

  1. Overall risk: Medium
  2. Merge recommendation: Request changes — expose override on the JS filter snapshot before this pin ships. Do not merge until that wrapper gap is closed; the WOD_LX1 network pins in fd60cbc are the right e2e direction but they do not cover the filter.
  3. Most important to fix: P2 network-filter isOverride gap.
  4. Positive: Device-driven pins for #245/#246 instead of claiming #225/#232 fixed things they did not; OTLP reader stays scoped to e2e; pin update is still single-source.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

Comment thread native-versions.json
Comment thread packages/react-native/README.md
krassx added a commit that referenced this pull request Oct 9, 2026
…gSymbolLevel needed

- 7.3.1 can offer one request to the filter as more than one event with
  the same id: a supplement (typically the request body) has
  NetworkEvent.isOverride() true. The Android snapshot now carries it as a
  read-only `override`, NetworkFilterEvent documents it, and a reply cannot
  change it (native writes only its known keys). JVM test included.
- README manual setup: Gradle plugin 4.0.8 uploads native symbols from the
  unstripped merged_native_libs, so no ndk.debugSymbolLevel is needed for
  Bugsee; set one only for Google Play.

Addresses cursor[bot] review on #68 (P2 override flag, P3 README).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Deep review: Android SDK 7.3.1 / Gradle plugin 4.0.8 (re-review)

Re-reviewed bcfd6c6 (prior fd60cbc, 908380d). bcfd6c6 is the wrapper/docs follow-up for the two findings from the last pass.

Prior findings

P2 High — JS network filter cannot see 7.3.1 isOverride — fully addressed.
NetworkFilterBridge.snapshot() now writes override: event.isOverride(). NetworkFilterEvent.override?: boolean documents it as Android-only, read-only, and that a supplement must be filtered like any other event. apply() still has no override writer, so a JS echo cannot clear the native flag. The new JVM test covers both snapshot values and that a reply with override: false leaves the event’s flag true.

No POST e2e was added. That is acceptable: installNetworkFilter is a first-before round-trip probe, and its GET has no body so 7.3.1 does not offer a supplement. Residual only: a customer filter that still does first-event-wins on a POST would leak the extra start; the type comment is the contract for that.

P3 Low — README still says debugSymbolLevel is required for Bugsee upload — fully addressed.
The manual android/app/build.gradle block no longer sets a level. It matches the example: plugin 4.0.8 uploads from unstripped merged_native_libs; a level is only for Play. Expo injection remaining until #64 is noted in-thread and is out of this PR.

Not bugs

  • Pins, OTLP reader, and the device-driven #245 / #246 / size_too_large pins from fd60cbc are unchanged and still look right.
  • The JVM stub does not override setOverride; production apply() never calls it, so the “reply cannot change it” assertion is still the right check against the write list.

  1. Overall risk: Low
  2. Merge recommendation: Approve. No remaining P0–P3 on this head.
  3. Most important to fix: Nothing on this PR.
  4. Positive: Small, targeted follow-up; snapshot is read-only as recommended; README now agrees with the 4.0.8 example.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Deep review: Android SDK 7.3.1 / Gradle plugin 4.0.8 (re-review)

Re-reviewed bcfd6c6 (prior fd60cbc, 908380d) against the JS/Android network-filter bridge (snapshot, apply, JVM tests, setNetworkFilter / replacementJson), the iOS snapshot (no override key, extra keys ignored), the Expo plugin still injecting debugSymbolLevel, pin sources (native-versions.json, baked JSON, example Gradle guard, options manifest), and the OTLP e2e reader vs span-lifecycle/apm. Did not run tests locally (no node_modules). GitHub ci for this head was still queued at review time.

bcfd6c6 closes both prior findings. No new wrapper defect with a credible failure scenario.

Prior findings

P2 High — JS network filter cannot see 7.3.1 isOverride — fully addressed

  • NetworkFilterBridge.snapshot() now writes override: event.isOverride() (read-only; apply still only writes url/body/headers/error fields/statusText).
  • NetworkFilterEvent.override?: boolean documents the 7.3.1 supplement contract (same id/type, typically the request body).
  • JVM test covers both flag values and that echoing override: false in the reply does not change the native event.

P3 Low — README still says debugSymbolLevel is required for Bugsee upload — fully addressed

  • Manual setup and the bare example both omit the level and state that plugin 4.0.8 uploads from unstripped merged_native_libs; a level is only for Play.

Findings

None remaining in the wrapper.

Not bugs (this head)

  • itGreeting stays it.failing on Android for this flow (greeting in preferences, empty chat, android#245). Native gap, not a wrapper defect.
  • Control POST body is it.failing (no_data on refused connect, android#246). Same: native capture regression, honestly pinned.
  • Custom-option Android witness matches #232 (every before of the 64-byte POST is size_too_large). iOS still compares against control.
  • The network-filter scenario is still a GET with no body, so it does not produce a supplement; installNetworkFilter's first-before rewrite is the round-trip probe, not a POST redaction template. Filters that spread the event and rewrite each before still work; first-id-wins POST filters were already broken on 7.3.1 even before the flag was exposed.
  • Expo config plugin still writes debugSymbolLevel 'SYMBOL_TABLE'. Harmless with 4.0.8 (merged_native_libs is independent of the level); author pointed at #64 to stop injecting it.
  • Pins stay consistent. option-keys.json / option-enums.json unchanged matches 7.3.1 “No new options”.
  • performanceTransactions still matches profile-2 (local-root 0x200, hex case, snapshot vs complete dedup, url.full / db.query.text / file.path / bugsee.description). iOS still takes the legacy transactions path.

  1. Overall risk: Low
  2. Merge recommendation: Approve — prior P2/P3 are addressed; no remaining wrapper issues to fix before merge. Residual native pins (#245, #246) are documented, not hidden.
  3. Most important to fix: Nothing in this wrapper. Follow-ups live in bugsee-android (#245, #246) and, if desired, stopping the Expo plugin from writing debugSymbolLevel (#64).
  4. Positive: override is read-only on the wire the way apply already worked; README and the example now tell the same 4.0.8 story; device-driven it.failing for #245/#246 instead of claiming native fixes that this flow does not show; OTLP reader stays e2e-scoped and unit-tested.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

krassx added 7 commits October 9, 2026 18:33
native-versions.json pins android.sdk 7.3.1 and gradlePlugin 4.0.8; the
bare example's plugins block, the baked plugin versions, the regenerated
Android options manifest (only sdkVersion/generatedAt change), the
single-source tests and the design/plan version lines follow.

Android pins flipped for the bugs 7.3.1 fixes:
- lifecycle itDelete: plain it on Android (#214 via #222); iOS stays (cocoa#195)
- feedback itGreeting: plain it (#215 via #225)
- exceptions case 10: plain it (unhandled files a crash only, #192)
- launch-options: environment.sdk.options records enums by value (#216 via
  #223), so the frame-rate and video-mode witnesses expect 1/3/21

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Bugsee Gradle plugin 4.0.8 uploads native symbols from the unstripped
libraries in merged_native_libs, independent of ndk.debugSymbolLevel
(bugsee-android-gradle-plugin #10, PR #13). Proof (Release + R8, 4 ABIs,
loopback stub only): uploadBugseeReleaseNative ran bugsee-cli 0.8.1 on
merged_native_libs/release, 64 libraries, each build-id equal to its
stripped copy in the APK; libbugsee_e2e_native, libappmodules,
libreactnative, libjsi and libfbjni went up as dwarf.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
…n 4.0.8

Android 7.3.1 writes performance.json as an OTLP/JSON trace export
(bugsee-android #207 via #208; bugsee/specs sdk/reporting/bundle/
performance.md) instead of {"transactions": [...]}. span-lifecycle and
apm read transactions.filter / span.description, so they failed on the
device with "transactions is undefined". scripts/performance-capture.ts
reads either layout: legacy as is, OTLP by the spec's profile-2 reader
rules (local roots, dedup on traceId/spanId, detail from url.full /
db.query.text / file.path / bugsee.description), mapped to the fields
the tests already assert (operation = bugsee.operation, status =
bugsee.span.status). The assertions are unchanged.

feedback: 7.3.1 paints the feedback action bar (#218 via #226) and OCR
now reads the back arrow into the title line ("< Feedback"); a leading
arrow glyph is dropped before the exact "Feedback" match.

README: the manual setup's plugins block names 4.0.8, and a test keeps it
on native-versions.json's android.gradlePlugin.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Focused Stryker on scripts/performance-capture.ts: 92.86% -> 98.41%
(116 killed, 8 timeouts, 2 equivalent survivors: a non-object resource or
scope has no scopeSpans/spans to read either way). toStrictEqual where
toEqual ignored undefined fields, hex ids with letters, resources without
scopes or spans, and the first of two equal copies.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
…evice shows them

launch-options custom-option (body-size-limit 7): 7.3.1 drops a body over
the limit whole and says why (bugsee-android #231 via #232, so a cut body
cannot slip past redaction). On Android every start event of the 64-byte
POST must now carry no body and no_body_reason size_too_large, a direct
witness instead of the control comparison; iOS keeps the comparison.

Control's POST to the dead endpoint used to keep its 64-byte request body;
7.3.1 reads a request body only while OkHttp writes it, so a refused
connection records no_body_reason no_data (WOD_LX1, 2 runs). That is a
capture regression: filed bugsee/bugsee-android#246 and pinned as its own
it.failing on Android.

feedback itGreeting: #225 does not show the greeting on this flow (set
just before showFeedbackActivity, chat opened directly, offline): an empty
chat, while the feedback preferences hold the run's greeting, 2 of 2 runs.
Filed bugsee/bugsee-android#245; it.failing on Android again, iOS plain.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
…gSymbolLevel needed

- 7.3.1 can offer one request to the filter as more than one event with
  the same id: a supplement (typically the request body) has
  NetworkEvent.isOverride() true. The Android snapshot now carries it as a
  read-only `override`, NetworkFilterEvent documents it, and a reply cannot
  change it (native writes only its known keys). JVM test included.
- README manual setup: Gradle plugin 4.0.8 uploads native symbols from the
  unstripped merged_native_libs, so no ndk.debugSymbolLevel is needed for
  Bugsee; set one only for Google Play.

Addresses cursor[bot] review on #68 (P2 override flag, P3 README).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
WOD_LX1, 7.3.1 [0aa9ae1ff], after each pin was seen to pass unchanged:
- report-dialog-keys RA-02 actionBarColor paints the dialog (#217 via #224): 22/22
- feedback-keys FA-01 actionBarColor, FA-11 emailContinueNotActiveColor,
  FA-20 inputTextHintColor (#218 via #226): 41/41. FA-19 inputTextColor was
  seen through the 7.3.0 hint, which 7.3.1 draws in inputTextHintColor;
  it now types into the input and finds the colour on the text (1524 px).
- sdk-breadcrumbs FLOW-15 (#219 via #228): 2/2
- options-readback: environment.sdk.options records enum values, not
  ordinals (#216 via #223): 81/81
- option-effects OPT-025 native crash with detect.crash=false (#220 via
  #227) and OPT-081 out-of-process report (#221 via #229): plain tests now.
  OPT-002 was pinned on #219; with crumbs back, extras adds no crumbs on
  Android but copies the intent extras into system crumbs' data, which is
  now the witness (1 vs 0). 16 passed, 10 skipped.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@krassx
krassx force-pushed the chore/android-7.3.1-plugin-4.0.8 branch from bcfd6c6 to b4d99fa Compare October 9, 2026 13:33

@cursor cursor Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale comment

Deep review: Android SDK 7.3.1 / Gradle plugin 4.0.8 (re-review)

Re-reviewed b4d99fa after the rebase onto #63 (prior 02dd607 / bcfd6c6, fd60cbc, 908380d). The new commit is e2e pin flips only, reported as seen on WOD_LX1 with 7.3.1 [0aa9ae1ff].

Prior findings

P2 (isOverride on the JS filter snapshot) and P3 (README debugSymbolLevel) remain fully addressed in 02dd607. Snapshot still writes override: event.isOverride(); the README still omits the level and points at merged_native_libs.

This head (b4d99fa)

No new wrapper or test defect with a credible failure scenario.

The #63 Android it.failing pins that 7.3.1 actually fixed are now plain tests, tied to the named SDK PRs:

  • report-dialog RA-02 actionBarColor (#224)
  • feedback FA-01 / FA-11 / FA-20 (#226); FA-19 inputTextColor now types into the chat EditText instead of asserting the old 0.5-alpha hint blend
  • FLOW-15 SDK breadcrumbs (#228)
  • options-readback enums as values, not ordinals (#223)
  • OPT-025 native SIGSEGV with detect.crash=false (#227) and OPT-081 out-of-process report (#229)

OPT-025 stays split (JS fatal vs native), so a JS detect.crash=false regression can still go red on its own — that was the remaining P2 on #63.

OPT-002 is not a weakened count check: 7.3.1 records the same crumb kinds with or without extras (WOD_LX1: 16/16), and the witness is now system crumbs whose JSON carries "extras":{" only on the option-on run. That matches BreadcrumbSystemEvents copying intent extras into crumb data.

Not bugs

  • itGreeting / control POST no_data remain it.failing (android#245 / #246). Native gaps, still pinned.
  • Expo plugin still injects debugSymbolLevel (called out for #64); harmless with 4.0.8.
  • FA-19 takes the first EditText in the dump; on this chat flow that is the message field, and the device run found 1524 px of the typed colour.

  1. Overall risk: Low
  2. Merge recommendation: Approve. No remaining P0–P3 on this head.
  3. Most important to fix: Nothing in this wrapper. Residual native follow-ups stay #245 and #246.
  4. Positive: Pin flips are device-proven and named to Android PRs; OPT-025 is not re-combined; OPT-002’s witness matches the option’s real effect instead of a count that 7.3.1 no longer changes.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deep review: Android SDK 7.3.1 / Gradle plugin 4.0.8 (re-review)

Re-reviewed b4d99fa (prior bcfd6c6, fd60cbc, 908380d) against the wrapper network-filter path (Android snapshot/apply, JS NetworkFilterEvent/replacementJson, iOS snapshot which still has no override key), pin sources (native-versions.json, baked JSON, example Gradle guard, options manifest sdkVersion/generatedAt only), the OTLP e2e reader vs span-lifecycle/apm, and the new #63 suite pin flips. Did not run tests locally (node_modules absent). GitHub ci for this head was still queued at review time.

b4d99fa is the rebase onto main after #63 plus device-proven un-pins. No new wrapper defect with a credible failure scenario.

Prior findings

P2 High — JS network filter cannot see 7.3.1 isOverride — fully addressed

  • NetworkFilterBridge.snapshot() still writes override: event.isOverride() (read-only; apply still only writes url/body/headers/error fields/statusText).
  • NetworkFilterEvent.override?: boolean still documents the 7.3.1 supplement contract (same id/type, typically the request body).
  • JVM test still covers both flag values and that echoing override: false in the reply does not change the native event.

P3 Low — README still says debugSymbolLevel is required for Bugsee upload — fully addressed

  • Manual setup and the bare example both omit the level and state that plugin 4.0.8 uploads from unstripped merged_native_libs; a level is only for Play.

Findings

None remaining in the wrapper. The new pin flips match 7.3.1 as measured on WOD_LX1:

  • report-dialog RA-02 / feedback FA-01, FA-11, FA-20: KNOWN_NOT_PAINTED.android emptied (#217/#218).
  • FA-19 inputTextColor now types into the chat EditText (7.3.1 draws the hint in inputTextHintColor).
  • FLOW-15 SDK breadcrumbs: plain it (#219/#228).
  • options-readback and launch-options enum witnesses: values 1/3/21, not ordinals (#216/#223).
  • OPT-025 native crash with detect.crash=false and OPT-081 out-of-process report: plain tests (#220/#221).
  • OPT-002: extras attach to system crumbs' data (same crumb count as control); the old length comparison would have been a false fail.

Not bugs (this head)

  • itGreeting stays it.failing on Android for this flow (greeting in preferences, empty chat, android#245). Native gap, not a wrapper defect.
  • Control POST body is it.failing (no_data on refused connect, android#246). Same: native capture regression, honestly pinned.
  • Custom-option Android witness matches #232 (every before of the 64-byte POST is size_too_large). iOS still compares against control.
  • Exception case 10 is a plain it (#192); case 7 (labels) stays it.failing. iOS delete stays it.failing (cocoa#195).
  • The network-filter scenario is still a GET with no body, so it does not produce a supplement; installNetworkFilter's first-before rewrite is the round-trip probe. Filters that spread the event and rewrite each before still work.
  • Expo config plugin still writes debugSymbolLevel 'SYMBOL_TABLE'. Harmless with 4.0.8 (merged_native_libs is independent of the level); stopping that inject is #64, not this PR.
  • Pins stay consistent. option-keys.json / option-enums.json unchanged matches 7.3.1 “No new options”. FrameRate.Low/High = 1/3 and VideoMode.DirectBuffers = 21 match option-enums.json.
  • performanceTransactions still matches profile-2 (local-root 0x200, hex case, snapshot vs complete dedup, url.full / db.query.text / file.path / bugsee.description). iOS still takes the legacy transactions path.

  1. Overall risk: Low
  2. Merge recommendation: Approve — prior P2/P3 remain addressed; the #63 pin flips are the 7.3.1 behaviour, not weakened assertions. Residual native pins (#245, #246) are documented, not hidden.
  3. Most important to fix: Nothing in this wrapper. Follow-ups live in bugsee-android (#245, #246) and, if desired, stopping the Expo plugin from writing debugSymbolLevel (#64).
  4. Positive: Rebase onto #63 did not paper over remaining 7.3.0 gaps — labels, greeting-on-this-flow, and refused-POST body stay it.failing where the device still shows them. override stays read-only on the wire; OTLP reader stays e2e-scoped and unit-tested; OPT-002 was rewritten to the actual extras-in-data witness instead of a count that 7.3.1 would not satisfy.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

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