    /* ── 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),
