    /* ── the first run ────────────────────────────────────────────────
       Every one of these is on state that STAYS: a sheet that is up, a
       counter, a field in the config, a row that is present or absent.
       Nothing here waits on a notice or a picker — both windows are
       shorter than the step's own wait plus the screenshot. */
    "fresh-boot": (i) => i.setupUp && i.setupCards === "Where your music lives|Soulseek"
        && i.setupState === "private:out:todo" && i.setupWrites === 0
        && /^dialog\/true\/Welcome to SoulStream\/focus$/.test(i.dlg)
        /* and nothing of the walk before it came through the reload: a
           phone that has just been installed has no session to restore */
        && !i.mini
        && !i.a11yAnon && !i.a11yGhost && !i.a11yBad && !i.a11yState,
    /* the tour's own door to the sign-in, and the stamp that a tour which
       ran leaves behind whichever door closed it */
    "fresh-community": (i) => !i.setupUp && i.title.startsWith("Community")
        && i.signIn === "Sign in to Soulseek" && i.setupWrites === 1 && i.setupState === "private:out:done",
    "fresh-home": (i) => !i.setupUp && i.setupNotes === 1 && i.setupRows === 2
        && i.setupNoteText === "Choose your library folder|Sign in on Soulseek",
    "fresh-albums": (i) => i.title.startsWith("Your library") && i.setupNotes === 1 && i.setupRows === 2
        && i.setupNoteText === "Choose your library folder|Sign in on Soulseek",
    "fresh-artists": (i) => i.title.startsWith("Your library") && i.setupNotes === 1 && i.setupRows === 2,
    "fresh-search": (i) => i.title.startsWith("Search") && i.setupNotes === 1 && i.setupRows === 2,
    /* the preview reads the real config and adds nothing to the counter */
    "fresh-preview": (i) => i.setupUp && i.setupWrites === 1 && i.setupCards === "Where your music lives|Soulseek",
    /* a folder picked from the tour: the config moved, the permission the
       new folder needs is offered, and still nothing was stamped */
    "fresh-folder": (i) => i.setupUp && i.setupState === "chosen:out:done" && i.setupWrites === 1
        && /Allow all files access/.test(i.halfText),
    /* and the note loses the row it answered — because the config changed,
       not because a flag was flipped */
    "fresh-fixed": (i) => !i.setupUp && i.setupNotes === 1 && i.setupRows === 1
        && i.setupNoteText === "Sign in on Soulseek" && i.setupWrites === 1,
    /* the provisioned device is back, and it is NOT offered a first run */
    "fresh-off": (i) => !i.setupUp && !i.setupNotes && i.setupState === "chosen:in:done" && !i.toast,
