Overview
A Phylax validator dispatches typed skill tasks to miners, verifies their submissions, computes consensus across verification groups, and pushes weights on chain. Per round the validator does six things:Prepare bundles
Verify each response
Requirements
- Docker 24+ with the compose plugin (
docker compose versionmust work) btcli(install guide)- 16 GB RAM, 4 or more CPU cores, 100 GB free disk
- Outbound HTTPS to the server URL
- Outbound HTTPS to container registries miners publish sandbox images to (typically
ghcr.io,docker.io) - Your shell user in the docker group:
sudo usermod -aG docker $USER && newgrp docker
Setup
Create Wallet, Register, and Stake
#faucet channel. You need TAO for the registration fee and for stake.Get on the Network Allowlist
- Your validator hotkey ss58
- The source IP your validator will dial from
.env so a rogue impostor cannot trick you.Install and Configure
~/phylax/validator/.env:| Variable | What to set |
|---|---|
PHYLAX_NETUID | 486 |
SUBTENSOR_NETWORK | test |
WALLET_NAME | folder name in ~/.bittensor/wallets/ |
WALLET_HOTKEY | default (or the hotkey you registered) |
PHYLAX_SERVER_URL | server URL |
PHYLAX_SERVER_HOTKEY | pinned server hotkey |
PHYLAX_VALIDATOR_LABEL | friendly label for network dashboards |
Per Round Verification Pipeline
For each response from a miner the validator runs sequential gates. Each gate either passes (continue to the next) or fails (the submission scores zero and a reputation update is queued).Gate 1: Deadline
Gate 1: Deadline
latency_ms > deadline_s * 1000 the submission is discarded with no score and no reputation update.Gate 2: SSSA parse
Gate 2: SSSA parse
Gate 3: SSSA validity
Gate 3: SSSA validity
skill.skill_type must match the task’s skill type. If llm_evidence.allowed_use is present it must be finding_enrichment, mitre_owasp_mapping, or cve_explanation. Violations score zero and flag for reputation violation.Gate 4: Sandbox manifest digest (primaries, runtime types only)
Gate 4: Sandbox manifest digest (primaries, runtime types only)
sandbox_manifest.digest must equal the image_hash the miner declared at registration. Mismatch scores zero immediately, without waiting for the async rerun.Gate 5: Trace bundle verification (primaries, runtime types only)
Gate 5: Trace bundle verification (primaries, runtime types only)
- Total bundle under 30 MB compressed
- Each file under its per file cap
- All required files for the skill type present
- Each file decompresses, parses as JSONL, and hashes (with
tssorted + key sorted + no whitespace normalisation) to exactly the hash the miner declared in their SSSA evidence block
Gate 6: Probe verification
Gate 6: Probe verification
synapse.probe_evidence must contain {file_path, file_content, dns_host, process_echo} derived from the nonce. For runtime types the probe file write must appear in fs.jsonl, the probe DNS host must appear in network.jsonl, and the probe echo must appear in process.jsonl.Gate 7: Axis scoring
Gate 7: Axis scoring
ε = 0.10 the composite Q is zero.Verification Group Selection
For each task the validator selects a five miner group from miners who declared support for the skill type with reputation greater than or equal to 0.2.| Slot | Selection rule |
|---|---|
| 3 primaries | Top three by per type reputation |
| 2 auditors | Random sample of two from the rest of the pool |
Async Sandbox Rerun
The validator does not rerun every primary’s sandbox every round. It triggers async rerun only when needed.- Consensus breakdown
- Some primaries diverge
- Clean consensus
~/.phylax/rerun_queue.sqlite3. A background thread pulls jobs one at a time, pulls the miner’s declared Docker image, verifies the pulled digest matches what they declared, runs the image against the same bundle with the same nonce, and compares:
fs_trace_hashmust match exactly (canary write is deterministic)- Semantic agreement on
network.jsonl,process.jsonl,secrets.jsonlmust be at least 0.7
Collusion Tracking
After each round the validator records per(hotkey, skill_type, round_id) the miner’s agreement with primaries and agreement with auditors. Over the last 30 samples, if a miner’s agreement with primaries exceeds 0.90 while their agreement with random auditors stays below 0.60, the validator accumulates a collusion flag. Three flags eject the miner from group selection until investigated.
Configuration Reference
Required
Required
| Variable | What to set |
|---|---|
PHYLAX_NETUID | 486 |
SUBTENSOR_NETWORK | test or finney |
WALLET_NAME | folder in ~/.bittensor/wallets/ |
WALLET_HOTKEY | hotkey under that wallet |
PHYLAX_SERVER_URL | network server URL |
Recommended
Recommended
| Variable | What to set |
|---|---|
PHYLAX_SERVER_HOTKEY | pinned server signing key for impersonation defence |
PHYLAX_VALIDATOR_LABEL | friendly label for network dashboards |
Tunable
Tunable
| Variable | Default | Description |
|---|---|---|
WEIGHT_UPDATE_INTERVAL | 360 | Blocks between set_weights pushes (one tempo on netuid 486; the chain rate-limit is 100 blocks so going below ~110 risks set_weights returned False: too soon to commit) |
EMA_ALPHA | 0.2 | Per round EMA blending factor |
QUERY_TIMEOUT | 150 | Hard ceiling on dendrite call, in seconds |
PHYLAX_RERUN_QUEUE_PATH | ~/.phylax/rerun_queue.sqlite3 | Persistent queue for async miner image reruns |
PHYLAX_COLLUSION_DB_PATH | ~/.phylax/collusion.sqlite3 | Persistent store for collusion agreement history |
PHYLAX_INFERENCE_PROXY_URL | (empty) | Forwarded to miners as inference_config.proxy_url |
PHYLAX_ALLOWED_MODELS | (empty) | Comma separated list forwarded as allowed_models |
PHYLAX_COMPOSITION_DEPTH | 5 | Default composition_depth for agent_composition ground truth runs |
Set by install.sh
Set by install.sh
| Variable | What it does |
|---|---|
PHYLAX_EVIDENCE_HOST_DIR | Host side absolute path of evidence bind mount. Required for docker in docker. |
DOCKER_GID | Host docker group GID. Validator container joins this group to open /var/run/docker.sock. |
HOST_UID / HOST_GID | Your shell user UID/GID. Container runs as this user so bind mounts stay writable. |
Local State Files
The validator maintains local SQLite state files. Do not delete them while the validator is running.| Path | Purpose |
|---|---|
~/.phylax/rerun_queue.sqlite3 | Persistent queue of pending async miner image reruns. Survives validator restart. |
~/.phylax/collusion.sqlite3 | 30 round window of per (miner, skill_type) consensus agreement data. |
| Docker image cache | Per miner sandbox images pulled at rerun time. Docker manages this automatically. Use docker image prune -af if it grows too large. |
Troubleshooting
Server registration failed: 403 Forbidden
Server registration failed: 403 Forbidden
Server identity mismatch
Server identity mismatch
PHYLAX_SERVER_HOTKEY is wrong. Confirm the pinned value with the operator and update .env.'no dispatchable miners' log line
'no dispatchable miners' log line
'trace verification failed' for many miners
'trace verification failed' for many miners
'sandbox digest mismatch' for a specific miner
'sandbox digest mismatch' for a specific miner
PHYLAX_SANDBOX_DIGEST does not match the image_hash they declared at registration. The miner needs to update either their env or their registration so the two agree.'probe verification failed' for many miners
'probe verification failed' for many miners
'docker pull failed' log line during rerun
'docker pull failed' log line during rerun
Rerun queue keeps growing
Rerun queue keeps growing
docker info works. Consider raising WEIGHT_UPDATE_INTERVAL to slow rounds.top_score stuck at 0.000
top_score stuck at 0.000
set_weights returned False
set_weights returned False
btcli stake add more TAO, or wait and try next interval.What Makes a Validator Run Well
A well functioning validator has:Reliable server connectivity
Public network egress for image pulls
Docker as the host user
docker run directly. The container user must reach the Docker socket.