Repository navigation
Conversation
There was a problem hiding this comment.
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_modulesin this environment). GitHub CIlint, typecheck, unitwas 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’sinstallNetworkFilterinexamples/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:
setNetworkFilterredacts URL/body on the firstbefore. OkHttp/HttpURLConnection then offers an additional start with the body. JS returns that event unchanged (nooverridefield to branch on). The capture keeps the original URL and body.- Fix: Put
override: event.isOverride()on the Android snapshot (read-only;applyalready mutates the same native object). Addoverride?: booleantoNetworkFilterEvent. Document that every event must be redacted on its own. Extend the network-filter e2e past GET-without-body so a second start would failtoHaveLength(1)if left unrewritten.P3 Low — README still says
debugSymbolLevelis required for Bugsee upload
- Location:
packages/react-native/README.md(manualandroid/app/build.gradleblock, ~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 frommerged_native_libsregardless of the level. The new README test only locks theplugins { 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
gradlePluginVersionback 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_libswithoutdebugSymbolLevel, and thatSYMBOL_TABLEis 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-manifestsdkVersion, pin tests).option-keys.jsonunchanged matches 7.3.1 “No new options”.performanceTransactionsmatches the profile-2 rules from specs PR 42 (local-root0x200, 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 legacytransactionspath.- Android
it.failing→itflips 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).
- Overall risk: Medium
- Merge recommendation: Request changes — expose
overrideon 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.- Most important to fix: P2 network-filter
isOverridegap.- Positive: Tight single-source pin update; OTLP reader is scoped to e2e and well tested;
it.failingflips are tied to named Android fixes rather than weakened.Sent by Cursor Automation: Bugsee code review
There was a problem hiding this comment.
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 previouscirun was cancelled by this push.
fd60cbcdoes not touch the wrapper filter snapshot or the READMEdebugSymbolLevelblock. 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.1addsNetworkEvent.isOverride()/setOverride(boolean)(absent from 7.3.0). The concrete capture entry and OkHttp interceptor implement them; the interface defaults arefalse/ no-op.NetworkFilterBridge.snapshot()still serializes id/url/method/body/headers/type only — nooverride— andNetworkFilterEventhas no such field.- Impact: A filter that only rewrites the first
before— including this repo’sinstallNetworkFilterinexamples/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:
setNetworkFilterredacts URL/body on the firstbefore. 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 everybeforeof the 64-byte POST, which is the shape that produces the extra start.- Fix: Put
override: event.isOverride()on the Android snapshot (read-only;applyalready mutates the same native object). Addoverride?: booleantoNetworkFilterEvent. Document that every event must be redacted on its own. Extend the network-filter e2e past GET-without-body so a second start would failtoHaveLength(1)if left unrewritten.P3 Low — README still says
debugSymbolLevelis required for Bugsee upload (not addressed)
- Location:
packages/react-native/README.md(manualandroid/app/build.gradleblock, ~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 frommerged_native_libsregardless of the level. The new README test only locks theplugins { 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
gradlePluginVersionback 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_libswithoutdebugSymbolLevel, and thatSYMBOL_TABLEis optional (Play Console), matching the example. Keep the Expo plugin injection if Play symbols are still wanted.Not bugs (this head)
fd60cbccorrectly putsitGreetingback onit.failingfor this flow (greeting in preferences, empty chat, android#245) and pins control’s refused POST body asit.failing(no_data, android#246). Those are native SDK gaps, not wrapper defects.- Android custom-option now witnesses
#232directly (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-manifestsdkVersion).option-keys.jsonunchanged matches 7.3.1 “No new options”.performanceTransactionsstill matches the profile-2 rules (local-root0x200, hex case, snapshot vs complete dedup,url.full/db.query.text/file.path/bugsee.description). iOS still takes the legacytransactionspath.- Android
it.failing→itflips that remain: delete-all-generations (#222), unhandled exception is one crash (#192), enum options recorded by spec value (#223).
- Overall risk: Medium
- Merge recommendation: Request changes — expose
overrideon the JS filter snapshot before this pin ships. Do not merge until that wrapper gap is closed; the WOD_LX1 network pins infd60cbcare the right e2e direction but they do not cover the filter.- Most important to fix: P2 network-filter
isOverridegap.- 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.
Sent by Cursor Automation: Bugsee code review
…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)
There was a problem hiding this comment.
Stale comment
Deep review: Android SDK 7.3.1 / Gradle plugin 4.0.8 (re-review)
Re-reviewed bcfd6c6 (prior fd60cbc, 908380d).
bcfd6c6is 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 writesoverride: event.isOverride().NetworkFilterEvent.override?: booleandocuments it as Android-only, read-only, and that a supplement must be filtered like any other event.apply()still has nooverridewriter, so a JS echo cannot clear the native flag. The new JVM test covers both snapshot values and that a reply withoverride: falseleaves the event’s flag true.No POST e2e was added. That is acceptable:
installNetworkFilteris a first-beforeround-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
debugSymbolLevelis required for Bugsee upload — fully addressed.
The manualandroid/app/build.gradleblock no longer sets a level. It matches the example: plugin 4.0.8 uploads from unstrippedmerged_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_largepins fromfd60cbcare unchanged and still look right.- The JVM stub does not override
setOverride; productionapply()never calls it, so the “reply cannot change it” assertion is still the right check against the write list.
- Overall risk: Low
- Merge recommendation: Approve. No remaining P0–P3 on this head.
- Most important to fix: Nothing on this PR.
- Positive: Small, targeted follow-up; snapshot is read-only as recommended; README now agrees with the 4.0.8 example.
Sent by Cursor Automation: Bugsee code review
There was a problem hiding this comment.
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 (nooverridekey, extra keys ignored), the Expo plugin still injectingdebugSymbolLevel, 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 (nonode_modules). GitHubcifor this head was still queued at review time.
bcfd6c6closes 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 writesoverride: event.isOverride()(read-only;applystill only writes url/body/headers/error fields/statusText).NetworkFilterEvent.override?: booleandocuments the 7.3.1 supplement contract (sameid/type, typically the request body).- JVM test covers both flag values and that echoing
override: falsein the reply does not change the native event.P3 Low — README still says
debugSymbolLevelis 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)
itGreetingstaysit.failingon Android for this flow (greeting in preferences, empty chat, android#245). Native gap, not a wrapper defect.- Control POST body is
it.failing(no_dataon refused connect, android#246). Same: native capture regression, honestly pinned.- Custom-option Android witness matches #232 (every
beforeof the 64-byte POST issize_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-beforerewrite is the round-trip probe, not a POST redaction template. Filters that spread the event and rewrite eachbeforestill 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_libsis independent of the level); author pointed at #64 to stop injecting it.- Pins stay consistent.
option-keys.json/option-enums.jsonunchanged matches 7.3.1 “No new options”.performanceTransactionsstill matches profile-2 (local-root0x200, hex case, snapshot vs complete dedup,url.full/db.query.text/file.path/bugsee.description). iOS still takes the legacytransactionspath.
- Overall risk: Low
- 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.
- 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).- Positive:
overrideis read-only on the wire the wayapplyalready worked; README and the example now tell the same 4.0.8 story; device-drivenit.failingfor #245/#246 instead of claiming native fixes that this flow does not show; OTLP reader stays e2e-scoped and unit-tested.Sent by Cursor Automation: Bugsee code review
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)
bcfd6c6 to
b4d99fa
Compare
There was a problem hiding this comment.
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 (
isOverrideon the JS filter snapshot) and P3 (READMEdebugSymbolLevel) remain fully addressed in02dd607. Snapshot still writesoverride: event.isOverride(); the README still omits the level and points atmerged_native_libs.This head (
b4d99fa)No new wrapper or test defect with a credible failure scenario.
The #63 Android
it.failingpins 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
inputTextColornow types into the chatEditTextinstead 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=falseregression 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 matchesBreadcrumbSystemEventscopying intent extras into crumb data.Not bugs
itGreeting/ control POSTno_dataremainit.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
EditTextin the dump; on this chat flow that is the message field, and the device run found 1524 px of the typed colour.
- Overall risk: Low
- Merge recommendation: Approve. No remaining P0–P3 on this head.
- Most important to fix: Nothing in this wrapper. Residual native follow-ups stay #245 and #246.
- 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.
Sent by Cursor Automation: Bugsee code review
There was a problem hiding this comment.
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 writesoverride: event.isOverride()(read-only;applystill only writes url/body/headers/error fields/statusText).NetworkFilterEvent.override?: booleanstill documents the 7.3.1 supplement contract (sameid/type, typically the request body).- JVM test still covers both flag values and that echoing
override: falsein 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.androidemptied (#217/#218). - FA-19
inputTextColornow types into the chatEditText(7.3.1 draws the hint ininputTextHintColor). - 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=falseand 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)
itGreetingstaysit.failingon Android for this flow (greeting in preferences, empty chat, android#245). Native gap, not a wrapper defect.- Control POST body is
it.failing(no_dataon refused connect, android#246). Same: native capture regression, honestly pinned. - Custom-option Android witness matches #232 (every
beforeof the 64-byte POST issize_too_large). iOS still compares against control. - Exception case 10 is a plain
it(#192); case 7 (labels) staysit.failing. iOS delete staysit.failing(cocoa#195). - The network-filter scenario is still a GET with no body, so it does not produce a supplement;
installNetworkFilter's first-beforerewrite is the round-trip probe. Filters that spread the event and rewrite eachbeforestill work. - Expo config plugin still writes
debugSymbolLevel 'SYMBOL_TABLE'. Harmless with 4.0.8 (merged_native_libsis independent of the level); stopping that inject is #64, not this PR. - Pins stay consistent.
option-keys.json/option-enums.jsonunchanged matches 7.3.1 “No new options”. FrameRate.Low/High = 1/3 and VideoMode.DirectBuffers = 21 matchoption-enums.json. performanceTransactionsstill matches profile-2 (local-root0x200, hex case, snapshot vs complete dedup,url.full/db.query.text/file.path/bugsee.description). iOS still takes the legacytransactionspath.
- Overall risk: Low
- 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.
- 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). - Positive: Rebase onto #63 did not paper over remaining 7.3.0 gaps — labels, greeting-on-this-flow, and refused-POST body stay
it.failingwhere the device still shows them.overridestays 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.
Sent by Cursor Automation: Bugsee code review


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.sdk7.3.1,android.gradlePlugin4.0.8.pluginsblock and its guard,plugin/build/native-versions.baked.json, the regeneratedandroid-options-manifest.json(fromv7.3.1; onlysdkVersion/generatedAtchange, andoption-keys.json/option-enums.jsonare byte-identical), the single-source tests, the design/plan version lines, and the README's manualpluginsblock. A new test keeps that README line on the pin.ndk.debugSymbolLevel. With 4.0.8 the native upload reads the unstrippedmerged_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 hasbugsee-plugin-version.txt= 4.0.8,CliBinaryResolver.DEFAULT_VERSION = "0.8.1"(#8, floor ≥ 0.7.12),--forceinCliUploader(#9), andNativeUploadTask.useMergedNativeLibs/mergedNativeLibsDir(#10). The release-branch treef24023cequals main@9139989apart fromversion.txt, so #11, #12, #13 and #15 are all in it.Fixed Android bugs: pins flipped (iOS pins untouched)
itDeleteit.failingbothiton Android (iOS stays, cocoa#195)itGreetingit.failingon Androiditit.failingon AndroiditAfter #63 landed (rebased onto
d957f55), its Android pins are flipped as well:#0000ff)detect.crash=false)capture.breadcrumbs.extrasadds 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.jsonis now OTLP/JSON (android#207 via #208; bugsee/specssdk/reporting/bundle/performance.md). span-lifecycle and apm readtransactions, which no longer exists.scripts/performance-capture.tsreads 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."< Feedback"). A leading arrow glyph is dropped before the exact match.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, pinnedit.failingon Android.showFeedbackActivity, offline). The prefs hold it. Filed bugsee/bugsee-android#245, pinned again on Android.isOverride) reach the network filter. The Android snapshot exposes a read-onlyoverride(cursor[bot] P2).Device: WOD_LX1, Debug arm64,
Bugsee Android SDK 7.3.1 [0aa9ae1ff](=v7.3.1)it.failing, #245)it)Release + R8 launch smoke (7.3.1 banner,
status=2, relaunch, no fatal): WOD_LX1, emulatorbugsee_api24(SDK 24),bugsee_api36(SDK 36).Release + R8, and the native symbol upload (loopback stub only)
assembleRelease -PbugseeE2eMinify=true, 4 ABIs, nodebugSymbolLevelanywhere in the app, a non-placeholder fake token, andplugin.endpointon a 127.0.0.1 stub that records every request (BUGSEE_CLI_AUTO_UPDATE=0):uploadBugseeReleaseNativeran bugsee-cli 0.8.1 onbuild/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.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 assymtab: the stripped ones (libhermesvm,libc++_shared, the Bugsee SDK's own). Every POST hasreplace_if_richer: true.native-debug-symbols.zip(.so.sym) was not used.🤖 Generated with Claude Code