The platform has exactly two built-in roles: the scheduler (control plane) and the development machine (execution plane). Developers, testers and every other system are not containers or registered instances — they hold a sideload token (sdl_…) and call device → control plane → this host's root scheduler → development machine. A device only talks to the control plane: it never learns the scheduler address and holds no instance credential. A sideload has no heartbeat and takes no lease, and its permissions are a closed scope set.
① Hold a sideload token→② Submit a task→③ Scope check→④ Scheduler queues / dispatches→⑤ Development machine runs→⑥ Files collected→⑦ Client downloads artifacts
Exactly two built-in roles
Inside the platform there is a scheduler and at least one development machine. Developers, testers, CI jobs, scripts and any other system 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.
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.
Lifecycle and audit
last_seen_at is updated at most every 30 seconds and the token reads online within 120 seconds. Deletion or expiry takes effect on the next request with 403. Token creation and deletion are audited; the token and its hash are never logged.