gonka-ai/gonka/mlnode-validate
Claude Code and agent skill by gonka-ai/gonka
- community
Checking that the SKILL.md file is still in the repository.
Validate a deployed MLNode end-to-end against a known-honest reference for a specific model. The caller picks the MLNode URL and the target model; the skill ensures the model is downloaded, deploys it, measures full-system PoC throughput, and verifies a pre-computed honest PoC vector set is accepted under an L2 threshold. Produces a JSON + text report. Self-contained inside the gonka repo (no external code, no callback receiver).
Install
npx vskill@latest install gonka-ai/gonka/mlnode-validateSKILL.md
MLNode PoC v2 Validation
The caller decides what to test. This skill never picks a default MLNode and never picks a default model. Both must be passed explicitly.
This file is the contract. The skill is implemented by two scripts under mlnode/packages/benchmarks/scripts/poc_validation/. Do not read or edit those scripts as part of running this skill -- run validate.py and report what it prints.
Two file types -- keep them straight
The skill works with two distinct artifact kinds. Do not conflate:
- Golden reference (committed in repo): one JSON per supported
model under mlnode/packages/benchmarks/scripts/poc_validation/artifacts/<sanitized model>.json. Pre-computed by the project: contains the honest PoC vectors, canonical PoC params, consensus-default additional_args, and the consensus-default stat_test block. Read-only at validate time.
- Per-run report (produced on the caller's machine, NOT
committed): one experiment directory per validate.py invocation under mlnode/packages/benchmarks/data/experiments/<exp_name>_<ts>/. Layout matches mlnode/packages/benchmarks/scripts/README.md -- one experiment = one server + one model deployment. Each directory contains validate_config.json (inputs), validate_report.json (full structured result), and validate_report.txt (short text summary).
When this skill says "reference", it means the golden file. When it says "report", it means the per-run output.
Available golden references
The repo ships these references under mlnode/packages/benchmarks/scripts/poc_validation/artifacts/. Each one is keyed by model id; the auto-lookup <sanitized model>.json picks one filename per model. Variants beyond the default require an explicit --reference <path>.
| Model | Filename | Vectors | Deploy notes | |
|---|---|---|---|---|
Qwen/Qwen3-0.6B | qwen-qwen3-0.6b.json | 32 | local dev / single GPU | |
Qwen/Qwen3-235B-A22B-Instruct-2507-FP8 (default lookup) | qwen-qwen3-235b-a22b-instruct-2507-fp8.json | 32 | tp=4, FlashInfer baseline. Quick smoke test. | |
Qwen/Qwen3-235B-A22B-Instruct-2507-FP8 (extended) | qwen-qwen3-235b-a22b-instruct-2507-fp8-deepgemm.json | 2000 | tp=2, DeepGEMM MoE backend (VLLM_USE_DEEP_GEMM=1, VLLM_MOE_USE_DEEP_GEMM=1), recorded on 4xB200. Pass with --reference. |
For Qwen3-235B the same model id has two references, and they exercise different code paths (tp-size + MoE backend). When validating qwen235b, run validate.py twice -- once with the default lookup, once with the deepgemm variant -- and report both verdicts. Example:
Each run lands in its own experiment directory, so reports do not collide. If the caller is short on time and explicitly asks for a quick check, the default-lookup run alone is acceptable; otherwise both should be run.
Required inputs
The caller MUST supply both:
MLNODE_URL-- base URL of the MLNode under test (e.g.
http://1.2.3.4:8080). No default.
MODEL-- target HuggingFace model id, exactly as the MLNode
would receive it (e.g. Qwen/Qwen3-235B-A22B-Instruct-2507-FP8, Qwen/Qwen3-0.6B). The full org/repo form. No default.
If either is missing, ask the caller for it before running anything. A short reference like "qwen 0.6B" is NOT enough -- ask for the full HF id. Do not pick a model from the available artifacts on the caller's behalf.
Where every other parameter comes from
Beyond MLNODE_URL and MODEL, the caller does not need to pass anything. Every other parameter has a documented source:
seq_len,k_dim,block_hash,public_key,node_id,
node_count -- all read from the golden reference for MODEL. The reference pins the exact PoC inputs its vectors were computed under.
- vLLM
additional_args-- the consensus-default deploy args for
this model are saved in the reference's additional_args field and used as-is. The caller can pass extra flags only if they ask for them: --tp-size and --max-model-len add-or-update the reference baseline (the same flag's existing value is replaced, otherwise appended); --extra-arg <token> appends arbitrary tokens.
stat_test.dist_threshold/p_mismatch/fraud_threshold--
resolved per-key with provenance: server default (0.02 / 0.001 / 0.01) is the floor; the reference's stat_test block (which mirrors the on-chain consensus params for this model) overrides; CLI flags (--threshold, --p-mismatch, --fraud-threshold) are the top. All three values are always sent to the server and shown in the report with their source.
Optional inputs
The caller can override deploy / validation / sampling defaults. Only pass these flags when the caller asks for them:
- Stat-test parameters. These three flags fill the
stat_testblock
the MLNode runs (per-nonce L2 mismatch test + binomial fraud test). --threshold IS the dist_threshold field of that block, just named more concisely on the CLI. Defaults come from the artifact; any key not provided is filled by the MLNode server defaults.
--threshold <float>(e.g.0.2) -- thedist_thresholdfield.
L2 distance above which a single nonce counts as a per-nonce mismatch. Default: artifact's dist_threshold.
--p-mismatch <float>(e.g.0.001) -- per-nonce probability of
a benign mismatch under honest computation. Default: artifact's stat_test.p_mismatch if present, else server default.
--fraud-threshold <float>(e.g.0.01) --probability_honest
cutoff at which the server flags fraud. Default: artifact's stat_test.fraud_threshold if present, else server default.
- Deploy overrides (only pass when the caller explicitly asks; the
artifact's additional_args already encode the consensus-default deploy config for this model):
--dtype <auto|float16|bfloat16|fp8>-- vLLM dtype.--tp-size <int>-- add-or-update--tensor-parallel-size.--max-model-len <int>-- add-or-update--max-model-len.--extra-arg <token>-- pass once per token to append additional
vLLM args. The caller owns avoiding conflicts with the artifact baseline.
- Phase skips. By default all four phases run; each flag drops one phase:
--skip-download-- the model is known to be cached already.--skip-deploy-- vLLM is known to already be servingMODEL.--skip-throughput-- skip the throughput measurement (faster runs).--skip-validate-- skip the vector-validation step (deploy / measure only).- Sampling:
--warmup-seconds <int>,--measure-seconds <int>,
--sample-interval <int>, --batch-size <int>.
- Timeouts (seconds):
--download-timeout <float>,
--deploy-timeout <float>, --validation-timeout <float>.
- Output location:
--exp-dir <path>-- write into this experiment directory.--exp-name <name>-- prefix used to auto-create the experiment
dir under data/experiments/<exp-name>_<ts>/ (default: mlnode_validate_<sanitized model>).
--reference <path>-- override the golden reference path (for
testing custom references). Default: looked up from MODEL. --artifact is accepted as a legacy alias.
How to run
Bare minimum (recommended starting form):
Add overrides only when the caller asks for them. The deploy config the caller sees is the artifact's additional_args plus any of --dtype, --tp-size, --max-model-len, --extra-arg they passed; the caller does not need to know what's in the artifact's baseline.
What the script does, in order
The script prints [i/4] headers (1-indexed) as it progresses. The agent should relay these headers to the caller while the run is in flight so the caller can see which phase is slow.
[1/4] download-- ensures the requested HF repo is cached on the
MLNode.
POST /api/v1/models/status {hf_repo}-- returns one of
DOWNLOADED | DOWNLOADING | NOT_FOUND | PARTIAL.
- If not
DOWNLOADED,POST /api/v1/models/download {hf_repo}to
start the download, then poll /models/status until DOWNLOADED.
- Skipped with
--skip-download. Hard-fails if the status flips
back to NOT_FOUND mid-poll, or the timeout expires.
[2/4] deploy-- starts vLLM if it is not already running.
POST /api/v1/inference/up/async {model, dtype, additional_args}.- Polls
GET /api/v1/inference/up/statusuntilis_running == true
or status becomes failed/cancelled. Server-side elapsed_seconds is printed on each poll so the caller sees progress.
- Skipped with
--skip-deploy; if so, the script verifies vLLM is
already running and aborts otherwise.
[3/4] throughput-- measures full-system PoC throughput.
POST /api/v1/inference/pow/init/generate {block_hash, ..., params}
(the artifact's params); the proxy fans out to every healthy vLLM replica with a different group_id so they process disjoint nonces. The first response reports backends and n_groups.
- After
--warmup-seconds, samples
GET /api/v1/inference/pow/status every --sample-interval for --measure-seconds. Reports per-replica nonces_per_second and the sum across replicas (the system-level throughput for this model). Then POST /api/v1/inference/pow/stop.
- Skipped with
--skip-throughput.
[4/4] validate-- verifies pre-computed honest vectors.
POST /api/v1/inference/pow/generatewithwait=true,
nonces=[...], validation.artifacts=<artifact>, and the full stat_test block (dist_threshold, p_mismatch, fraud_threshold). The MLNode recomputes the same nonces, compares them to the supplied vectors under L2 (per-nonce mismatch test), then runs a binomial fraud test using p_mismatch and fraud_threshold. Returns {n_total, n_mismatch, mismatch_nonces, p_value, fraud_detected}.
- The pass criterion is the binomial test alone: `fraud_detected ==
false. A non-zero n_mismatch with fraud_detected == false means the MLNode produced a few mismatches but they fall within the statistical tolerance the test allows; this is still a PASS, and the script labels it PASS (with mismatches within stat-test tolerance)`.
- Skipped with
--skip-validate.
After the four phases, the script writes three files into the experiment directory (mlnode/packages/benchmarks/data/experiments/<exp_name>_<ts>/, matching the layout in mlnode/packages/benchmarks/scripts/README.md):
validate_config.json-- the resolved inputs only (mlnode URL,
model, reference path + meta, deploy config, PoC params, stat_test with provenance, raw CLI args). Lets a future reader reproduce the run without re-deriving any defaults.
validate_report.json-- the full structured report (config +
per-phase results + verdict). This is the audit trail.
validate_report.txt-- short human-readable summary; first line
after the banner is verdict: <PASS|FAIL|...> for at-a-glance reading.
How to report back to the caller
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/mlnode-validate/SKILL.md
Popularity
- Repository stars
- 542
- Repository forks
- 115
- 7-day trend score
- 31
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/gonka-ai/gonka/mlnode-validate)