UNDERTOWCHANGELOG / FIELD NOTESWhat it is now ↗

HOW THE FUCK IT GOT HERE

Day by day,
the station changes its mind.

What changed and why—written as prose rather than commit messages. Including the days Undertow talked itself out of something.

The WTF guide explains what Undertow is now. This is the selective public record of what surprised us and what we still do not know. The listening laboratory ↗ preserves the experiments themselves.

The instrument stopped rather than limped.

Releases 13 through 18 were one sustained attempt to make an authored DJ performance actually perform on air: a receiver clock that could not be fooled by stale transport, a repaired memory guard that judged the renderer on its own image, and a native audio handoff behind hard admission guards — 150 ms of source-phase error, one second of lateness, neither ever relaxed. The guards did their job three times. Release 17's diagnostic refused a buffer 253 ms beyond the phase limit. Release 18's one real public witness arrived 2.74 s late against the 1 s limit; roughly 2.2 s of that sat inside server middleware, the exact subphase unmeasured. The compiled audio never started; ordinary broadcast never broke.

Adrian stopped the goal instead of endlessly repairing it: Release 18 stays the serving baseline, the reviewed-in-isolation transport repair stays unmerged, #539 is parked, and the 12.1 MB evidence archive — refused decision, flushed partial PCM, everything — is retained. Hearing an authored performance on air remains unmet. A station that refuses its own ambition three times, correctly, is not a failure of the instrument. It is the instrument working.

The same day, the listening laboratory gained sound: seven playable Opus derivatives of finished experiment renders — the one-second silence, the inherited rhythm, the friction the fader should have left alone — each one a format conversion of an exactly identified retained render, listed in a publication manifest awaiting Adrian's explicit approval. The wider audition bank stays private.

The DJ made a decision. The safety guard said no.

Release 12 shipped verified backend and Pages files. Two real upcoming transitions then received shadow decisions from the resident DJ: a filtered-identity handoff and a finite echo bridge, both four-node performances. They cost US$0.04 together. Neither reached air. Both renders were refused by the 512 MiB memory guard, leaving the ordinary radio uninterrupted.

The surprising part was what the guard had measured. Linux getrusage retained the station launcher's high-water mark into a newly executed renderer, even though the renderer's own memory could be much smaller. A controlled diagnostic found 44,072 KiB in the inherited counter versus 10,896 KiB in the fresh worker image. It would be a mistake to claim the renderer actually consumed nearly a gigabyte.

The defect and narrow repair keep the 512 MiB bound and demand Linux evidence that a genuinely over-limit renderer is still refused. Release 12 is not patched in place; the new performance mode remains off pending a separately reviewed fix and served-audio proof. A successful refusal is not yet an audible DJ performance.

We gave the DJ a pitch fader. The records argued back.

The obvious lesson seemed simple: when two records run at different speeds, make them agree. We added classic varispeed, pitch-preserving stretch and audible pitch rides to the Performance Compiler. Then we compared all of them with leaving the original relationship alone. That last option turned out to matter.

On A Ghost Declines → Dauerversprechen, the first blind listener preferred the uncorrected 120/132 tension; shared-speed treatment was criticised for harshness and stutter, while stretch remained possible but softened transients in another review. At the smaller Rigid Cell → Outil132 difference, a 2.27% correction was not reliably heard as better. Some alternatives had no completed listening review at all. A numerical match is not yet a musical one.

The public 22-take field edition preserves the alternatives and uncertainty. The live source integration merged, but actual on-air execution still needed Release 12's served-audio acceptance at this entry's cutoff.

A ghost outlived its record. A second of nothing did some work.

The first DJ Performance Compiler made the promises executable: finite echo returns surviving their input, source-contour inheritance, independent spectral and fader movement, measured responses and deliberate silence. There were 24 candidate performances across six pairs and 114 causal-control records, plus inconvenient rejected evidence.

Two model-selected finalists survived an early listen: Ghost's rhythmic trace inside Dauerversprechen's altered material, with roughness and fatigue left visible; and a one-second silence between Ghost and Mouthful, preferred in one comparison over a two-second gap. Other results were disputed. A model misestimated silence timing. Engineering tests could prove the WAV binding, not award taste.

That is why the learning laboratory preserves experiments rather than only polished winners. The compiler was merged and locally usable; its original bank was not secretly another production release.

The same recording came back nineteen minutes later.

An ordinary broadcast replayed the same physical recording after roughly nineteen minutes, even with alternatives available. It was not two records sharing a title. Its exploration cost was a soft preference, not a boundary, and the immediately previous recording was not hard-excluded.

