    /* the whole discography: All in front of the six categories the eleven
       mock rows file into, the ten families they fold to, a year header per
       year, the desktop's own summary line and the order the head shows.
       Two of those rows are dated relative to today (dayIso(-9), dayIso(21)),
       so a run across a New Year splits their year in two — hence the range
       rather than a number. */
    "disco-all": (i) => i.dgTabs === 7 && i.dgRows === 10 && i.dgGroups >= 8 && i.dgGroups <= 9
        && /^10 releases/.test(i.dgSum) && /Newest/.test(i.dgOrder)
        && !i.a11yAnon && !i.a11yBad && !i.a11yGhost && !i.a11yState,
    "disco-albums": (i) => i.dgRows === 4 && i.dgGroups === 4,
    /* Discovery and its Deluxe — the one edition_group in the mock, and the
       thing a flat list of releases loses */
    "disco-editions": (i) => i.dgEds === 2 && i.dgRows === 10,
    "disco-sheet": (i) => i.half.includes("up") && /By year/.test(i.halfText),
    /* the rule this page has to get right: a name order cannot be grouped by
       year, so the grouping falls away with it */
    "disco-az": (i) => i.dgFirst === "Alive 1997" && i.dgGroups === 0 && /A–Z/.test(i.dgOrder),
    "disco-many-artist": (i) => i.title.startsWith("Ember Parade") && i.disco === 12 && /Show all 140/.test(i.dgAll),
    "disco-many": (i) => i.dgRows === 60 && /\+ 80 more/.test(i.dgMore),
    "disco-many-all": (i) => i.dgRows === 140 && !i.dgMore,
