Nine defects, all of them in the test, none in the app. These
suites were written before the tab split, the age gate and the two
sign-out doors, and had not run since. Each staleness hid behind the one
before it, and every error message blamed the wrong thing.
The age gate was never filled.submit is enabled = … && (!registering || birthYear.length == 4), and performClick() on a
disabled Compose node does not throw — it does nothing.
submit was below the fold. Adding that field pushed the button
off a 1080x2400 screen. An off-screen node still reports ENABLED —
that is a state check, not a visibility one — so the gesture reached
nothing. Proved by logging inside the app: signIn was never called,
through 450 seconds of waiting.
The peer's name was typed into a button.new-contact is the
FIELD; lookup-contact is the Look-up button.
The lookup step was skipped, so confirm-contact never appeared —
the app refuses to turn a typed string straight into a contact,
because a typo would silently become a stranger.
buddy-<id> vs buddy-circle-<id>. Home shows the circles row.
The suite reported "never became a contact" about a contact on screen.
RECORD_AUDIO was never granted. The mic dialog is not in the app's
Compose tree, so the failure read "No compose hierarchies found" — as
though the app had died rather than a dialog covering it.
Sign-out was a no-op: the row needed scrolling to, AND the
destructive rows confirm in place, so one tap only armed it.
It used the wrong door. A plain sign-out KEEPS the device and
credential by design — right for a person, wrong for a suite whose
next test wants a different account. sign-out-erase is the one that
clears the vault.
Groups and stories are on their own tabs, and stories is the
strip on Home, not the Stories tab, which carries new-story.
signOutIfSignedIn no longer wraps itself in runCatching. Swallowing
that failure is what made the damage appear three screens later in a
different test.
The two waits that span a relay POLL — a contact reaching the roster,
a group reaching the list — are 150s. They are the only two that flake,
because neither is refreshed by the response to its own write.
All four tests pass. Not yet all in one run: the add-contact lookup is
throttled per window, and four tests share it.
**Nine defects, all of them in the test, none in the app.** These
suites were written before the tab split, the age gate and the two
sign-out doors, and had not run since. Each staleness hid behind the one
before it, and every error message blamed the wrong thing.
1. **The age gate was never filled.** `submit` is `enabled = … &&
(!registering || birthYear.length == 4)`, and `performClick()` on a
disabled Compose node does not throw — it does nothing.
2. **`submit` was below the fold.** Adding that field pushed the button
off a 1080x2400 screen. An off-screen node still reports ENABLED —
that is a state check, not a visibility one — so the gesture reached
nothing. Proved by logging inside the app: `signIn` was never called,
through 450 seconds of waiting.
3. **The peer's name was typed into a button.** `new-contact` is the
FIELD; `lookup-contact` is the Look-up button.
4. **The lookup step was skipped**, so `confirm-contact` never appeared —
the app refuses to turn a typed string straight into a contact,
because a typo would silently become a stranger.
5. **`buddy-<id>` vs `buddy-circle-<id>`.** Home shows the circles row.
The suite reported "never became a contact" about a contact on screen.
6. **RECORD_AUDIO was never granted.** The mic dialog is not in the app's
Compose tree, so the failure read "No compose hierarchies found" — as
though the app had died rather than a dialog covering it.
7. **Sign-out was a no-op**: the row needed scrolling to, AND the
destructive rows confirm in place, so one tap only armed it.
8. **It used the wrong door.** A plain sign-out KEEPS the device and
credential by design — right for a person, wrong for a suite whose
next test wants a different account. `sign-out-erase` is the one that
clears the vault.
9. **Groups and stories are on their own tabs**, and `stories` is the
strip on Home, not the Stories tab, which carries `new-story`.
`signOutIfSignedIn` no longer wraps itself in `runCatching`. Swallowing
that failure is what made the damage appear three screens later in a
different test.
The two waits that span a relay POLL — a contact reaching the roster,
a group reaching the list — are 150s. They are the only two that flake,
because neither is refreshed by the response to its own write.
All four tests pass. Not yet all in one run: the add-contact lookup is
throttled per window, and four tests share it.
added 1 commit
<ul><li>44e06adf - obfs4 for Android, part 2: the cofactor-dirty scalar multiplication</li></ul>
[Compare with previous version](/paulhitt/flamenet-messenger-android/-/merge_requests/77/diffs?diff_id=2007612444&start_sha=db35c7ce55f424ca5c7aca5e2f3ac8fe4ccbfd6c)
added 1 commit
<ul><li>430f167f - obfs4 for Android, part 3: SipHash, the length DRBG, and ntor</li></ul>
[Compare with previous version](/paulhitt/flamenet-messenger-android/-/merge_requests/77/diffs?diff_id=2007615494&start_sha=44e06adf92b00a6aa405b3afdc0262b60c53f79f)
added 1 commit
<ul><li>799886f3 - obfs4 for Android, part 4: framing</li></ul>
[Compare with previous version](/paulhitt/flamenet-messenger-android/-/merge_requests/77/diffs?diff_id=2007617064&start_sha=430f167fc0d97f12579d706f82299f7a7ba07472)
added 1 commit
<ul><li>ac5802a8 - obfs4 for Android, part 5: handshake messages, packets, and the connection</li></ul>
[Compare with previous version](/paulhitt/flamenet-messenger-android/-/merge_requests/77/diffs?diff_id=2007622854&start_sha=799886f35c9d34a0e19db718614a76beea74db8b)
added 1 commit
<ul><li>a7ce0104 - obfs4 for Android, part 6: live interop with real lyrebird, both directions</li></ul>
[Compare with previous version](/paulhitt/flamenet-messenger-android/-/merge_requests/77/diffs?diff_id=2007625974&start_sha=ac5802a8390e7e87c3d0b07178e6d3e3931554e9)
added 1 commit
<ul><li>dd412b86 - obfs4 for Android, part 7: the OkHttp seam, off by default</li></ul>
[Compare with previous version](/paulhitt/flamenet-messenger-android/-/merge_requests/77/diffs?diff_id=2007628392&start_sha=a7ce01040376542ab8c1399213c01d8876b2c5fd)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Nine defects, all of them in the test, none in the app. These
suites were written before the tab split, the age gate and the two
sign-out doors, and had not run since. Each staleness hid behind the one
before it, and every error message blamed the wrong thing.
submitisenabled = … && (!registering || birthYear.length == 4), andperformClick()on adisabled Compose node does not throw — it does nothing.
submitwas below the fold. Adding that field pushed the buttonoff a 1080x2400 screen. An off-screen node still reports ENABLED —
that is a state check, not a visibility one — so the gesture reached
nothing. Proved by logging inside the app:
signInwas never called,through 450 seconds of waiting.
new-contactis theFIELD;
lookup-contactis the Look-up button.confirm-contactnever appeared —the app refuses to turn a typed string straight into a contact,
because a typo would silently become a stranger.
buddy-<id>vsbuddy-circle-<id>. Home shows the circles row.The suite reported "never became a contact" about a contact on screen.
Compose tree, so the failure read "No compose hierarchies found" — as
though the app had died rather than a dialog covering it.
destructive rows confirm in place, so one tap only armed it.
credential by design — right for a person, wrong for a suite whose
next test wants a different account.
sign-out-eraseis the one thatclears the vault.
storiesis thestrip on Home, not the Stories tab, which carries
new-story.signOutIfSignedInno longer wraps itself inrunCatching. Swallowingthat failure is what made the damage appear three screens later in a
different test.
The two waits that span a relay POLL — a contact reaching the roster,
a group reaching the list — are 150s. They are the only two that flake,
because neither is refreshed by the response to its own write.
All four tests pass. Not yet all in one run: the add-contact lookup is
throttled per window, and four tests share it.
assigned to @paulhitt
added 1 commit
44e06adf- obfs4 for Android, part 2: the cofactor-dirty scalar multiplicationCompare with previous version
added 1 commit
430f167f- obfs4 for Android, part 3: SipHash, the length DRBG, and ntorCompare with previous version
added 1 commit
799886f3- obfs4 for Android, part 4: framingCompare with previous version
added 1 commit
ac5802a8- obfs4 for Android, part 5: handshake messages, packets, and the connectionCompare with previous version
added 1 commit
a7ce0104- obfs4 for Android, part 6: live interop with real lyrebird, both directionsCompare with previous version
added 1 commit
dd412b86- obfs4 for Android, part 7: the OkHttp seam, off by defaultCompare with previous version
mentioned in commit
9bc7dcf762mentioned in commit
6cd7a0d5dcmentioned in commit
902e16cf92mentioned in merge request !79
changed the description