Skip to content

Releases

v0.5.19

Choose a tag to compare

@CADmind-dev CADmind-dev released this 09 Nov 17:17

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 ADMITTED or NOT passed.
    • cadmind-miner-stats shows registered, admitted and any block on its first line.
    • The denied tools no longer name MultiEdit, LS or NotebookRead, 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 miner docs work for a newcomer (an onboarding test, 2026-11-09). The btcli commands are bittensor 11's
    (wallet new-coldkey, subnets register, --wallet, --network). The docs say btcli comes with this package
    and warn against the separate bittensor-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.md has a new section, "The baseline": Claude
    Code running Claude Sonnet 5.5 alone at reasoning effort high, 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-miner now defaults to
    --model claude-sonnet-5-5 and 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

Choose a tag to compare

@CADmind-dev CADmind-dev released this 09 Nov 13:19

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.verify now refuses unless told the sender's signature scheme. The service passes sr25519,
    which every Bittensor hotkey uses, whenever the installed verify takes the argument; older releases behave as
    before. CI, which installs the newest bittensor, failed ten signed-route tests on it.

v0.5.17

Choose a tag to compare

@CADmind-dev CADmind-dev released this 09 Nov 12:58

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 carries parts.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's subprojects, 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.3b rolls back. Votes stay shadow.
  • A failing main line reaches the client. A vote whose deciding sample rules a main line fails is 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 with ruff format and the long lines are wrapped; no behaviour changes.

v0.5.16

Choose a tag to compare

@CADmind-dev CADmind-dev released this 08 Nov 03:38

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. readmit gives 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.md now 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

Choose a tag to compare

@CADmind-dev CADmind-dev released this 07 Nov 21:33

[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

Choose a tag to compare

@CADmind-dev CADmind-dev released this 07 Nov 13:19

Changed

  • Reference miner: what a watt command 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 one test rather 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's subprojects/<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
    outside subprojects/<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

Choose a tag to compare

@CADmind-dev CADmind-dev released this 06 Nov 21:40

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 refuses check with as_delivered by 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

Choose a tag to compare

@CADmind-dev CADmind-dev released this 06 Nov 20:39

Added

  • The gate checks the tree as delivered. After the miner's watt status says deliverable and before its own
    guard run, the validator runs watt check --as-delivered on its fork (the agent API's check with
    {"as_delivered": true}): Watt's check of the tree a delivery carries, without .watt/ and build/. 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 stage as-delivered, its codes in the miner's failures. 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, an ALERT is 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/submit takes host_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 watt answer with
    host_refused is 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
    with host_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 (trust is
    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/receipt and the stats publish weight and average (points per
    job) in place of quality, each job's parts as {signal} or {failed}, and constants as the window and the
    three point values.

  • Routing. The next client job goes to the job's prefer miner if it is available, else to the available
    builder that has waited longest since its last client assignment ended (a new free_ms wait 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. --votes defaults to shadow; counted and live are
    accepted as its names. A report's votes.per_job holds V and the vote count.

Removed

  • From scoring: efficiency E (compute and wall-time medians, brief size classes), on-time T, the immediate part
    I, the baseline B, the vote's V and u (review.U_MAX), trust weights, the partial download credit, the
    24-hour half-life decay, the 25% remix credit (the claim's remix_credit is still checked and recorded with the
    job), routing by quality (the decayed mean, the 10% exploration), and Ledger.vote, Ledger.quality,
    Reviewer.apply/apply_all. Outcomes no longer carry size, compute_s, vote or credit.

  • 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

Choose a tag to compare

@CADmind-dev CADmind-dev released this 06 Nov 13:07

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 kind practice: 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 (namespace practice)
    and shown to its miner on GET /v1/practice (signed, no body), grouped by setup.
  • setup on submit. POST /v1/jobs/submit takes an optional setup, the miner's own label for its setup
    (80 characters). The reference miner sends --setup or $CADMIND_MINER_SETUP.
  • cadmind-einstein practice [--status] (also cadmind-einstein-miner practice): ask for a practice job, or
    print the results so far. Documented in docs/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

Choose a tag to compare

@CADmind-dev CADmind-dev released this 06 Nov 07:18

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 parts gets the vote at once, as before. The vote's record and its calibration archive
    say whether it waited (parts: built or as it stands).