development log
The Rack can act. The model still cannot.
FF00 Studio reached a larger pre-alpha checkpoint: Surge control survived Waveform, worker replacement stayed bounded, and the first local advisor was deliberately given no mutation authority.
The last FF00 Studio note ended with a deliberately limited claim: I could kill an external worker without killing Waveform. The Rack still could not host the synth that motivated the project, Master could not control a live Rack, and the local model boundary was little more than an endpoint check.
Today those pieces met for the first time.
This is still not a release. It is a pre-alpha checkpoint in one disposable Waveform 14.0.49 edit, with one installed Surge XT 1.3.4 build and one Windows machine. But it is the first session where the architecture behaved like the product rather than a collection of isolated harnesses.
Surge outside the DAW process
FF00 Rack loaded Surge inside its own worker rather than inside Waveform. Master found the live Rack, inspected its worker, and read all 2,855 parameters exposed by that Surge build. It then addressed one exact parameter by its stable host ID.
The authority sequence mattered more than the knob:
- Preview changed the live worker value without changing committed Rack state.
- Discard replaced the worker and restored the exact committed value.
- A second Preview, followed by Apply, advanced the committed revision once.
- Waveform save, close, and reopen restored Surge and the applied value in a fresh worker.
Opening Surge’s native editor followed the same conservative rule. The Rack treated the editor session as Preview until an explicit commit. Discard closed the worker-owned window and restored committed state instead of quietly saving whatever the plugin happened to contain.
I also ran two Rack instances at once. Each had its own runtime identity and worker. Changing the selected parameter on the second Rack did not change the first. That is a small result with a large consequence: Master is addressing a specific live executor, not whichever plugin happens to answer first.
Killing the worker again
The earlier worker test proved that Waveform could survive a child process ending. This time the supervisor was active.
During playback I terminated one exact Rack worker. The sibling worker stayed alive, Waveform stayed responsive, and a replacement worker appeared with a new identity. It did not enter an unbounded restart loop. I heard no click, dropout, silence, or change in the sound during the check.
That last sentence is listening evidence, not a sample capture. I am not turning it into a claim of mathematically click-free recovery. The component harnesses already verify delayed-dry continuity; a future host capture still needs to measure the transition itself. The useful result today is narrower and solid: the worker failed, replacement remained bounded, the host lived, and the audible result did not call attention to itself.
Closing the edit then left no FF00 workers and no live Rack registrations behind.
The model gets fewer privileges than the Rack
The local assistant was the source of this project, but it is intentionally arriving after the executor boundary.
The first Ollama integration now implements Discuss only. It accepts a prose question and a small set of verified facts already visible in Master. It receives no Rack tools and cannot construct Preview or Apply operations. Its response must fit a strict schema containing a summary, observations, non-binding options, and unknowns. Rust validates that response before the UI displays it.
The transport is equally narrow: canonical loopback, no proxy, no redirects, bounded prompt and response sizes, a fixed timeout, and one correction attempt for malformed structured output. This does not make model advice true. It makes model output contained.
The installed qwen3:8b completed the first structured music-advice probe in
23.22 seconds. The 14B model exceeded the 180-second usability timeout on the
same small probe, so 8B is the development default on this machine while model
selection remains replaceable. Neither result touched Waveform or the Rack.
Where the milestones actually stand
This session moved several tracks forward without completing them:
- the worker bridge now has live evidence for bounded replacement and cleanup;
- Surge hosting, native UI, parameter enumeration, state restoration, and controlled audio/MIDI have passed their first host path;
- Master discovery and exact Preview / Discard / Apply have worked across two Racks;
- the first local-model provider can discuss, but has no path to mutate state;
- PluginKnowledge, semantic Surge recipes, the constrained graph, transcription, reference analysis, and mix/master workflows remain ahead.
The unresolved work is not decorative. The full host PDC matrix, offline and variable-block behavior, explicit current-user pipe permissions, captured recovery audio, request cancellation, Waveform scripting, and network observation remain release gates.
Still, this is the first version of FF00 Studio where the division of labour is visible: the model may have an opinion, deterministic code decides what exists, the Rack owns the reversible candidate, and only an explicit Apply changes what survives reload.
Read the updated FF00 Studio project record or open the technical architecture appendix.