Skip to content

Releases: fredericrous/relais

v0.48.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 10:54
ce29fb3
  • A holdout store declares its own holdouts. At preflight relais reads <repo>/<name>/holdout.toml and check.sh from the store [holdouts] store names, 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. A holdout.toml that does not parse refuses the run (holdout_declaration_invalid). An unreachable store refuses a named holdout as holdout_unreadable and records holdout_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 holdouts shows 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 table holdout_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_holdouts puts each review in Claude Code's dialog. A review too long to show whole is confirmed in a terminal instead. The model is refused a relais trust holdouts --accept in Bash.
  • You can see them. relais doctor lists each holdout with its source (store or machine) and confirmation state. relais plan marks an attached holdout that is not confirmed. relais report counts 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

Full Changelog: v0.47.0...v0.48.0

v0.47.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 18:04
ccd5ffe
  • A run the queue ends names the candidate it keeps. When admission_wait runs out while a candidate is verified, the run still ends blocked (admission_wait_exhausted), and the outcome now says how to verify the candidate again without a worker: a kind: verify run naming candidate {run, index}. Its transition detail carries candidate {run, index, sha}; a kind: verify run names its source run. The attempt row is closed blocked with its sha, where it used to stay verifying. A reviewer whose admission runs out ends needs_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

Full Changelog: v0.46.0...v0.47.0

v0.46.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 13:28
bfa3f93
  • 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 new check_timings ledger table. relais report prints 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 asks amont stamps --json: a gate reported deferred or absent, or no answer (amont missing or older than 1.66), is a verification gap, never a pass. relais's own profile now runs cargo-fmt, clippy, module-cycles, the two child-cycle gates, cargo-test and plugin-test this way, and amont.conf is a verification input.
  • A base amont already proved is not run again. When every profile gate is stamped or attested on the base tree on this platform, and the toolchain is identified, the baseline run is skipped and the receipt says baseline_proven: true. A proof writes nothing to the baseline cache.
  • relais resume --prune-runs [<days>] (30 days by default) lists the run directories under runs/ untouched for that long, each with its verdict and the evidence rows deleting it would leave dangling. A preview deletes nothing. --write deletes 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 or relais resume --retire removes those earlier runs left (74 had piled up since September). A directory that still holds a file is kept.

What's Changed

Full Changelog: v0.45.0...v0.46.0

v0.45.0

Choose a tag to compare

@github-actions github-actions released this 01 Nov 03:31
12d1fb2
  • relais programme list names each map once: it scans primary checkouts only, so a linked worktree of a repository no longer repeats its maps.
  • relais programme frontier --all and show give each in-flight ticket its branch's last-commit age (5m, 3h, 2d), and their --json in-flight entries carry branch_age_secs. The programme skill now says where the prog/ branch lives and how to give a ticket up.

What's Changed

Full Changelog: v0.44.0...v0.45.0

v0.44.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 20:05
ef0668a

Fixed

  • relais --bogus --help prints 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 --help after -- 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 flaky with the reason timed_out_then_passed (new reason on the flaky event), 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

Full Changelog: v0.43.0...v0.44.0

v0.43.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 09:42
dad9cc8
  • relais programme list|frontier|show|check read a programme map (docs/programmes/<slug>/map.md and one TOML-frontmatter ticket file per decision, ADR-0051) and answer which decision tickets are ready: open, every blocker closed, and no prog/<slug>/<id> branch (local or origin) working them. check reports every problem as path:line: message on 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

Full Changelog: v0.42.0...v0.43.0

v0.42.0

Choose a tag to compare

@github-actions github-actions released this 31 Oct 07:58
49d6ecb
  • relais dataset seed <file|-> [--json] writes a described set of runs into a new ledger, so relais report can 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_DIR names a directory other than the default one, however spelled, with no ledger.sqlite, -wal or -shm in 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.

What's Changed

Full Changelog: v0.41.0...v0.42.0

v0.41.0

Choose a tag to compare

@github-actions github-actions released this 30 Oct 14:34
86651f0
  • A holdout can attach to runs without the contract naming it (ADR-0045 widening). Give its machine.toml declaration attach = { task_types = [...], paths = [...] }. A change or verify run whose routing type is listed and whose write scope could touch one of the paths then gets a mandatory attached:<name> criterion, unless a mandatory contract criterion already names the holdout. unclassified is 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, and relais decide adds 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_skipped event 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 records wall_ms and source (named or attached) for each holdout.
  • Ledger schema 46 adds source to holdout_definitions and holdout_outcomes; existing rows read as named. relais report --json schema 16 adds holdouts.by_source (named and attached runs and catches, and attached skipped), with a by-source line in the text view.
  • relais plan lists the holdouts that would attach (holdout <name> attached: task type <t>, path <glob>), and those it would skip, also under holdouts.attached and holdouts.skipped in --json.

What's Changed

Full Changelog: v0.40.0...v0.41.0

v0.40.0

Choose a tag to compare

@github-actions github-actions released this 30 Oct 09:36
0094b68
  • 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 ends answered instead of unknown (answered-outcome plan, relais#333). answered is 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, so unknown rate now 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, with parent_link_recorded on 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 as make check or npm 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 under unmatched check commands; relais refuses any other shape.
  • relais native router-state serves accepts: 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 sends unknown and none of the new fields, whatever the version numbers.
  • Ledger schema 45 (expand-only): it adds three router_tasks columns and backfills answered onto ended unknown question and review rows with no files and no aborted signal, marked outcome_source = 'backfill_v45'. Undo with UPDATE 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 --json is at schema 15 (answered under session_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

Full Changelog: v0.39.0...v0.40.0

v0.39.0

Choose a tag to compare

@github-actions github-actions released this 30 Oct 02:11
9fad226
  • relais doctor --json carries an integration object (state, plugin_version, binary, and reason when the state is unknown), documented in docs/INTEGRATIONS.md. It is derived from the same single claude plugin list --json reading as the plugin finding, so the two agree, including for a plugin installed at project scope only.
  • The Claude Code install no longer writes the relais-verified-push and relais-architecture-conflict skills, and removes the unmodified copies it wrote earlier. Published skills come from the greenharness/skills repository, placed by grh (ADR-0050); relais keeps its plugin, the /relais skill and its three agents.

What's Changed

Full Changelog: v0.38.0...v0.39.0