The merged rotation repair provides a configurable recent-airtime window, defaulting to 24 hours when another eligible record exists. When the catalogue really is exhausted, the system can continue, but must disclose it. A penalty is not a guarantee.

One release. Not eleven reasons to declare victory.

Release 11 shipped one immutable reviewed whole tree: 371 matching public files, seven active services and normal health. Bounded TWEAK acceptance kept exact text across tested sessions and reconnect conditions, while returned Lyria text became legible without inventing absent timing data. Test submissions were intercepted, not sent for generation.

The remaining served WebGL and cold-session checks still needed evidence. Generated predecessor bytecode also upset exact staging verification; quarantining the stray copies was not a reason to weaken the integrity check. A real release has edges, not a universal green sticker.

A name that fits a hundred records fits none.

The direct-generation catalogue accumulated repeated and unresolved sleeves. A read-only census of 2,119 banked recordings found 1,391 unresolved proposed identities; the name “M500 / Exact Re-roll” would land on one hundred different recordings. Valid syntax was erasing actual distinction.

The census merged as a read-only proposal tool, not a bulk rename. The unresolved catalogue still needs editorial judgement and guarded corrections. A model proposing a title does not mean a record has found its name.

The GitHub Actions bill was becoming the loudest instrument.

Hosted macOS CI was running for ordinary changes whose meaningful landing checks were Linux/ARM and atlas integrity. Intermediate pushes multiplied runner starts; successful builds prepared more release machinery than was actually being released.

We deleted the hosted Mac workflow and curtailed unnecessary automatic runs while retaining the required Linux and atlas checks. Mac testing stays local. Claimed savings require later billing evidence; deleting the workflow is the fact.

A room you can install is not yet a radio in your pocket.

Undertow gained an installable PWA substrate, with explicit rules against a service worker making stale station state look live. Browser caching should preserve furniture, not invent a broadcast.

Lock-screen audio, Bluetooth interruptions and real background playback still require physical-device evidence. Undertow Live is the next architectural step: one actual final mixed-audio stream without making every phone render the club. The 3D room should be an experience, not a battery tax.

The station stopped losing its mind. Probably.

Fresh visitors had sometimes found an empty programme, or waited twelve to twenty seconds for an answer while the health check insisted the station was alive. We found two concrete HTTP defects. A fairness-session database lookup was blocking the async server, and a successful response whose JSON body broke in transit could replace the last accepted programme with an empty object. Both are fixed.

Then we watched sixty consecutive observations: 240 successful HTTP requests across thirteen records, with no recurrence. That is reassuring, but it is not a root-cause story for the earlier long stalls. Worker-pool and database contention remain plausible limits. The honest result is narrower: two real bugs are gone; the station behaved for half an hour; permanent reliability has not been proved.

The DJ developed an unfortunate theory of tropes.

We asked the DJ to understand why a particular musical lineage works rather than memorising Adrian's vocabulary. It correctly identified repetition, delay and decay as mechanisms, then helpfully treated the actual sonic materials as disposable genre tropes. The result could preserve an abstract causal diagram while abandoning the world that made the diagram meaningful: generic modern bass music wearing the explanation of something more specific.

This was useful. We had taught the system to preserve mechanisms while accidentally giving it permission to discard what the mechanism was made of. The current rule keeps material grammar and causal mechanism together when the source world matters, and the failed theory remains in the evidence. We still do not know whether that correction produces better music. Adrian heard the prepared comparison and answered “neither / neither”, so the research is shelved until a more capable local music model exists.

We moved the projector because the screen was blocking it.

The first liquid-wheel projector technically worked and looked wrong: a cone and wall decal read as an effect pasted onto the room. Adrian rejected it and gave a physical correction—one source on the north side, firing south through smoky space toward the desk. Rebuilding it as a depth-clipped, source-shadowed volume made it feel like light occupying the club rather than a texture on a wall. His verdict was “10000x better. nice direction.”

The surprise was architectural. The hard part was not drawing psychedelic colour; it was respecting where the machine, beam, smoke, walls and bodies could actually be. The browser checks establish graceful failure and stable rendering, not how the room feels on a physical phone or whether this is the final light.

The website became nearly a VR nightclub.

The listener began as a quiet radio page with machinery behind disclosures. That was legible, but it kept turning the station into a website decorated as a booth. We replaced the metaphor with a place: two turntables, mixer, recording deck, physical tapes, crates, distant walls, a dance floor, spatial sound and a body that can walk around. Records now carry their calls and provenance with them instead of opening an unrelated admin surface.

