Repository navigation
Releases
v0.9.0
Changelog
Added
-
With
review.mode: critic, the review-thread leg asks the critic once per pull
request head to sort the unresolved bot threads. It answers and resolves those it
calls invalid, duplicate or out of scope, quoting the critic's evidence. -
The threads the critic would apply become one round, judged by the touched modules'
paired tests and the type checker. -
Under
review.mode: critican attempt runs one to three candidates, by the unit's
size, each in its own worktree. The critic reviews the green ones in a fixed order
until one passes, andtorve whyandnight showlist the candidates. -
A dsh seat's candidate whose battery convicted three tests or fewer, or only mypy,
gets one more turn in its own session with the gate output before it is judged. -
Each unit that ran through selection writes a
unit.closedtelemetry record. -
unit: documentin a document'sphasing.yamlmints one contract for the whole
document, and is the default for three phases or fewer;unit: phasekeeps one
contract per entry. A whole-document contract's landing completes every phase. -
An agent profile's
finishcommand runs in the sandbox after the agent stops and
before its tree is judged, for example a formatter's fixes. Its exit status never
fails the attempt. -
torve abort --claim … --evidence … [--row <id>]stops a task from inside its attempt
when the rows, the intent and the tests cannot all hold. A halt on a LOCKED row goes
to the owner; any other goes back to the author as underspecified. -
review.mode: criticreviews a gate-green candidate with the critic: a frozen prompt
over the diff, the base tree and what the engine measured. The engine blocks on its
located findings and violated rows, never its stated verdict.classicstays default. -
A gate pass the critic will read writes
.torve/review/evidence.yaml: changed tests
run on the base and the head, a status per owned row, unrun acceptance, edits to
existing tests, and flags for gaming or text aimed at a reviewer. -
torve review corpus --mode classic|criticreplays the corpus through either seat and
reports whether each case would have blocked. Three cases join: a weak test, a test
edited to pass, and code that special-casesPYTEST_CURRENT_TEST. -
Upgrade: upgrade every host that shares a store together: a contract 0.9.0 mints
is version 3, and a night it closes on--passesnames a reason 0.8.0 does not know. -
Upgrade:
torve initrefreshes.torve/schemas/for version 3 contracts, a phasing
file'sunit, a profile'sfinishandreview.mode. A seat whose harness image names
{torve}runs the 0.9.0 images the tag's publish workflow builds.
Changed
-
A contract row's
checkruns only when its document completes, on the document branch
or at the local landing that completes it, never on an attempt or a rebase. Standing
invariants' checks no longer run in the lane, and a gate manifest'srowskey is
ignored with a warning. -
A task contract's scope is now
files,tests,fenceandcontingent. Only an
edit inside the fence fails the scope gate or meets the pre-write hook; one outside the
files and their tests is listed as evidence. Version 2 contracts load for this release. -
torve planlicenses each scoped module's existing paired tests in the contract,
fences the manifest'sscope.denyand the engine's own.torvepaths the phase does
not own, and adds up to ten LOCKED rows of other documents the scope touches. -
The dsh image moves to dsh 0.2.1-rc.5. It now shuts out project instruction files
and the default skill roots, gives a shell command up to 900 s in the foreground,
and reports usage and tool calls from dsh's v4 session log. -
A dsh seat's attempt runs as a session the engine drives through dsh's
--json
events, which give its tool calls, their results and each step's usage. A turn past
the seat's timeout is now killed inside the sandbox instead of left running. -
The context pack carries the files a task changes and their paired tests first and
whole, in the contract's order, and names its contingent files without carrying them.
A neighbour that sorted first can no longer push the task's own files out of the
prompt. -
The context pack no longer carries
gates.json,contended.jsonor coverage counts,
and a retry is handed only the reds that blocked. -
An attempt is no longer asked for attestation entries:
torve log divergencerefuses
decidedandresolved, the prompt andAGENTS.mdsections name no owed entry, and
the finish hook runs only the acceptance. Logs written before still read. -
torve log divergencewithout--attemptfiles its entries under the attempt the
engine pinned in the worktree, not attempt 1. -
A review no longer sees what earlier reviews of the same task found:
touched.json
dropsprior_reviews, which anchored each review to the last one's reading.
Removed
-
torve log owedis gone. -
torve evalandtorve shadoware gone, with the eval arms and shadow replays they
launched. A dispatch no longer refuses an image digest no eval verdict measured. -
torve fleetis gone. Serve each repository with its owntorve manager serve; a
report's default partition is now the configuration'sscm.repo, and
~/.config/torve/fleet.yamlis no longer read. -
torve serve, the web dashboard and theserveextra are gone. -
torve surveyis gone. -
The verify role is gone:
torve planmints no verify tasks, and thetorve:verifier
skill no longer ships. Finish any document planned with the verify pilot on before
upgrading: its verify tasks no longer load, and the tasks waiting on them never start. -
The
mutation,held-out,verify-tests,decisions-reported,self-audit,
user-facing-text,source-layout,red-on-baseandevidencegates are gone. A
gate manifest entry naming one loads with a warning and is ignored. -
A document's pull request no longer shows the Tests, Check, Survivors and Findings
columns in its decisions table. -
Standing jobs under
.torve/standing/no longer run, and escalations are no longer
sent to a webhook. -
The OpenSandbox runtime and the
opensandboxextra are gone;runtime.adaptertakes
dockeronly. -
The mimo, codex and opencode sandbox images are no longer defined or published.
-
The configuration keys
notify,verify,unmeasured_images,runtime.opensandbox
andloop.standing_max_per_tick, and a seat on the mimo, codex or opencode harness,
still load in this release: torve ignores them and warns.
Fixed
-
torve whycounted onlyblockerfindings as a review's blockers, so a review that
blocked a candidate on amajorfinding underreview.blocks_at: majorread as having
none. -
The dsh seat's door against
AGENTS.md,CLAUDE.mdand the default skill roots had
no effect: it patched keys dsh does not read, so those files reached every attempt.
Security
-
The gates read the gate manifest committed at the attempt's merge base, and the
contract from the root or the store, never from the attempt's worktree. An attempt
could previously edit both and change which gates judged it. A root edit after the
cut no longer moves an attempt in flight. -
The gate battery, the lane's included, mounts a cache volume of its own
(<cache_volume>-<slot>-gates) and a nested Docker daemon's state volume of its
own. Code a gate ran could previously leave files or images there for the next
attempt to read.
v0.8.0
Changelog
Added
-
night.engine_pathsnames the files that make up the engine. When a chained night's
fast-forward between nights changes one of them, the chain plans nothing, records
chain_engine_movedand exits with code 6, so a launcher loop can install the new engine
and start the chain again. The operating guide ships that loop. -
With
intake.issue_labelset, the manager's and the fleet's pass draft task contracts
from one labelled GitHub issue per pass, through the same drafting runtorve intake
starts. The issue is filed as a source first, and torve never writes to it. -
An issue is drafted only when the account that last applied its label holds triage or
more on the repository, and its title and body were not edited after that. -
torve spec checkwarns, for each phase of a document nothing has landed from, about
the files outside the phase's scope that import what it changes, and about the tests
importing them that no acceptance command runs. -
torve manager serve <partition> --night --chainruns nights back to back in one
process. Between nights it fast-forwards a clean checkout on the base branch and plans
every accepted, unimplemented document that has minted no task, except in the checkout
its own engine runs from. -
Under
--chain, the night budget bounds a UTC day, and each night opens with what the
day has left. -
A seat may name a
revision_variant, a configured tier. The revision that follows a
surviving review blocker runs on that tier before the task escalates. Empty, the
default, keeps the revision on the seat. -
A gate manifest may name
@suite. It runs the whole suite once, and a failing test
convicts only when that test is still red at the head and not red on the merge base. A
red the base also carries is recorded as inherited and never convicts; no command, an
uncollected file or a red naming no test fails. -
Every battery the lane runs is recorded as a
lane.judgedevent, andtorve why
shows it with its failing gates' output. -
A document's header may list
fixes, the issues it fixes: a number, orowner/repo#N
in another repository. Its pull request's body ends with oneClosesline per entry,
so the merge closes them, andtorve spec checkrefuses an entry that is not an
issue reference. -
A shadow gate,
evidence, names each decision row no changed test proves: one that
cites the row and fails on the base tree but passes on the candidate. A document's
pull request shows each row's proving tests, check, survivors and findings, and the
reviewer asks whether each proving test exercises its row. -
Upgrade: upgrade every host that shares a store together: 0.7.0 cannot read the
lane.judgedrecord a 0.8.0 battery writes. -
Upgrade:
torve initrefreshes.torve/schemas/forrevision_variant,
intake.issue_label,night.engine_paths, a document'sfixesand@suite. A seat
whose harness image names{torve}runs the 0.8.0 images the tag's publish workflow builds.
Changed
-
The review-thread leg refuses a thread as asking for a command only when it names one:
a run, execute, invoke or install verb with a code span beside it, or a shell code block.
The word alone in prose, as in "before a run starts", no longer sends a finding to a
person. -
An open document's pull request is rebased, and its battery run again, only when the
base's new commits conflict with it or change a file it changes. A merge that touches
neither leaves it as judged. -
The lane's re-gate after a rebase and its completion battery run only blocking and
decision gates, plusevidenceandmutationon the completion battery. A rebased
candidate whose only failing tests also fail on its base lands.
Fixed
-
A contract that inherits rows from an accepted document nothing has landed from carries
them without their checks. Those checks select code that does not exist yet, so they
failed on every review round and draft that touched the row's paths. -
torve log landrun with no execution log on disk records the work commit's parent as
the landing's base. It used to record the work commit as its own base. -
A task whose document was merged on the forge is not landed again, even when the
served checkout's own tree has not caught up. The lane used to cut the document branch
again from main and try to land the merged tasks onto it. -
A document pull request's merge is recorded once. While its branch stayed on the
remote, a served night used to record the same merge again on every pass. -
torve intakeandtorve adoptrun git with repository hooks off, as the rest of
torve does. A drafting run's own refusal is no longer reported as a configuration error,
and an issue whose drafting run never started is tried again on the next pass. -
A decision row's check runs only when the diff touches the row's paths or a file the
check names. A row that a later phase of the same document builds no longer fails its
check in each earlier phase, and those attempts no longer owe a log entry. -
The review-thread leg answers a refusal once per thread. It used to reply to its own
replies, and could loop with a review bot. -
A document whose contracts were minted into the record, with no contract file in the
checkout, completes. The lane reads each task's contract from the files it landed, and
a verify holdout no landing placed turns the completion battery red. -
A requeued task whose document branch moved past its checkpoint starts from the
branch's tip. It used to resume a tree without what had landed since, and fail on its
absence. -
A phase's contract lists, among its contingent paths, the files the manifest's
scope.derivedmap pairs with its sources. -
Two manager workers on one checkout no longer escalate a task when both cut
a worktree at once. The second waits for the first, and a cut no longer
writes.git/config, so a lock another git holds there cannot refuse it. -
A document that names another in
after:no longer waits forever on the named
document's review records, which never land. Its first phase waits on the
implement, verify and revert tasks alone, and a task already minted with such an
edge starts once those tasks land. -
The review-thread leg takes a new thread beside an answered one as a new finding when
another reviewer opened it. Only the answered reviewer's own thread there is escalated
as a re-raise.
v0.7.0
Changelog
Added
-
torve spec checkwarns, for a document nothing has landed from, on each LOCKED
row of adepends_ondocument that one of its phases' scopes touches. A phase that
contradicts such a row shows before the document is accepted, not when its executor
halts on it. -
torve spec checkwarns when a document's title is too long for its typed
pull request title, naming its length and the room after<gitmoji> <type>(<scope>):. Shortened before acceptance, the title is the squash
subject as written. The· n/m phasescount gives way rather than cut it. -
torve ledgerprices a subscription seat's attempts from their token counts
when its provider record names the model'slist_price, and marks the figure
~: what the tokens would cost, not an amount billed. The attempt's own cost
stays unreported, and a night's dollar budget does not count it. -
torve manager note --urgenthalts a running attempt: a Claude seat under a
broker stops at its next tool call, any other when its session ends. The task
escalates askilled, its gates never run, and its tree stays on its branch.
Changed
-
torve runs on forze 0.16.2, whose durable run tables are unchanged, so no
migration is owed. The configuration hash moves with the pin, so telemetry
starts a new regime, and this release's seat images carry the new forze. -
The spec-writer skill and the adopting reference say how a phase gets more time or
the stronger model: a seat variant with its ownagent_timeoutand
sandbox_timeout, named by the phase'stier_variantor reached through
character_routing. -
The scope gate names a file outside the scope whose change is whitespace alone,
such as a final newline or trailing spaces, asoutside allow, whitespace only.
It still fails, and the retry is told to undo the change rather than widen the scope. -
Upgrade: upgrade every host that shares a store together, and run the 0.7.0
seat images: 0.6.4 cannot read an urgent note's record, and only the new claude
image hands the provider's context window to the seat. -
Upgrade: the implement hooks gain
urgent_note.py, run before every tool call.
A profile equippingtorve:hooks/implementgets it with the package; a repository
with its own copy of.torve/agents/hooks/implement/copies it again.torve init
refreshes.torve/schemas/for the provider record'slist_price.
Fixed
-
A document pull request whose last phase lands green is published ready even
when the forge does not list the new completion status yet. A forge that
refuses to mark it ready is recorded aslane_pr_refused, no longer silently. -
The next phase of a document whose remote branch was rebased onto a moved
base no longer escalatesmerge_conflictwhen this checkout still holds the
old hashes. A copy whose landings the remote already has is reset to the
remote, and the phase lands onto it. -
A served night no longer closes as drained while a task that can still run is
queued or escalated, such as work waiting on an escalation. It keeps polling
until its wall-clock end, so the work runs once the escalation is resolved. -
A task whose manager was killed mid-attempt no longer stays
runningafter
torve reapexpires its run. The next pass escalates itlease_expired, so
torve manager resolveandtorve plan --refreshreach it. -
torve manager boardshows a review row its run already concluded as
consumed, astorve statusdoes, instead ofqueuedforever. The JSON
board is unchanged. -
The night guide and the operator skill name
torve plan --partitionas the
step that puts a freshly accepted document on the board. The manager's import
pass reads contract files and never plans a document. -
A task minted into the store no longer answers "no task" from
torve why
without--partition. With a store configured,why,status,context,
serveandmcpread the fleet manifest's partition for the root, else
scm.repo, and fall back to the files when that record lacks the task. -
An attempt's work commit is titled by its phase, not by its intent cut
mid-word, and a review round's names a lone finding's file with the path
whole. A subject still too long is cut between words, never inside backticks
or a path, and the commit body keeps the whole text. -
A phase's contingent paths, the context pack and a review round's paired tests no
longer take in copies from a git worktree or clone nested in the repository, such as
an agent harness's under.claude/worktrees/. -
The intake lint reads the drafting worktree's files. It read none, because that
worktree sits under.wt/, so a draft that left out its module's test file passed. -
Git works inside an attempt's Docker sandbox:
git status,diffandlog
read a read-only copy of the attempt's HEAD and index. The copy carries none
of the host's git config or other branches, and nothing in the sandbox can
write a ref. -
A Claude seat running a non-Claude model compacts at the window its provider
record states instead of at 200,000 tokens. Rebuild the claude sandbox image
to pick it up.
v0.6.4
Changelog
Fixed
- A red gate's clipped output keeps pytest's failure report from where it
opens, as far as the bound allows, and the summary. The gate's output, the
recorded result and the retry's context each kept only the tail, where the
coverage table had pushed every traceback out.
v0.6.3
Changelog
Fixed
- A task whose gates outlast the 15-minute lease is no longer released and
escalated by another worker: the pass recordsgates.startedwith its
longest run, and the lease waits that out. Upgrade every host together;
0.6.2 and earlier cannot read that fact.
v0.6.2
Changelog
Fixed
-
A phase is cut from its document branch with the landings held locally, so it
no longer conflicts with them on every attempt. A second conflict at the same
branch tip escalates for a person instead of requeueing to the attempt ceiling. -
A document branch holding landings for its wave no longer overwrites a hand
commit pushed to its pull request. The held landings are replayed onto it
before publishing, and a conflict escalates for a person instead of pushing. -
The implement finish check names the projections a task owes as
torve spec project --only <file>, so an attempt no longer rewritesAGENTS.mdfiles
outside its scope and failsscope.torve spec projectgains--only. -
A review round is no longer judged by a guessed
uv run pytestwhen the
acceptance gate names nocommands; the round is refused by name.torve doctoris red whilethreads.enabledis on and the commands are missing. -
A document pull request no longer stays a draft when its last phase lands by
hand, or when publishing it ready failed. The lane runs the completion battery
over a hand-completed tip once, and republishes a green tip still in draft. -
The nested Docker daemon and the seat images' Docker CLI run 29.7.2, as hosts
and CI do, instead of 27.5.1, where a directoryCOPY --chmodcreated got
another mode. Warmtorve-dind-<slot>volumes are upgraded in place.
v0.6.1
Changelog
Fixed
-
A scope glob may start with
/, the root anchor:/README.mdis the root's
README alone, so a phase naming it no longer blocks every other task as
overlapping.torve spec checkwarns when a phase names a root file with no
slash. -
A release retries an image push the registry refuses, and a rerun after a
partial push publishes only the images still missing. 0.6.0 published no
codex,dsh,mimooropencodeseat image.
v0.6.0
Changelog
Added
-
An attempt that writes ignored files outside the toolchain caches gets an
ignored-writesshadow result naming them, in its record and intorve why. It changes
no verdict. -
An opt-in verifier,
verify.enabledin the runner configuration, off by default. A
feature or fix phase that touches source gets a verify task first: an agent on the
verify seat writes the phase's tests from its decision rows. The implement task must
pass them and cannot edit them. -
A verifier can also write held-out tests that never enter the implementer's sandbox.
Theheld-outgate runs them in the gate checkout and reports only the failing row and
message. When the document's last phase lands, the lane commits them to its branch. -
The
verify-testsgate rejects a verify candidate whose tests do not collect, leave a
settled decision row without a test citing it, or already pass before the
implementation exists. -
torve eval --task <id> --verifierreplays a task with and without its verifier, and
--oraclerecords which arm let a known bug through. -
torve doctorfails when the verifier is on and its seat runs the executor seat's own
model. -
torve init --starterwrites a verify agent profile beside the implement, revert and
review ones.
Changed
- Every gate battery judges a standalone checkout of what the attempt would commit,
inside a sandbox. Ignored files, the attempt's.venvamong them, no longer reach a
gate, so a gate that leaned on one the attempt built now fails.
Fixed
-
A gate whose output is not valid UTF-8 reports its own verdict when it runs in a
sandbox. It was recorded as an infrastructure error, with its output lost. -
A shell gate that runs git, such as
coverage-delta'sdiff-cover --compare-branch,
judges the candidate in the sandbox. The battery's checkout is a repository of its own
whose history reaches the attempt's base. -
A run whose attempt raises, such as a seat image that does not start, ends escalated
instead of running. Requeueing the escalation now dispatches the task again, without a
torve reapfirst. -
A served night records on the board a candidate the lane escalates, such as one red
again at the same base and head. The board no longer shows it asreadywhile the
night waits on it, andtorve manager resolvecan answer it.
Security
- The lane's re-gate of a rebased candidate and the whole-document battery run their
shell gates in a gates sandbox under the default executor seat's image. They ran the
candidate's tests on the host, in the manager's environment.
v0.5.0
Changelog
Added
-
runtime.docker: nestedgives each sandbox of a role inruntime.nested.roles
(default[gates]) a Docker daemon of its own, in a privileged side container from
runtime.nested.image. Tests that start containers or compose stacks run in the
sandbox. -
A nested daemon keeps its images in the worker slot's cache volume and starts each
task with no container, volume or network a previous task left. One that does not
answer withinruntime.nested.ready_sseconds fails the sandbox's creation. -
The review role, OpenSandbox, sealed broker mode and every fleet trust class but
ownrefuse a nested sandbox. -
An acceptance command may name
dockerwhen the configuration nests the gates role;
the mint-time lint refuses it otherwise. -
torve doctorchecks, whenever any role is nested, that a proxy on the host's
loopback answers from the bridge gateway a nested sandbox reaches it through. A proxy
that listens on127.0.0.1only fails every image pull inside a nested sandbox. -
The base sandbox image carries the Docker CLI with its compose and buildx plugins,
justandopenssl. The seat images need rebuilding. -
Each release publishes the base and seat images to
ghcr.io/morzecrew, tagged with
its version, after checking that each one runs that version of torve. An adopter
pulls them instead of copying torve's image definitions. -
{torve}in a harness manifest's image or inruntime.imageresolves to the
installed torve's version, so an upgrade moves the images with the engine. torve's
own manifests name their images that way. -
torve doctoraccepts a published seat image with no local definition when its
labels name torve's repository and the host's torve version. -
torve manager resolve --resolution requeued --noteadds the note to the task's
feedback record, so the next attempt reads it.
Changed
-
just imagestags every image, the base included, with the version it stamps, and
no longer writes:latest. -
An invariant gate whose check selects no test fails as "the check selected nothing",
as a decision gate does. It stays shadow.
Fixed
-
torve spec checkin a sandbox, where git cannot run, reads the host's list of
tracked files instead of reading the tree as empty and passing. With no list, it
warns that the scan did not run. -
The lane checks citations on the host before a fast-forward, so a candidate that
cites a row no document defines goes back instead of landing. -
torve manager board --until-changeholds one store connection pool for its whole
wait, and every store a command opens closes when the command ends. -
torve manager returnmoves the candidate's run state back to queued under the
lane's lock, so the lane no longer lands a candidate an operator sent back. -
torve review corpusreplays reach their seat through the configured broker, so a
credentialed route no longer fails as logged out. A seat that gives no verdict is
reported as a seat error.
v0.4.0
Changelog
Added
-
.torve/config.yamlcan name the torve release a repository needs,engine: "X.Y.Z",
meaning that release up to the next minor. A command that loads the configuration
under a torve outside the range stops and names the install command for one inside
it;torve --version,guideanddoctorstill run. -
torve doctorgoes red when a seat image carries another torve version than the
host's.just imagesstamps each image with the version the host's torve reports
for the same tree. -
gates.yamlcan declare a Python project under a subdirectory,layout.root, and
top-level directories that ride with any change,layout.carried. The source-layout
gate, citation scan, spec quality report, coverage and default test paths read the
project root; the sizer counts a carried directory as no module. -
torve manager board --until-changewaits until a task's state, attempts or
escalation changes, or the night closes, then prints the changed rows and exits.
--documentnarrows the wait to one document's tasks. -
The base sandbox image carries CPython 3.14 beside 3.13, so a project on Python 3.14
runs its gates in a seat image without deriving one. -
torve guide torve upgradingstates the upgrade, and the adoption reference covers a
tool install,engine, a nested layout and the shipped hooks.
Changed
-
Breaking: torve's git commands no longer run the repository's git hooks; every
commit, rebase, checkout and push it makes setscore.hooksPath=/dev/null. A
repository that relied on a hook running on torve's commits moves that check into
its gates or its CI. -
Breaking: a repository installs torve as a uv tool rather than locking it as a
dependency, and the stubtorve initwrites calls baretorve. A repository that
keeps torve only in its lock installs it as a tool too, or the stub finds notorve. -
torve runs on forze 0.13.0. Its configuration hash moves with the pin, so telemetry
starts a new regime, and the seat images need rebuilding. -
Upgrade: the implement hooks ship in the package as
torve:hooks/implement, and
the starter implement profile equips them.torve initleaves an existing profile
alone: a repository that copied.torve/agents/hooks/implement/points its profile's
hook item there by hand and deletes the copy. -
For a project under a subdirectory, coverage reads its source prefix from the
report's Cobertura<sources>, the reviewer collapses every rider file
scope.derivednames as it doesuv.lock, and the context pack leaves out paths
tests.patternsnames.
Fixed
-
The sizer no longer counts a glob whose first segment is a wildcard, such as
**/x.py, as a module named**. -
A review, thread round or standing task minted during a served run no longer takes
the id of a task only the store holds, which removed that task's worktree and
crashed the night.torve intake,decompose,adoptandreview prtake
--partitionto number past the board's ids by hand. -
The served lane lands a task planned with
torve plan --partition. It read the task's
contract from.torve/tasks/, which such a plan never writes, so every pass failed
with "No such file or directory".
Security
- The dsh seat image runs dsh 0.1.2-rc.1. Earlier releases trusted the Host header on
dsh's local control-plane API, so code in the sandbox could run commands with full
access and lift the seat's approval policy. Rebuild the dsh image.