Milestones
List view
Goal: The host creates a one-time guest link. The guest uses it for soundcheck and broadcast, then the link stops working. Screens follow the flow: https://flow-lab-chi.vercel.app/moafunk/ Scenario: Guest · Take-over. Adds "Create guest link" on Episode. Exit criteria: - The scenario clicks through exactly as the flow defines it. - Guest password logins are gone (part of https://github.com/phaabe/live.moafunk.de/issues/739, in P2). - Every ticket is merged and deployed to production. - Smoke check passed. Tag `r5`. Before starting: the flow has no button from Studio · On Air to Take-over finished. Add it to the flow first. https://github.com/phaabe/live.moafunk.de/issues/739 also asks for email login; the flow keeps username login, and the flow wins.
No due dateGoal: Hosts mark moments on air and pick 3 in Wrap-up, and Publish queues the Instagram posts. Screens follow the flow: https://flow-lab-chi.vercel.app/moafunk/ Flow parts: Moments on Studio · On Air, "3 moments for Instagram" in Wrap-up, the Instagram line in Published, and Announcements on Episode. Exit criteria: - These screens match the flow. - Every ticket is merged and deployed to production. - Smoke check passed. Tag `r4`.
No due dateGoal: Schedule lists the free slots of the host's shows, and each one opens Book Slot. Screens follow the flow: https://flow-lab-chi.vercel.app/moafunk/ Flow parts: the Free slots block on Schedule. It uses the show rhythm from R0. Exit criteria: - Schedule matches the flow. - Every ticket is merged and deployed to production. - Smoke check passed. Tag `r3`.
No due dateGoal: Publish in Wrap-up uploads the recording to SoundCloud as a private track and adds it to the show's playlist. Screens follow the flow: https://flow-lab-chi.vercel.app/moafunk/ Flow parts: the SoundCloud block in Wrap-up and the SoundCloud line in Published. Exit criteria: - Wrap-up and Published match the flow. - The upload works after the token expires (https://github.com/phaabe/live.moafunk.de/issues/302), and a second recording part never deletes the first (https://github.com/phaabe/live.moafunk.de/issues/293). Both tickets sit in P1 today. - Every ticket is merged and deployed to production. - Smoke check passed. Tag `r2`.
No due dateGoal: New hosts set their own password and recovery email, and every host can reset a forgotten password by email. Screens follow the flow: https://flow-lab-chi.vercel.app/moafunk/ Scenarios: Host · First sign-in, Host · Forgot password. Adds "Forgot password?" on Admin Login. Exit criteria: - Both scenarios click through exactly as the flow defines them. - Password-reset mail works in production (https://github.com/phaabe/live.moafunk.de/issues/722, now in S1). - Every ticket is merged and deployed to production. - Smoke check passed. Tag `r1`.
No due dateGoal: A host creates a show, books an episode, goes live or plays a pre-recorded set, and the show is recorded. Every screen follows the flow: https://flow-lab-chi.vercel.app/moafunk/ Scenarios: Host · New show, Host · Show day, Host · Live episode, Host · Pre-recorded. Left out on purpose (later milestones): Free slots, Announcements, guest link, Moments, SoundCloud, Instagram, "Forgot password?". UNHEARD is parked. Exit criteria: - The four scenarios click through exactly as the flow defines them. No host screen shows anything the flow lacks. - Every ticket is merged and deployed to production. - Smoke check passed: one live and one pre-recorded show, each through the archive mp3. Tag `r0`. Known gap: a connection drop still loses the audio of the gap. The flow asks for loss-free recording on Studio · On Air. R0 ships without it (Anton, 2026-11-02).
No due date•1/2 issues closed- explore UX with a mockup and iterate over building mockups and testing it by clicking through it, making sure that it feels right from a users perspective acceptance criteria - decide for a UX concept - put concept as MD into `docs/ux/` - add mockup to `explorations/ux/
No due dateStatus: parked Goal: The old relay and Lightsail are deleted, and secrets are scoped and no longer kept in a hand-edited host file. Exit criteria: - Every ticket is merged and deployed to production. - Smoke check passed. Tag `p7`. https://github.com/phaabe/live.moafunk.de/issues/148 waits for S6, which settles how the API gets its config.
No due date•0/3 issues closedStatus: parked Goal: Hosts can go on air from OBS or BUTT, prerecorded shows take their length from the file, and developers can go live against a local harbor. Exit criteria: - Every ticket is merged and deployed to production. - Smoke check passed. Tag `p6`. Starts after S9. https://github.com/phaabe/live.moafunk.de/issues/288 can start after S8.
No due date•0/3 issues closedStatus: parked Goal: Voicemail upload works on iPad, voicemails get a phone filter, and AI bios stop repeating words. Exit criteria: - Every ticket is merged and deployed to production. - Smoke check passed. Tag `p5`.
No due date•0/3 issues closedStatus: parked Goal: The bot reminds UNHEARD artists before their show and warns when a final recording is missing. Exit criteria: - Every ticket is merged and deployed to production. - Smoke check passed. Tag `p4`. Needs the backend bot from https://github.com/phaabe/live.moafunk.de/issues/303 (S4).
No due date•0/2 issues closedStatus: parked Goal: The public site has an Impressum, a schedule and show pages, and finished shows can be replayed. Exit criteria: - Every ticket is merged and deployed to production. - Smoke check passed. Tag `p3`. The Impressum (https://github.com/phaabe/live.moafunk.de/issues/49) is a legal duty and ships through Pages at any time.
No due date•0/3 issues closedStatus: parked Goal: Hosts log in with a verified email and reset passwords themselves, guests get a show-limited link, and artists can edit their profile. Exit criteria: - Every ticket is merged and deployed to production. - Smoke check passed. Tag `p2`. Needs password-reset mail (https://github.com/phaabe/live.moafunk.de/issues/722, S1).
No due date•0/4 issues closedStatus: parked Goal: After a show, the recording reaches SoundCloud without a reconnect, a second part never deletes the first, and posts use artist names. Exit criteria: - Every ticket is merged and deployed to production. - Smoke check passed. Tag `p1`. Start this one first: SoundCloud upload returns 401 on every show today. It rides the O1.2.5 deploys after S1. https://github.com/phaabe/live.moafunk.de/issues/302 adds DB columns, so it needs a word with the backend lane.
No due date•0/4 issues closedGoal: A Supervisor starts and scales the runners within hard limits, a Coordinator posts a daily digest, and Security and Architect checkers gate risky work. Exit criteria: - `agentctl up` brings everything back after a reboot with no manual step. - A digest is posted every day. Every spawn stays within the limits. - Every PR that touches a security path has a Security verdict at its merged head. - Release: the check holds 3 days in a row, tag `a5`.
No due date•0/6 issues closedGoal: A Releaser prepares each milestone release, and a Verifier of the other agent kind checks evidence for the exact candidate. Exit criteria: - The next S release is prepared by `release-prepare` and passes `release-check` plus a Verifier verdict. - Anton only approves and merges. A changed candidate never reuses old evidence. - Release: the check holds 3 days in a row, tag `a4`.
No due date•0/5 issues closedGoal: Anton writes a rough request. Agents make it Ready through a proposal and a review by the other agent kind, and a Steward keeps the board and branches clean. Exit criteria: - At least 2 rough requests reach Ready without Anton editing them, and 1 of them merges. - Every red CI run on the integration branch or `main` gets a Steward ticket within 1 h. - No board status contradicts its PR for more than 1 h. - Release: the check holds 3 days in a row, tag `a3`.
No due date•0/7 issues closedGoal: A second Claude and a second Codex runner work in parallel, with no duplicate work and no new Anton steps. Exit criteria: - All four instances pass the A1 checks. - Never two active leases on one issue or one PR head. 0 writes refused as `lost`. - The shared reader is on, normal polling uses 0 GraphQL, and peak use stays below 50 % of the hourly limits. - At least 4 tickets merge, and every instance merges at least one. - Release: run the activation checklist in https://github.com/phaabe/live.moafunk.de/issues/456, the check holds 3 days in a row, tag `a2`. v1 leases without takeover: a restarted instance resumes its own leases. Docker containment comes later.
No due date•0/8 issues closedGoal: A Ready ticket goes from claim to merge with no action from Anton, and runner stops are rare and visible. Exit criteria: - Each runner logs a finish event at least every 30 min. - 0 preflight blocks, hold files, stale-lock refusals and re-seals. Free disk never drops below 20 GB. - At least 2 tickets go from Ready to merged with no `needs-anton` and no Anton step. - At most 3 error or timeout finishes in a row. A refused tick reports `blocked`, never `ok`. - Release: both runners run it, the check holds 3 days in a row, tag `a1`.
No due date•0/12 issues closedGoal: The page, the lock screen and ICY show what is really on air. Exit criteria: - B5.2 serves one public programme projection and `/now-playing.json`. - F5 applies metadata and artwork. F6.1 moves admin readers, then B5.2.4 removes private fields. - O4.2.1–O4.2.3 public routes and O4.3 reload continuity work. R1.1.2 and R1.1.3 pass. - Release (https://github.com/phaabe/live.moafunk.de/issues/346): observe two complete shows on real devices, tag `s10`. This reaches the long-term goal of the station track.
No due date•0/8 issues closedGoal: Between shows the station plays an approved fallback instead of going silent. Exit criteria: - P2.2.1 is frozen. O3.1.2 and O3.1.3 source formats and isolation are tested. - The O3 fallback is published, and the final selector is the output authority. - B5.1 reconciles the running Liquidsoap process. B4.2 plays the pinned local file. - O6.1 checks the public MP3 from outside. F3.1 makes continuous mode a release profile. - Release (R2.2.2): turn it on in a media window with MP3 rollback ready, tag `s9`. Needs operator input: the approved fallback and ident audio.
No due date•0/9 issues closedGoal: Prerecorded files are checked before airtime, and shows get an editable public presenter and stable artwork. Exit criteria: - B4.1 prepares verified ready assets. - B6 publishes the presenter and immutable artwork. Admins edit the presenter (F6.2), which replaces “Hosted by <username>”. - The F3.2.3 artifact matrix is agreed, and admin errors are shown (R1.1.1). - Release: turn on B4 staging and publish artwork, tag `s8`.
No due date•0/8 issues closedGoal: Recordings survive crashes, restarts and full disks, and they reach the backup quickly. Exit criteria: - B3 manifests, idempotent archive reconciliation and verified-only cleanup are in place. - O5 reserves and limits are in place, and SQLite settings are applied after a check. - Local alert rules cover disk, recording backlog, WAL and backups. Backup lag is bounded (O7.2). - R1.2.3: crash, R2 outage and full-disk runs lose no recording. - Release (R2.1.3): turn on B3 recovery, tag `s7`.
No due date•0/9 issues closedGoal: Every API deploy goes through a persistent maintenance gate and a fenced host executor that never cuts or late-starts a show. Exit criteria: - The B2 gate and the O2 executor are in place, with readiness profiles (O1.2.3). - Maintenance alert suppression is tied to the operation ID (O6.2.3). - R1.2.1 (race against starts) and R1.2.2 (killed or paused executor) pass. - Release (R2.1.2): install the gate in the O1.2.2 window, rehearse rollback and API-down recovery. From then on the gate is the only deploy path. Tag `s6`. 10 tickets, above the 3–8 rule: a gate without its executor or its proof cannot ship.
No due date•0/10 issues closedGoal: Every broadcast keeps one identity from start to stop. A stop, reconnect or takeover never cuts or corrupts the next session. Exit criteria: - B1.1.4, B1.2.1–B1.2.4 and B1.3.1–B1.3.4 are done, with tests. - Rehearsal never counts as a public broadcast. - Release: O1.2.5 deploy, smoke check with a takeover and a reconnect, tag `s5`. B1.2 and B1.3 need only P2.1.1 (S3), so they can ship before the gate.
No due date•0/4 issues closedGoal: Backups keep 30 days, alerts reach a person, and the contracts the next milestones need are frozen. Exit criteria: - Daily DB snapshots and both buckets are kept for 30 days, and replaced or deleted files survive between runs (O7.1.1–O7.1.4). - Alertmanager posts into the MoafunkBot topic again, and the zero-listener rule no longer fires all the time (https://github.com/phaabe/live.moafunk.de/issues/300, O6.2.2). - The backend bot is on, so missed-start and missing-recording alerts arrive (https://github.com/phaabe/live.moafunk.de/issues/303). - The SQLite decision is recorded (O5.2.4). - P2.1.2, P2.1.3, P2.2.2 and P2.2.3 are frozen. - The O3.1.1 media proof passed on the production Liquidsoap image. - Release: monitoring, backup and host `.env` steps in the O1.2.2 window. Smoke check: a test alert reaches the MoafunkBot topic, and a backup run keeps a dated DB snapshot. Tag `s4`. O3.1.1 is here and not in S9: if the proof fails, the Liquidsoap image must change, and we want to know that early.
No due date•0/9 issues closedGoal: Only a show's hosts or an admin can start, take over or stop its broadcast, and public routes leak nothing private. Exit criteria: - The P2.1.1 authorization matrix is frozen. - Manual prerecorded go-live uses the broadcast rule. A takeover is checked again under the final lock. - A guest or an unrelated host cannot stop the stream, and a test covers it. - A forced takeover feeds only the new socket's audio to ffmpeg. - `/status-json.xsl` is closed, `/test.mp3` is closed or protected, and `/api/stream/metrics` needs a session. - The leaked harbor password is rotated, and unsafe harbor passwords are refused before ffmpeg starts (https://github.com/phaabe/live.moafunk.de/issues/705). - Release: O1.2.5 deploy plus a written nginx host step in the O1.2.2 window, smoke check, tag `s3`.
No due date•0/6 issues closedGoal: A listener's audio keeps playing through failed status checks, short network losses and new site deploys. Exit criteria: - One failed, slow or broken status poll never stops audio. - At most one status request runs at a time: every 10 s, with a 5 s timeout. - Stalls retry after 1, 2, 4, 8, 16 and 30 s. A pause by the user or the system is respected. - A new build never reloads a listener who is starting, buffering or recovering. - The bundle and `version.json` carry the same deployment digest. - Release: Pages deploy. Smoke check on one iPhone and one desktop browser: start, short network loss, deploy during playback. Tag `s2`.
No due date•0/7 issues closedGoal: Code reaches production only through a manual, show-safe deploy, so no merge and no deploy cuts a live show. Exit criteria: - A push to `main` only builds. This is true since https://github.com/phaabe/live.moafunk.de/pull/729. - `backend-ci` and `frontend-ci` are required checks and turn red on a failing PR. - The O1.2.5 manual deploy asks for a typed confirmation, deploys an exact image digest and runs one deploy at a time. It runs only in the O1.2.2 window and refuses during a show or 30 min before one. - The inventory and the decision register are complete. Every open item has an owner. - The weekly backup also copies the shows bucket. A written host-file step puts the new backup script on the host. - Password-reset mail works in production (https://github.com/phaabe/live.moafunk.de/issues/722). - Release (https://github.com/phaabe/live.moafunk.de/issues/345): release PR from `dev/312-interim` to `main`, then the first O1.2.5 deploy in a show-free window. Smoke check: status, test broadcast, recording, finalize upload. Tag `s1`. Already merged on `dev/312-interim`, so it ships too: B1.1.6, B3.3.5, B5.2.6, check-config (https://github.com/phaabe/live.moafunk.de/pull/745) and the recording fixes https://github.com/phaabe/live.moafunk.de/issues/724, https://github.com/phaabe/live.moafunk.de/issues/728, https://github.com/phaabe/live.moafunk.de/issues/747 and https://github.com/phaabe/live.moafunk.de/issues/748.
No due date•0/9 issues closed