Building the room repeatedly exposed the difference between geometry and presence. A mathematically valid dancer was too tall. A visible DJ arm looked cheap. A speaker click behaved like a transport control instead of a speaker. The compass was backwards. Mobile movement used a bespoke D-pad where a thumb stick should have been. Each defect passed some earlier test; none survived looking at the room as a room.

It is now close enough to a game environment that WebXR is a sensible next step. That does not mean the room is finished, comfortable on real hardware, or artistically accepted. “What the fuck, this is in a browser?” remains the target, not a checkbox we can award ourselves.

The station wrote down its laws.

By now Undertow had accumulated enough corrections to become difficult to explain without lying by omission. The public guide became a two-depth field atlas: an ordinary answer to “what is this?” above a source-checked account of authority, retention, spending and failure boundaries. The deployment path acquired a shared release lock. Backups had to prove an actual restore. Artwork spending got its own ledger. A recording's public eligibility could change without changing its retained identity. These were no longer implementation details. They were laws of the instrument.

The surprise was how often a rule began as a correction to confident prose. A diagram could describe source without proving deployment. A green test could prove geometry without proving a room felt right. “Anonymous” analytics could still create third-party identifiers. Writing the laws down did not make the system finished; it made contradictions visible enough to stop obeying both sides. We still do not know which of today's laws are permanent and which are merely the best account of the instrument we have so far.

Records stopped being output files.

The archive became a room full of objects. A recording acquired a sleeve, printed notes, a position in a crate, a turntable and a tape path. Its call and provenance moved with it instead of opening as unrelated audit furniture. The mixer gained real meters; the monitors became acoustic objects; the DJ viewpoint acquired knees, hips and shoulders. Several versions were physically absurd—the DJ waddled, an arm appeared under the mixer, artwork sat on vinyl as a rectangular plaque—but each failure clarified what it meant for the interface to be a place rather than a page.

The same day, provider refusals and other generation failures were separated from valid retained music. A refusal belonged to one request, not to the whole station; a failed generation path could not withdraw an existing valid recording. This joined two ideas that had looked unrelated: physical objects persist, and failures need somewhere to live without erasing them. We had not yet built the convincing club, but the raw material had stopped being disposable output.

Bring Back stopped meaning “generate it again.”

Early caller memory was shared too loosely. A new call could inherit another person's history, and “bring this back” risked collapsing replay, regeneration, retry and musical return into one vague action. We isolated caller memory and made return explicit: replay hears existing bytes; a retry repeats a failed operation; Bring Back is a new parent-linked call with fresh authority to transform an earlier record. None of those meanings may be inferred merely because two requests look related.

This gave the audience less accidental power and the DJ less room to invent a relationship after the fact. It also exposed how much identity a supposedly simple button carries: who asked, which record they meant, what may be preserved, what may change, and whether another paid attempt exists. The boundaries became sharper, but their musical adequacy did not. A correctly linked return can still be a bad return, and only listening can establish that.

We hid the machinery and accidentally hid the truth.

The first attempt to quiet the interface removed prompt and trace controls from the operator's listening room. That made it cleaner and made the instrument impossible to inspect. Adrian's correction was precise: terrible hierarchy did not mean the evidence was unwanted. The complete call, DJ interpretation, exact provider request, returned blocks, decisions and human notes came back beside each recording. The public listener simultaneously became a calmer paper-and-ink transmission desk, with deeper machinery deferred rather than deleted.

That distinction—progressive disclosure, never evidentiary disappearance—became one of Undertow's foundational laws. It also changed the project's posture. We stopped treating an interface as successful because fewer controls were visible, and stopped treating retained JSON somewhere on disk as human memory. The remaining problem is permanent: evidence can be technically reachable and still be stupid to navigate. Every later room has had to solve both truths at once.

One generation. Human taste.

The first station architecture generated several candidates and let models score them KEEP or NO. It looked like diligence. In practice it created a bottleneck: Adrian could not naturally find and hear everything his own instrument had made, and machine praise often rewarded polished violations of the caller's idea.

So Undertow talked itself out of candidate farming. One caller interpretation now authorises at most one paid generation. Every valid returned recording remains playable regardless of machine status. Automated listening may describe audio, defects and adherence, but it cannot decide whether a record is good. Failed art stays in the archive because it is evidence, not waste.

This made the system less theatrically intelligent and more honest. It did not solve taste. The unresolved work is the whole interesting problem: whether a resident DJ can develop a recognisable hand across very different musical worlds without becoming a house genre, a compliance engine or an imitation machine.