Generate a runner registration token via Settings > Actions > Runners > New self-hosted runner, or via the REST API POST /repos/{owner}/{repo}/actions/runners/registration-token
Download and extract the runner package, then run ./config.sh --url https://github.com/YOUR_ORG/YOUR_REPO --token YOUR_REG_TOKEN --labels gpu,x64,linux to register with custom labels
Start the runner with ./run.sh (or install as a service with ./svc.sh install && ./svc.sh start) so it appears as Online in the repository's runner list
Reference the runner in a workflow job using runs-on: [self-hosted, gpu] — all listed labels must match for the job to dispatch to that runner
Add or remove labels at any time from Settings > Actions > Runners > select runner > Edit, or via the REST API endpoints under /actions/runners/{runner_id}/labels
Verify dispatch by checking the Actions run log for the 'Set up job' step, which shows the matched runner name and labels
Known gotchas
Custom labels are case-sensitive and must match exactly in the runs-on array; a typo silently leaves the job queued indefinitely
Organization-level runners require configuring runner groups and granting repository access before the runner is visible to workflow jobs
The registration token expires after one hour; if config.sh fails with an auth error, regenerate the token
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp