Skip to content

Tokens and roles

Control knows people and programs by tokens: long random strings sent as Authorization: Bearer <token>. Each token has one role. Control keeps only a token’s SHA-256 hash wherever it can, so the machine control runs on holds nothing that signs in.

RoleSettingDashboardREST APIMCP
OwnerTHERMITE_CONTROL_ADMIN_TOKEN_SHA256 or THERMITE_CONTROL_ADMIN_TOKEN_FILE (required)Signs in. The only token that canEvery routeEvery tool. Commands up to approving and declining promotions
OperatorTHERMITE_CONTROL_OPERATOR_TOKEN_SHA256 or _FILE (optional)NoNoReads; steers; messages a run’s agents and removes messages kept in force; changes a run’s experiment queue and removes its rules; searches the knowledge base and changes which folders a campaign’s agents may read (kb_folders, kb_search, kb_grant, kb_revoke); lists the MCP servers in Settings (mcp_servers), but never adds, changes or deletes one; adds cluster rigs, sets a cluster’s slots, stops, starts and restarts cluster rigs, and moves them onto control’s images; gives rigs’ agents a model; starts runs of campaigns control keeps (start_run), as Start a run does, but never changes a rig’s GPU split there; starts and ends RunPod tests and lists the rigs launched on RunPod, but never launches, stops, starts, restarts, terminates or resets one; reads control’s log, providers and how control set a rig up, with each step’s details
AgentTHERMITE_CONTROL_AGENT_TOKEN_SHA256 or _FILE (optional)NoNoReads and steers. No changes to a run’s experiment queue, no knowledge base tools, no control log, no providers, no rig setup steps, no RunPod, no tools that set rigs up. Refused during a full reset
ReaderTHERMITE_CONTROL_READ_TOKEN_SHA256 or _FILE (optional)No/metrics and GET /v1/rigs/<rig>/live onlyRead tools (not the knowledge base’s), control’s log, providers, how control set a rig up (without each step’s details) and RunPod tests (read only)

“Reads” means the MCP read tools, which every token has: the rigs, a run and its attempts, a run’s experiment queue, rules, the planner’s hand-outs and the owner’s messages to its agents, with who read them (run_queue), events, the leaderboard, daily reports and commands. How control set a rig up (rig_setup) is for the owner, the operator and the reader, not the agent. The knowledge base’s folders and search (kb_folders, kb_search) are for the owner and the operator only: the agent’s and the reader’s tokens see no folder.

“Steers” means these signed commands: assign a campaign, pause and resume a run, redirect it, reset its workers, export now and run a rig check, plus sending a champion to another rig. The operator may also message the agents (message_agent), remove a message kept in force (unkeep_message), change a run’s experiment queue (queue_add, queue_move, queue_edit, queue_drop, queue_accept) and remove a rule (drop_directive). Only the owner approves or declines a promotion.

Some things no token can do over MCP: changing a rig’s settings (other than its agents’ model, which set_rig_model gives, and its GPU split, which the owner’s start_run sends with a new run), accepting a rig’s key, accepting a review or a “not possible” ending, and wiping a rig. The owner does them on the dashboard, and a wipe only as part of a full reset. Only the owner’s token adds, changes, signs in to or deletes an MCP server.

  • _SHA256 holds the token’s SHA-256 as 64 hexadecimal characters. _FILE names a file that holds the token itself, which is meant for local development.
  • Set one of the two for a role, not both. Control stops at start if both are set.
  • The owner’s credential is required. Without it control does not start.
  • The four tokens must all be different. Control stops at start if two are the same.
  • A _FILE setting whose file is missing or empty counts as not set.
TokenWhere it is keptWhat it may do
Rig tokenEnrolled rigs: its SHA-256 in control’s store. Rigs listed in THERMITE_CONTROL_RIG_TOKENS_FILE: the token itself, in that fileThe rig-facing routes for its own rig only: send reports, fetch commands, fetch its model route, its kits and its Git access, its advisors’ models, the MCP servers the runs control assigned it name, with their sign-in, and the past research of the runs control assigned it. A retired rig is refused whatever token it holds
Join tokenIts SHA-256 in control’s storeFetch one rig’s join script or manifest, once, within one hour

The harness has tokens of its own, which never reach control:

TokenSettingUsed by
Supervisor tokenTHERMITE_SUPERVISOR_TOKEN_FILE on the harness, THERMITE_HARNESS_TOKEN_FILE on the supervisor (required)The supervisor, to talk to its harness
Proposer tokenTHERMITE_PROPOSER_TOKEN_FILE on the harness (optional)A person or script submitting changes with thermite submit
Trial tokenMade by the harness for each trialOne worker’s tools during one trial, such as submitting its change or proposing an idea for the run’s experiment queue. It stops working when the trial ends
TokenMakeChangeEnd
Owner, operator, agent, readerthermite token new --out FILE on your own computer: it writes the token to the file and prints its SHA-256 for control’s setting. Locally, the init container of the compose stack (thermite local init), or npm run dev:init in a checkout, writes an owner and an operator token to .dev/secrets/Make a new token, change the setting, restart control. A new owner token signs every browser out of the dashboardRemove the setting and restart control
Rig token (enrolled)thermite rig add, POST /v1/rigs, Add a rig on the dashboard, or a used join commandthermite rig token, or POST /v1/rigs/<rig>/token. The old token stops working at onceRetire the rig: thermite rig retire, POST /v1/rigs/<rig>/retire, the MCP tool retire_rig, or the rig’s page. Bringing a rig back does not bring its token back
Rig token (in the tokens file)Add the rig to THERMITE_CONTROL_RIG_TOKENS_FILE and restart controlEdit the file and restart controlRetire the rig, then remove it from the file
Join tokenAdd a rig › run it yourself, or Make a new join command on the rig’s page. It is shown onceMake a new join command (the earlier one stops working)Revoke it while it is unused, or retire the rig

Make and change tokens gives the steps.

Control’s audit log names who did each thing:

ActorWho
owner:uiThe owner, on the dashboard
owner:apiThe owner, over the REST API or the command line
owner:mcpThe owner’s token, over MCP
owner:operatorThe operator’s token, over MCP
agent:mcpThe agent’s token, over MCP
reader:mcpThe reader’s token, over MCP
rig:<rig>A rig, with its own token
controlControl itself