Problem
The Schedule reveal level seam sits at the wrong altitude. maskSetForReveal (src/lib/scheduleReveal.ts:34-46) — the function meant to own reveal transformation — has zero app callers (only its own test). Meanwhile every set card pulls the raw canShowDay/Stage/Time booleans and re-derives the identical display decision:
canShowTime ? formatTimeRange(...) : canShowDay && !canShowTime ? formatDayOnly(...) : null
src/pages/EditionView/tabs/ArtistsTab/SetCard/SetMetadata.tsx:23-30
src/pages/SetDetails/SetInfoCard.tsx:35-41
src/pages/SetDetails/MultiArtistSetInfoCard.tsx:42-46
src/pages/ExploreSetPage/SetExploreCard/SetCardHeader.tsx:36-37
The module hands out booleans; each caller re-cooks the same reveal→label mapping. The tested surface (maskSetForReveal) is the unused one; the used per-card gating has no tests.
Proposed deepening
A label-producing module — revealLabels(set, level) → { dayLabel?, timeLabel?, stage? } — that owns the draft < days < stages < full display invariant. Cards render what they're handed and never see a canShow* boolean. Delete the dead maskSetForReveal.
Relations
Architecture note
Explore ticket from the 2026-07-13 architecture review (candidate 3). Design to be settled in a grilling session before implementation. Vocabulary per /codebase-design.
Problem
The Schedule reveal level seam sits at the wrong altitude.
maskSetForReveal(src/lib/scheduleReveal.ts:34-46) — the function meant to own reveal transformation — has zero app callers (only its own test). Meanwhile every set card pulls the rawcanShowDay/Stage/Timebooleans and re-derives the identical display decision:src/pages/EditionView/tabs/ArtistsTab/SetCard/SetMetadata.tsx:23-30src/pages/SetDetails/SetInfoCard.tsx:35-41src/pages/SetDetails/MultiArtistSetInfoCard.tsx:42-46src/pages/ExploreSetPage/SetExploreCard/SetCardHeader.tsx:36-37The module hands out booleans; each caller re-cooks the same reveal→label mapping. The tested surface (
maskSetForReveal) is the unused one; the used per-card gating has no tests.Proposed deepening
A label-producing module —
revealLabels(set, level)→{ dayLabel?, timeLabel?, stage? }— that owns thedraft < days < stages < fulldisplay invariant. Cards render what they're handed and never see acanShow*boolean. Delete the deadmaskSetForReveal.Relations
days/stageslevels) its seam — those modes need exactly this decision made in one place.Architecture note
Explore ticket from the 2026-07-13 architecture review (candidate 3). Design to be settled in a grilling session before implementation. Vocabulary per
/codebase-design.