Repository navigation
1.6.0 - 2026-07-25
Release Notes
Changed
OutcomeKindis now#[non_exhaustive]. Addingverifier_errorbelow breaks
any downstream exhaustivematchon it, so the marker lands in the same
release: consumers absorb one break now instead of another every time the
eligibility model gains a state. Match arms on the enum need a_arm.
Added
-
verifier_erroroutcome state, for a verifier that produced no verdict
because it crashed, timed out, or returned something unparseable. Until now
the closest available state wasfailed, which asserts the task was verified
and did not succeed and therefore penalises the chunks that were retrieved.
Reporting a broken verifier that way turns endpoint flakiness into permanent
negative priors on memories that may be perfectly good. Observed at benchmark
scale while judging a memory benchmark: 41 empty judge responses and 19
client timeouts were scored as wrong answers for the system under test.A
verifier_errorcredits nothing in either direction, even when used and
harmful chunk IDs are supplied, so it can be reported without knowing what
the run would have concluded. The event is still persisted and queryable, so
verifier failures stay visible instead of silently moving ranking. The
evidence requirement is unchanged: verifier types that require an evidence
reference still require one, since a broken run is exactly when the log or
job reference matters.No migration is needed, but the state is not readable by older binaries.
Downgrading after recording one makes the outcome list for that episode fail
to parse; other episodes and all ranking reads are unaffected.
Fixed
-
Background consolidation had no machine-wide ceiling. The 1.5.1 lock is keyed
on tenant and project, which stops one project stacking spawns but leaves the
machine unbounded: every project whose dirty region crossesMIN_REGIONadds
another detached child, and they all queue on the one store writer. A machine
with several active projects could therefore still reproduce the starvation
1.5.1 set out to fix. Spawning now also claims one of four interchangeable
slot locks under the data directory, so at most four background
consolidations run at once regardless of how many scopes are active. A spawn
past the ceiling returns{"skipped": "consolidation_slots_busy"}and is
reported bysession-startas a skip reason rather than a start. The scope
lock is still claimed first, so a contended scope reports itself as such
instead of consuming a slot it would not use. -
session-startdropped background-spawn errors. Only askippedreason was
surfaced, so a spawn that failed outright reported
consolidation_spawned: falsewith no reason, which reads as "nothing needed
doing". 1.5.1 moved scope resolution and lock acquisition into the parent,
making that path reachable, and the error is now reported. -
cargo testwas intermittently red, roughly three runs in twenty. The 1.5.1
lock test holds a child process while the rest of the suite runs, andfork
copies the whole descriptor table, so an unrelated test asserting on a freshly
released file lock could observe a copy still held by a child that had not yet
reached itsexec. Both affected assertions now retry briefly, matching the
allowance the 1.5.1 test already made for its own release check. Twenty
consecutive runs pass.
Install memd 1.6.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/fmschulz/memd/releases/download/v1.6.0/memd-installer.sh | shDownload memd 1.6.0
| File | Platform | Checksum |
|---|---|---|
| memd-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| memd-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| memd-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| memd-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |