One control contract for all actors
Human, AI, scripted, and replay actors receive a permitted state view and events, then submit DjCommand intents. Actor callbacks run outside the audio thread and may be asynchronous. An AI model's inference latency does not stall transport.
| Session mode | Example assignment |
|---|---|
| Human vs AI | Human decks 1–2; AI decks 3–4 |
| AI vs AI | Separate versioned actors and owned resources |
| Cooperative B2B | Explicit deck handoff between human and AI |
| Replay vs AI | Recorded human inputs against a new AI run |
| Shadow | AI can propose; no adapter dispatch permission |
Ownership rules
Ownership applies to deck transport, channel controls, and shared resources such as crossfader or master FX. Deck ownership alone does not grant mixer ownership. Resources have one controlling actor and a monotonically increasing ownership generation.
An authorized human takeover increments that generation, revokes the previous actor, and invalidates queued commands under the old generation. Recheck generation when a command executes. A lost browser connection leaves playback running; ownership expires according to the declared session policy and returns to an unowned state. Explicit actor disable revokes pending work without stopping existing audio.
Physical gestures may originate outside the API. Where reliably observable, emit an external human-control event and transfer ownership according to policy. Hardware controls that cannot be observed cannot offer guaranteed automatic takeover; the UI must expose that limitation.
For the first slice use one local human actor. Add two competing scripted actors before model integration to validate arbitration and predictable handoffs.
See RFC 0001 for remaining decisions.