Round Lifecycle
A round runs every time the validator’s forward loop iterates. On a healthy host that is roughly every two to three minutes depending on the slowest miner.Fetch tasks
The validator pulls twelve tasks for the round, two per skill type. Each task carries bundle bytes, ground truth, expected policy, canary spec, and timing window.If fewer than twelve tasks are available the round still proceeds. If zero are available the round is skipped.
Prepare bundles (concurrent)
For each task in parallel, the validator:
- Generates a fresh 32 byte nonce
- Derives probe events from the nonce: file path + file content, DNS host, process echo string
- For
rag_knowledgeanddeclarative, injects the canary marker percanary_spec - For declarative canary slots, generates a synthetic safe bundle locally
Select verification group
For each task the validator queries the candidate miner pool for the skill type, filters out miners with three or more collusion flags, picks the top three by reputation as primaries, and randomly samples two more as auditors.If the candidate pool is fewer than five the group degrades. Fewer than three miners disables consensus scoring for that task but the task still runs.
Dispatch (concurrent, all tasks, all miners)
The validator sends a
PhylaxSynapse to every selected miner across every task at the same time. Each synapse carries:- The prepared bundle bytes
- The nonce
- The probe spec derived from the nonce
- The miner’s role (primary or auditor)
- The task deadline (full window for primaries, tighter window for auditors)
- Inference config (proxy URL and allowed models, if set)
Verify each response
As responses arrive (or time out) the validator runs the seven gate verification pipeline:
| Gate | Failure means |
|---|---|
| Deadline | Discarded, no reputation update |
| SSSA parse | Zero, reputation invalid |
| SSSA validity (type, allowed_use) | Zero, reputation violation |
| Sandbox digest (primaries, runtime) | Zero, reputation violation |
| Trace bundle (primaries, runtime) | Zero, reputation violation |
| Probe presence | Zero, reputation invalid |
| Axis scoring | Q in [0, 1] |
Compute SSSA consensus (per task)
For each task with at least three valid SSSAs, the validator computes the seven component consensus score per miner. The score multiplies the miner’s emission for that task.Per task results are written to local memory.
Aggregate (per round)
Per task emission scores are weighted by per type base weight and per miner per type reputation, then summed to a per miner round score:The round score is EMA blended into the running per UID score vector:
Push weights (every WEIGHT_UPDATE_INTERVAL blocks)
If enough blocks have passed since the last push:
- Normalise
self.scoresto a weight vector - Call
subtensor.set_weights(uids, weights)on the chain
Enqueue reruns (async)
For each task, the validator inspects consensus agreement:
- Consensus broken (group split > 50/50) -> enqueue rerun for every diverging primary
- Some primaries diverge -> enqueue rerun for only those primaries
- All agree -> enqueue rerun for one randomly selected primary (sampling)
~/.phylax/rerun_queue.sqlite3 and are pulled by the async rerun worker. The forward loop does not wait for rerun results.Timing Budget
Per round timing assuming healthy miners and no rerun backlog:| Phase | Typical duration |
|---|---|
| Task fetch | < 1 s |
| Bundle preparation | < 1 s |
| Group selection | < 1 s |
| Dispatch + verification | bounded by slowest miner’s deadline (typically 60 to 120 s) |
| Consensus + aggregation | < 1 s |
| Weight push (only some rounds) | < 5 s |
QUERY_TIMEOUT at 150 s.
Async Rerun Worker
The async rerun worker is a separate thread inside the validator container. It pulls one job at a time from the persistent queue.Pull image
docker pull <miner.image_uri>@<miner.image_hash>. If the digest in the pulled image does not match what was declared, fail the job (reputation x 0.5).Run
docker run --rm against the same bundle path with the same nonce that the miner originally received. Tight resource limits (one CPU, one GB RAM, ten minute wall clock).Compare
fs_trace_hashmust exactly equal the miner’s declared hash (the canary write is deterministic)- Semantic agreement on
network.jsonl,process.jsonl,secrets.jsonlmust be >= 0.7
Failure Modes
| Failure | What happens | What to do |
|---|---|---|
| Single miner timeout | That miner’s slot scores zero. Other miners and tasks unaffected. | Nothing. |
| All miners timeout | Round produces no emissions. Round score stays at last EMA value. | Investigate dispatch path. |
| Subtensor down | Validator retries with exponential backoff. | Wait for chain to recover. |
| Rerun queue backlog | Reruns run slower. Reputation updates from reruns are delayed but do not block rounds. | Check Docker disk usage. Consider pruning unused images. |
| Probe event injection fails for a task | That task is logged as skipped. Other tasks proceed. | Inspect validator log. |
What Each Round Produces
| Output | Where it goes |
|---|---|
| Per task emissions | In memory, used for round aggregation |
| Per UID round score | Blended into self.scores EMA |
| Weight vector | Pushed on chain at WEIGHT_UPDATE_INTERVAL boundary |
| Collusion samples | Written to collusion.sqlite3 |
| Rerun jobs | Written to rerun_queue.sqlite3 |
| Round log | Stdout, captured by docker compose logs |
What’s Next
Verification Groups
Selection rules, rotation, and graceful degradation in depth.
Consensus
The full seven component consensus computation.
Sandbox Reruns
Async rerun worker, image pulls, digest verification, semantic agreement.
Probe Events
How probe events are derived from the nonce and what they prove.