Repository navigation
e2e(campaign): API, option and appearance device tests (N-02..N-09, N-11, N-13, N-14) - #63
Conversation
There was a problem hiding this comment.
Stale comment
Deep code review (campaign API / option / appearance e2e)
Test-only PR: N-02..N-09, N-11, N-13, N-14 device cases. No product SDK logic. Reviewed against surrounding harness (
startRun/awaitMetroServes),span-lifecycle.test.tscapture shape, Jest 29testPathPattern, and CI run 37585858557 (ios e2e (simulator)job 112675691361).P1 High —
relaunch.test.tsis executed by CI's launch-only Jest regexLocation:
examples/bare/e2e/relaunch.test.ts:51(new file). Triggered by existing.github/workflows/ci.yml(~393):yarn e2e launch.test.ts.Problem: Jest 29 treats a positional path as a regex, not an exact filename.
yarn e2e launch.test.tsbecomes/launch.test.ts/i. The new filerelaunch.test.tscontains that substring, so the job that comments "launch.test.ts only" now also runs this campaign suite.Impact: The "Reach Status.Launched" gate is no longer launch-only. On this head it is red: launch.test.ts PASS, then relaunch.test.ts FAIL ×5. Log:
Ran all test suites matching /launch.test.ts/i.FirststartRun('api-relaunch')already dies inawaitMetroServes(Metro never served a bundle carrying nonce … last: HTTP 200, 4751988 bytes without the nonce). The job no longer means what the workflow comment says, and a required check fails.Scenario:
ios e2e (simulator)runsyarn e2e launch.test.tswithmaxWorkers: 1. Jest pickslaunch.test.tsthenrelaunch.test.ts. After the launch suite, Metro still serves the previous ~4.7 MB bundle; the new nonce never appears within 60s; the relaunchbeforeAllthrows.Fix: Do both, or at least one that uniquely selects
launch.test.ts:
- CI:
--testPathPattern='(^|/)launch\.test\.ts$'(or--runTestsByPath e2e/launch.test.ts).- This PR: rename to e.g.
api-relaunch.test.tsso the existing pattern cannot swallow it.P2 Medium —
[API-19f]never asserts child parentageLocation:
examples/bare/e2e/api-arguments.test.ts:312-320(lookup at 314; guard at 318-319).Problem: Two independent misses, either of which skips the parentage
expect:
span()matchesrecord.description === ….startTransaction(\api-txn-${nonce}`, 'api.flow')stores that string as the transaction **name**, not description.span-lifecycle.test.tsalready treatsnamevsdescriptionseparately and finds the root byparentSpanId === undefined`.- The guard reads OTLP snake_case (
span_id/parent_span_id). Device captures in this repo are camelCase (spanId/parentSpanId) — seespan-lifecycle.test.ts:26-27, 92, 99.The remaining asserts only require the child to exist and the name string to appear somewhere in the JSON.
Impact: API-19f is a false green. A child with the wrong parent, or no parent link, still passes.
Scenario: Performance capture has
name: "api-txn-<nonce>"and child{ description: "child-<nonce>", parentSpanId: "…", spanId: "…" }.parentisundefined(no description match) or found butspan_idis undefined. Theifis skipped; the test passes.Fix: Find the parent by
name(or the root span withparentSpanId === undefinedin that transaction). Assertchild.parentSpanId === parent.spanId. Drop the optional snake_case guard so a missing link fails.
Verdict
- Overall risk: Medium (CI gate broken; one campaign assertion is a no-op. No product-code defect.)
- Merge recommendation: Request changes. Do not merge while
ios e2e (simulator)is red for this filename collision.- Most important to fix: (1) stop
/launch.test.ts/imatchingrelaunch.test.ts; (2) make API-19f assert camelCase parentage for real.- Positives: Honest
it.failingpins; Android DebugawaitMetroServesbefore launch (avoids mid-run Metro reload); autolaunch overlay is a dedicated flavor, not a silent default; N-03 screenshot-before/after relaunch is a real option-effect check.Sent by Cursor Automation: Bugsee code review
…ntage - relaunch.test.ts -> api-relaunch.test.ts, and CI selects '/launch\.test\.ts$': Jest reads the argument as a path regex, so 'launch.test.ts' also ran the relaunch suite in the simulator job (whose Metro never serves a rewritten scenario; red on run 37585858557). - [API-19f]: find the transaction by name and its root span in `spans`; assert the child's parentSpanId is that root's spanId, unconditionally (camelCase, as span-lifecycle.test.ts reads the capture). Review findings from cursor[bot] on #63. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
There was a problem hiding this comment.
Stale comment
Deep code review (re-review of c650bc9)
Test-only PR: N-02..N-09, N-11, N-13, N-14 device cases. No product SDK logic. Rechecked the two prior findings against Jest 29.7
testPathPatternToRegExp(absolutetest.path),span-lifecycle.test.tscapture shape, and the surrounding harness (startRun/awaitMetroServes).Prior findings
- P1 fully addressed. Suite is
api-relaunch.test.ts. CI runsyarn e2e '/launch\.test\.ts$'. Jest 29 compiles that tonew RegExp('/launch\\.test\\.ts$', 'i')and matches absolute paths, so the path must end in/launch.test.ts..../e2e/launch.test.tsmatches;.../e2e/api-relaunch.test.tsdoes not (relaunchis not/launchafter the last slash). The previous/launch.test.ts/icollision is gone.- P2 fully addressed.
[API-19f]finds the transaction byname, takes the root ofspanswith noparentSpanId, and assertschild.parentSpanId === root.spanIdunconditionally (camelCase, same asspan-lifecycle.test.ts).No new P0–P2. I did not invent a defect from CI
lint, typecheck, uniton run 37588305266: that job is red on this SHA, but the log is not readable while sibling jobs are still running. The previous head (e86998e) passed that job. Treat a still-red lint job as a merge gate, not as a reviewed code bug.
Verdict
- Overall risk: Low (prior CI/assertion defects fixed; remaining work is campaign e2e. No product-code defect.)
- Merge recommendation: Approve the review findings. Do not merge while
lint, typecheck, unitis red; confirmios e2e (simulator)stays launch-only.- Most important remaining: Wait for a green
lint, typecheck, uniton this SHA. Nothing else from this review.- Positives: Honest
it.failingpins with filed SDK issues; Android Debug waits for Metro before launch (avoids mid-run reload); autolaunch overlay is a dedicated flavor, not a silent default; N-03 screenshot-before/after relaunch is a real option-effect check; API-19f now matches how the capture is actually shaped.Sent by Cursor Automation: Bugsee code review
There was a problem hiding this comment.
Stale comment
Deep code review (re-review of 7d6ca55)
Test-only PR: N-02..N-09, N-11, N-13, N-14 device cases. No product SDK logic. Rechecked the full diff against the harness (
startRun/awaitMetroServes),span-lifecycle.test.tscapture shape, Jest 29testPathPattern(absolutetest.path), the Android autolaunch overlay, and the campaign scenarios App.tsx dispatches.Prior findings
- P1 fully addressed. Suite is
api-relaunch.test.ts. CI runsyarn e2e '/launch\.test\.ts$'. Jest 29 compiles that tonew RegExp('/launch\\.test\\.ts$', 'i')on the absolute path, so the path must end in/launch.test.ts..../e2e/api-relaunch.test.tsdoes not (relaunchis not/launchafter the last slash).example-wiring.test.tsnow pins that command and asserts the regex selects onlylaunch.test.tsamong the e2e suites.- P2 fully addressed.
[API-19f]finds the transaction byname, takes the root ofspanswith noparentSpanId, and assertschild.parentSpanId === root.spanIdunconditionally (camelCase, same asspan-lifecycle.test.ts).
lint, typecheck, unitwas red on c650bc9 (37588305266) because the wiring test still expectedyarn e2e launch.test.ts. This SHA updates that pin; the same job is success on 37589560526.No new P0–P2. Re-read attach/pre-launch ownership, option-effect controls,
it.failingpins, and the autolaunch debug source-set overlay; nothing there is a false green or a product-path defect.
Verdict
- Overall risk: Low (prior CI/assertion defects fixed; lint gate green; remaining work is campaign e2e. No product-code defect.)
- Merge recommendation: Approve.
- Most important issues to fix: None from this review.
- Positives: Honest
it.failingpins with filed SDK issues; Android Debug waits for Metro before launch (avoids mid-run reload); autolaunch overlay is a dedicated Gradle property, not a silent default; N-03 screenshot-before/after relaunch is a real option-effect check; API-19f now matches how the capture is actually shaped; the launch-only CI step is regression-tested against the e2e directory.Sent by Cursor Automation: Bugsee code review
There was a problem hiding this comment.
Stale comment
Deep code review (re-review of 836ee32)
Test-only PR: N-02..N-09, N-11, N-13, N-14 device cases. No product SDK logic. Rechecked the full diff against the harness (
startRun/awaitMetroServes),span-lifecycle.test.tscapture shape, Jest 29testPathPattern(absolutetest.path), the Android autolaunch overlay, App.tsx'sisApiScenariodispatcher, and the option-effect / appearance suites.Delta since 7d6ca55
836ee32only rewritesit.failingtitles and known-bug comments to cite the filed issues (bugsee-cocoa#201..#204, bugsee-android#217..#221). No assertion, harness, CI, or scenario-control flow change.Prior findings
- P1 fully addressed. Suite is
api-relaunch.test.ts. CI runsyarn e2e '/launch\.test\.ts$'. Jest 29 compiles that tonew RegExp('/launch\\.test\\.ts$', 'i')on the absolute path, so the path must end in/launch.test.ts..../e2e/api-relaunch.test.tsdoes not.example-wiring.test.tsstill pins that command and asserts the regex selects onlylaunch.test.tsamong the e2e suites.- P2 fully addressed.
[API-19f]finds the transaction byname, takes the root ofspanswith noparentSpanId, and assertschild.parentSpanId === root.spanIdunconditionally (camelCase, same asspan-lifecycle.test.ts).No new P0–P2. Re-read attach/pre-launch ownership, option-effect controls vs defaults,
it.failingpins, and the autolaunch debug source-set overlay; nothing there is a false green or a product-path defect.
Verdict
- Overall risk: Low (prior CI/assertion defects fixed; this SHA is issue-link comments only. No product-code defect.)
- Merge recommendation: Approve.
- Most important issues to fix: None from this review.
- Positives: Honest
it.failingpins now point at filed SDK issues; Android Debug waits for Metro before launch (avoids mid-run reload); autolaunch overlay is a dedicated Gradle property, not a silent default; N-03 screenshot-before/after relaunch is a real option-effect check; API-19f matches how the capture is actually shaped; the launch-only CI step is regression-tested against the e2e directory.Sent by Cursor Automation: Bugsee code review
scenarios/api.tsx routes every api-* scenario: launch-option overrides on the typed model, a pre-launch step that may own the launch (api-attach on a manifest-launched build), the post-launch step, and a stage for the scenarios that render. App.tsx gets additive hooks only. e2e/api-markers.ts reads their 'BUGSEE_E2E api ...' markers. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…(N-02, N-03, N-09) attach.test.ts: attach() with nothing launched (iOS, ordinary Android), and on an Android build made with -PbugseeE2eAutoLaunch=true, which merges com.bugsee.app-token meta-data (placeholder token, dead endpoint) so the SDK launches from the manifest. relaunch.test.ts: relaunch() with changed options, launch() after stop(), a second launch() while Launched. lifecycle-events.test.ts: RelaunchedAfterCrash, Before/AfterReportShown, upload failure events. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…04, N-05, N-11) secure-rectangles-api.test.ts reads the mask off the report screenshot on both platforms (measureInWindow ground truth), with a display-1 rectangle and [] clears. console-levels.test.ts: the console level map and an RCTLog line with no console call, each filtered once. sdk-breadcrumbs.test.ts: SDK breadcrumbs next to the app's, and a plain upload's video decodable, more than one frame, not black. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
options-readback.test.ts: all manifest keys of the platform non-default in one launch (accessors and setCustomOption), read back, refreshed getters, the report's environment record (Android ordinals, bug 10), every enum value. option-effects.test.ts: the offline-observable effect cases, each against a control at the defaults. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Every key read back, the foreign keys' RangeError, and a pixel check where the open dialog, chat or e-mail screen paints the key. Feedback also: setGreeting(null), setListener(null), use before launch(), the e-mail screen on a first open. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bugsee-cocoa#195..#200 and bugsee-android#214..#216 (sdk-issues-filed.md). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…ound - harness: wait for Metro to serve the run's scenario before a Debug launch on Android and the iPhone too; a late watcher notice reloaded the app mid-run and restarted the scenario. - N-09: AfterReportShown fires as the report UI is shown on both SDKs (their documented contract), not on dismissal; asserted as documented on A/S/X. RelaunchedAfterCrash uses a native signal (a Debug red box catches testNativeCrash on Android). - N-05: iOS lands a native-only RCTLog line three times (wrapper bug, pinned). - N-06: iOS adaptive video defaults on; body-size-limit pinned (#197). - N-08: settle() composites parsed; ErrorBoundary fallback renders twice; setStatus+finish() is OK as documented; non-Error reasons per payload.ts. - N-11: iOS is not driven to the background. - N-13/N-14: severity selector and labels on, empty description for hints; blended colours where the SDK draws with alpha; keys the SDKs never paint pinned (to file); feedback read-back is the package's record; FB-06 on the simulator reinstalls and resets the Keychain, skipped on the iPhone. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
N-07: deadlines follow ReportHandlerDeadlines (option seconds - 1 s); out-of-process report assembly needs the network on (JobScheduler); the dialog's added fields are compared by text; allsources by logcat tags; net-on-launch owns its launch and fetches in the same turn; hang and HTTP errors are A/X (no error reporter in the simulator slice); notify-flush and websocket are not observable offline (reasons in the tests); os_log asserted as beta5 documents (ignored); min-frame-rate recorded; on-device symbolication by the testCrash frame. Known product bugs pinned: Android NDK crash ignores detect.crash=false, Android records no SDK breadcrumbs, iOS never reads detect.kill. N-06: the Android all-keys run has the network on (out-of-process assembly). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…; iOS untyped-body pin OPT-009: Android records the request start only with on-launch (asserted, A only; iOS records the same events either way). OPT-081: read back as set; filing pinned (Android files no report out of process). The all-keys N-06 run keeps in-process assembly so its report exists. OPT-007 pinned on iOS (untyped body kept with the option off). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…ntage - relaunch.test.ts -> api-relaunch.test.ts, and CI selects '/launch\.test\.ts$': Jest reads the argument as a path regex, so 'launch.test.ts' also ran the relaunch suite in the simulator job (whose Metro never serves a rewritten scenario; red on run 37585858557). - [API-19f]: find the transaction by name and its root span in `spans`; assert the child's parentSpanId is that root's spanId, unconditionally (camelCase, as span-lifecycle.test.ts reads the capture). Review findings from cursor[bot] on #63. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
example-wiring.test.ts pinned the old literal command; it now pins the anchored pattern and checks it against the e2e directory (api-relaunch must stay out). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
836ee32 to
7a41147
Compare
There was a problem hiding this comment.
Stale comment
Deep code review (re-review of 7a41147)
Test-only PR: N-02..N-09, N-11, N-13, N-14 device cases. No product SDK logic. Rechecked the full diff after the rebase onto #62 (
794b780): App.tsx now dispatches bothflow-*(FlowStage) andapi-*(ApiStage); the names do not overlap. Also recheckedstartRun/awaitMetroServes, Jest 29testPathPattern, the Android autolaunch overlay, API-19f parentage, and the option-effect / appearance suites.Prior findings
- P1 fully addressed. Suite is
api-relaunch.test.ts. CI runsyarn e2e '/launch\.test\.ts$'. Jest 29 compiles that tonew RegExp('/launch\\.test\\.ts$', 'i')on the absolute path, so the path must end in/launch.test.ts..../e2e/api-relaunch.test.tsdoes not (resits in front oflaunch).example-wiring.test.tsstill pins that command and asserts the regex selects onlylaunch.test.tsamong the e2e suites.- P2 fully addressed.
[API-19f]finds the transaction byname, takes the root ofspanswith noparentSpanId, and assertschild.parentSpanId === root.spanIdunconditionally (camelCase, same asspan-lifecycle.test.ts).New finding
One P2 in the OPT-025 pin: Android
it.failingwraps a JS fatal and an NDK crash behind a single empty-bundle assertion, so the JS half ofdetect.crash=falsecannot go red. OPT-081 in the same file already splits read-back (it) from the known no-bundle bug (it.failing); this case should too.
Verdict
- Overall risk: Low (test-only; prior CI/assertion defects still fixed; one campaign pin cannot catch a JS-crash-detection regression on Android.)
- Merge recommendation: Approve. Split OPT-025 before treating that row as device proof of the JS path.
- Most important issue to fix: OPT-025 — separate the JS-fatal assertion (
iton Android) from the NDKit.failingpin (bugsee-android#220).- Positives: Honest
it.failingpins with filed SDK issues; Android/iPhone Debug waits for Metro before launch (avoids mid-run reload); autolaunch overlay is a dedicated Gradle property, not a silent default; N-03 screenshot-before/after relaunch is a real option-effect check; API-19f matches the capture shape; the launch-only CI step is still regression-tested against the e2e directory; rebase onto the flow dispatcher is clean.Sent by Cursor Automation: Bugsee code review
The JS fatal and the native crash each get their own test (same launches, each followed by an idle launch). The JS half is a plain it on A and X; the native half stays it.failing on Android (bugsee-android#220, fixed in 7.3.1) and plain on the XS. Before, the Android NDK bundle alone kept the combined it.failing green, so a JS fatal reported with detect.crash=false could not turn it red. cursor[bot] review on #63. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
There was a problem hiding this comment.
Stale comment
Deep code review (re-review of 80f9fb2)
Test-only PR: N-02..N-09, N-11, N-13, N-14 device cases. No product SDK logic. Rechecked the full diff after the OPT-025 split, including
startRun/awaitMetroServes, Jest 29testPathPattern, the Android autolaunch overlay, API-19f parentage, App.tsxflow-*vsapi-*dispatch, attach/pre-launch ownership, and the option-effect / appearance suites.Prior findings
- P1 fully addressed. Suite is
api-relaunch.test.ts. CI runsyarn e2e '/launch\.test\.ts$'. Jest 29 compiles that tonew RegExp('/launch\\.test\\.ts$', 'i')on the absolute path, so the path must end in/launch.test.ts..../e2e/api-relaunch.test.tsdoes not.example-wiring.test.tsstill pins that command and asserts the regex selects onlylaunch.test.tsamong the e2e suites.- P2 fully addressed.
[API-19f]finds the transaction byname, takes the root ofspanswith noparentSpanId, and assertschild.parentSpanId === root.spanIdunconditionally (camelCase, same asspan-lifecycle.test.ts).- P2 fully addressed.
[OPT-025]is two tests over the same launches. The JS fatal + idle launch is a plainiton A and X. The native crash + idle launch isit.failingon Android (bugsee-android#220) and a plainiton the XS.New finding
One P2 of the same class as the OPT-025 pin: iOS
[OPT-007]it.failingwraps the working option-on assertion with the known option-off leak (bugsee-cocoa#204), so a regression of "untyped body kept with the option on" cannot turn the test red. OPT-025/081 in this same file already split that way.
Verdict
- Overall risk: Low (test-only; prior CI/assertion defects still fixed; one iOS option-effect pin cannot catch a body-without-type positive-path regression.)
- Merge recommendation: Approve. Split OPT-007 before treating that iOS row as device proof of the option-on path.
- Most important issue to fix: OPT-007 — separate option-on (
iton A/S/X, body kept) from option-off (it.failingon iOS for bugsee-cocoa#204,iton Android).- Positives: OPT-025 is now a real JS-fatal gate on Android; honest
it.failingpins with filed SDK issues; Android/iPhone Debug waits for Metro before launch; autolaunch overlay is a dedicated Gradle property; N-03 screenshot-before/after relaunch is a real option-effect check; API-19f matches the capture shape; rebase onto the flow dispatcher is still clean.Sent by Cursor Automation: Bugsee code review
With the option on, the untyped body is kept: a plain it on A, S and X. At the default (off) it is left out: plain on Android, it.failing on iOS (bugsee-cocoa#204). Before, the iOS control alone kept the combined it.failing green, so losing the body with the option on could not turn it red. cursor[bot] review on #63. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
There was a problem hiding this comment.
Stale comment
Deep review (
adbf04f)Test-only campaign coverage (N-02..N-09, N-11, N-13, N-14).
adbf04fsplits OPT-007 the same way 80f9fb2 split OPT-025: option-on is a plainiton A/S/X; the default-off leak staysit.failingon iOS (bugsee-cocoa#204).Prior threads (CI launch pattern, API-19f parentage, OPT-025, OPT-007) are fully_addressed.
Two remaining P2s of the same class: a working half still cannot turn its suite red.
Did not run device e2e (needs the handset / XS). Inspected the new suites against
startRun, App.tsx dispatch,api-lifecycle/api-options/api-args, and the CI launch regex.Findings
P2 FLOW-13 native RCTLog —
console-levels.test.ts:78
P2 OPT-026 does not exercisedetect.early-crash—option-effects.test.ts:191Rechecked, not posted
- FLOW-15 Android
it.failingstill also assertsapi-own-crumb; API-28 remains the addBreadcrumb gate.attach()treats anything other thanLaunchedas idle; autolaunch still requiresafter=2.- API-41c still asserts rolling-capture parts after
delete(false), not that the uploaded bundle remains.notify()relay still asserts body/fields/sixth-arg, not severity/urgent.Overall
- Overall risk: Low
- Merge recommendation: Approve; split FLOW-13 and isolate OPT-026 so those names are real gates.
- Most important to fix: FLOW-13 Custom mapping as a plain
it; OPT-026 needs an actually-early crash and/or an option-off control (todaydetect.crashrecovers it).- Positive: OPT-007/025/081 splits are the right shape; API-19f parentage is unconditional; CI
'/launch\.test\.ts$'is pinned inexample-wiring.test.ts; product bugs stayit.failingwith issue numbers rather than being weakened.Sent by Cursor Automation: Bugsee code review
… from JS - FLOW-13: 'reaches the report' (iOS: one Custom 98 line at Warning 2, the bridge forward; Android: in the report) is a plain it on A, S and X; 'lands once and is filtered once' stays it.failing on iOS (W1). - OPT-026: a crash JS can raise comes after Launched, where detect.crash recovers it with or without detect.early-crash (on by default), so the old case passed whatever the option did. Skipped with that reason; the synchronous send is staging S-5. cursor[bot] review on #63. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
There was a problem hiding this comment.
Stale comment
Deep review (
d3c59d0)Test-only campaign coverage (N-02..N-09, N-11, N-13, N-14).
d3c59d0addresses both remaining P2s fromadbf04f.Prior findings
- FLOW-13 fully addressed. Same launch, two tests.
reaches the reportis a plainiton A/S/X: iOS asserts exactly one Custom (98) Warning (2) line (the bridge forward); Android asserts at least one logcat line.lands once and is filtered oncestaysit.failingon iOS (W1) and a plainiton Android.- OPT-026 fully addressed. Skipped with the isolation reason;
EFFECT_OPTIONS['early-crash']removed. Read-back stays in N-06 (detect.early-crash: false). Staging S-5 for the synchronous send.- Earlier threads (CI launch pattern, API-19f, OPT-025, OPT-007) remain fully_addressed.
No remaining P0–P3. Did not run device e2e.
Overall
- Overall risk: Low
- Merge recommendation: Approve
- Most important issues to fix: None
- Positive: The OPT-007/025/081/FLOW-13 splits are the right shape for
it.failingpins; OPT-026 is an honest skip rather than a passing test that did not isolate the option.Sent by Cursor Automation: Bugsee code review
There was a problem hiding this comment.
Deep review (d3c59d0)
Test-only campaign coverage (N-02..N-09, N-11, N-13, N-14). d3c59d0 addresses the two remaining P2s from adbf04f.
Prior threads (CI launch pattern, API-19f parentage, OPT-025, OPT-007, FLOW-13, OPT-026) are fully_addressed.
Did not run device e2e (needs the handset / XS). Inspected the new suites against startRun, App.tsx dispatch, api-lifecycle / api-options / api-args, Jest 29 testPathPattern, and the CI launch regex. Rechecked remaining it.failing pins for a working half that cannot go red; nothing left of that class that is not already gated elsewhere (API-28 for addBreadcrumb next to FLOW-15).
Prior findings at this SHA
P2 FLOW-13 — fully addressed. Two tests over the same launch. ‘reaches the report’ is a plain it on A, S and X (iOS: exactly one Custom (98) line at Warning (2)). ‘lands once and is filtered once’ stays it.failing on iOS (W1) and a plain it on Android. A G16 “fix” that drops RCTLog forwarding now turns the first test red.
P2 OPT-026 — fully addressed. Skipped with the isolation reason; early-crash is gone from EFFECT_OPTIONS. A JS-raised crash is after startRun saw Launched, where detect.crash recovers it with or without detect.early-crash. Read-back stays in N-06; the synchronous send is staging S-5.
No remaining P0–P3.
Rechecked, not posted
- FLOW-15 Android
it.failingstill also assertsapi-own-crumb; API-28 remains the addBreadcrumb gate. attach()treats anything other thanLaunchedas idle; autolaunch still requiresafter=2.- API-41c still asserts rolling-capture parts after
delete(false), not that the uploaded bundle remains. notify()relay still asserts body/fields/sixth-arg, not severity/urgent.$$ENDPOINTis the Android option key, not an AGP${name}placeholder.
Overall
- Overall risk: Low
- Merge recommendation: Approve.
- Most important to fix: None from this review.
- Positive: FLOW-13/OPT-007/025/081 splits are the right shape; OPT-026 is an honest skip instead of a passing test that did not isolate the option; API-19f parentage is unconditional; CI
'/launch\\.test\\.ts$'is pinned inexample-wiring.test.ts; product bugs stayit.failingwith issue numbers rather than being weakened.
Sent by Cursor Automation: Bugsee code review
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)


Campaign PREP-api: device tests for plan items N-02, N-03, N-04, N-05, N-06, N-07, N-08, N-09, N-11, N-13 and N-14 (beta-campaign-plan.md section 3.1). Every new test title carries its plan ID(s) in brackets, so the evidence collector maps it.
What
scenarios/api*.ts(x): theapi-*scenarios and a dispatcher;App.tsxgets additive hooks only.attach,relaunch,secure-rectangles-api,console-levels,options-readback,option-effects,api-arguments,lifecycle-events,sdk-breadcrumbs,report-dialog-keys,feedback-keys.-PbugseeE2eAutoLaunch=true(Android debug): mergescom.bugsee.app-token(placeholder) + dead$$ENDPOINTmeta-data for N-02's manifest auto-launch. Off by default.harness.ts: wait for Metro to serve the run's scenario before every Debug launch (Android and iPhone too). A Debug app reloads whene2e-scenario.jsonchanges after launch, restarting the scenario mid-run.Proof (smallest runs, WOD_LX1 / simulator / iPhone XS)
All suites pass or fail only on pinned, evidenced product bugs; per-item, per-target status in
.superpowers/.../campaign-prep-api.md.New product bugs, pinned it.failing and listed "to file" in sdk-issues-filed.md:
E_TOKEN.Plan correction: both SDKs fire AfterReportShown when the report UI is shown (documented), not on dismissal; EVT-09 asserts that, no tap needed.
Not covered (reasons in the tests and the doc): EVT-18 order, FB-06 on the XS, OPT-022 notify-flush (affects the POST only), OPT-062 websocket (RN's SocketRocket not captured), OPT-098 broadcast trigger (no in-app sender).
yarn lint,yarn typecheck,yarn test(3247) pass. No product logic changed (no Stryker run).🤖 Generated with Claude Code