Everything written this session that has not been through the device: rounds 43 to 48 (each patch adversarially verified, 43's transient-notice expectation fixed), a partial round 49, the pipeline scripts, the Android Auto design and the icon comparison mock. Also the two harness changes that were never A/B'd — adaptive waits, which may only shorten a declared wait and never lengthen it, and a ship that runs the mock walk and the deploy at the same time. The A/B and its 255-step baseline are in handoff/tools; main stays at what the phone has actually walked.
41 lines
3.2 KiB
Plaintext
41 lines
3.2 KiB
Plaintext
/* ── the faces no walk had seen ─────────────────────────────────────
|
|
Each of these fails if round thirty-one's fix is undone: stop reading
|
|
`slot.error` and Home's line empties; drop the `gapErr` branch and
|
|
the Gaps line falls back to "See what's missing" and can be tapped
|
|
for ever; put `lyr.failed` back and the face says "No lyrics found"
|
|
about a lookup that never answered; take `say()` out of `stateLine`
|
|
and the raw string is on the row again. Every one asserts the
|
|
sentence a person reads AND that the Rust string is not in it — the
|
|
second half is the round-thirty-one rule, and the half that survives
|
|
any rewording of the first. */
|
|
"faces-home-down": (i) => i.homeSlots > 0 && i.homeErr === i.homeSlots
|
|
&& /^Couldn't reach the catalog, so there's nothing new/.test(i.catDown)
|
|
&& !/New from your artists/.test(i.secs),
|
|
"faces-gap-down": (i) => /Couldn't reach the catalogue — tap to try again/.test(i.gapLine) && !i.gapCards,
|
|
"faces-gap-again": (i) => /more released/.test(i.gapLine) && !/Couldn't reach/.test(i.gapLine) && i.gapCards >= 3,
|
|
"faces-album-down": (i) => /^The catalog did not answer/.test(i.why) && /The network didn't answer/.test(i.why)
|
|
&& !/io:|connection reset/.test(i.why) && i.again && !i.trks,
|
|
"faces-album-again": (i) => !i.why && !i.again && i.trks > 0,
|
|
/* the pair that proves the distinction is real and not decoration */
|
|
"faces-artist-down": (i) => /only what this phone holds is here/.test(i.catNote) && /didn't answer/.test(i.stubText)
|
|
&& !/io:|address information/.test(i.catNote + i.stubText),
|
|
"faces-artist-none": (i) => !i.catNote && /had nothing to add/.test(i.stubText) && !/didn't answer/.test(i.stubText),
|
|
"faces-playlist-down": (i) => /^Couldn't read this playlist/.test(i.why) && /library folder isn't readable/.test(i.why)
|
|
&& i.again && !i.plrows && !/database file/.test(i.why),
|
|
"faces-playlist-again": (i) => !i.why && !i.again && i.plrows > 0,
|
|
"faces-lyrics-down": (i) => i.lyrFailed === "yes" && !i.lyrLines && /^Couldn't look up the words/.test(i.lyrNote)
|
|
&& i.lyrTools && !/io:|address information/.test(i.lyrNote),
|
|
"faces-lyrics-again": (i) => i.lyrFailed === "no" && i.lyrLines >= 3 && !i.lyrNote,
|
|
"faces-xfer-failed": (i) => i.title.startsWith("Transfers")
|
|
&& /failed · They refused the transfer \(File not shared\)/.test(i.xferFail)
|
|
&& !/transfer rejected/.test(i.xferFail),
|
|
"faces-library-toast": (i) => /library folder isn't readable right now/.test(i.toast) && i.retry === "Try again"
|
|
&& !/database file/.test(i.toast),
|
|
"faces-library-again": (i) => i.title.startsWith("You") && !i.toast && !i.retry,
|
|
/* the disarm, proved: no toast, no armed action, no stub, Home's slots
|
|
healthy and its rails back — so the first run below is not quietly
|
|
running on something this block left standing */
|
|
"faces-clear": (i) => !i.toast && !i.why && !i.catDown && !i.retry
|
|
&& i.homeSlots > 0 && i.homeErr === 0
|
|
&& /New from your artists/.test(i.secs) && /^(Good |Still)/.test(i.title),
|