Skip to content

e2e: device coverage for the first beta - #57

Merged
krassx merged 3 commits into
mainfrom
test/beta-coverage
Oct 7, 2026
Merged

krassx merged 3 commits into
mainfrom
test/beta-coverage

Conversation

@krassx

@krassx krassx commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Device e2e for the first beta's automatable coverage gaps (api-device-coverage.md, gap list G4, G5, G8, G9, G12, G13), on the WOD_LX1, the iPhone 17 Pro simulator and the iPhone XS (iOS 7.0.0-beta4, after merging #30/#55).

New suites

  • wrapper-identity: environment.sdk.wrapper in a report (type, package version, RN version, Hermes, build configuration), checked against the packages on disk.
  • feedback: the feedback screen in front of the app (Android dumpsys, iOS Vision OCR of a screen capture), the greeting, the chat background color. No taps.
  • launch-options: 20 option cases, each proven by what it changes in a report against a control run, plus the getLaunchOptions() read-back. The Android enum keys are launched with values whose ordinal names a different constant, so an ordinal lookup would fail.
  • lifecycle: onStatusChange, onLifecycleEvent order with report ids, stop(), an upload after stop, deleteCollectedDataOnDevice checked on disk.
  • span-lifecycle: getActiveSpan, setDescription, finish(status), setName.
  • js-crash: testJsCrash() as one crash at the launched crash priority.
  • report-dialog-appearance: the report dialog painted in the appearance color.
  • ios-native-crash: crashNative('segv'|'abort') (now a real signal crash on iOS) recovered on the XS, with the recovery handler's labels in the crash report.

Product bugs, pinned with it.failing

  • Android bridge BugseeOptionEnums: wireValue(IssueSeverity.VeryLow) is 0 (fromIntValue(int) falls back to VeryLow), and coerce() snaps every unknown severity to VeryLow.
  • deleteCollectedDataOnDevice(true) resolves true and leaves the capture parts: Android 7.3.0 (removeOtherGenerationsFilesSync(-1) keeps every generation), iOS beta4 (clears the legacy folder only).
  • iOS beta4: capture.video=false still records video; capture.network.body-size-limit is dropped; a JS fatal is filed at severity 5 ignoring crash-priority; setName renames the transaction instead of setting the operation (span.ts contract).
  • Android 7.3.0 feedback never shows the greeting; the iOS chat ignores the theme (documented).

Details, evidence, per-row status and the MANUAL checklist: .superpowers/sdd/2026-09-16-implementation-plan/beta-coverage-report.md (local).

Runs

  • WOD_LX1: 56 passed, 6 skipped. Simulator: 45 passed, 13 skipped. XS: all new suites green (ios-native-crash 6/6 in three runs).
  • yarn typecheck, yarn lint, yarn test green; launch.test, native-crash.test re-run.

🤖 Generated with Claude Code

krassx added 2 commits October 6, 2026 17:15
crashNative('segv') now stores through a bad pointer (EXC_BAD_ACCESS,
SIGSEGV) and crashNative('abort') calls abort() on iOS too, so an iOS
device test can prove a signal crash with no NSException behind it is
recovered. It used to only log that it was Android-only.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
… lifecycle, spans, crashes)

New suites, each run on the WOD_LX1, the iPhone 17 Pro simulator and the
iPhone XS:
- wrapper-identity: environment.sdk.wrapper in a report (API-45)
- feedback: the feedback screen in front, the greeting, the chat color
- launch-options: 20 option cases, each proven by what it changes in a
  report against a control run, plus the getLaunchOptions read-back;
  the Android enum keys use values whose ordinal names another constant
- lifecycle: onStatusChange, onLifecycleEvent order, stop(), an upload
  after stop, deleteCollectedDataOnDevice on disk
- span-lifecycle: getActiveSpan, setDescription, finish(status), setName
- js-crash: testJsCrash as one crash at the launched crash priority
- report-dialog-appearance: the dialog painted in appearance colors
- ios-native-crash: SIGSEGV / SIGABRT recovered on the XS with the
  recovery handler's labels in the crash report

Product bugs found are pinned with it.failing, each with its evidence.

🤖 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 (e827609)

Intent: device e2e for the first beta’s automatable gaps (wrapper identity, feedback UI, launch-option effects, lifecycle/delete, span ops, testJsCrash, report-dialog colour, iOS signal-crash recovery). The only non-test change is example-only crashNative on iOS, which now raises a real SIGSEGV/SIGABRT instead of logging and returning. @bugsee/react-native is untouched. CI ios e2e still runs launch.test.ts only.

Reviewed against the existing harness (startRun, clearIosBundles, report-handler / exceptions suites), setUserIdentifier persistence, and the iOS fatal path that already waits for BugseeRN exception unhandled completed.

Findings

ID Severity Location Problem
1 P2 High examples/bare/scenarios/feedback.ts:32 feedback-chat writes a persistent user identifier and never clears it
2 P2 High examples/bare/e2e/js-crash.test.ts:50 iOS kills the app 5s after the “throwing” marker, not after persist completes
3 P2 High examples/bare/e2e/ios-native-crash.test.ts:101 SIGABRT recovery after SIGSEGV is a known 2/3 miss, encoded as implicit test order

No P0/P1. I did not run the device e2e (needs WOD_LX1 / XS / a simulator with the app installed).

1. Overall risk: Medium

Example-only and test-only, but two findings can produce false reds on a later shared-device run, and one leaves identity in the iPhone Keychain the attributes suite already treats as uncleared-from-outside.

