The on-device test now passes. The app, on an emulator, with an obfs4 bridge in force, signs up on relay1, publishes its device, looks up a contact, adds it and sends a message. Six obfs4 handshakes counted by the app, five of them before the send, and the relay logged POST /e2e/messages 200. What was in the way was not the bridge. 🔴 **signIn discarded work that had already succeeded.** It ran `withTimeoutOrNull(60s) { withContext(IO) { authenticate(...) } }`. `authenticate` is blocking socket work, so cancelling the coroutine does not stop it: the timeout fired, the screen said "The server did not answer. It may be down, or the address may be wrong", and the registration carried on and finished behind it. One run left the account `andb7564513` on relay1 with a published identity and a device while the person was told the server was unreachable. The relay answered sign-up in 397 ms and the app's next call came 115 seconds later. Reproduced with no bridge (`-e direct true`), so this was never a bridge defect. The work now runs in its own `async`, the first 60 seconds still report, as "Still waiting for the server" rather than as a failure, and a late success is adopted instead of dropped. After 180 more seconds it gives up and cancels the work, so a success nobody is waiting for cannot surprise somebody who moved on. Spanish for the new string is in values-es. Two things the test learned to stop believing: - An outgoing line in the thread is not delivery. The app renders a message as soon as it is composed, and a run that asserted only the text reported OK while the relay never saw a POST at all. Delivery is now the absence of both the `pending` and `undelivered` markers. - `Obfs4Settings` on main takes `add`, not `save`, and returns `AddResult`. The branch this was first written against had the older single-line API. InstrumentedSuitesCanSignUpTest now accepts `typeIfPresent("birth-year")` as well as the direct call. relay1 does not ask for a birth year, so a suite driving it has to fill that field only when the relay puts it on screen. The rule it enforces is unchanged. Gate: `:app:testDebugUnitTest` is 671 tests with 267 failures on this machine, identical with and without this change, measured by stashing it and re-running. 266 of those are `IllegalArgumentException: Unsupported class file major version` from a JDK 26 toolchain, which is this laptop rather than the repository. The one real failure was the guard above, and it passes now: 3 tests, 0 failures. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>