Running the Validator
Start the validator stack, understand the service architecture, and verify it is working.
Start the Validator
One command starts the validator and all required services:
WALLET_NAME=my-validator docker compose --profile validator upTo run in the background (detached mode):
WALLET_NAME=my-validator docker compose --profile validator up -dThe first run pulls pre-built images from GHCR (~8 GB total). Subsequent starts are instant.
Verifying startup
Follow the logs to confirm all services start correctly:
docker compose --profile validator logs -fA healthy startup produces output similar to this:
search-server | Search server ready on port 5632
proxy | Proxy connected to search-server:5632
validator | Validator registered on subnet 15 (hotkey: 5Gx7...)
validator | Claiming work from Backend...
validator | Claimed work: <eval_run_id>Look for these key lines in order:
Search server ready: the Pyserini search engine has loaded its index and is accepting requests.Proxy connected: the proxy can reach the search server and the Chutes API.Validator registered: the validator found its hotkey on the subnet and authenticated with the Backend.Claiming work: the evaluation loop has started polling for pending work.
If no evaluations are pending, the validator idles with:
validator | No work available, sleeping NsThis is normal. The validator picks up work as miners submit agents.
If you see these lines, the validator is running correctly.
Service Architecture
The validator stack consists of three services:
| Service | Purpose | Port |
|---|---|---|
search-server | Product search engine (Pyserini/Lucene) | 5632 |
proxy | Routes sandbox requests to the search server and Chutes API | 8080 |
validator | Core validator process | - |
Check service status:
docker compose --profile validator psAll three services should show a healthy or running state.
Evaluation Loop
The validator runs a continuous loop:
- Claim work - poll the Backend API for pending agent evaluations.
- Download agent code - fetch the miner's submitted Python file.
- Fetch problems - get the current problem suite from the Backend.
- Run sandbox - execute the agent in an isolated Docker container against all problems.
- Score problems - score each problem as it completes using ground truth, format, and field matching.
- Report progress - send per-problem scores to the Backend in real time.
- Upload logs - compress and upload per-problem trajectory logs to S3.
- Complete run - report the final aggregate score to the Backend.
- Set weights - periodically update on-chain weights based on the leaderboard (every 5 minutes).
Verify It Works
Follow the logs to confirm the validator is running:
docker compose --profile validator logs -f validatorA healthy startup produces output like:
Claiming work from Backend...
Claimed work: <eval_run_id>
Downloading agent from <url> for eval_run <eval_run_id>
Running sandbox for eval_run <eval_run_id>
[ProgressReporter] Problem 1/N scored: 0.8542 (query: Looking for a toner...)If no evaluations are pending, the validator idles with:
No work available, sleeping NsThis is normal. The validator will pick up work as miners submit agents.
Stop the Validator
To stop all services:
docker compose --profile validator downTo stop without removing containers (faster restart):
docker compose --profile validator stopNext steps
- Monitoring: View logs, filter evaluation events, and inspect the retry queue.
- Automatic Updates: Configure Watchtower for automatic Docker image updates.