2. Merge recommendation: request changes

3. Most important to fix

  1. Clear the identifier feedback-chat sets (same contract as attributes-persist).
  2. On iOS, wait for exception unhandled completed before stopApp() in js-crash.
  3. Isolate SIGABRT recovery (or pin the post-SIGSEGV miss as it.failing) so the suite does not depend on ['abort','segv'].

4. Positive

  • Option cases launch with enum values whose ordinals name a different constant — that is a real ordinal-vs-fromIntValue trap, not a read-back theatre.
  • Product gaps are pinned with it.failing and a concrete observation (video-off still records, Android greeting unread, iOS setName renames the transaction, delete keeps generations).
  • iOS crashNative is a signal (0x10 store / abort()), not +[Bugsee testCrash], so it actually covers the FLOW-10 hole report-handler.test.ts left.
  • New suites go through beginRetainingSuite / startRun (dead endpoint, pin check, nonce) instead of inventing a second driver.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

Comment thread examples/bare/scenarios/feedback.ts
Comment thread examples/bare/e2e/js-crash.test.ts Outdated
Comment thread examples/bare/e2e/ios-native-crash.test.ts Outdated
… fatal, no crash-order dependency

- feedback.test.ts: afterAll runs attributes-persist to clear the
  e-mail user identifier feedback-chat sets (it outlives the wipe).
- js-crash.test.ts: on iOS, stop the app only after the bridge logs
  `exception unhandled completed`, as exceptions.test.ts does.
- ios-native-crash.test.ts: no array-order dependency; segv and abort
  each run once from a wiped container, the intermittent SIGABRT loss
  (3 of 16 runs, either order) is stated where it bites, and the crash
  reporter's queue is reported before each relaunch.

🤖 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

Re-review (676b612)

All three prior P2s are fully_addressed.

Thread Verdict
feedback-chat identifier leak fully_addressed — afterAll runs attributes-persist and waits for attr cleared-id {"type":"undefined"} (the same marker attributes.test.ts uses) before endRetainingSuite.
js-crash iOS stopApp before persist fully_addressed — waits for bridgeLine('exception unhandled completed') from this run’s launched index, then stops.
abort recovery hidden by ['abort','segv'] fully_addressed — kinds are separate cases; clearBundles() (crash queue included) runs before each; queue listing is reported before relaunch. The 3/16 SIGABRT miss is now an honest red, not an order trick, and is recorded as an open beta4 finding.

No new P0–P3. Residual: SIGABRT recovery on the XS is still intermittent (author: 3/16, either order). That is an SDK miss, not a test-design defect.

1. Overall risk: Low

2. Merge recommendation: approve

3. Most important to fix

Nothing left in this PR. The SIGABRT drop belongs on the iOS beta4 list, not as a merge blocker here.

4. Positive

The clearer reuses attributes-persist instead of a one-off wipe. The fatal wait matches exc-fatal. The abort comment now states the expected behaviour and will go red when the SDK drops it, which is the right pin for an intermittent miss (it.failing would flip).

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 (676b612)

Intent: device e2e for the first beta’s automatable gaps (wrapper identity, feedback UI, launch-option effects, lifecycle/delete, span ops, testJsCrash, report-dialog colour, iOS signal-crash recovery). The only non-test change is example-only crashNative on iOS, which raises a real SIGSEGV/SIGABRT. @bugsee/react-native is untouched. CI ios e2e still runs launch.test.ts only.

Re-checked against attributes-persist / Keychain identity, exc-fatal’s exception unhandled completed wait, clearIosBundles (crash queue included on device), IosConsole.launch (--terminate-existing), and the existing Android native-crash suite (still Android-only).

Prior findings (e827609) — all fully addressed

ID Prior Now
1 P2 feedback-chat left a persistent user identifier afterAll runs attributes-persist and waits for attr cleared-id {"type":"undefined"}
2 P2 iOS js-crash killed 5s after the pre-throw marker waits for BugseeRN exception unhandled completed before stopApp()
3 P2 SIGABRT recovery encoded as ['abort','segv'] order no order array; clearBundles before each kind; 3/16 abort miss stated as an open beta4 finding

No new P0–P3. I did not run the device e2e (needs WOD_LX1 / XS / a simulator with the app installed).

Residual, not a test defect: iOS beta4 still drops SIGABRT recovery now and then (3 of 16 on the XS, either order). The suite goes red when that happens, which is the right pin.

1. Overall risk: Low

Example-only and test-only. The three shared-device / false-red issues from the first pass are gone.

2. Merge recommendation: approve

3. Most important to fix

Nothing blocking. Optional later: retry or isolate the known SIGABRT-recovery miss if this file becomes a CI gate.

4. Positive

  • Follow-up matches the existing contracts (attributes-persist clearer, exc-fatal persist-before-kill, clearIosBundles wipe-and-assert) rather than inventing a second cleanup path.
  • Option cases still launch with enum values whose ordinals name a different constant.
  • Product gaps stay pinned with it.failing and a concrete observation.
  • iOS crashNative is a signal (0x10 store / abort()), not +[Bugsee testCrash], so FLOW-10 is actually covered.
Open in Web View Automation 

Sent by Cursor Automation: Bugsee code review

@krassx
krassx merged commit 807dc4b into main Oct 7, 2026
28 checks passed
@krassx
krassx deleted the test/beta-coverage branch October 7, 2026 02:07
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