Regression tests for Solana agent skills

Does your skill actually help?

Run the new version, the old version and no skill at all on the same Solana tasks. A checker that ships with the runner — not the model — scores every answer. You get a report with every single trial in it

0trials checked
0regressions caught
0silent retries
solana-core v1.0.3 · 3 repssolana-token-helper
trial 1/56
BaselineA · 1.4.2B · 1.5.0
ACCT-01
ACCT-02
TX-03
TX-04
PLAN-05
PLAN-06
base0/0
A0/0
B0/0
att_tgXUGZ5GiP · ACCT-01 · baseline · dispatched
The problem

Every skill update ships on faith

01

A SKILL.md is a promise

The description says the skill helps with Solana. Nothing in the file shows how often it gets a mint, a transaction or a transfer right

02

Verified is not helpful

A verified publisher and a clean security scan tell you the bundle is safe to load. They say nothing about whether answers got better

03

One good answer is not a measurement

The model grading itself, or one lucky reply, will not catch the version that quietly broke atomic units

How it works

Four steps. No vibes

The same flow in the browser and in the CLI. The checker is the same binary in both

SKILL.md
references/amounts.md
references/tx-reading.md
scripts/decode_mint.tsnot run
01

Import

Drop two versions as a folder or ZIP. You see the digest, the files, what the run covers — and which scripts will not be executed

6 tasks × 3 reps × 3 arms
= 54 trials
manifest 9f3c…e21a
02

Plan

Pick the fixture pack, the model profile, repetitions and a budget cap. The manifest is hashed before anything is sent

03

Run

Fresh context per trial, same tools, one request in flight. Arms are shuffled per task, so baseline is never always first

base9/18
A14/18
B13/18
04

Report

Success rate with its full denominator, paired differences, reason codes and the raw answer behind every cell

Fixture pack · solana-core v1.0.3

Real chain data. Golden answers

Every fixture is immutable and content-addressed: raw bytes, network, slot, the expected structured output and the checker version that scores it. Golden records are verified by an independent decoder and a second reviewer

Input

Raw account bytes plus network and owning program

External check

Account type, required fields and authority / null match a verified decoder fixture

ACCT-01Decode a Token-2022 mint with a transfer-fee extension
fx_7Kq2mint22feemainnet-betaslot 371,402,118sha256 a91e04c7d2…
Rejects:authority_not_nullextra_fieldfee_bps_mismatch
ACCT-02Classify a frozen associated token account
fx_3Hn9ataFrozenmainnet-betaslot 368,990,541sha256 5c2e8b07f4…
Rejects:state_mismatchamount_not_atomic
The paired protocol

Same task, same tools, three arms

A difference only counts on a (task, repetition) where every compared arm got a real model answer. Anything else is listed, never quietly dropped

One task, three repetitions

order from seed 11002
rep 11skill A2baseline3skill Bcomplete pair
rep 21skill B2skill A3baselineexcluded: B unknown
rep 31baseline2skill B3skill Acomplete pair
success = pass / executed_model_trialsfail, invalid_output and a task timeout after dispatch count against the skill. Planned, executed, infra errors, interrupted and not-run sit right next to it.

Outcome codes

docs →
passChecker matched every required field against the golden record
failValid JSON, wrong answer. Comes with a reason code from the checker
invalid_outputThe model answered, but not in the required structure
unsupported_caseThe task needs something the skill or runner does not support, e.g. executing a script
infrastructure_errorThe request never reached the model: rate limit, network, provider 5xx before dispatch
unknownDispatched, then no answer: timeout or restart. Kept as is, never retried silently
interruptedA crash during dispatch. Usage is kept; the attempt is closed
not_runNever dispatched: cancelled, or the next call could break the budget cap
Guarantees

Built to be hard to fool

The checker is not the model

Scores come from a trusted checker that ships with the runner. It never runs model-generated code, never follows a URL from an answer and never lets the skill set its own grade

No hidden retries

Every request has an attempt ID and a durable planned → dispatched → result record. A timeout stays unknown until you decide

Budget before dispatch

The upper cost of the next call is reserved first. If it could break the cap, it is not sent — the trial is not_run_budget

The skill is test data

Instructions inside a bundle cannot widen access. No shell, no arbitrary HTTP, no file walking, no signing. Read-only fixture tools only

No winner when it is unfair

If the model fingerprint, pack or checker differ, the comparison is marked incomparable. Partial runs never name a winner

Reports anchored on Solana

Publish a report and its manifest hash is written on chain with a Memo transaction from your wallet. Anyone can recompute the hash from the export and check it

Recheck without the model

Saved answers re-scored by the same checker give the same results. Zero model calls

Local CLI

Keys stay on your machine

Prefer to run it yourself? The CLI uses your own model key from the OS keychain, writes a journal and content-addressed files next to it, and exports the same JSON and HTML report

validateplanrunstatuscancelrecheckreport
CLI reference
skilltrial — zsh
$SKTRIAL

Every hosted trial burns supply

Hosted runs pay model usage at cost plus a flat runner fee of 0.0002 SOL (~$0.03) per executed trial. All of the runner fee buys $SKTRIAL on the market and burns it, every six hours

Burned so far1,856,163$SKTRIAL
Hosted trials334,556executed
Next buyback01:18:28UTC window
FAQ

Questions, answered

Ship the version that wins

Your first comparison takes a few minutes and costs less than a coffee. The report is yours to keep, export or anchor