Architecture example · sideload access · v1.0 · 2026-11-14
Example Project Architecture · Sideload Access
Only two roles are built in: the scheduler (control plane) and the development machine (execution plane). Developers, testers, support staff, CI jobs, scripts and external systems are not containers or registered instances — each holds a sideload token (sdl_…) and calls device → control plane → this host's root scheduler → development machine. A device never learns the scheduler address and holds no instance credential. Host boxes stay generic — workspace, agent runtime, console commands and resource admission — with no project-specific operations.
① Hold a sideload token→② Submit a task→③ Scope check→④ Scheduler queues / dispatches→⑤ Development machine runs→⑥ File channel collects→⑦ Client downloads artifacts
Exactly two built-in roles
The platform has a scheduler and at least one development machine. Developers, testers, support staff, CI jobs, scripts and external systems enter through sideload tokens, so no new role, container or dispatch rule is introduced for them.
One fixed call chain
A device calls the control plane; the control plane validates the token, resolves the host and its root scheduler, and forwards the request. The device never sees the scheduler address and never holds an instance credential — the same path the admin app uses.
A sideload is not an Agent
It has no container, no registration, no heartbeat and no lease of its own. Because it reuses the normal task / lease / fencing path, it cannot bypass scheduling, admission or auditing.
Hosts stay generic and scale out
Every development machine exposes the same surface: an isolated workspace, the bound Agent Profile or Shell, console commands within scope, and resource admission before start. Scaling means adding hosts, not defining new roles or project-specific operations.
Least privilege by construction
Scopes are a closed set: tasks:read, tasks:write, builders:read, queue:read and console:run. console:run is granted separately from tasks:write, and unknown scopes are rejected rather than ignored.
Files move both ways
Inputs are uploaded as attachments and land under <workspace>/attachments/. Outputs are collected through the scheduler's artifact channel: any format, SHA-256 verified and returned byte-for-byte instead of being packed into stdout.