Repository navigation
Field fixes: the state dir that hid the audio, and four acts tuned to the notes - #37
Merged
Merged
Conversation
The field bug behind "per chapter (0/7 here)" with the files sitting in
var/audio: runtime_state_dir returned a bare relative Path("var"), so a
service unit with no WorkingDirectory= (systemd defaults to /) silently
read and populated /var — while the pattern registry, anchored by
__file__, kept working, which is exactly why nothing else looked wrong.
The default is now anchored to the repo the same way the registry is;
an explicit --store still wins verbatim, and the resolver test now
proves the default is CWD-independent.
Diagnosability so the next mismatch names itself: /api/audio returns
{dir, files} — the resolved directory the stage actually reads — the
page's empty-inventory state shows that directory in the selector, and
AudioPlayer logs it at startup.
Operators whose service ran without a WorkingDirectory have live state
under <old CWD>/var (e.g. /var/stage/queue.json); copy it into the
checkout's var/ to keep the queue, or just requeue.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N97HVk3sAr5jRGYodXcDoC
embers: net growth through the first two and a half minutes — the gain climbs 0.40 to 1.35 by 2:30 and keeps rising to 1.50 underneath the scars, so every gust knocks the fire down and it comes back stronger; mortality eased to 0.06 so the bed stays full; strong to 3:42, then the last gust and the dying fall share the final half minute (verified: mean climbs 0.057 -> 0.111 through two gusts, holds 0.08-0.10 to 3:38, 0.008 at 4:08). veils: a VEILS_NIGHT palette — violet-blue dark sky, green curtains, high fringes turning through blue into a real violet band — and a new AuroraVeils.hot_hue so the burnt-through cores burn purple-white here (green-white stays the default elsewhere). At the crest ~17% of lit lights read purple against the green; calm keeps a trace. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N97HVk3sAr5jRGYodXcDoC
The opening was a diagram: every seat igniting at once, each flame fading in over ~15 s on the wide seniority edge, all of them identical. Now a flame CATCHES — a 2 s take with a flare-and-settle overshoot (ignite_flare rides the ignition edge, so it needs no extra state) — and the sculpture's bones light unevenly across the first ~10 s in hash order (anchor_spread), each seat nudged off its exact vertex (anchor_jitter_deg), with the stray candles held back a beat and then interleaving. And no two flames alike (vary): some burn brighter, pools differ in size, each candle gutters on its own weather — rare irregular deep dips, a few near-extinctions that recover — a die_frac of them quietly go out early and stay out, and the snuff wave's edge is ragged, some flames leaning a beat longer than others. All parameters default off; the koln part-iib candles are untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N97HVk3sAr5jRGYodXcDoC
then nocturne/blackout Falls are no longer meridian-bound: each star streaks away at its own hash-chosen heading — any direction — and burns out mid-sky rather than needing an edge to exit by. The streak wears the star's own color: gold ones fall gold, blue ones blue (the pre-fall flare keeps its tint too, and the fixed white-gold overlay is gone). The shower is now one single swell: every stretch denser than the last (median gaps 3.0 s -> 0.9 s -> 0.27 s across the act) with no keepers — the LAST star falls at the end of the span while the sky's own airglow floor drains to nothing beneath the final falls (end_black_at), so it falls on true black. Then the black holds as its own chapter, nocturne/blackout: a new Blackout primitive and a 20 s closing movement — silent, trackless, skippable like any chapter. The duty audit exempts blackout by name and no longer polices endings (bodies still carry the never-dead law); eluvium.mp3 now times the starfall chapter itself, fading at the cut. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N97HVk3sAr5jRGYodXcDoC
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.
The
(0/7 here)root causeruntime_state_dirreturned a bare relativePath("var")— CWD-dependent — while the pattern registry anchors to the repo by__file__. A service unit with noWorkingDirectory=(systemd defaults to/) therefore read and silently populated/var/audio,/var/stage/queue.json, … while patterns kept loading fine, which is why nothing else ever looked wrong. Both audio sightings ("wants ♪ apollo.mp3" with the file present; "per chapter (0/7 here)" after update) are this one bug.luminary/statedir.py); explicit--storestill wins verbatim. The resolver test proves CWD-independence./api/audionow returns{dir, files}— the resolved directory the stage actually reads; the page's empty-inventory state names that directory right in the selector;AudioPlayerlogs it at startup.WorkingDirectory=, live state sits under the old CWD (likely/var/stage/queue.json) — copy it into the checkout'svar/to keep the queue, or requeue.nocturne/embers: growing net faster than it's blown out
Gain climbs 0.40 → 1.35 by 2:30 and keeps rising to 1.50 underneath the scars — each gust knocks the fire down and it comes back stronger; mortality eased so the bed stays full. Strong to 3:42; the last gust and the dying fall share the final half minute. Verified: mean 0.057 → 0.111 through the first two gusts, holds 0.08–0.10 to 3:38, 0.008 at 4:08.
nocturne/veils: purples
New
VEILS_NIGHTpalette — violet-blue dark sky, green curtains, high fringes turning through blue into a real violet band — plusAuroraVeils.hot_hueso the burnt-through cores burn purple-white here (green-white stays the default for small_planet and promises). At the crest ~17% of lit lights read purple against the green.nocturne/candles: uneven, unpredictable, subtly different fates
A flame now catches — a ~2 s take with a flare-and-settle overshoot (
ignite_flare) instead of a 15 s fade-in — and the sculpture's bones light unevenly across the first ~10 s in hash order (anchor_spread), each seat nudged off its exact vertex (anchor_jitter_deg), strays held back a beat then interleaving. No two flames alike (vary): brighter and dimmer, wide and small pools, each guttering on its own weather with a few near-extinctions that recover; adie_fracquietly go out early and stay out; the snuff wave's edge is ragged. All defaults off — Köln's part-iib candles untouched.nocturne/starfall: any direction, their own colors, one swell, then blackout
end_black_at) — it falls on true black.nocturne/blackout: a newBlackoutprimitive, a 20 s silent closing movement, skippable like any chapter.eluvium.mp3times the starfall chapter and fades at the cut.blackoutby name and no longer polices endings (movement bodies still carry the never-dead law).Full suite green; mypy clean; black clean.
🤖 Generated with Claude Code
https://claude.ai/code/session_01N97HVk3sAr5jRGYodXcDoC