        /* ── the faces round thirty-one drew and no step had ever read ──
           Home's own line and the slots behind it (how many follows it
           walked, how many came back empty-handed); the catalog's note on
           an artist page; whatever stub is up, whitespace collapsed; the
           Gaps line, the BUTTON only — the '.gapline.done' variant is a
           div and says something else entirely; the failed transfer's
           sentence; and whether the lyrics lookup itself failed, as
           opposed to having found nothing. Every backslash here is doubled
           and there is not one backtick, comment included — this block
           lives inside a template literal, and a backtick would END it
           (the file still PARSES, so node --check says nothing: what it
           becomes is a tagged template, and smoke.mjs throws on import). */
        catDown: (document.querySelector('.sec-note.cat-down') || {}).textContent || '',
        homeSlots: (function () { try { return __ss.home.order.length; } catch (e) { return -1; } })(),
        homeErr: (function () { try { return __ss.home.order.filter(function (id) { var s = __ss.home.slots[id]; return !!(s && s.error); }).length; } catch (e) { return -1; } })(),
        catNote: (function () { var n = [].slice.call(document.querySelectorAll('.screen .sec-note:not(.cat-down)')).find(function (x) { return /catalog/i.test(x.textContent || ''); }); return n ? n.textContent.replace(/\\s+/g, ' ').trim() : ''; })(),
        stubText: ((document.querySelector('.screen .stub') || {}).textContent || '').replace(/\\s+/g, ' ').trim(),
        gapLine: ((document.querySelector('button.gapline') || {}).textContent || '').replace(/\\s+/g, ' ').trim(),
        xferFail: (document.querySelector('.row.xfer.failed .m') || {}).textContent || '',
        lyrFailed: (function () { try { return __ss.lyr.failed ? 'yes' : 'no'; } catch (e) { return ''; } })(),
