Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
cc56eba · 2026-09-03 · Music room: apply graphic-designer critique fixes (Steve)
- BUG: mobile panel collision — Music Room was invisible/unclickable (shared box with
Videos). Now distinct mobile slots (Videos bottom, Music Room above), Music Room z:11
so its header is always tappable, and the two panels are mutually exclusive (opening
one closes the other). Verified: mrToggle now receives the tap and opens.
- BUG: 'Chapter · Departure' caption was hidden behind the Music Room panel on desktop —
moved the panel down (top:182) to clear it.
- Movie screen: cropped the YouTube iframe (scale 1.34) so its title bar/byline/logo/
'More videos' chrome is pushed outside the gold frame — only the footage shows; added a
stage riser/base under the frame so it reads as mounted on the stage; nudged it down
(top:36%) off the title.
- Orb: flattened to a matte material (metalness 0 / roughness 1 — no photoreal specular)
to match the paper-cutout world, and raised its default to high sky (y 3.1) off the riser.
- Polish: mobile title floor bumped (clamp 20/6.5vw/30), kicker 9→10px.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6b22391 · 2026-09-03 · Fast onload: cache archive.org's down state, cut timeouts
Steve: "Music must start onload fast !!" Measured 9.4s from page
load to first playback — bootMusic tries archive.org twice in
sequence (pool-build, then the default-show fetch), each paying a
6-9s timeout before falling back to YouTube, and archive.org has
been down for hours this session.
Added a localStorage health cache (dead.archiveDownUntil, 10min
cooldown): fetchT marks it on every success/failure, and both
_poolFromShows and loadShowRef check it up front and skip straight
to the YouTube fallback when archive is known-down — no wasted
round-trip. Also tightened the raw timeouts 7000/6000ms -> 3000ms as
a floor for the first-ever cold load, before the cache has data.
Measured: cold first visit 9.4s -> 3.1s; any visit after that within
the cooldown 9.4s -> 0.8s. Recovery is automatic — the very next
successful archive.org call (from anywhere: search, a real show
load) clears the flag immediately.
20eefcf · 2026-09-03 · Videos panel: add Prev/Next concert + 30s back/fwd seek buttons
Steve: "allow user to go fwd bwd on video" / "and 30 seconds back and
fwd buttons." Added a transport bar (⏮ / ⏪30 / 30⏩ / ⏭) above the
show list. Prev/Next step through MR_VIDEOS relative to whatever's
selected (wraps at both ends); the 30s buttons seek the currently
playing YouTube player via getCurrentTime()/seekTo(), clamped to
[0, duration]. Verified: stepping through 3 shows forward and back
lands on the right titles each time, seek buttons don't throw.
8769b6f · 2026-09-03 · Music room: mobile-friendly pass — shrink + fluid-scale text, keep panels in the viewport (Steve)
- Phone media blocks (<=640px, <=400px): title h1 drops to clamp(17px,6vw,28px) then
clamp(15px,6.4vw,24px); eyebrow/subtitle/panel/dock/museum text all shrunk; Controls
button moved to right:12 so it isn't clipped; Videos + Music Room panels pinned
left/right:10 width:auto so they stay inside the viewport; movie screen 92vw on phones.
Note: the room has NO background PNG to convert to SVG — its backdrop is the live generative
canvas. canyon-backdrop.png is unused; cover.png is only the ROOT landing's card thumbnail.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a7cda26 · 2026-09-03 · Music room: adjustable movie screen (drag+scale) + optional draggable orb (Steve)
- Movie screen is now draggable to reposition and corner-resizable to scale up/down
(--movie-dx/-dy/-scale, persisted to localStorage); gold corner handle + move overlay.
- Orb is OFF on load ('onload no orb') but a new 🔮 Orb toggle turns it on, and once on it
can be DRAGGED around the room (click = AI VJ, drag = move; position persisted). The WebGL
loop skips all work while the orb is off.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
650582d · 2026-09-03 · Music room: concert plays on a movie SCREEN on the stage, orb removed (Steve)
Steve: 'it's a movie screen!' + 'remove the orb, onload no orb' + 'music from youtube
can start right away and play' + 'wait to hear music then dance'.
- Disabled the WebGL AI-VJ orb entirely (ORB_ENABLED=false) — no orb on load or ever.
- A picked concert now plays on a framed MOVIE SCREEN mounted center-stage (.movie-on:
golden proscenium frame + glow, z-index below the dancer canvas so the bears dance in
FRONT of it), WITH SOUND (the vr-row click is a gesture → unmuted autoplay allowed).
- onStateChange PLAYING kicks the dancers into motion ('wait to hear music then dance').
- Removed the now-dead Backdrop LEFT/TOP/WIDTH/HEIGHT sliders from the Videos panel
(they controlled the retired small backdrop box) — panel is header + hint + year list.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
559b69a · 2026-09-03 · Fix stray sound leak on manual video picks + reduce backdrop opacity
Steve: "no sound when selected and make not opaque."
1. Sound leak: archive.org has been down all session, so bootMusic's
auto-failover pre-arms a global tap/key "unlock" listener that
unmutes the YouTube player on the NEXT gesture anywhere on the
page. That listener didn't know about muted manual picks from the
Videos panel, so the very click that selected a video (a gesture)
could immediately unmute it right after playConcertManual() set it
muted — a race. Added VB.forceMuted, set true in playConcertManual
(manual picks are meant to be silent decoration) and explicitly
false in enterYouTubeFallback (the real outage fallback IS the
show, still allowed to unmute on a gesture); the unlock listener
now checks it before ever calling unMute().
2. Opacity: #venueVideo was opaque (1) once shown — dropped to .55 so
the backdrop reads as translucent, not a solid opaque panel.
ff54235 · 2026-09-03 · Lock in Steve's dialed-in backdrop position as the default
Left 48% / Top 43% / Width 18vw / Height 32vh — the framing Steve
tuned live with the position sliders and confirmed looked right.
f5a3143 · 2026-09-03 · Backdrop: confine to the stage-riser area with live X/Y/W/H controls
Steve: "put behind my graphics!! on the bg on stage only" / "the area
in back of where singers would sing" / "allow me to expand to show
how it's done."
Two fixes:
1. playConcertManual() was unconditionally entering yt-hero (the
full-screen "video IS the show" mode reserved for the real
archive.org-down fallback) for every Videos-panel pick too, which
is why "behind the art" never actually looked behind anything —
archive.org is still down right now, so every pick went full-hero.
Manual picks now stay muted + confined to the small backdrop box;
yt-hero stays exclusive to enterYouTubeFallback's real outage path.
2. Replaced the single "Backdrop size" scale slider with 4 controls
(Left/Top/Width/Height, --vr-bd-x/-y/-w/-h) plus a reset button, so
Steve can position the box himself instead of me guessing canvas
coordinates. Default widened (46vw x32vh) so the video peeks out
around the opaque stage-riser graphic rather than being fully
hidden behind it edge-to-edge.
8f1b9bf · 2026-09-03 · Music room: CONSOLIDATE the two video-backdrop systems into ONE controller (DTD verdict B, TK-11178)
- Deleted the duplicate #vrBackdrop layer + vrEmbed in-panel player + showBackdrop/hideBackdrop/bdToggle + .vr-bg CSS + dead .vr-embed/.vr-bd-toggle CSS
- The Videos panel now browses MR_VIDEOS and each pick is a MANUAL trigger into the one VideoBackdrop controller (VB) via new playConcertManual(): plays the chosen concert as the #venueVideo backdrop + audio, kills archive audio (single audio owner), yt-hero + react-disabled like the auto path
- Kept the 'Backdrop size' control, retargeted onto #venueVideo via --vr-bd-scale
- Two triggers (auto era-match failover + manual pick) -> one engine, one backdrop, one audio owner: double-audio is now structurally impossible
- Verified via Playwright: #vrBackdrop gone, 18-row browser intact, pick drives #venueVideo, archive audio killed, no .vr-bg
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8e80e02 · 2026-09-03 · Backdrop: full drapery behind the stage, never a cropped close-up
Steve: "use as the draperies on a stage basically.. this is bad" —
the previous cover/crop sizing meant a high zoom setting showed an
illegible close-up mush of the poster texture. Switched to
contain-fit (min(100vw,177.78vh) x min(100vh,56.25vw)): the WHOLE
frame is always visible, letterboxed, like a curtain hung behind the
stage riser — zoom now just makes the curtain bigger, never crops
it. Lowered default to 82% and slider range to 40-150%; clamp any
stale localStorage value from the old cover-based slider so a
returning visitor's saved setting doesn't reintroduce the bad look.
afdb60f · 2026-09-03 · Videos backdrop: dim it behind the graphics + let Steve control its size
Steve: "put behind my graphics!! ... allow me to expand to the size i
need." The backdrop was rendering at full opacity/dominant scale,
washing out the generative scene on top. Now: opacity 1->0.5 + a dark
scrim, scene dimming eased (0.42->0.85) so the animated art reads
clearly in front, and a Backdrop Size slider (50-200%, localStorage-
persisted) so the video's scale is Steve's call, not a fixed guess.
ecd6824 · 2026-09-03 · Music room UI: tuck chapters, camera views + Museum Label into the controls drawer too — maximally clean default stage (TK-11178)
Default stage is now just: title + collapsed Music Room bar (top-left), collapsed Videos bar + hamburger (top-right), and the scene/video. Everything else lives in the right drawer: chapters -> cameras -> playback/mode toggles -> sliders -> Museum Label. Verified via Playwright (drawer children order + slide-in).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012XLgczMhQr91Ad5jL38JM4
e9d46a6 · 2026-09-03 · Music room UI: collapse the sprawling controls into a hamburger-opened RIGHT drawer; Music Room + Videos collapsed by default (TK-11178)
- #dock is now a right slide-in drawer (vertical: Pause/Restart + mode toggles + sliders), hidden by default, opened by the top-right hamburger (repurposed the existing '☰ Controls' button + 'c' key from hide-all-chrome to toggle the drawer)
- Music Room defaults collapsed (data-open=false) on all widths
- Removed the blanket hide-chrome default so the collapsed panels + hamburger are the resting state; clean stage, video/scene unobstructed
- Verified layout via Playwright at 1280x800: dock off-screen by default, slides fully in on hamburger, panels collapsed, center stage clear
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012XLgczMhQr91Ad5jL38JM4
93937cc · 2026-09-03 · Music room: make the concert video visible — pull scene canvases down under a video backdrop + a yt-hero state where the fallback video dominates (TK-11178)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012XLgczMhQr91Ad5jL38JM4
6b68f71 · 2026-09-03 · Add a standalone Videos section, independent of archive.org/Music Room
Steve, after seeing archive.org's outage take out audio AND the
video backdrop with it: "offer videos only sections." New 🎬 Videos
panel lists all 18 MR_VIDEOS shows; clicking one embeds a plain
YouTube iframe directly, bypassing the archive-audio pipeline and
the VB failover machinery entirely, so it works even when
archive.org is down. Verified over local HTTP (file:// gives a
false Error 153 — origin restriction on the YouTube embed, not a
real bug): 18 rows list correctly, click-to-play works, video plays.
9ae8b46 · 2026-09-03 · Music room: fix contrarian findings — showIdx assignment (resume + mid-show failover were dead), expired-gesture read, muted-announce collision, bounded error-hop (TK-11178)
- showIdx now set in loadShowRef (+curShow) so resume + mid-show archive->YouTube
failover actually fire (were unreachable: showIdx stayed -1 forever)
- capture userActivation BEFORE the metadata await (transient activation expires)
- guard _tryAutoplay with VB.mode!=='youtube' so the fallback isn't stomped by
the old 3-song wishlist announce + a duplicate unlock listener
- _onPlayerError bounded (only genuine-unavailability codes 100/101/150, <=3 hops,
each video once) + refreshes on-screen title/link; harden the gesture-unlock race
- persist resume in fallback mode too
- era-match unit-tested in node (1973->1973, 1991->1991, etc.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012XLgczMhQr91Ad5jL38JM4
339f860 · 2026-09-03 · Put all dock pills (Pause/Restart + the 5 mode toggles) on one line
Was two vertical stacks side by side. Now a single horizontal row on
desktop widths (>=1180px) where it fits without crowding the camera
and museum-label panels; falls back to the original stacked layout
below that, same as the file's existing 820px breakpoint pattern.
b7cdfc8 · 2026-09-03 · Music room: YouTube era-matched video-library backdrop + archive.org failover + resume (TK-11178)
- 18-video embed-verified library (1969-1995), nearest-year era matching
- Every show: muted era-matched official GD concert video as #stage backdrop
- archive.org down -> unmuted YouTube concert becomes the audio (replaces the
old dead 'open archive.org player' fallback that also failed during an outage)
- localStorage resume; venue button toggles the video backdrop; React-to-Music
disabled on the YouTube stream (Web Audio can't read a cross-origin iframe)
- Timed the two hot-path archive.org fetches so an outage fails fast to fallback
- Mutual audio exclusion enforced (no double audio); verified end-to-end via
Playwright against the live archive.org outage
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012XLgczMhQr91Ad5jL38JM4
f3c92ee · 2026-09-03 · docs(TK-11100): Option A patch artifact for the scarlet-riverboat-masquerade merge handoff
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ddgxmase3XCnLRxVyaE1LD
f5e5893 · 2026-09-03 · room(TK-11100 F1): default Music Room COLLAPSED on narrow mobile (<=480px) — Steve-approved Option A
On <=480px the position:fixed Music Room panel overlaid the dock controls
(measured 0/7 dock buttons tap-reachable while expanded on a 390px screen;
reproduced identically on Chromium/WebKit/Firefox/Chrome — pure layout/z-order).
On-load matchMedia(<=480px) now starts the room data-open=false so the dock is
free; one tap on #mrToggle re-expands it. Desktop/tablet keep it EXPANDED so
revealing the chrome shows a working player in one tap (CTA/screenrecord
CRITICAL #1). CSS/attr-only, reversible via git revert.
Verified local (harness ROOM_URL=127.0.0.1): dockTappableExpandedPct 0->100 on
all 3 dock buttons, dockOccludedByMusicRoom true->false; 0 new console/page
errors; mobile re-expand + desktop-stays-expanded proven via DOM.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ddgxmase3XCnLRxVyaE1LD
7bf0e6c · 2026-09-02 · TK-11100: commit localhead QA audit trail (text/JSON only; binaries stay ignored)
Cross-browser room verification of commit 8917dd6 (blob 6aaa35e, 17-show
catalog): PASS 4/4 (Chromium+WebKit x desktop+mobile), served loopback-only,
proven ahead of stale live (room path 404). Evidence relocated out of the
gitignored verification/ tree per DTD verdict B (relocate method) so the
lightweight audit trail is durable in history while the heavy PNGs +
three.js fixture stay ignored (honors fcb5365 100MB-limit protection).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B7oGXaBnX1Hx23zroNbkqb
29702f8 · 2026-09-02 · docs(TK-11100): 390px mobile dock/Music-Room overlap — reproduction + proposal patch
Read-only vs room/index.html (dead-orb owns it). Confirms the order-independent
390px overlap (8/8 dock buttons intercepted by the expanded MR), tested 8 fix
candidates, recommends candidate K (stack bottom groups + compact dock):
verified 7/7 dock + 3/3 MR transport + labelBtn tap-reachable, 0 pageerrors.
Two documented residuals (cams 3rd-button corner overlap; MR-top overflow →
sticky-transport) left for the file owner to finalize.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014nfErRV5Sc4ULyQY5rsjL6
33ede49 · 2026-09-02 · room recovery: remove completed RECOVERY-MISSION.md (TK-11097 done)
Reconstruction landed in 2c062a1: all 6 dead-orb blocks + parallel base,
verified (3 scripts/0 errors, all markers, headless 0 pageerrors, #mrNow='Cueing the set…').
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014nfErRV5Sc4ULyQY5rsjL6
062e20e · 2026-09-02 · docs(TK-11101): perf+a11y audit of room/index.html — findings + reviewed patch (not applied; for dead-orb)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PbuCGne4EgqBfU2KzJGhXL