Repository navigation
1.12.0 — 2026-10-12
Release Notes
layover.toml says more with less: flags and a follow-up's routes are declared once, lengths of
time read as durations, a workflow sizes its own chains, and the numbers learnings live by are the
factory's — with lapsed learnings deleted rather than kept for ever.
Compatibility. Additive for the file format: every factory that loaded under 1.11 loads and
runs, and new keys are optional. What an existing factory will notice:
- Lapsed learnings are deleted after
keep_lapsed_days, fourteen by default, counted from when
each lapsed — or, for one that lapsed before this release, from when it was last proposed. The
firstlayover servedeletes any already past that. Set[learnings] keep_lapsed_dayshigher
first to keep more. - An agent's
fuel_usdis applied to chains starting at it, as documented; see Fixed. layover servebinds[layover] http_addrwhen--addris not given. A factory that set it
to something other than the default, believing it ignored, now listens there.validate --strictfails on[layover] state_dir, which is warned about now.- The HTTP API:
Pipeline.entrymay benull, for a resuming pipeline that names none — only
for factories that use that;Learninggainslapsed_atanddeleted_after.
Added
layover servebinds[layover] http_addr, which was accepted and ignored.--addrstill
wins, and without either it is127.0.0.1:7878as before. A factory started byautostartnow
serves where itslayover.tomlsays.- Lengths of time can be written as durations:
[defaults] timeout = "2h",
[reserve] window = "24h",[learnings] keep_lapsed = "14d"and a route'stimeout = "30m",
besidetimeout_sec,window_hours,keep_lapsed_daysand the route'stimeout_sec, which keep
working and also take a duration. Naming both is an error, and a duration that is not a whole
number of hours or days, where the key counts in them, is refused rather than rounded. - The numbers a learning lives by are the factory's, in a new
[learnings]table:
provisional_runs(20) runs it applies for,confirm_after(3) rediscoveries to make it
permanent,max_chars(400) the longest an agent may propose, andmax_per_run(25) the most one
run is given.validaterefuses0for any of them. A changedprovisional_runsapplies to
learnings from then on. - Lapsed learnings are deleted once
[learnings] keep_lapsed_dayshave passed since they
lapsed without an agent rediscovering them — fourteen by default,0to delete each as soon as it
lapses. A rediscovery within the period still counts towards making a learning permanent; one
after it starts a new learning. Deletion happens after every run and whenlayover servestarts.
Each learning now records when it lapsed, andGET /learningsgives a lapsed one'slapsed_atand
deleted_after, which the dashboard shows beside it. Rejected learnings are kept, as before. - Flags can be declared once, for every workflow, in a top-level
[flags]table. Every
workflow accepts them as though it had declared them, and a workflow may still declare its own.
The trigger window andlayover explainoffer each workflow only its own flags and the shared ones
a prompt its agents read tests.validatewarns about a workflow repeating a flag exactly as
[flags]declares it. The workitem-factory and multi-workflow examples now declare theirs once. routes_fromlets a workflow use another's scoped routes:[pipelines.follow-up] routes_from = "development"scopes every route scoped todevelopmentto the follow-up too, so
those routes no longer each name both. It carries through chains of them; naming itself or an
unknown pipeline is an error. The multi-workflow example's follow-up uses it.- A workflow can set its own rails:
max_hops,fuel_usd,max_runsandtimeouton
[pipelines.<name>], for every chain it opens, spawns or resumes, instead of[defaults]. A chain
keeps the rails it started with.validatemeasures each workflow's reach, schedule and Reserve
fit against its own rails, and refuses one of zero. The Reserve stays factory-wide. - A pipeline that
resumesmay leave outentry. Its work goes back to whoever set it down,
so the entry was required and unused. Without one it cannot be triggered by hand, and its map
draws no arrow from it.GET /pipelinesgives such a pipelineentry: null.
Changed
[layover] state_diris warned about byvalidate. It has never been honoured — everything
Layover keeps is in.layover/beside the factory definition — and a key that is silently ignored
reads as though it works. A factory that sets it still loads;validate --strictnow fails on it.
Fixed
- An agent's
fuel_usdnow applies to a chain that starts at it, as it was documented to. It
was validated and shown as a workflow's Fuel on the dashboard, and every chain ran on
[defaults] fuel_usdregardless. A factory that sets one now runs those chains on it — a tighter
or looser budget than before, as the agent's value says.
Install layover-cli 1.12.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/KotkaZ/layover-project/releases/download/v1.12.0/layover-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/KotkaZ/layover-project/releases/download/v1.12.0/layover-cli-installer.ps1 | iex"Install prebuilt binaries via Homebrew
brew install KotkaZ/tap/layoverInstall prebuilt binaries into your npm project
npm install @layover/layover-cli@1.12.0Download layover-cli 1.12.0
| File | Platform | Checksum |
|---|---|---|
| layover-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| layover-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| layover-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| layover-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| layover-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo KotkaZ/layover-projectYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>