Skip to content

v0.99.45

Choose a tag to compare

@mrain1p mrain1p released this 17 Sep 22:33
· 32 commits to main since this release
80470d6

A review of the whole app — the code read from eighteen angles, every finding argued against the code before it was believed, and the DJ's tools drilled against the live station. What it found, in the order it would bite a caller:

  • The DJ can be cut off mid-sentence again. When the station's voice came back while the DJ was saying "alright, I'm back", the line that was supposed to be cancelled played on anyway, over the top of the station. Three more faults in the same guard: a call that came in while the booth was mid-link could leave the guard stuck thinking the DJ was still on air for the rest of the call, the caller was never shown the "on hold" chip during that wait, and a hold that timed out could fire a stray "where were we?" into a conversation that had been running for a minute.
  • The station stays quiet while a call is live. Two ways it could be left talking over a caller: if the station refused the mute at the moment it was asked, nothing ever tried again; and a caller who rang in during the second the last call's mute was being lifted got no mute at all. The DJ also no longer leaves the station muted for three minutes after a caller hangs up.
  • Requests, albums and mixes say what actually happened. The booth answering a request in words without queueing anything was reported to the caller as "it's in the queue". Asking twice for the same song spent a second action on nothing. An album the station capped at thirty tracks marked all forty-five as queued, so a later pick was refused as already there. "Play Greatest Hits" could queue two different records at once. "Pull Yesterday" could also pull "Yes", and clearing a run could pull another caller's tracks when the station failed to answer. A refusal that came with a reason stopped counting as a refusal at all, so nothing caught the DJ claiming it had worked.
  • The DJ stops reaching for tools the line never gave it. On the settings an anonymous caller actually meets, a search result ended by telling the DJ to queue the chosen record with a tool that is off by default. The DJ did exactly that, was refused, and told the caller the record had landed anyway. Six places in the tools' own answers named a tool that might not be there, including what to do when a search comes back empty. Each now says what this line can actually do — and says so plainly when the answer is that it cannot queue anything at all.
  • A caller could not be quietly cut off from what they asked for. A misspelt artist made the DJ say the station could not line up a run at all, rather than that the artist was not on the shelf. A track this call queued that had since played was refused as "still waiting its turn".
  • The DJ hears the truth about the weather and its own words. A temperature of exactly zero came through as "It's Clear, °C". Ordinary speech in brackets — a band name, "(thanks)" — was being deleted before it was spoken. And the prompt no longer tells an open caller the DJ can do things the same prompt later says it cannot.
  • Two ways a stored key could leave. Typing an address into the TTS or model box and letting the panel refresh its list sent the saved key to that address before it was ever saved. Fixed for both.
  • A caller could free their own line. The hangup beacon identified a finished call by its room name, which the caller holds — so a caller could free their own slot and ring straight back while still on the air, past the one-at-a-time check and the concurrency limit. It now has to show a secret minted with its token, and the worker signs its own beacon with the key both halves already run on.
  • Two pixel faults on the card as it sits on a web page. The player's genre chips were drawn with their bottom six pixels cut off under the playhead, and with an open line up the phone face showed "ALSO ON THE LINE" with the sentence beneath it hidden. Both found by pressing every control on every card with the phone in hand, and both fixed inside the 620x544 card's own rules.
  • A hidden tab bar no longer paints down the side of a landscape phone. With only one card to show there is no tab bar, but turned sideways it came back anyway as a 56-pixel rail the full height of the screen, over the card.
  • The guide's portrait opens without squeezing the show's name. Pressing the host's picture enlarges it; on a phone the name beside it was crushed to "THE O…". The name now drops under the picture, whole.
  • The panel no longer offers a tool no caller could reach. With the one-tool finder switched on and every search switched off, the tools reference listed it anyway — the DJ was never given it, because a dispatcher with nothing to dispatch is not worth the hop.
  • Smaller, but each its own fault: the address a caller is judged by could be chosen by the caller; a bad station address in the settings fell to the built-in default instead of the one in the environment; a URL with a note pasted after it was accepted; saving two settings at once could be refused for a reason that was no longer true; the operator's prompt preview showed a different prompt from the one the DJ gets; a text-line caller and a phone caller with the same code could be given different permissions; the station's own push file could be read half-written; and the panel's Open Lines card can count the answers a line drew.
  • Under the hood: every fix above carries a test that names what went wrong, and the checks that find them got a great deal sharper. The browser harness runs in CI, presses every control a caller can reach, drives the settings page a page at a time — twelve pages opened out and 63 controls pressed on every release, against one before — and can now be shown the afternoon when the station, the model and the voice are all down, to check what the page says then. The drill runs the line as an anonymous caller meets it rather than as the operator, which is what found the queue fault above, and its coverage set reaches ten tools it could never ask for. And four checks that had been passing for the wrong reason were tightened: one was letting a whole module ship untested on a word in someone else's comment, and one is why a hidden face bar went five releases with a fix in place that never won.