android: the faces the walk had never seen — six failure states, read back in their own words

Round thirty-one gave the phone honest error states and shipped six of them
unobserved, because neither `loadHome` nor `loadLyrics` was reachable from the
`__ss` handle and both answer a second ask with nothing. The handle carries the
two stores and their two loaders now, and a block of mock steps arms each
failure with the mock's own weather, drives the face, and asserts the sentence
a person reads as well as the absence of the Rust string behind it: Home's
catalog line, the Gaps line and its second tap, a catalog record's stub, the
artist page's two different answers, a playlist that would not read, the lyrics
lookup that failed, a refused transfer, and the library toast's Try again,
pressed for the first time.

It sits before the first-run block, which reloads and empties the mock's
follows; every failure is disarmed by the step that proves the face heals, and
a last step asserts nothing was left armed. The phone walk gets a safe step of
its own — a terminal transfer row written into the store and taken away,
nothing fetched and nothing reaching the shade. ANDROID.md now names what the
walk still cannot see: three screens that draw a raw backend string, six error
faces with no expectation, and the history mirror printed on every step and
asserted on none.
This commit is contained in:
KeelrLeek committed 2026-09-14 03:59:09 -05:00
1 parent f2cde4ec7c
commit 537bfdd5af
3 files changed
+235 -5

No files matched your search

+47 -3
View File
@@ -940,6 +940,39 @@ merely not there yet (a fresh install still works), and refuse with
into a row under Library folder with the path and what to do about it, and the
toast says it in English.
**What the walk has seen.** The round that wrote all of the above was straight
about what it had not proved: six of these fixes shipped with no expectation at
all, because neither `loadHome` nor `loadLyrics` was reachable from the `__ss`
handle the walk drives the app through, and both answer a second ask with
nothing — `loadHome` is gated on `started`, `loadLyrics` on the track's own
`key` — so no amount of tapping re-runs them. They are driven now: Home's
`catalogDown`, the Gaps line, a catalog record's stub, the artist page's two
different sentences, a playlist that would not read, the lyrics `failed` face,
and `failed · <sentence>` on a transfer row. Each is armed with
`__ssMock.fail`, asserted both by the words a person reads and by the Rust
string being absent from them, and disarmed by the step that proves the face
heals. The handle grew four names for it and no more — `home` and `loadHome`,
`lyr` and `loadLyrics` — because a test seam that exports the internals
wholesale stops being a seam. The toast's own **Try again** is pressed for the
first time too, through You → **Rescan library**: `lib.error` is written by
`loadLibrary` alone, and that row is the only door in the app that reaches it
a second time.
What is still unseen, honestly. **Three sites draw a raw backend string**, so
the rule above has holes: `screens/Browse.svelte` — a peer's shares that would
not read, which is a full error face, Try again and all, that was simply missed
— and `screens/Import.svelte`, twice. `SyncRoom.svelte` is a fourth, by way of
`saveTapSync`'s catch. **Six error faces have no expectation either**: Browse's,
Community's "The server did not answer.", Room's "Not in this room.", Album's
"That record is gone.", Playlist's "Playlist not found." and Peer's "Not
compared yet." — all reachable, the first two through the mock's weather and
the rest by pushing a nav entry with a dead id. And of the probe's fields, six
are still read out on every step and asserted on none: `accent`, `xlive`, `hd`,
`hwant`, `navMs` and `a11yWho`. The cheapest real win left in the harness is a
global `hd === hwant` check on every named step — the history mirror is how the
blank page after a confirmed delete was found — but it would fire during the
first-run reloads and needs its own thinking about the suppress window first.
## The downloads in the shade
Transfers is a screen inside the app; the desktop says what a Save is doing
@@ -1255,7 +1288,14 @@ weather: a library index that will not read and its Try again, the client taken
offline, a refused password and a server that cannot be reached, Search with
nowhere to search, a room list that never arrives, and a rescan that refuses
because the folder is gone — then all of it cleared and the app left as it was
found. The mock answers every command the phone
found. After the weather come the faces that failure actually draws, each one
armed by the mock and read back by its own words: Home with every follow's
catalog page refused, the Gaps line and its second tap, a catalog record's stub
and its Try again, an artist page whose lookup failed beside one that was
answered with nothing, a playlist that would not read, the lyrics face on a
lookup that never came back, a transfer that was refused, and the library
toast's own Try again pressed for the first time — then all of that disarmed
too, and asserted disarmed. The mock answers every command the phone
uses; one it does not know is named in the report (`[mock] no mock for X`)
rather than surfacing as a TypeError toast, console warnings carry their top
frames (the smoke bundle is built unminified for that), and every probe
@@ -1269,8 +1309,12 @@ backend funnels through `with_client()` answers "not connected to Soulseek",
the two connects answer the server string, and `soulseek:state` goes out — and
`clear()` puts all of it back. They reject with a plain string because that is
what Tauri rejects with. Fourteen mock steps drive them, and the phone walk carries
one safe step of its own (`trouble-words`: eleven real backend strings through
`__ss.say` on the device, every output asserted free of Rust). A mock step can
two safe steps of its own (`trouble-words`: eleven real backend strings through
`__ss.say` on the device, every output asserted free of Rust; and
`trouble-xfer`: one already-failed transfer row written into the store and
taken away again — nothing fetched, and a terminal row is not in flight, so
nothing reaches the shade). Fifteen more mock steps drive the failure faces
themselves, which are described under **When things go wrong**. A mock step can
also set the
viewport — `{ view: [915, 411] }` sends `Emulation.setDeviceMetricsOverride`
through the same client, which is how the walk turns the phone over and back;