Restore the airplay-search and playlist-archive listener surfaces - #233
Merged
Conversation
Both pages were reverted off main on 2026-08-26 (43c433d, 90643dc) because they render historical DJ identity that could hold real names. WXYC/Backend-Service#2281 ran against production on 2026-09-08 and rewrote 1,103,206 rows, removing Cohort A (the auth_user.name era) and Cohort B (the tubafrenzy DJ_NAME era) from flowsheet.dj_name. Cohort C remains by design — names DJs typed into tubafrenzy's own free-text DJ_HANDLE field. Verified against the oldest retained backup (wxycmusic-2025-10-13) and the final pre-turndown dump (wxycmusic-2026-09-07) that 994 of the 995 affected shows carried that value in tubafrenzy's public DJ_HANDLE column rather than its private DJ_NAME column, so restoring re-publishes what tubafrenzy itself published on those shows. The single exception, legacy_show_id 168503, had an empty upstream handle and was nulled out separately. Pages and their tests are re-added whole from the revert parents; the reverts left lib/flowsheetRange.js, lib/flowsheetSearch.js and components/OrganizingArchive.js in place, so no data-layer work was needed. The wxyc.info turndown guard in wxycInfoLinks.test.js stays and still passes — only the deliberate-gap note and the suppressed assertions come out. Two corrections folded in rather than restored verbatim: programming.mdx said the archive reaches back to 2009 when flowsheet history runs to at least 2004-11-01, and a plain checkout of the pre-revert wxycInfoLinks.test.js would have silently undone e089f9c's 2026-08-31 to 2026-09-07 cutover-date fix. Closes #232.
This was referenced Sep 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Restores the two D3 listener surfaces pulled off
mainon 2026-08-26, now that thedj_namescrub they were blocked on has run.Closes #232.
Why this is safe to restore now
WXYC/Backend-Service#2281 ran to completion against production on 2026-09-08: 1,103,206 rows rewritten, clean exit, zero lock waits. That removes Cohort A (the
auth_user.nameera) and Cohort B (the tubafrenzyDJ_NAMEera) fromflowsheet.dj_name— the two classes that took these pages down.Cohort C remains by design — real names DJs themselves typed into tubafrenzy's free-text
DJ_HANDLEfield. The scrub's README is explicit that name-shaped residue after the run is expected, not a failed run. What was missing was evidence about whether that residue was ever actually public.It was. Verified against the oldest retained tubafrenzy backup (
wxycmusic-2025-10-13.sql) and the final pre-turndown dump (wxycmusic-2026-09-07.sql.gz), comparing each residual value against tubafrenzy's publicDJ_HANDLEcolumn rather than its privateDJ_NAMEcolumn:DJ_HANDLEDJ_HANDLEempty — name only in privateDJ_NAMESo restoring these pages re-publishes names that tubafrenzy itself published on those same shows. It does not expose anything that was private. Combined with the 1.1M rows the scrub removed, this is a large net reduction in exposure relative to the pages' pre-2026-08-26 state.
The analysis was done in SHA-256 hashes and counts throughout; no name was printed, and the derived hash files were deleted. Backups were read in place and never copied.
The one exception is excluded.
legacy_show_id 168503had an empty upstreamDJ_HANDLE, so its name was never displayed on that show. Itsshows.legacy_dj_nameand the 29 carryingflowsheetrows (27 track +show_start+show_end) were nulled in a targeted transaction; the 6 talkset and 3 breakpoint rows on that show were already NULL and were not touched. That DJ's name remains public as their handle on 17 other shows, so the marginal exposure was near zero either way — excluded on principle rather than necessity.What changed
Both pages are re-added whole from their revert parents — this is a re-add, not a rewrite. The reverts deliberately left the data layer in place (
lib/flowsheetSearch.js,lib/flowsheetRange.js,components/OrganizingArchive.js), all confirmed still present.pages/airplay-search.jsx+__tests__/airplaySearch.test.jsx— from43c433dc^pages/playlists/archive.jsx+__tests__/archivePlaylists.test.jsx— from90643dc1^content/page/programming.mdx— both links restored__tests__/wxycInfoLinks.test.js— deliberate-gap note removed, the twoprogramming.mdxlink assertions and the three-routeresolvePagecase restored. The wxyc.info turndown guard itself stays and still passes.README.md— both page sections restored in their original positionsTwo corrections folded in rather than restored verbatim:
programming.mdxcopy was the outlier.e089f9ccorrected these strings from 2026-08-31 after the reverts landed, so a plain checkout of the pre-revertwxycInfoLinks.test.jssilently reverted that fix. Re-applied, and the README sections are phrased in the past tense now that the cutover has happened.No backend work was required:
GET /flowsheet/rangeandGET /flowsheet/searchare live and CORS-cleared forwxyc.orgviaPUBLIC_READ_ORIGINS. This deliberately does not route throughFRONTEND_SOURCE, which would grant credentialed access org-wide (the WXYC/Backend-Service#1107 hazard).Note on #232's acceptance criteria
One criterion as written is unreachable and should be read as superseded:
Cohort C guarantees a non-zero count forever — that is the design, not a failure. The meaningful check is differential: Cohort A and B residue is gone, and every remaining hit resolves to a known Cohort C value that was publicly displayed as a handle. That is what the verification above establishes. See the discussion on #232.
Related
flowsheet-etlre-derivesdj_namewith aCOALESCEinstead of the canonical helper, so divergence regrows at the rate that job runs