Repository navigation
Releases
v0.5.19
Fixed
-
A newcomer's miner no longer quits or goes silent (an onboarding test, 2026-11-09).
- The reference miner waits out the validator's "hotkey is not registered" answer: right after registering, the
validator has not read the chain yet. It asks again every minute instead of exiting. - While its key request is pending it logs one line per ask.
- After its entry test it watches its own signed stats and logs
ADMITTEDorNOT passed. cadmind-miner-statsshows registered, admitted and any block on its first line.- The denied tools no longer name
MultiEdit,LSorNotebookRead, which Claude Code no longer has (every run
logged a warning for them). - The miner guide says how much test TAO to get and what the miner logs while waiting.
- The reference miner waits out the validator's "hotkey is not registered" answer: right after registering, the
-
The miner docs work for a newcomer (an onboarding test, 2026-11-09). The
btclicommands are bittensor 11's
(wallet new-coldkey,subnets register,--wallet,--network). The docs saybtclicomes with this package
and warn against the separatebittensor-cli. The testnet's netuid, validator URL and hotkey now point to the
developer platform's Networks section instead of a placeholder and an unlinked "announcement". The guide says the
baseline is a model and an effort run through an API key whose terms allow automated use.
Changed
- The baseline is stated, and the reference miner runs it.
docs/MINER.mdhas a new section, "The baseline": Claude
Code running Claude Sonnet 5.5 alone at reasoning efforthigh, the setup CADmind's own miners run. A miner may
change model, effort and harness. A miner whose delivered quality falls below what the baseline delivers today is
not allowed to operate (its key is refused or revoked).cadmind-einstein-minernow defaults to
--model claude-sonnet-5-5and a new--effort high, passed to the CLI. Either can be set empty for the CLI's
own default. - The miner guide names judge 1.3c (it still named 1.3b).
v0.5.18
Added
- Burn mode before the first miner (
--burn-when-empty, off by default). An hour with no admitted miner to
weight puts all weight on the subnet owner's uid, instead of setting no weights at all, so a new subnet's
validator keeps setting weights (and stays active) before anyone mines. The miners' share of the emission is
burned meanwhile. When the subnet owner's validator is our own hotkey, the burn goes to that uid. The first
hour with an admitted miner sends the normal vector, with no manual step. The owner's uid is never weighted
otherwise.
Fixed
- A validator on bittensor 11.3.2 refused every signed request. That release stopped trusting sr25519 senders
by default:http_auth.verifynow refuses unless told the sender's signature scheme. The service passes sr25519,
which every Bittensor hotkey uses, whenever the installedverifytakes the argument; older releases behave as
before. CI, which installs the newest bittensor, failed ten signed-route tests on it.
v0.5.17
Added
- An assembly's judge sees what its parts proved (judge
cadmind-judge/1.3c). A review bundle of an assembly
made of sub-projects carriesparts.json: each vendored part's purpose, promises, published requirements with the
checker's verdict on each, whether it meets the contract the assembly requires of it, and its open decisions. 1.3c
shows it to the judge as the fact sheet'ssubprojects, with the validator's own latest vote on each part
(judged), and rules that a function proved inside a part counts as shown at the assembly that places the part as
its contract says. Its own prompt,judge_prompt_1.3c.md; 1.3b's prompt and digest are unchanged, and
--judge 1.3brolls back. Votes stay shadow. - A failing main line reaches the client. A vote whose deciding sample rules a
mainlinefailsis sent to the
platform as a finding (POST /api/engine/einstein/jobs/{job}/finding: the line, its quote of the brief, the nudge
on it), sent again until taken. The platform shows it as a notice; it gates nothing.
Fixed
- CI runs the tests again. The lint step had failed since 0.5.5 on formatting and line length, so the test step
never ran there. The code is reformatted withruff formatand the long lines are wrapped; no behaviour changes.
v0.5.16
Added
- The operator can lift a wrong disable.
POST /v1/operator/unblock {hotkey, reason, readmit?}and
cadmind-einstein-operator unblock HOTKEY --reason WHY [--readmit]: the block ends, the last strike is taken back
(the next block is the shorter one again), and the abuse counts the hotkey has so far are marked acted on, so the
same counts do not disable it again on the next tick.readmitgives back the admission only to a hotkey that had
passed its entry test and is still approved; otherwise it takes the test again. It never grants a key: the miner
mints a new one through its usual key request. Logged and kept in the validator's state. Before, a false disable
could only be undone by editing the state with the validator stopped.
Changed
- Reference miner: fit first. The prompt and
docs/MINER.mdnow ask a builder to walk only the client's own
use of the device, to source a fit-critical size from a reference model and then the client's measure before a
drawing, to price each question's options in numbers, to test a whole feature rather than one point of it, to keep
covered controls workable, to grip a flexible part by a declared interference, and to make the notes state the
values the model has.
Fixed
- The copy check no longer compares rounds of one project started from the same files. An attempt now records
what it started from (the job's seed workspace, a continuation's base, and the design digest each one's export
states); an output that shares one of those starts is not compared. With the seed's features subtracted, the small
delta of a round (an assembly) is the same for every builder: a client's next round, started from the same kept
version as a round that never delivered, was failed as a copy of it and its miner disabled. Different starts are
compared as before, and copy entries kept before this release (no start recorded) are compared as before. - A miner whose key was revoked while it was down mints a new one at startup. The agent key loaded from state
is checked with the platform first; one it no longer takes (401) is minted again at once, where before the miner
waited up to an hour for its idle check. When the platform cannot tell, the stored key is kept.
v0.5.15
[0.5.15] - 2026-11-07
Fixed
- The copy check no longer compares an attempt with other attempts at the same job. Builders of one job start from
fresh grants of the same seed and never see each other's work; an assembly of fixed parts comes out identical for
every builder, and later attempts were failed as copies (and an honest miner disabled for it).
v0.5.14
Changed
- Reference miner: what a
wattcommand costs. Every build, test, inspect, render and report builds the whole
design again, minutes on a large one: the prompt says to check while editing, run onetestrather than build,
inspect and test in a row, and never run a heavy command again on unchanged files.
Fixed
- A client's answer to a split project's decision is checked where the part records it. A parent assembled
from vendored parts may state a decision only as Watt's link,same_as = "subs.<key>.decision.<id>", whose
status and answer live in the part'ssubprojects/<key>/spec/*.toml. The answers gate read only the parent's own
spec/and did not follow the link, so an answer the part recorded properly failed with "does not quote". The
gate now reads the vendored parts' specs, follows the link (a part's own links and supersedes too, bounded, never
outsidesubprojects/<key>/) and applies the same open, quote and choice checks there; its reasons name the
link (decision mount (same as subs.lid.decision.fixing)), and a link whose target is missing says the linked
part's decision is missing.
v0.5.13
Fixed
- A job begun before a Watt release with the as-delivered check is gated as it was when it started. A Watt
release keeps the workspaces it began, so a job assigned before the release runs its gate on the older Watt,
which refusescheckwithas_deliveredby name (`watt check` takes project; not ['as_delivered']). 0.5.12
read that as its own side and retried until the job's deadline. Now that answer skips the as-delivered stage for
that job (logged); every other stage, the guard run included, is unchanged.
v0.5.12
Added
- The gate checks the tree as delivered. After the miner's
watt statussays deliverable and before its own
guard run, the validator runswatt check --as-deliveredon its fork (the agent API'scheckwith
{"as_delivered": true}): Watt's check of the tree a delivery carries, without.watt/andbuild/. A design
that passes only with its local records (a removed role recorded only in.watt/trace.jsonl, which an importing
project never sees) fails the gate at stageas-delivered, its codes in the miner'sfailures. A run that answers
neither a pass nor errors is the validator's side and is retried. Needs a Watt that knows the mode: deploy it
first. - Blocked by the platform. A run of the gate whose answer carries
host_refused({code: "host_refused", why}: the platform refused the run's result for a reason of its own, not the design's) ends the round
blocked by the platform: the result{label: "host_blocked", kind: "host_blocked", charge: false, why, host_refused, workspace, digest, hotkey, attempts, summary?}goes to the platform with the project (the fork)
kept, anALERTis logged, and the attempt is uncounted (no 0 in the ledger, not toward the attempt cap, not a gate
failure or "not finished" against the miner, its wait clock put back where its submit found it). An entry test so
blocked may be asked for again at once; a practice job ends without a result. - A miner reports a host refusal.
POST /v1/jobs/submittakeshost_refused({code, why}or the why). The
validator reproduces it with its own guard run on the fork even though the miner's record is not deliverable: refused
too, the round is blocked by the platform; not refused, the round is judged on that run (delivered when it passes,
else as the record stands, the claim counting for nothing). - Reference miner: a host refusal is never resumed. The prompt tells the agent that a
wattanswer with
host_refusedis the platform's, never the design's: no retry, no work-around, no dropped part, and it ends with
HOST_REFUSED <why>. The miner then does not resume it (it used to, three times), skips the self-review and submits
withhost_refused. The scripted fake miner stops and reports the same way.
Changed
-
A client's cancel keeps the builder's place in the line. A cancel, and a job the platform takes back when the
validator's lease lapses, free the miner with its wait clock untouched; only its own submit, hand-back or timeout
moves it. -
A "not finished" round names its kept project for every gate failure, the as-delivered check's included, so the
platform can read the change requests an assembly round wrote on a part that blocked it. -
Scoring. A client job delivered by a builder that passes the validator's Watt gate scores 0.5 while the
client has done nothing; 1 when the client downloaded it (in the app or by API) or rated it 3, 4 or 5 stars;
0 when the client rated it 1 or 2 stars, or a refund was granted for its quality. The client's latest signal
decides (a download then 1 star is 0; 1 star then 5 stars is 1); free and paid count the same (trustis
ignored). Not delivered, failed the gate, timed out, handed back (rejected), a copy: 0, at once. A miner's
weight is the sum of its job points over the last 7 days (a job counts for 7 days from its end, flat, no decay)
over the sum of all miners' (registered, admitted, seen in 24 hours). Genesis, launch, never-empty and owner rules
are unchanged. Reports,/v1/scores,/v1/miners/receiptand the stats publishweightandaverage(points per
job) in place ofquality, each job'spartsas{signal}or{failed}, andconstantsas the window and the
three point values. -
Routing. The next client job goes to the job's
preferminer if it is available, else to the available
builder that has waited longest since its last client assignment ended (a newfree_mswait clock per miner,
persisted); a builder that hands a job back goes to the back of the line. Every availability rule is unchanged. -
Every failed attempt scores 0 at once. A rejection or gate failure is no longer held until another miner
passes the job; job endings (declined, not finished, didn't finish, second opinions from another coldkey, the
attempt cap) and the overturned-rejection abuse count are unchanged. Failures an older release held on a job are
scored 0 when the upgraded validator loads them. -
Recompute at start. Stored outcomes keep their facts and signals, never their points: every start scores the
7-day window by the running rule, so no miner holds a mix of old and new scores. -
The judge's vote scores nobody. Votes are still made, signed, published, shown to miners, archived and compared
with practice runs; no score, weight or route reads them.--votesdefaults toshadow;countedandliveare
accepted as its names. A report'svotes.per_jobholdsVand the vote count.
Removed
-
From scoring: efficiency
E(compute and wall-time medians, brief size classes), on-timeT, the immediate part
I, the baselineB, the vote'sVandu(review.U_MAX), trust weights, the partial download credit, the
24-hour half-life decay, the 25% remix credit (the claim'sremix_creditis still checked and recorded with the
job), routing by quality (the decayed mean, the 10% exploration), andLedger.vote,Ledger.quality,
Reviewer.apply/apply_all. Outcomes no longer carrysize,compute_s,voteorcredit. -
The reference miner's prompt says that when a device is split, every connection between sub-devices (a lead, a
hose, a signal) is an interface in each contract and the parent wires it: an extension lead is the parent's own
cable. A sub-device never stands in another sub-device's hardware to wire to.
v0.5.11
Added
- Practice jobs: try a new setup with nothing at stake.
POST /v1/practice(signed; approved key holders,
admitted or not) asks the platform for a delivered public project's brief, exactly as its gallery page shows it,
that this miner has not practised on, and runs it as a job of kindpractice: assigned to that miner alone,
no_questions, granted on the platform's practice lane and quota (practice: true), and gated as any job with
the validator's own guard draw. It is never in the ledger, quality, weights or routing, never sent to another
miner, and never handed out while the miner holds a job or a client job it could take is queued. One open at a
time, 3 per miner per UTC day (--practice-per-day, the platform's own cap mirrored). - Practice votes. A deliverable practice result is voted on exactly as a delivery is (same judge, prompt,
rubric and sample count), and so is the delivered version of the same brief under today's judge; that reference
vote is cached per (delivered job, judge digest). A result that fails the gate is reported with the gate's reason
and no vote. Each result is reported to the platform for the operator, kept in the store (namespacepractice)
and shown to its miner onGET /v1/practice(signed, no body), grouped by setup. setupon submit.POST /v1/jobs/submittakes an optionalsetup, the miner's own label for its setup
(80 characters). The reference miner sends--setupor$CADMIND_MINER_SETUP.cadmind-einstein practice [--status](alsocadmind-einstein-miner practice): ask for a practice job, or
print the results so far. Documented indocs/MINER.md"Trying a new setup".
Changed
- A delivery the platform refuses for what the build did is the builder's failure. The platform refuses an
assembly round that dropped a part it was given (409 parts_dropped) or a change request whose failing check
passes with the part imported (409 change_unfounded). The validator no longer retries such a result: the
attempt fails (refused, scored 0 at once, counted toward the job's attempts), the job's pass is withdrawn, and
the job goes to another miner from scratch; past the attempt cap it ends "didn't finish". The platform's words
are in the miner's receipt (failures). - The reference miner's prompt says an assembly round keeps every imported part; a part that truly breaks one
of the project's checks gets one change request on its record ([subproject.<id>.change]:test,measured,
proposal), and otherwise the builder rejects the job and says why.
v0.5.10
Changed
- A delivery that waits for its parts is judged once they are built. A main project delivered at its interface
stage (its sub-projects' interfaces defined, each still a placeholder) is not voted on at once. The platform says so
on the delivery's review bundle (parts:awaiting,built,total,delivered_ms,assembled); the validator
defers the vote, asks again every 30 minutes, and votes once every part is built, on the bundle the platform makes
again with the parts assembled in view. Five days after the delivery it votes on the device as it stands. A
sub-project's own job is judged as any job. The judge, its prompt and its rubric are unchanged. - Until that vote, the job scores as a job with no vote (
B = I): never a 0, never a missing-vote penalty. A
vote made after the job left the 7-day scoring window is recorded, archived and published, and scores nothing. - A platform that sends no
partsgets the vote at once, as before. The vote's record and its calibration archive
say whether it waited (parts:builtoras it stands).