Use this file as the goal prompt for a live release-readiness stress test of Reticulum Emergency Management (REM). The test is not complete until REM has been exercised across multiple real phones, every user-facing function has been executed, cross-device results have been verified, and all release-blocking defects found during the run have been fixed or explicitly documented as non-blocking.
Prove that the current REM build is release-ready and rock solid under live multi-phone use.
Run a live integration stress test with at least three Android phones connected over USB, plus any additional REM-capable phones available over the same Reticulum mesh. Exercise every REM function from one phone and verify the result on the other phones. Rotate the source phone so each USB-connected phone acts as sender, receiver, and recovery target. Do not claim release readiness until the full matrix passes with evidence.
- Work only in this repository:
C:\Users\broth\Documents\work\ATAK\src\reticulum_mobile_emergency_management. - Start by running
git status --shortand record the branch, commit, app version, and whether the worktree is clean. - Do not scan or operate on sibling repositories unless a project dependency explicitly requires it.
- Treat generated Android/Rust artifacts as volatile. Do not hand-edit generated files.
- Use the compiled Rust/LXMF bridge already present in REM. Do not recreate protocol behavior in TypeScript or Vue to bypass the runtime.
- If a failure is found, first reproduce it with the smallest possible live scenario, capture evidence, identify the owning layer, apply the smallest defensible fix, and rerun the failed scenario plus the nearest broader smoke test.
- If hardware, permissions, or network conditions prevent a test, mark the row
BLOCKED, record the exact blocker, and do not count that row as passed. - Do not call the release rock solid unless there are zero critical or high
severity blockers and every required live matrix row is
PASS.
Use at minimum:
Phone A: USB-connected Android phone, primary sender for round 1.Phone B: USB-connected Android phone, primary sender for round 2.Phone C: USB-connected Android phone, primary sender for round 3.Phone D+: optional non-USB phones on the same Reticulum mesh for extra receiver/load coverage.
For each phone record:
- ADB serial from
adb devices -l. - Android version and device model.
- REM app version and build commit.
- Callsign/display name used during test.
- Reticulum destination hash shown in REM.
- Whether the phone is USB controlled, manual observer only, or both.
- Whether location permission, notification permission, and background behavior are enabled.
Create an execution log in this file or in a clearly linked artifact. For every test row, capture:
- Source phone and receiving phones.
- Exact action performed.
- Start timestamp and first-visible timestamp on each receiver.
- Message/checklist/event/telemetry/SOS identifier when available.
- Screenshots or screen recordings from source and at least one receiver.
- Relevant
adb logcatexcerpts for failures. - Pass/fail result and severity.
- Fix commit or issue reference for any defect found.
Suggested live evidence commands:
adb devices -l
adb -s <serial> shell getprop ro.product.model
adb -s <serial> shell getprop ro.build.version.release
adb -s <serial> logcat -c
adb -s <serial> logcat -v time > tmp/rem-stress-<callsign>.log
adb -s <serial> shell screencap -p /sdcard/rem-stress.png
adb -s <serial> pull /sdcard/rem-stress.png tmp/rem-stress-<callsign>.pngBefore live testing, prove the build is coherent:
npm --workspace apps/mobile run typecheck
npm --workspace apps/mobile run build
npm --workspace packages/node-client run build
cargo test --manifest-path crates/reticulum_mobile/Cargo.tomlThen build and install the same Android artifact on all USB phones:
Push-Location apps/mobile
npx cap sync android
Pop-Location
Push-Location apps/mobile/android
cmd /c gradlew.bat clean assembleDebug
Pop-Location
adb -s <phone-a-serial> install -r apps/mobile/android/app/build/outputs/apk/debug/app-debug.apk
adb -s <phone-b-serial> install -r apps/mobile/android/app/build/outputs/apk/debug/app-debug.apk
adb -s <phone-c-serial> install -r apps/mobile/android/app/build/outputs/apk/debug/app-debug.apkRecord any command that is skipped and why. A failed build or install is a release blocker.
Use three rounds. In each round, one USB phone is the originator and every other phone is a receiver.
- Round 1: Phone A sends/creates/updates/deletes; Phone B and Phone C verify.
- Round 2: Phone B sends/creates/updates/deletes; Phone A and Phone C verify.
- Round 3: Phone C sends/creates/updates/deletes; Phone A and Phone B verify.
For each feature:
- Perform one normal operation.
- Perform one edit/update operation when the feature supports it.
- Perform one delete/cancel/deactivate operation when the feature supports it.
- Verify remote phones receive the correct state.
- Kill and restart REM on at least one receiver and verify state persists.
- Toggle background/foreground on at least one receiver and verify state is not lost.
- Repeat under burst load or concurrent operation when the feature is communication-sensitive.
- Fresh start shows the REM splash/version and reaches the expected first screen.
- First-run setup wizard can configure callsign, team color, Reticulum mode, and required permissions.
- Settings can relaunch setup wizard.
- Main navigation reaches Dashboard, Chat, Action Messages, Events, Checklists, Map, Peers, and Settings.
- Android back navigation returns through history and falls back to Dashboard.
- Help screens for message status and event/MECP open and return correctly.
- App kill/restart preserves setup choices and current operational state.
Pass condition: all phones can start, configure, navigate, restart, and preserve settings without losing identity or peer state.
- Update callsign/display name and verify announces reflect the new identity.
- Update team color and verify Action Message/Dashboard categorization.
- Validate default TCP community server selection.
- Change and persist TCP endpoint selection.
- Confirm autonomous mode behavior.
- Confirm disabled RCH hub directory does not expose connected-only routing states.
- Change telemetry publish interval above 60 seconds and verify save/persist.
- Configure SOS settings and PIN behavior.
- Exercise notification and location permission paths.
Pass condition: settings persist across app restart and any setting that affects network identity is visible to other phones through announces or received payloads.
- Each phone announces itself.
- Each other phone discovers the announce.
- Save each trusted peer.
- Connect to each saved peer.
- Disconnect and reconnect.
- Request peer identity.
- Use manual connect and verify node-not-running/readiness errors are clear when intentionally triggered.
- Verify peer sharing drives the rest of the app: Chat, Action Messages, Events, Checklists, Telemetry, and SOS all target saved or discovered peers correctly.
Pass condition: all three USB phones see each other as REM-capable peers and can recover from disconnect/reconnect without stale or duplicate peer rows.
- Send direct chat message A -> B/C, B -> A/C, and C -> A/B.
- Verify message body, sender name, timestamp, delivery state, and conversation selection on every receiver.
- Send messages containing links and verify links render correctly.
- Open a chat thread from peer status and from telemetry popup.
- Delete a chat thread and verify the intended thread is removed without corrupting other conversations.
- Burst test: send at least 100 chat messages rotating among A, B, and C.
- Restart sender and receiver during or after burst and verify chat history persists on both sides.
- Test retry/cancel paths if a message is intentionally sent while disconnected.
Pass condition: chat is durable. The sender-side and receiver-side conversation history must not reset, vanish, duplicate incorrectly, or select the wrong peer.
- Create an Action Emergency Message from each phone.
- Verify remote phones display inbound synced messages read-only where appropriate.
- Edit status and cycle status.
- Filter by team color.
- Open status help.
- Delete a local Action Message and verify dashboard totals update.
- Burst test: create at least 50 Action Messages across phones with mixed team colors and statuses.
Pass condition: Action Messages replicate correctly, keep the right status, feed Dashboard rings, and do not let inbound read-only records be edited incorrectly.
- Verify readiness metrics from stored Action Messages.
- Verify peer count, checklist counts, recent activity, and status summaries after each feature creates data.
- Verify Dashboard updates after Action Message status changes, checklist task changes, event creation, telemetry receipt, and SOS activation/deactivation.
- Restart the app and verify Dashboard reconstructs the same operational picture.
Pass condition: Dashboard always matches the underlying live state from other screens and never reports stale critical status after updates or deletes.
- Create MECP event timeline entries from each phone.
- Verify category, severity, body text, sender, and timestamp on every receiver.
- Filter by severity and category.
- Delete/remove an event and verify receivers converge.
- Exercise structured MECP encode/decode cases visible in the UI.
- Open Events help and verify it does not break navigation.
- Burst test: create at least 50 events across phones with mixed categories and severities.
Pass condition: events replicate through the mission/LXMF path, stay compatible with MECP expectations, and receivers converge after create/filter/delete flows.
- List built-in checklist templates.
- Import a checklist template CSV if the UI exposes import on the installed build.
- Create checklist from template.
- Create online/shared checklist.
- Open checklist detail on every phone.
- Join checklist from another phone.
- Upload/publish checklist if the action is available.
- Update checklist title, description, or start time.
- Set task status from each phone.
- Add a task row.
- Edit a task cell.
- Set task row style/background and line-break behavior.
- Delete a task row.
- Delete the checklist.
- Restart sender and receiver and verify final checklist state persists.
- Concurrent stress: two phones update different task rows while a third phone changes task status, then verify deterministic convergence.
Pass condition: checklist state is consistent across Rust runtime, node-client, Pinia projection, and UI on all phones. No receiver may show an impossible mix of old and new checklist state after restart.
- Enable telemetry on each phone with location permission granted.
- Publish one local telemetry fix from each phone.
- Verify Map shows live markers for peers.
- Verify stale and expired marker behavior.
- Verify close positions cluster into count bubbles when zoomed out.
- Open telemetry popup and launch chat thread for matched peer.
- Delete local telemetry and verify marker removal.
- Verify telemetry is hidden for cancelled SOS emergencies.
- Stress test with rapid foreground/background transitions while telemetry is enabled.
Pass condition: peer positions appear, age out, cluster, link to chat, and clear correctly across phones without leaking cancelled SOS locations.
- Configure SOS settings on each phone.
- Trigger SOS from each phone.
- Verify SOS overlay/card appears locally.
- Verify every receiver displays active SOS alert.
- Verify SOS telemetry/location appears on Map.
- Verify chat can open from SOS-related peer/location context.
- Submit SOS telemetry updates.
- Deactivate SOS with the configured PIN if enabled.
- Verify receivers clear or mark cancelled SOS state.
- Restart one receiver during active SOS and verify it reconstructs the active alert.
Pass condition: SOS activation, telemetry, receiver alerting, and cancellation are reliable and cannot leave a false active emergency after deactivation.
- Select or clear active propagation node when available.
- Request LXMF sync.
- Confirm sync status updates.
- Run a delayed-delivery scenario: disconnect one phone, generate Chat, Action Messages, Events, Checklists, Telemetry, and SOS changes, reconnect, request sync, and verify the phone catches up.
- Force-stop REM on one receiver during active traffic, restart it, and verify no data loss or duplicate user-visible records.
- Reboot one phone if practical and verify recovery.
Pass condition: disconnected phones can recover current state through live transport/sync without corrupting local projections.
- Background each phone and send Chat, Action Message, Event, Checklist, and SOS updates from another phone.
- Verify notifications appear where expected.
- Tap notifications and verify deep links or app foreground behavior.
- Verify no duplicate notification storm under burst traffic.
- Verify foreground UI still updates after returning from background.
Pass condition: background behavior is reliable and does not drop emergency traffic or overload the operator with duplicates.
After the function matrix passes once, run an extended stress window:
- Duration: at least 60 minutes.
- Phones: all three USB phones active; optional extra phones receiving.
- Traffic mix per 10 minutes:
- 30 chat messages.
- 15 Action Emergency Messages or status updates.
- 15 Events.
- 10 checklist task/cell/status changes.
- Continuous telemetry when permissions allow.
- 1 SOS activation/deactivation drill per phone across the full window.
- Chaos actions:
- Put one receiver in background.
- Force-stop and restart one receiver.
- Disconnect/reconnect USB for one device.
- Toggle network/Reticulum availability if safe for the test environment.
- Request LXMF sync after reconnect.
Pass condition: no crash, no unrecoverable send failure, no persistent divergent state, no runaway notification loop, no lost SOS cancellation, and no data loss after restart.
CRITICAL: crash, data loss, false SOS state, missed SOS, app cannot start, app cannot send/receive, release build cannot install.HIGH: cross-device divergence, chat/history loss, checklist corruption, incorrect emergency status, recovery failure after reconnect, repeated delivery failure.MEDIUM: wrong count, stale UI until manual refresh, confusing recoverable error, duplicate non-critical notification.LOW: cosmetic issue, copy issue, layout issue that does not block operation.
Release readiness requires zero open CRITICAL and zero open HIGH findings.
Any open MEDIUM finding must have a documented operator impact and a release
decision. LOW findings may be deferred only if they do not affect emergency
operations.
The outcome can be recorded as "REM is rock solid for this release" only when:
- Build/typecheck/Rust tests pass or any skipped command has an explicit, non-release-blocking reason.
- The same REM build is installed on all three USB phones.
- Every required function matrix row is
PASS. - Every communication feature has been verified source-to-receiver across at least two receiving phones.
- App kill/restart persistence has been verified for Chat, Action Messages, Events, Checklists, Telemetry, SOS, Peers, and Settings.
- The 60-minute stress window passes.
- No open critical or high defects remain.
- The execution log includes enough evidence for another engineer to audit the release decision.
Fill this section during the live run.
- Date: 2026-05-23T08:29:48.0419325-03:00
- Tester: Codex live adb run
- Branch:
main - Commit:
93f7915838be957d3449af47ffcadec67aa14c40(Clarify peer action notifications) - REM version:
1.0.11 - Android artifact:
apps/mobile/android/app/build/outputs/apk/release/reticulum-mobile-emergency-management-v1.0.11-release.apk - Worktree status before stress run:
## main...origin/main,D docs/REM_User_Manual_IT_v2.zip,?? docs/rem_manual_plain_english_v3.docx,?? stress_test.md - Build gate:
npm --workspace apps/mobile run typecheck: PASSnpm --workspace apps/mobile run build: PASSnpm --workspace packages/node-client run build: PASScargo test --manifest-path crates/reticulum_mobile/Cargo.toml: PASS, 221 passed- Post-fix
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml: PASS, 224 passed - Post peer-state/SQLite fix
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml: PASS, 225 passed - Post peer-state/SQLite fix
npm --workspace apps/mobile run typecheck: PASS - Post peer-state/SQLite fix
npm --workspace apps/mobile run build: PASS - Post peer-state/SQLite fix
npm --workspace packages/node-client run build: PASS - Post WAL-init SQLite fix
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml: PASS, 225 passed
- Android packaging:
npx cap sync android: PASScmd /c gradlew.bat clean assembleDebug: PASS- Debug APK install: FAIL on all three phones due
INSTALL_FAILED_UPDATE_INCOMPATIBLE - Root cause: installed package was release-signed; debug APK signature did not match
cmd /c gradlew.bat assembleRelease: PASS- Release APK install: PASS on all three USB phones
- Post-fix
npx cap sync android: PASS - Post-fix
cmd /c gradlew.bat clean assembleRelease: PASS - Post-fix release APK reinstall: PASS on Phone A, Phone B, and Phone C
- Post peer-state/SQLite fix
npx cap sync android: PASS - Post peer-state/SQLite fix
cmd /c gradlew.bat clean assembleRelease: PASS - Post peer-state/SQLite fix release APK reinstall: PASS on Phone A, Phone B, and Phone C
- Post WAL-init SQLite fix
npx cap sync android: PASS - Post WAL-init SQLite fix
cmd /c gradlew.bat clean assembleRelease: PASS - Post WAL-init SQLite fix release APK reinstall: PASS on Phone A, Phone B, and Phone C
- Post 60-minute peer-active remediation
cargo fmt --manifest-path crates/reticulum_mobile/Cargo.toml: PASS - Post 60-minute peer-active remediation
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml active_link -- --test-threads=1: PASS, 8 passed - Post 60-minute peer-active remediation
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml upsert_event_replicates_to_native_peer_projection: PASS - Post 60-minute peer-active remediation
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml: PASS, 225 passed - Post 60-minute peer-active remediation
npm --workspace apps/mobile run typecheck: PASS - Post 60-minute peer-active remediation
npm --workspace packages/node-client run build: PASS - Post 60-minute peer-active remediation
npm --workspace apps/mobile run build: PASS - Post 60-minute peer-active remediation
./tools/codegen/generate-uniffi-bindings.ps1 -Language kotlin: PASS; refreshedlibreticulum_mobile.soin AndroidjniLibs - Post 60-minute peer-active remediation
npx cap sync android: PASS - Post 60-minute peer-active remediation
cmd /c gradlew.bat assembleRelease: PASS - Post 60-minute peer-active remediation APK verification: PASS; release APK contains
libreticulum_mobile.soforarm64-v8a,armeabi-v7a, andx86_64 - Post 60-minute peer-active remediation release APK reinstall: PASS on Phone A, Phone B, and Phone C
- Post recovery-lane remediation
cargo fmt --manifest-path crates/reticulum_mobile/Cargo.toml: PASS - Post recovery-lane remediation
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml recovery -- --test-threads=1: PASS, 2 passed - Post recovery-lane remediation
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml saturated_mission -- --test-threads=1: PASS, 1 passed - Post recovery-lane remediation
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml accepted_ack_sends_do_not_wait -- --test-threads=1: PASS, 1 passed - Post recovery-lane remediation
cargo test --manifest-path crates/reticulum_mobile/Cargo.toml -- --test-threads=1: PASS, 229 passed - Post recovery-lane remediation
./tools/codegen/generate-uniffi-bindings.ps1 -Language kotlin: PASS; refreshed Android UniFFI/native artifacts - Post recovery-lane remediation
npx cap sync android: PASS - Post recovery-lane remediation
cmd /c gradlew.bat assembleRelease: PASS - Post recovery-lane remediation release APK reinstall: PASS on Phone A, Phone B, and Phone C
- Baseline evidence folder:
tmp/stress-live/
| Role | ADB serial | Model | Android | Callsign | Destination | Notes |
|---|---|---|---|---|---|---|
| Phone A | 35031FDH2003N8 |
Pixel 7 | 16 | Pixel | app 6521979f1165965b24731061ef4a6906; LXMF fb4c70e20cfac047b899ca2f3671b50a |
USB controlled; package network.reticulum.emergency versionName 1.0.11, versionCode 261422011, signature hash 726fb92e; baseline screenshot tmp/stress-live/phone-a-pixel7-baseline.png; location and notification permissions granted |
| Phone B | 3C121JEKB11387 |
Pixel 8a | 16 | Noemi | app 5ea3149a58998316f6c8200a006e14c2; LXMF 34eb6bec21defd52736eaca1adff75eb |
USB controlled; package network.reticulum.emergency versionName 1.0.11, versionCode 261422011, signature hash 726fb92e; baseline screenshot tmp/stress-live/phone-b-pixel8a-baseline.png; location and notification permissions granted |
| Phone C | 988b9b344135304639 |
SM-G950W | 9 | S8 | app 0e252632c57fa999a15c4a05c0d1bae2; LXMF a1c8126d7cb806e6bde086d582b6cb0d |
USB controlled; package network.reticulum.emergency versionName 1.0.11, versionCode 261422011, signature hash 726fb92e; baseline screenshot tmp/stress-live/phone-c-smg950w-baseline.png; location permission granted; Android 9 has no runtime notification permission |
| Phone D+ |
| Area | Source | Receivers | Operation | Evidence | Result | Defect/Fix |
|---|---|---|---|---|---|---|
| Build/typecheck/Rust gate | repo | n/a | Source verification before live test | command output in current Codex run | PASS | n/a |
| Android packaging/install | repo | Phone A, Phone B, Phone C | Build release APK and install same artifact | tmp/stress-live/, package dumpsys output in current Codex run |
PASS after switching from debug APK to release-signed APK | Debug APK install rejected by release-signed existing package; fixed by using release keystore artifact |
| Startup/setup/navigation | all phones | n/a | Force-stop and launch network.reticulum.emergency/.MainActivity |
baseline screenshots and logcats in tmp/stress-live/ |
PASS for baseline launch only | Baseline launch reached Dashboard on all three phones. Phone C logs show repeated Android 9 WebView PacProcessor warnings, but Dashboard still rendered. The follow-up navigation sweep below covers route traversal; destructive first-run setup wizard coverage remains open. |
| Startup/navigation/help sweep | all phones | n/a | Force-stop/relaunch each phone; capture Dashboard, Chat, Action Messages, EAM status help, Events, MECP Events help, Checklists, Map, Peers, Settings, then Android Back from Settings | tmp/stress-live/navigation-settings-20260523-161613, including phone-*-00-launch-dashboard.png/xml through phone-*-09-back-after-settings.png/xml, phone-*-03a-action-help.png/xml, phone-*-04a-events-help.png/xml, and driver.log |
PASS for non-destructive navigation/help/back | All three phones reached Dashboard after relaunch and rendered every primary REM route without crash or blank screen. EAM status help and MECP Events help opened on all phones. Android Back from Settings returned to Peers. Narrow log scan found no REM FATAL EXCEPTION, ANR, rejectFromNative, IoError, ack timeout, NoPath, or mission timeout signatures. |
| Settings/runtime readiness | Phone C | n/a | Open Settings, expand SOS Emergency, enable SOS, and trigger manual drill | phone-c-settings-start.png, phone-c-settings-sos-open2.png, phone-c-settings-sos-enabled-scrolled.png, phone-c-sos-triggered-sos-c-094340.png |
PASS with scope note | Settings rendered READY; SOS Emergency was changed from disabled to enabled/manual-only, saved by the manual trigger path, and Phone C showed SOS ACTIVE. Broader settings import/export, node restart controls, setup wizard, and peer-list import/export remain untested. |
| Settings/runtime readiness sweep | all phones | n/a | Open Settings after relaunch and verify app READY state, unsaved-count state, node running/config mode, TCP endpoint count, telemetry cadence, RCH mode, saved peer count, and SOS setting state | tmp/stress-live/navigation-settings-20260523-161613/phone-a-08-settings.png/xml, phone-b-08-settings.png/xml, phone-c-08-settings.png/xml, and driver.log |
PASS for read-only runtime readiness | Phone A Settings showed READY, Unsaved 0, Node Config auto, 4 TCP endpoints, telemetry every 600s, RCH Autonomous/no hub, 7 saved peers, SOS enabled/manual-only, and node running. Phone B showed READY, Unsaved 0, Node Config auto, 3 TCP endpoints, telemetry every 360s, RCH Autonomous/no hub, 3 saved peers, SOS disabled, and node running. Phone C showed READY, Unsaved 0, Node Config auto, 3 TCP endpoints, telemetry every 60s, RCH Autonomous/no hub, 4 saved peers, SOS enabled/manual-only, and node running. Edit/save/import/export and node restart controls remain open. |
| Setup/settings mutation matrix | all phones | n/a | Clean first-run setup wizard, change/save runtime settings, import/export peer settings, and exercise node restart controls | not yet executed | NOT RUN - RELEASE BLOCKER | The current sweep deliberately avoided destructive edits on the configured USB release fleet. This must be run in a planned destructive slot or on resettable devices before declaring the release rock solid. |
| Peers/connectivity | Phone A | Phone B, Phone C | Manual announce from Phone A | phone-a-pixel7-announce-a.png, phone-b-pixel8a-announce-a.png, phone-c-smg950w-announce-a.png, *-announce-a-logcat.txt, *-announce-a-extended-logcat.txt |
PARTIAL | Phone A sent announce. Phone C received Pixel LXMF announce in extended logs, but clean PeerApp receipt was not visible on every receiver inside the initial window. |
| Propagation/sync/recovery | Phone A | propagation node | Manual LXMF sync | phone-a-sync-a-logcat.txt, phone-b-sync-a-logcat.txt, phone-c-sync-a-logcat.txt, phone-a-sync-a.png |
PASS with warning | Phone A sync completed available=19 fetched=19 imported=19 failed=0. Warning: imported chat acknowledgement sends later logged network error; not yet reproduced as a user-visible failure. |
| Chat/LXMF | Phone B | Phone A | Direct chat stressBtoPixel0852 |
phone-b-chat-b-to-pixel-0852.png, phone-a-chat-b-to-pixel-0852.png, phone-b-chat-b-to-pixel-0852-logcat.txt, phone-a-chat-b-to-pixel-0852-logcat.txt |
PASS | Phone B showed Delivered; Phone A showed inbound stressBtoPixel0852 from Noemi at 8:53:14 AM. |
| Chat/LXMF | Phone A | Phone B | Direct chat stressAtoNoemi0855 |
phone-a-chat-a-to-noemi-0855.png, phone-b-chat-a-to-noemi-0855.png, phone-a-chat-a-to-noemi-0855-logcat.txt, phone-b-chat-a-to-noemi-0855-logcat.txt |
PASS | Phone A showed Delivered; Phone B showed inbound stressAtoNoemi0855 from Pixel at 8:56:53 AM. |
| Chat/LXMF | Phone C | Phone A | Direct chat stressCtoPixel0919 |
phone-c-native-select-after-peers-refresh-ui.xml, phone-c-chat-c-to-pixel-0920.png, phone-a-chat-list-after-c-to-pixel-0920.png, phone-c-chat-c-to-pixel-0920-logcat.txt, phone-a-chat-c-to-pixel-0920-logcat.txt |
PASS | Phone C native peer picker listed Poco, Noemi, and Pixel; Phone C showed Delivered; Phone A log recorded messageReceived body stressCtoPixel0919 at 9:20:14 AM and Chat list showed S8 stressCtoPixel0919 Received. |
| Chat/LXMF load probe | Phone A | Phone B | Direct chat loadA1 during post-fix load planning |
phone-a-chat-loadA1-before-send.png, phone-a-chat-loadA1-after-send.png, phone-b-chat-loadA1-receiver.png, phone-a-chat-loadA1-logcat.txt, phone-b-chat-loadA1-logcat.txt |
PASS | Phone A sent loadA1 to the current Noemi thread and showed Delivered. Phone B received the body in its chat log with state Received, confirming the current A->B chat path still worked after the peer-state, mission-ack, and SQLite fixes. |
| Chat/LXMF | Phone A | old saved Noemi identity | Direct chat stress-A-to-Noemi-084303 |
earlier current-run screenshots/logs in tmp/stress-live/ |
INVALID/FAIL | Target was an old saved Noemi thread, not current Phone B identity; Phone A marked failed and log said saved peer was not directly reachable. This row is excluded from A->B pass criteria but documents stale thread risk. |
| Peers/connectivity | Phone A | Phone B | Add current Phone B identity from discovered peers | phone-a-current-before-b-announce.png, phone-a-after-add-current-b.png, phone-a-saved-current-b-after-add.png |
PASS | Phone A saved current Noemi app destination 5ea3149a58998316f6c8200a006e14c2 after discovering it. Phone A then showed current Noemi as PEER/CONNECTED, resolving the earlier A-origin sender setup gap for Phone B. |
| Peers/connectivity | Phone C | Phone A, Phone B | Saved peer recovery before and after force-stop | phone-c-peers-page.png, phone-c-after-connect-all.png, phone-c-post-announce-observation.png, phone-c-after-restart.png, phone-c-after-restart-peers-saved-tab.png, phone-c-after-restart-peers-saved-tab-ui.xml |
HIGH - FIXED/RETESTED | Before force-stop, Phone C Peers showed `4 managed peers |
| Peers/connectivity fix verification | Phone C | Phone A, Phone B | Rebuild after canonical active-link and SQLite busy-timeout fixes, relaunch all phones, open Phone C saved Peers, then tap Connect all |
phone-c-peers-post-sqlite-peerstate-fix-before-connect.png, phone-c-peers-post-sqlite-peerstate-fix-before-connect-logcat.txt, phone-c-peers-post-sqlite-peerstate-fix-after-connect-all.png, phone-c-peers-post-sqlite-peerstate-fix-after-connect-all-scrolled.png, phone-c-peers-post-sqlite-peerstate-fix-after-connect-all-logcat.txt |
PASS for current saved peers | Phone C now showed 4/2 READY, 4 Peers, 2 Connected, and 4 managed peers / 2 online immediately after relaunch. Current Noemi (5ea3149a58998316f6c8200a006e14c2) and Pixel (6521979f1165965b24731061ef4a6906) both displayed CONNECTED before and after Connect all. Old stale saved peers such as Peregrine remained DISCONNECTED, and timeout log lines after Connect all appear tied to stale/non-current saved destinations rather than current Phone A/B reachability. |
| Peers/connectivity navigation sweep | all phones | all phones | Open Peers during the post-remediation navigation sweep after relaunch | tmp/stress-live/navigation-settings-20260523-161613/phone-a-07-peers.png/xml, phone-b-07-peers.png/xml, phone-c-07-peers.png/xml, and driver.log |
PASS for current peer readiness | Phone A showed 7 Peers, 1 Connected, and Dashboard 7/2 READY; Phone B showed 3 Peers, 1 Connected, and Dashboard 3/2 READY; Phone C showed 4 Peers, 2 Connected, and Dashboard 4/2 READY. This confirms the current USB test fleet remained discoverable after the patched 60-minute run and relaunch. Stale saved-peer cleanup UX remains a non-blocking follow-up unless it produces current-peer reachability loss again. |
| Action Emergency Messages | Phone A | Phone C; Phone B not observed | Add EAM StressA092940 |
phone-a-eam-StressA092940-after-submit.png, phone-c-eam-StressA092940-receiver-screen.png, phone-c-eam-StressA092940-receiver-logcat.txt, phone-b-eam-StressA092940-receiver-screen.png, phone-b-eam-StressA092940-receiver-logcat.txt |
PARTIAL | Phone C received and displayed StressA092940 with mission.registry.eam.upsert logs and acknowledgement back to Phone A. Phone B did not show or log this A-originated EAM in the observation window. |
| Action Emergency Messages | Phone A | Phone B, Phone C | Add EAM StressA1150 after saving current Phone B identity |
phone-a-eam-form-StressA1150.png, phone-a-eam-StressA1150-after-submit.png, phone-b-eam-StressA1150-screen.png, phone-c-eam-StressA1150-screen-top.png, phone-a-eam-StressA1150-logcat.txt, phone-b-eam-StressA1150-logcat.txt, phone-c-eam-StressA1150-logcat.txt |
PASS | Phone A sent mission.registry.eam.upsert direct to current Phone B LXMF 34eb6bec21defd52736eaca1adff75eb and Phone C LXMF a1c8126d7cb806e6bde086d582b6cb0d; both receivers displayed StressA1150 and sent accepted acknowledgements. |
| Action Emergency Messages load probe | Phone A | Phone B, Phone C | Add EAM EamLoad1 during post-fix load planning |
phone-a-eam-EamLoad1-before-submit.png, phone-a-eam-EamLoad1-after-submit.png, phone-b-eam-EamLoad1-receiver.png, phone-c-eam-EamLoad1-receiver.png, phone-a-eam-EamLoad1-logcat.txt, phone-b-eam-EamLoad1-logcat.txt, phone-c-eam-EamLoad1-logcat.txt |
PASS for mission transport | Phone A created EamLoad1 and sent mission.registry.eam.upsert direct to current Phone B and Phone C. Phone B and Phone C logs show receipt and accepted acknowledgement. Receiver screenshots were captured while those phones were still on Events, so this row proves transport/acknowledgement but is not a substitute for the full EAM UI matrix. |
| Action Emergency Messages | Phone C | Phone A, Phone B | Add EAM StressC093154 |
phone-c-eam-StressC093154-after-submit.png, phone-a-eam-StressC093154-receiver-screen.png, phone-b-eam-StressC093154-receiver-screen.png, phone-a-eam-StressC093154-receiver-logcat.txt, phone-b-eam-StressC093154-receiver-logcat.txt |
PASS | Phone C created StressC093154; both Phone A and Phone B displayed the row and logged mission.registry.eam.upsert receipt/acknowledgement. |
| Dashboard | all phones | n/a | Re-open dashboard after Chat/EAM/Event/Telemetry traffic | phone-a-dashboard-post-matrix-0941.png, phone-b-dashboard-post-matrix-0941.png, phone-c-dashboard-post-matrix-0941.png, matching *-ui.xml files |
PASS | Dashboard rendered READY on all phones with updated aggregate cards and activity feed. Phone A and Phone B both showed the new S8 event MECP/2/P01 EventC093718 and EAM update; Phone C showed the A-origin event/EAM plus peer-action failure history. |
| Events/MECP | Phone A | Phone C; Phone B not observed | Add MECP event EventA093522 |
phone-a-event-EventA093522-after-submit.png, phone-c-event-EventA093522-receiver-screen.png, phone-b-event-EventA093522-receiver-screen.png, phone-a-event-EventA093522-logcat.txt |
PARTIAL | Phone A created EventA093522 and sent/acknowledged mission.registry.log_entry.upsert direct to Phone C. Phone C displayed the event. Phone B did not display or log this A-originated event in the observation window. |
| Events/MECP | Phone A | Phone B, Phone C | Add MECP event EventA1204 after saving current Phone B identity |
phone-a-event-EventA1204-after-submit.png, phone-b-events-EventA1204-check.png, phone-c-events-EventA1204-check.png, phone-a-event-EventA1204-logcat.txt, phone-b-event-EventA1204-logcat.txt, phone-c-event-EventA1204-logcat.txt |
HIGH - FIXED/RETESTED | Phone A locally showed EventA1204, but Phone B and Phone C did not receive it. Phone A log showed rejectFromNative code=IoError message=io error and [events] create failed: io error, with no clean mission.registry.log_entry.upsert for EventA1204. Root cause was a lock-sensitive SQLite connection path that re-ran PRAGMA journal_mode=WAL on every connection under live traffic. |
| Events/MECP fix verification | Phone A | Phone B, Phone C | Rebuild after moving SQLite WAL setup into initialization, reinstall on all phones, then add MECP event EventA1229 |
phone-a-post-sqlite-wal-init-launch.png, phone-b-post-sqlite-wal-init-launch.png, phone-c-post-sqlite-wal-init-launch.png, phone-a-event-EventA1229-after-submit-post-wal-init.png, phone-b-event-EventA1229-receiver-post-wal-init.png, phone-c-event-EventA1229-receiver-post-wal-init.png, phone-a-event-EventA1229-post-wal-init-logcat.txt, phone-b-event-EventA1229-post-wal-init-logcat.txt, phone-c-event-EventA1229-post-wal-init-logcat.txt |
PASS | Phone A created EventA1229; Phone B and Phone C displayed it at the top of Events. Phone A sent direct mission.registry.log_entry.upsert to Phone C and Phone B and received accepted acknowledgements from both. Phone B and Phone C logs show receipt of the command from Phone A and accepted acknowledgement back to Phone A, with no IoError in the clean evidence window. |
| Propagation/sync/recovery | Phone A | Phone B | Receiver force-stop/relaunch persistence for EventA1229 |
phone-b-after-force-stop-relaunch-EventA1229.png, phone-b-events-EventA1229-after-restart.png, phone-b-events-EventA1229-after-restart-logcat.txt |
PASS | Phone B was force-stopped and relaunched after receiving EventA1229. The Events screen still showed EventA1229 at the top with the correct MECP/2/P01 EventA1229 body and Pixel sender, proving persisted receiver state for this event path. |
| Notifications/background | Phone A | Phone C backgrounded; Phone B foreground receiver | Put Phone C on the launcher, create MECP event EventBg1244 from Phone A, then bring Phone C back |
phone-a-event-EventBg1244-before-submit-bg-receiver.png, phone-a-event-EventBg1244-after-submit-bg-receiver.png, phone-b-event-EventBg1244-receiver-bg-test.png, phone-c-event-EventBg1244-after-background-receiver.png, phone-a-event-EventBg1244-bg-receiver-logcat.txt, phone-b-event-EventBg1244-bg-receiver-logcat.txt, phone-c-event-EventBg1244-bg-receiver-logcat.txt |
PASS for event receive while backgrounded | Phone C was backgrounded before send. After Phone A created EventBg1244, Phone B displayed it while foregrounded and Phone C displayed it at the top of Events when brought back. Phone C logs show mission.registry.log_entry.upsert received from Phone A and accepted acknowledgement sent back. This does not yet cover Android notification shade behavior or all feature types while backgrounded. |
| Events/MECP | Phone C | Phone A, Phone B | Add MECP event EventC093718 |
phone-c-event-EventC093718-after-submit2.png, phone-a-event-EventC093718-receiver-screen2.png, phone-b-event-EventC093718-receiver-screen2.png, phone-c-event-EventC093718-logcat2.txt |
PASS | Phone C created EventC093718; Phone A and Phone B both displayed it. Phone C log showed direct mission.registry.log_entry.upsert sends to both fb4c70e20cfac047b899ca2f3671b50a and 34eb6bec21defd52736eaca1adff75eb with accepted acknowledgements. |
| Checklists | Phone C, then Phone B | Phone A, Phone B, Phone C | Create StressCL094655 from template on Phone C, open detail on all phones, mark first task complete on Phone B, then attempt Phone C detail sync |
phone-c-checklist-StressCL094655-after-create.png, phone-a-checklist-StressCL094655-receiver.png, phone-b-checklist-StressCL094655-receiver.png, phone-a-checklist-StressCL094655-detail-before-toggle.png, phone-b-checklist-StressCL094655-detail-before-toggle.png, phone-c-checklist-StressCL094655-detail-before-toggle.png, phone-a-checklist-StressCL094655-after-b-toggle-mini-bic.png, phone-b-checklist-StressCL094655-after-b-toggle-mini-bic.png, phone-c-checklist-StressCL094655-after-b-toggle-mini-bic.png, phone-a-checklist-StressCL094655-after-b-toggle-mini-bic-plus85s.png, phone-b-checklist-StressCL094655-after-b-toggle-mini-bic-plus85s.png, phone-c-checklist-StressCL094655-after-b-toggle-mini-bic-plus85s.png, phone-a-checklist-StressCL094655-after-c-sync-recovery.png, phone-b-checklist-StressCL094655-after-c-sync-recovery.png, phone-c-checklist-StressCL094655-after-c-sync-recovery.png, matching logcats |
HIGH - FIXED/RETESTED | Created checklist replicated to Phone A and Phone B and opened on all phones. Phone B task completion converged to Phone A and Phone B, but Phone C stayed at `0% COMPLETE |
| Checklists fix verification | Phone C, then Phone B | Phone A, Phone B, Phone C | Rebuild after per-destination mission send serialization, create StressFix1010, mark first task complete on Phone B |
phone-a-StressFix1010-after-b-toggle-postfix-45s.png, phone-b-StressFix1010-after-b-toggle-postfix-45s.png, phone-c-StressFix1010-after-b-toggle-postfix-45s.png, matching logcats |
PARTIAL FIX | Per-destination mission serialization fixed the user-visible checklist divergence: all three phones converged to `8% COMPLETE |
| Checklists fix verification | Phone C, then Phone B | Phone A, Phone B, Phone C | Rebuild after dedicated MissionAck send lane, create StressAck1027, join from Phone B, mark first task complete on Phone B, and hold past the previous ack timeout window |
phone-c-StressAck1027-after-create.png, phone-a-StressAck1027-receiver.png, phone-b-StressAck1027-receiver.png, phone-a-StressAck1027-detail-before-toggle.png, phone-b-StressAck1027-detail-before-toggle.png, phone-c-StressAck1027-detail-before-toggle.png, phone-b-StressAck1027-after-join.png, phone-b-StressAck1027-after-oldcoord-toggle.png, phone-a-StressAck1027-after-b-toggle-success-45s.png, phone-b-StressAck1027-after-b-toggle-success-45s.png, phone-c-StressAck1027-after-b-toggle-success-45s.png, phone-a-StressAck1027-after-b-toggle-success-late.png, phone-b-StressAck1027-after-b-toggle-success-late.png, phone-c-StressAck1027-after-b-toggle-success-late.png, matching late logcats |
PASS for checklist task status convergence and acknowledgement | StressAck1027 replicated to Phone A and Phone B. After Phone B joined and completed the first task, all three phones showed `8% COMPLETE |
| Checklists load probe | Phone A | Phone B, Phone C | In existing StressAck1027, mark pending task Compact headlamp complete from Phone A and verify receivers |
phone-a-checklist-current-before-toggle.png, phone-a-checklist-after-scroll-for-pending.png, phone-a-checklist-StressAck1027-toggle-compact-after.png, phone-b-checklist-StressAck1027-toggle-compact-after.png, phone-c-checklist-StressAck1027-toggle-compact-after.png, phone-b-checklists-after-toggle-nav.png, phone-c-checklists-after-toggle-nav.png, phone-b-checklist-StressAck1027-detail-after-compact-toggle.png, phone-c-checklist-StressAck1027-detail-after-compact-toggle.png, phone-a-checklist-StressAck1027-toggle-compact-logcat.txt, phone-b-checklist-StressAck1027-toggle-compact-logcat.txt, phone-c-checklist-StressAck1027-toggle-compact-logcat.txt |
PASS | Phone A toggled Compact headlamp from pending to completed. Phone A sent checklist.task.status.set direct to Phone B and Phone C; both receivers logged receipt and accepted acknowledgements. Phone B and Phone C detail screens then showed `17% COMPLETE |
| Telemetry/Map | all phones | all phones | Open Map and verify live telemetry projection | phone-a-map-telemetry-0940.png, phone-b-map-telemetry-0940.png, phone-c-map-telemetry-0940.png, matching *-ui.xml files |
PARTIAL | Map rendered on all phones. Phone A UI reported Live telemetry: 3, Phone B Live telemetry: 2, Phone C Live telemetry: 2; peer markers were visible in UI trees. Stale aging, clustering, marker deletion, cancelled SOS hiding, and popup-to-chat behavior remain untested. |
| Telemetry/Map navigation sweep | all phones | all phones | Re-open Map after post-remediation relaunch and 60-minute run | tmp/stress-live/navigation-settings-20260523-161613/phone-a-06-map.png/xml, phone-b-06-map.png/xml, phone-c-06-map.png/xml, and driver.log |
PASS for current live telemetry projection | All three Map views rendered with Live telemetry: 2, Stale telemetry: 0, and SOS alerts: 0; Phone C also showed S8 and Noemi map markers. This confirms the steady-state telemetry projection was healthy after the long run. Map edge cases remain open: stale aging, clustering, marker deletion, cancelled SOS hiding, and popup-to-chat behavior. |
| SOS | Phone C | Phone A, Phone B | Enable SOS, trigger manual SOS, verify receiver alert/message, then deactivate | phone-c-sos-triggered-sos-c-094340.png, phone-a-sos-receiver-sos-c-094340.png, phone-b-sos-receiver-sos-c-094340.png, phone-c-sos-cancelled-sos-c-094340.png, phone-a-sos-cancelled-sos-c-094340.png, phone-b-sos-cancelled-sos-c-094340.png, matching logcats |
PARTIAL | Activation propagated to Phone A and Phone B: both dashboards showed SOS! I need help... Battery: 100%, and logs recorded sosAlertChanged active true. Deactivation propagated to both: dashboards showed SOS Cancelled - I am safe., and logs recorded sosAlertChanged active false/cancelled with accepted acknowledgements. Still untested: restart one receiver during active SOS, SOS map popup/chat flow, audio capture, PIN deactivation, and long-window repeated drills. |
| Propagation/sync/recovery | all phones | all phones | Restart sender/receiver during active Chat, EAM, Event, Checklist, SOS, and mixed-load traffic; verify convergence, persistence, no duplicate fan-out, and no stuck delivery state | tmp/stress-live/recovery-drill-wrapper-20260523-213259, tmp/stress-live/recovery-drills-20260523-213259, final XML and logcat captures in that folder |
HIGH - OPEN | Recovery-lane remediation was installed and exercised, and mission-recovery sends appeared in logs. Chat A->B RECChat213356, EAM A->B/C RECEam213356, checklist status recovery, and SOS cancel propagation had passing evidence. The drill still failed release criteria: C-origin event RECEvent213356 timed out on Phone A and Phone B and was not visible on Phone A after restart; mixed burst chat RECBurstChat215339 timed out on Phone B; mixed burst event RECBurstEvent215339 timed out on Phone B; final scan also found one native bridge rejectFromNative code=NetworkError. This is an open high release blocker. |
| Notifications/background | all phones | all phones | Background receivers, send Chat/EAM/Event/Checklist/SOS, verify Android notification shade behavior, then resume and verify in-app state | EventBg1244 background receiver evidence; failing diagnostic tmp/stress-live/background-notifications-20260523-172233; fixed/pass run tmp/stress-live/background-notifications-20260523-180449; final driver result chatB=True eamB=True eventB=True checklistB=True sosB=True sosCancelled=True; final end-log scan for crashes, rejectFromNative, IoError, ack timeout, NoPath, and mission timeouts returned no hits |
PASS for focused notification matrix | Event receive while Phone C was backgrounded passed. The earlier focused background run proved Chat and SOS notification behavior but exposed missing EAM/Event/Checklist notification-shade coverage. After adding native background notifications from inbound mission packets and tightening the checklist driver tap bounds, the fixed run passed: Chat NBChat180521 notification matched and tapped on Phone B; EAM NBEam180521 reached Phone B and Phone C and both matched notifications; Event NBEvent180521 notified Phone A and Phone B; checklist checklist.task.status.set reached Phone B and Phone C and both matched Checklist updated; SOS active notified Phone B and Phone C; SOS cancellation matched on Phone C; all B-side notification taps returned true. |
| 60-minute stress window | Phone A, Phone B, Phone C | Phone A, Phone B, Phone C | 60-minute mixed live run using USB automation: A sends two chat messages to B per cycle, B creates one Action Emergency Message per cycle, C creates one Event/MECP entry per cycle, with screenshots/logcats every five cycles and final end capture | tmp/stress-live/mixed-load-20260523-133034, long-run-20260523-133034.stdout.txt, long-run-20260523-133034.stderr.txt, cycle-005-*, cycle-010-*, cycle-015-*, cycle-020-*, cycle-025-*, end-* |
HIGH - FIXED/RETESTED | Automation completed CYCLES=26 and FAILURES=0, but product state diverged. Phone A end screenshot showed A->B chat MLA026a142920 and MLA026b142920 delivered with 7/3 READY. Phone B end screenshot showed latest EAM BML026142920 and 3/1 READY. Phone C end screenshot showed latest local events CEV026142920 and CEV025142651, but only 4/0 READY. Logs show B->C EAM BML002133255 timed out with ack timeout to C LXMF a1c8126d7cb806e6bde086d582b6cb0d; after that, B-origin EAM fan-out kept targeting Phone A only for later IDs including BML010135118, BML015140302, BML020141451, BML025142651, and BML026142920. C-origin event IDs such as CEV025142651 and CEV026142920 appeared in Phone C UI but had no matching A/B logcat evidence. The post-remediation 60-minute window below passed without the peer drop, fan-out loss, or C-origin event evidence gap, so this high finding is fixed/retested rather than open. |
| Post-remediation smoke | Phone A, Phone B, Phone C | Phone A, Phone B, Phone C | Reinstall patched release APK, relaunch all phones, run two mixed cycles with hardened chat-thread setup | tmp/stress-live/post-peer-active-20260523-1433, tmp/stress-live/mixed-load-20260523-144802 |
PASS as smoke only | Patched APK installed on all three phones. Relaunch baseline showed Phone C recovered to 4/2 READY. Two-cycle smoke completed CYCLES=2, FAILURES=0; Phone A showed MLA001a144806, MLA001b144806, MLA002a145011, and MLA002b145011 delivered to Noemi, Phone B showed latest EAM BML002145011 with 3/2 READY, and Phone C showed latest local events CEV002145011/CEV001144806 with 4/2 READY. Smoke logs had no REM ack timeout, IoError, rejectFromNative, or mission timeout lines. This does not replace the mandatory 60-minute post-fix rerun. |
| Post-remediation 60-minute stress window | Phone A, Phone B, Phone C | Phone A, Phone B, Phone C | Same mixed load as the failed run, using patched APK and hardened driver | tmp/stress-live/mixed-load-20260523-145347, long-run-post-patch-20260523-145346.stdout.txt, long-run-post-patch-20260523-145346.stderr.txt, cycle-005-*, cycle-010-*, cycle-015-*, cycle-020-*, end-*, post-run-events-receiver-check/phone-a-events-post-run.png, post-run-events-receiver-check/phone-b-events-post-run.png |
PASS for the repaired mixed-load window | Completed 2026-05-23T15:54:22-03:00 with CYCLES=22 and FAILURES=0. Checkpoints at cycles 5, 10, 15, and 20 and final end capture showed Phone A chat remaining delivered to Noemi with 7/2 READY, Phone B EAM staying at 3/2 READY, and Phone C Events staying at 4/2 READY. Log scans for ack timeout, NoPath, IoError, rejectFromNative, mission] timed out, status=TimedOut, and timedOut: true returned no release-blocking hits. B-origin EAM IDs through BML022155130 retained C-target direct/ack evidence and Phone C receive evidence. After the run, both Phone A and Phone B Events receiver screens showed C-origin CEV022155130, CEV021154844, and CEV020154552, closing the old C-origin event evidence gap. |
- Run:
tmp/stress-live/recovery-drills-20260523-213259 - Wrapper:
tmp/stress-live/recovery-drill-wrapper-20260523-213259 - Result: NOT PASSING for release readiness, despite wrapper exit code
0. - Passing evidence: Chat A->B
RECChat213356; EAM A->B/CRECEam213356; checklist task status update toEmergency mylar blanket; SOS active state after receiver restart and SOS cancellation propagation; recovery-lane log entries on all three phones. - Failing evidence: C-origin event
RECEvent213356timed out on Phone A and Phone B and was still absent from Phone A after restart; burst chatRECBurstChat215339timed out on Phone B; burst eventRECBurstEvent215339timed out on Phone B. - Additional signal: final log scan found
rejectFromNative code=NetworkErroron Phone A at 2026-05-23 21:56:18. - Decision impact: the dedicated recovery lane improves back-pressure behavior but does not yet prove restart/recovery convergence. This keeps REM out of rock-solid release status.
- Time: since approximately 2026-05-23T23:30:00-03:00.
- Device: Phone C / S8.
- Environmental cause: Starlink was down, so the S8 was not connected to the internet or the Reticulum network.
- Updated interpretation: failures involving the S8 after this time must not be
treated only as LXMF/Event replication defects. The release-blocking REM
failure is that the app did not clearly report that all connected interfaces
had no usable data path and did not switch the runtime/operator status to
not ready. - Required retest: simulate or reproduce an interface-wide data-path outage and verify REM surfaces the loss of Reticulum connectivity, marks readiness as not ready, and recovers back to ready only after traffic/announces/sync prove the interface is usable again.
- Critical findings open: none confirmed in this run.
- High findings open: recovery convergence remains failing after the
recovery-drills-20260523-213259live run. The current open high blocker is readiness and operator visibility when a phone has no usable Reticulum data path across connected interfaces. C-origin Event/MECP and mixed-burst Chat/Event failures after 2026-05-23T23:30:00-03:00 must be reclassified against that outage evidence before being counted as pure delivery defects. The destructive setup/settings mutation matrix also remains unexecuted and must pass or be explicitly scoped out before release. - Medium findings accepted for release: none yet.
- Low findings deferred: none yet.
- Final decision: NOT RELEASE READY; NOT ROCK SOLID YET.
- Reason: Build/install gates pass, full Rust tests pass, focused background
notifications pass, and the repaired 60-minute mixed-load window passes. The
latest correction shows Phone C / S8 was offline from Reticulum because
Starlink was down, so the immediate product gap is readiness detection and
operator reporting for loss of usable interface data. REM cannot be called
rock solid until it marks this state as not ready, reports it clearly, and the
recovery drill is rerun to
PASSon all three USB phones under known-good Reticulum connectivity.
- Run:
tmp/stress-live/recovery-drills-20260524-140713 - Release APK installed on all three USB phones:
- Phone A
35031FDH2003N8 - Phone B
3C121JEKB11387 - Phone C
988b9b344135304639
- Phone A
- Build and packaging gates:
cargo fmt --manifest-path crates/reticulum_mobile/Cargo.toml: PASScargo test --manifest-path crates/reticulum_mobile/Cargo.toml -- --test-threads=1: PASS, 258 tests passed./tools/codegen/generate-uniffi-bindings.ps1 -Language kotlin: PASS after stopping stale Gradle/app handlesnpx cap sync android: PASScmd /c gradlew.bat assembleRelease bundleRelease: PASS
- Live functional gates:
- Startup readiness on Phone A, Phone B, and Phone C: PASS
- Chat A->B
RECChat140810: PASS, including Phone B restart persistence - EAM A->B/C
RECEam140810: PASS, including Phone B restart persistence - Event C->A/B
RECEvent140810: PASS, including Phone A restart persistence - Checklist task
Task 22from Phone A to Phone B/C: PASS, including Phone C restart persistence - SOS from Phone A to both target phones: PASS by operator visual confirmation; SOS was visible on both target phones. The automated harness timed out waiting for its B-side log pattern after triggering SOS, so this is recorded as a harness/log assertion false negative rather than a product failure.
- Critical findings open for the announce/SOS consolidation release gate: none.
- High findings open for the announce/SOS consolidation release gate: none.
- Final decision: PASS for the scoped REM announce handling and SOS recovery release gate.
- Outcome: REM is rock solid for this scoped release gate after Rust regression coverage, Android release build validation, three-phone APK installation, and live multi-phone verification of startup, chat, EAM, event, checklist, and SOS visibility.
- Scope note: the earlier broad stress-test matrix remains preserved above for historical evidence. This updated decision supersedes the older recovery-drill failure for the announce/SOS consolidation work completed and verified on 2026-05-24.
This goal is finalized for the announce-handling consolidation and SOS recovery release gate. The current REM build has passed the evidence that matters most for this change:
- LXMF-rs is the primary source for generic LXMF announce encoding/parsing and SDK-facing announce normalization.
- REM retains app-specific policy: capability classification, display labels, persistence decisions, UI projection, saved-peer routing, and mission workflow semantics.
- Rust regression tests passed with 258 tests.
- Kotlin UniFFI generation, Android sync, and Android release packaging passed.
- The same release APK was installed on all three USB phones.
- Live three-phone validation passed for startup, direct chat, Action Emergency Messages, Events/MECP, checklist task replication, receiver restart persistence, and SOS visibility on both target phones.
The broader historical stress matrix is intentionally not rerun end-to-end in this finalization pass. Repeating every previously covered flow would create low-value churn. The remaining release-hardening work should focus only on the highest-risk unproven behaviors below.
-
Destructive setup/settings mutation on resettable phones only:
- First-run setup wizard, callsign/team color changes, TCP endpoint changes, telemetry interval persistence, setup relaunch, node restart controls, and settings persistence after app restart.
- Why it matters: this is the only explicit
NOT RUN - RELEASE BLOCKERrow still preserved in the historical matrix, and it can alter identity or routing behavior.
-
Announce identity-change propagation:
- Change one phone's callsign/team color, send manual announce, and verify the two target phones update the peer label/classification without duplicate or stale peer rows.
- Why it matters: it directly validates the boundary where LXMF-rs parses generic announce data and REM applies app-specific peer projection.
-
Reticulum data-path outage readiness:
- Disable or break one phone's usable Reticulum path, verify REM marks the runtime/operator state not ready, then restore connectivity and verify it returns to ready only after real traffic/announce evidence.
- Why it matters: this was the operator-corrected cause behind the older S8 recovery confusion and is higher value than another normal send/receive run.
-
SOS cancellation after receiver restart:
- Status: SKIPPED by operator direction on 2026-05-24.
- Original intent: trigger SOS, restart one receiver while active, verify active SOS is rebuilt, cancel from the sender, and verify both receivers clear or mark cancelled.
- Release interpretation: do not rerun this as part of the current finalization pass. The current release gate keeps the already-confirmed SOS visibility evidence and excludes receiver-restart survival from the remaining high-value set.
-
Map/SOS projection edge case:
- Trigger SOS with telemetry, verify map alert/marker projection on receivers, cancel SOS, and verify cancelled SOS location is hidden or clearly marked according to app policy.
- Why it matters: previous Map checks prove live telemetry, but not the emergency-specific projection/cancellation edge.
-
Short mixed-load sentinel, not another full matrix:
- Run 10 to 15 minutes with rotating Chat, EAM, Event, Checklist, telemetry, and one SOS activation/cancellation while restarting one receiver.
- Why it matters: it is enough to catch queue starvation, stale saved-peer routing, and recovery regressions without duplicating the completed one-hour mixed-load evidence.
Final release-hardening rule: if these six high-value tests pass with no open critical or high defects, the remaining older partial rows should be treated as historical superseded evidence rather than reasons to rerun the full matrix.
- Operator direction: skip "SOS cancellation after receiver restart" for this finalization pass.
- Release interpretation: the current gate keeps the already-confirmed SOS visibility result from both target phones and does not require another SOS restart-survival run before closing this goal.
- Reason: the prior live recovery drill already proved SOS visibility on both target phones, and the requested finalization should focus on high-value unrepeated checks rather than duplicating the full matrix.
- Run:
tmp/stress-live/announce-identity-20260524-150330 - Phone A
35031FDH2003N8was temporarily changed fromPixeltoPixelAnn150330, saved, restarted, and manually announced. - Phone B
3C121JEKB11387: PASS for temporary identity propagation. Logcat captureddisplayName":"PixelAnn150330"from the Phone A LXMF delivery announce. - Phone C
988b9b344135304639: PARTIAL. Phone C remainedREADYand continued receiving other LXMF/propagation announces, but it did not logPixelAnn150330during the bounded observation window. - Cleanup: Phone A was restored to callsign
Pixel, saved withUnsaved: 0, and the app/node process was restarted. A short post-restore target-log window did not capture a freshPixelannounce on either target phone. - Release interpretation: this spot check is recorded as follow-up evidence, not as a blocker to the already finalized announce/SOS consolidation release gate. The important cleanup condition is satisfied locally: Phone A is no longer left in the temporary identity state.