Repository navigation
Releases: fredericrous/relais
Releases · fredericrous/relais
Release list
v0.48.0
- A holdout store declares its own holdouts. At preflight relais reads
<repo>/<name>/holdout.tomlandcheck.shfrom the store[holdouts] storenames, at one commit per run, through a shared cache of shallow fetches. A machine.toml table of the same name still wins, and{ enabled = false }turns a store holdout off. Aholdout.tomlthat does not parse refuses the run (holdout_declaration_invalid). An unreachable store refuses a named holdout asholdout_unreadableand recordsholdout_store_unreachable. - A store holdout runs only at a fingerprint the person confirmed. The fingerprint covers the whole effective declaration and the files it supplies. Any change asks again, and a symlink anywhere in a holdout is refused without being read.
relais trust holdoutsshows each new or changed holdout's declaration and diffs, and--accept <name> --sha <sha> --fingerprint <fp>confirms exactly that version; a store that moved meanwhile is refused as stale. Confirmations live in the new ledger tableholdout_confirmations, and the ledger migrates to v48. Until a holdout is confirmed, it is skipped when attached and refuses the run when named (holdout_unconfirmed). - The plugin asks.
mcp__relais__trust_holdoutsputs each review in Claude Code's dialog. A review too long to show whole is confirmed in a terminal instead. The model is refused arelais trust holdouts --acceptin Bash. - You can see them.
relais doctorlists each holdout with its source (store or machine) and confirmation state.relais planmarks an attached holdout that is not confirmed.relais reportcounts unconfirmed skips separately. - The holdout definition digest now covers the declaration's source, timeout, inputs and attach rule. Definitions frozen before this release still compare under the old formula, so the upgrade reports no spurious changes.
What's Changed
- test(runner): room for work on a slow host by @fredericrous in #378
- docs: rechart the homelab offload by @fredericrous in #379
- docs: amont runs gates on the cluster (t21) by @fredericrous in #380
- docs: laptop signs remote gates (t25, t15) by @fredericrous in #381
- chore(adr): refresh the fleet pack by @fredericrous in #384
- feat(holdouts): holdouts declare themselves in the store by @fredericrous in #385
- chore(release): v0.48.0 by @fredericrous in #386
Full Changelog: v0.47.0...v0.48.0
v0.47.0
- A run the queue ends names the candidate it keeps. When
admission_waitruns out while a candidate is verified, the run still endsblocked (admission_wait_exhausted), and the outcome now says how to verify the candidate again without a worker: akind: verifyrun namingcandidate {run, index}. Its transition detail carriescandidate {run, index, sha}; akind: verifyrun names its source run. The attempt row is closedblockedwith its sha, where it used to stayverifying. A reviewer whose admission runs out endsneeds_review(review unavailable) with the same recovery in its text. The text no longer says "nothing was launched" when a worker already made the candidate. - The release signs its attestations. CI signs the gate attestations on each push to main, and the release requires them signed.
What's Changed
- build(ci): sign attestations on push to main by @fredericrous in #372
- fix(ci): sign job reads the leg's result file by @fredericrous in #373
- build(release): require signed attestations by @fredericrous in #374
- fix(runner): blocked runs name the kept candidate by @fredericrous in #375
- chore(release): v0.47.0 by @fredericrous in #376
Full Changelog: v0.46.0...v0.47.0
v0.46.0
- Each check records when it queued, started and ended. Every check outcome and retry, setup steps included, carries
timing(queued, admitted, started and ended instants, slot wait and run time), stored in a newcheck_timingsledger table.relais reportprints per-check p50/p90 run and slot-wait times, with reused baseline outcomes apart. The ledger migrates to v47. - A profile can run its gates through amont, and the push then skips them. A profile command
amont run --stamp <gate>(amont 1.66) runs an amont gate and records its verdict on the candidate's tree. After the profile, relais asksamont stamps --json: a gate reporteddeferredorabsent, or no answer (amont missing or older than 1.66), is a verification gap, never a pass. relais's own profile now runscargo-fmt,clippy,module-cycles, the two child-cycle gates,cargo-testandplugin-testthis way, andamont.confis a verification input. - A base amont already proved is not run again. When every profile gate is
stampedorattestedon the base tree on this platform, and the toolchain is identified, the baseline run is skipped and the receipt saysbaseline_proven: true. A proof writes nothing to the baseline cache. relais resume --prune-runs [<days>](30 days by default) lists the run directories underruns/untouched for that long, each with its verdict and the evidence rows deleting it would leave dangling. A preview deletes nothing.--writedeletes only runs that have ended, wait on nobody, have their receipt in the ledger and are not cited by a baseline-cache entry; it also removes the empty verify directories of ended runs.- An ended run no longer leaves an empty
verify/<run>/directory behind. The run removes it at its end, and the next run start orrelais resume --retireremoves those earlier runs left (74 had piled up since September). A directory that still holds a file is kept.
What's Changed
- feat(report): per-check timings in the ledger by @fredericrous in #367
- feat(verify): run gates through amont, skip proven by @fredericrous in #370
- feat(resume): prune empty verify and old run dirs by @fredericrous in #368
- chore(release): v0.46.0 by @fredericrous in #371
Full Changelog: v0.45.0...v0.46.0
v0.45.0
relais programme listnames each map once: it scans primary checkouts only, so a linked worktree of a repository no longer repeats its maps.relais programme frontier --allandshowgive each in-flight ticket its branch's last-commit age (5m,3h,2d), and their--jsonin-flight entries carrybranch_age_secs. Theprogrammeskill now says where theprog/branch lives and how to give a ticket up.
What's Changed
- fix: a busy ledger checkpoint is Busy, not Corrupt by @fredericrous in #362
- chore(policy): leave msrv and audit to CI by @fredericrous in #363
- build(ci): one platform per PR, release waits by @fredericrous in #364
- fix(programme): one map per repo, branch ages by @fredericrous in #365
- chore(release): v0.45.0 by @fredericrous in #366
Full Changelog: v0.44.0...v0.45.0
v0.44.0
Fixed
relais --bogus --helpprints the help and exits 0: help wins over an
unknown argument (cli.help.help-and-version), at the top level and after a
subcommand, which gets its own help. An unknown argument alone is still a
usage error with exit 2, and--helpafter--is not a request for help.- A check that ends on its own time limit now runs once more (only that check, not the suite, and with no worker) before it is judged (baseline, candidate and holdout checks, not setup steps, and not a check a run budget cut): a pass on that run is marked
flakywith the reasontimed_out_then_passed(newreasonon theflakyevent), so a contended machine no longer buys a repair or blocks a base; a check that times out twice fails as before (SPEC §9, §29).
What's Changed
- chore: adr-lint exact rules block in relais by @fredericrous in #355
- fix(cli): help wins over an unknown argument by @fredericrous in #358
- docs: chart the homelab offload programme by @fredericrous in #359
- fix(verify): a timed-out check runs once more by @fredericrous in #360
- chore(release): v0.44.0 by @fredericrous in #361
Full Changelog: v0.43.0...v0.44.0
v0.43.0
relais programme list|frontier|show|checkread a programme map (docs/programmes/<slug>/map.mdand one TOML-frontmatter ticket file per decision, ADR-0051) and answer which decision tickets are ready: open, every blocker closed, and noprog/<slug>/<id>branch (local ororigin) working them.checkreports every problem aspath:line: messageon stderr and exits 2 when there is one. All four are read-only and open no ledger, coordinator or machine config (SPEC §31).
What's Changed
- feat: relais programme commands and skill by @fredericrous in #356
- chore(release): v0.43.0 by @fredericrous in #357
Full Changelog: v0.42.0...v0.43.0
v0.42.0
relais dataset seed <file|-> [--json]writes a described set of runs into a new ledger, sorelais reportcan be checked against known counts (used by the value-checking holdout). The runs are JSON lines, with an optional first line{"seed_schema": 1}. Each line gives a status,accepted_by,created_at,cost_micros, holdouts and exposures, and they go through the same ledger writers as real runs.- It refuses (exit 2) unless
RELAIS_STATE_DIRnames a directory other than the default one, however spelled, with noledger.sqlite,-walor-shmin it. - A bad file is refused whole, each bad line printed as
file:line: reason. - I/O errors exit 1. With
--json, stdout carries only{seeded, ledger}. - The ledger appears complete or not at all: it is staged per invocation and published with
hard_link.
- It refuses (exit 2) unless
What's Changed
- feat: relais dataset seed command by @fredericrous in #353
- chore(release): v0.42.0 by @fredericrous in #354
Full Changelog: v0.41.0...v0.42.0
v0.41.0
- A holdout can attach to runs without the contract naming it (ADR-0045 widening). Give its machine.toml declaration
attach = { task_types = [...], paths = [...] }. Achangeorverifyrun whose routing type is listed and whose write scope could touch one of the paths then gets a mandatoryattached:<name>criterion, unless a mandatory contract criterion already names the holdout.unclassifiedis refused, and an error names the key path. The attached criterion is rebuilt from the ledger after preflight and inherited by successors. No model sees it in a first prompt; a retry shows only its statement, verdict and failing tests, andrelais decideadds where it was declared. - An attached holdout whose store cannot be read (unreachable, missing, or a ref that does not resolve) is skipped, with a
holdout_attach_skippedevent and a skipped row that is never a catch. A named holdout still refuses the run. - A run's holdouts run concurrently, each in its own copy and
CARGO_TARGET_DIR. The receipt recordswall_msandsource(namedorattached) for each holdout. - Ledger schema 46 adds
sourcetoholdout_definitionsandholdout_outcomes; existing rows read asnamed.relais report --jsonschema 16 addsholdouts.by_source(namedandattachedruns and catches, and attachedskipped), with a by-source line in the text view. relais planlists the holdouts that would attach (holdout <name> attached: task type <t>, path <glob>), and those it would skip, also underholdouts.attachedandholdouts.skippedin--json.
What's Changed
- feat: attach holdouts by declaration by @fredericrous in #349
- chore(release): v0.41.0 by @fredericrous in #350
Full Changelog: v0.40.0...v0.41.0
v0.40.0
- A routed task that edited no file, launched nothing that could write one (a Bash writer such as
sed -i, a subagent the router did not create, a relais run or replay) and was not aborted now endsansweredinstead ofunknown(answered-outcome plan, relais#333).answeredis reported on its own line,answered (no file edited, never a label): N, broken down by task kind, and it is never a completed task, a strong outcome or a learning label. The outcomes line keeps its shape, sounknown ratenow counts only tasks that edited, or could have edited, something without a recognised check: on one live ledger it went from 50% to 19%. - A subagent task records its parent task (
parent_task_id, withparent_link_recordedon every new record), and the report buckets unknown subagents by their parent's outcome (subagent unknown by parent:). Rows recorded before this release count on their own line,parent link not captured: N. - A Bash command that runs a build or test runner but matches no check records the prefix you would paste into
checks, such asmake checkornpm run test, and nothing more (no path, value or later argument; at most 5 per task, prefixed with the repository's name). The report lists the top five underunmatched check commands; relais refuses any other shape. relais native router-stateservesaccepts:answered,parent_task_id,unmatched_checks. The plugin sends the new form only when all three are listed, so a plugin talking to an older relais sendsunknownand none of the new fields, whatever the version numbers.- Ledger schema 45 (expand-only): it adds three
router_taskscolumns and backfillsansweredonto endedunknownquestion and review rows with no files and noabortedsignal, markedoutcome_source = 'backfill_v45'. Undo withUPDATE router_tasks SET outcome = 'unknown', outcome_source = 'own', completed_at_end = CASE WHEN completed_at_end = 'answered' THEN 'unknown' ELSE completed_at_end END WHERE outcome_source = 'backfill_v45'.relais report --jsonis at schema 15 (answeredundersession_routing). - Before upgrading, stop the coordinator and back the ledger up (
sqlite3 <state>/ledger.sqlite ".backup <file>"): v0.39 and older refuse a schema 45 ledger. Install the binary, then reinstall the plugin.
What's Changed
- feat(router): answered outcome, parent link, unmatched checks by @fredericrous in #333
- chore(release): v0.40.0 by @fredericrous in #348
Full Changelog: v0.39.0...v0.40.0
v0.39.0
relais doctor --jsoncarries anintegrationobject (state,plugin_version,binary, andreasonwhen the state isunknown), documented in docs/INTEGRATIONS.md. It is derived from the same singleclaude plugin list --jsonreading as thepluginfinding, so the two agree, including for a plugin installed at project scope only.- The Claude Code install no longer writes the
relais-verified-pushandrelais-architecture-conflictskills, and removes the unmodified copies it wrote earlier. Published skills come from thegreenharness/skillsrepository, placed bygrh(ADR-0050); relais keeps its plugin, the/relaisskill and its three agents.
What's Changed
- feat: retire two skills; doctor json integration by @fredericrous in #345
- chore(release): v0.39.0 by @fredericrous in #346
Full Changelog: v0.38.0...v0.39.0