Repository navigation
Releases
2.5.2 — The session-start run is bounded and a vault node that is not a regular file never blocks it
Fixed
- A vault node that is not a regular file no longer blocks a run. A transaction entry, a preimage slot or a lock path that is a symlink, a named pipe or a directory is not opened: the entry is reported as a damaged transaction, the slot refuses the mutation that needs it and the lock path is refused. Each ERROR names the node. In 2.5.1,
init,journal --check,journal --resolveandjournal --repaircould hang on such a node, and a dangling symlink at the lock path madeinitloop forever. statusreports a vault entry that is not a regular file asjournal: unreadable; run journal --check, andjournal --checkanswers for it without opening it.- The harness path is read again immediately before the link is replaced. A path that changed while the repair waited is left alone with a WARNING, where 2.5.1 overwrote it; a path that cannot be looked at is a WARNING and no longer an uncaught error.
Added
init --lock-wait SECONDS(default 10) sets one deadline for every lock a run takes. TheSessionStarthook passes 3, so a busy lock costs a session about three seconds and leaves the harness link for the next start. The bound covers waiting for the lock, not the work done under it.
Changed (refusals an adopter upgrading from 2.5.1 can meet)
- A transaction entry that is a symlink to a valid transaction file, which 2.5.1 read, is now a damaged transaction and gates
inituntil it is replaced with a regular file or removed. - A preimage slot that is a dangling symlink, which 2.5.1 replaced, now refuses the mutation until it is removed.
- A lock path that is a symlink to a lock file of a dead process, which 2.5.1 broke, is now refused.
Known limits
- A process outside the plugin that replaces the harness path between its last reading and the rename, or the staged link between its last identification and the rename or cleanup, is not guarded against. The standard library has no compare-and-swap on a pathname; the relink never replaces a directory. This narrows the limit declared in 2.5.1.
- A process outside the plugin that replaces a regular preimage slot between its second
lstatand its removal has its file removed. - Two runs breaking the same dead lock can both end up holding it. The race predates this release and is not widened by it.
Decision record: ADR 0030.
2.5.1 — The harness link survives an unrelated journal refusal
Fixed
init --harness-memory, which theSessionStarthook runs, restores the harness-memory symlink after a readable journal refusal that does not concern the link, such as two adoption lineages in one legacy history. In 2.5.0 the session started without project memory and nothing said why.- The repair is decided and performed under the journal lock. It is withheld, with a WARNING ending in
run journal --check, whenever a retained transaction, a history condition or a vault entry that is not a regular transaction file could own the link. Paths are compared as the filesystem reads them: symlinked parents,.., case, and two names of the same file. - The same vault check now guards the repair when the journal cannot be read, when its lock cannot be taken, and when the vault's ignore entry cannot be written. A lock held by another validated-memory run withholds the repair.
Added
statusprintsstatus: journal: N history condition(s) stop init; run journal --check, with a WARNING, when the inspection thatjournal --checkperforms finds history conditions. The exit code does not change.
Known limits
- The lock serialises validated-memory processes only. A process outside the plugin that replaces the harness path between the check and the relink is not guarded against; the relink never replaces a directory.
initcan still block on a vault transaction entry that is a symlink to a FIFO, as in 2.5.0.statusreports such a vault as unreadable without opening it.
Decision record: ADR 0029.
2.5.0 — Safer init and a recoverable journal
Safer init and a recoverable journal
Version 2.5.0 hardens adoption. The first repository history is created with
no-replace publication, so an interrupted or concurrent init can no longer
leave a partial journal.jsonl. Interrupted transactions are recovered from
their write-ahead log before any later effect, and a torn history append is
repaired only when the retained log proves the exact bytes. When a gate
remains, init ends with one summary line: init: N item(s) confirmed, M gate(s).
The journal format stays at schema 1 (#27, #28, #29).
Fixes
initrefuses a harness memory path inside the adopter and a project-memory
target outside it, records managed directory symlinks as symlinks, skips
harness absorption when a whole-run gate remains, and keeps the backup path
visible when link publication fails (#16, #17, #18, #19, #20).- A directory at
memory/MEMORY.mdis reported as an index finding bylint
andstatusinstead of a traceback (#20). probebounds aggregate stdout and stderr per invocation (#13).- Directory-durability failures are explicit and recoverable; repair touches
only WAL-proven torn tails and owned temporaries (#14, #15). journal --checkrejects one transaction id reused across the repository
and local histories for different mutations (#21).renderkeeps the primary write error when temporary cleanup also fails (#22).- Bootstrap refuses database aliases
sourceandsource-*, which would
collide with source records (#23). - The session-context startup hook works under Bash 3.2 (stock macOS) and
with mawk or BusyBox awk, which abort on a directory argument. - Executing
validated_memory.clidirectly is a usage error; the CLI is
python3 -P -m validated_memory(#24).
Documentation
Executed implementation plans left the published tree; the memory-reuse
usefulness evidence now lives under evaluations/memory-usefulness/ and the
recall specification under docs/design/.
2.4.0 — Configurable discovery and clearer memory coverage
Configurable discovery and reliance
Version 2.4.0 adds an optional project profile for Claude Code. An adopter can
choose automatic discovery for each submitted prompt, explicit discovery only
for prompts prefixed with Busca en VA: or Validated-memory:, or leave prompt
discovery off. It can independently prefer lightweight candidate guidance or a
reviewed reliance workflow. Discovery remains bounded, lexical and fail-open;
returned candidates still require inspection and do not establish truth or
checked use. Projects without a profile keep the previous behavior.
Requested learning now has a documented path for distilling an explicitly
requested lesson, choosing the appropriate memory or curated layer, and reviewing
one selected record without changing the project profile. Capture remains
selective: discovery, task completion and cancellation do not save learning
automatically.
Resumption, transfer and recovery
Checked consultation gains a read-only resume-use report that compares a
historical checked use with the requested scope and known pending origin review.
It supports explicit task handoff and resumption without treating an earlier
observation as perpetual eligibility.
The new selected-material view for show-transfer exposes the complete retained
semantic material for one imported origin before local proposal authoring,
including dependencies, predecessors and known correction context. Transfer
validation and capture paths were consolidated to avoid duplicate acquisition
work and to harden bounded history checks. Imported material remains historical:
it does not prove live freshness, authorship, semantic equivalence or local
acceptance.
New task-lifecycle and whole-project recovery guidance covers trusted handoffs,
bounded delegation packets, fresh source inspection, single-project backup and
restore, and staged one-root-at-a-time migration. These are explicit procedures;
the plugin does not automatically transport task state through compaction or
subagents, gate every deliverable, or recover several roots whose identities were
lost together.
Safer probes and clearer status
probe now gives each configured command a 60-second deadline by default, with
--timeout accepting a finite value from greater than zero through 3600 seconds.
Timeouts record unknown, emit a warning and continue. Cleanup and reaping are
also bounded, with platform and descendant-process limits reported explicitly.
Output volume remains unbounded; the deadline is not a subprocess sandbox.
status adds five non-gating coverage lines. They count active and superseded
knowledge units, then classify active units in each evidence state as anchorless,
never recorded, partially recorded or fully recorded. Coverage means that a
matching anchor verdict exists; it does not mean that verdict is current. Existing
freshness flags and exit-code behavior are unchanged.
Compatibility and update
This is an additive release. It introduces no new consultation storage schema and
does not force an existing store upgrade. Existing evidence, supersession and
explicit-upgrade contracts remain in place.
For a Claude Code marketplace installation, refresh the marketplace, update the
plugin, then restart Claude Code:
claude plugin marketplace update validated-memory
claude plugin update validated-memory@validated-memoryIf the adopter also has a temporary or local development hook for the same event,
reconcile it before enabling the installed hook so candidate delivery is not
duplicated.
Validation
The frozen release passed 1,290 local tests, GitLab prepublication CI, and
postpublication CI on GitHub and GitLab (main, v2 and v2.4.0).
An independently built wheel from the exact release commit installed cleanly
and passed CLI smoke checks; 72 focused packaging-surface tests also passed.
These checks do not establish semantic understanding or savings in ordinary use.
2.3.0 — Contributions, corrections and portable history
Contributions, corrections and portable history
Version 2.3.0 adds an opt-in lifecycle for reviewing and incorporating contributions,
resolving challenges, and tracking correction effects through consumer conclusions
and reports. Portable transfer preserves foreign identities, evidence, dependencies
and supersession history while requiring explicit local correspondence and review.
A complete three-workspace example and everyday playbook cover the path from an
incorrect interpretation to corrected local use, report reflection and final handoff.
Consultation commands do not author canonical adopter files.
Compatibility and upgrade
Version 2.2.0 used consultation storage schema 1. Fresh 2.3.0 workspaces use schema 3.
Existing complete schema 1/2 stores remain readable for ordinary consultation and
are never migrated implicitly. To enable transfer, explicitly run:
python3 -P -m validated_memory consultation --store /absolute/workspace.sqlite upgradeUpgrade retains workspace identity and original logical event fields. Older clients
refuse schema 3 stores. Schema 2 was an unreleased incorporation format; its retained
history remains compatible with the explicit upgrade.
Export requires --include-workspace-history: selecting a receipt does not narrow
the complete history disclosed. Imports establish retained history, not live source
freshness, authenticated authorship or automatic local authorization. Capsules are
bounded to 8 MiB and stored payloads to 32 MiB per workspace.
Validation
Release validation passed 1,098 local tests independently in three runs, alongside
legacy-client upgrade evidence and a complete synthetic correction lifecycle.
The installable wheel was built and checked independently, including four CLI
checks from the wheel alone. All 97 existing fenced examples remain unchanged.
Remote CI results are verified as part of publication. Predetermined fixture
judgments do not establish empirical usefulness or model/token savings.
2.2.0 — Checked consultation
Version 2.2.0 adds opt-in checked consultation across registered local projects.
- Retain evidence bindings, scoped conflict decisions and inspected-content receipts.
- Record use against an exact consumer conclusion and check whether that use remains current.
- Review changed support and relocate projects through retained checkpoints without rewriting adopter files.
- Keep existing Markdown authoring and CLI exit codes unchanged.
See the checked consultation guide for a complete two-project example and the storage contract for limits and retained artifacts.
The specified mechanism and synthetic workflow are verified. This release does not establish empirical productivity gains or automatic understanding of inspected content.
Closes #6.