Releases: grpcer/ownmem
Release list
OwnMem 0.6.0
[0.6.0] - 2026-09-09
Breaking
- Events record
surfaceashookrather thanclaude-hook, and carry two new
top-level fields:agent(which coding agent produced the row) andnested
(more than one host marker was present, so attribution is refused rather than
guessed). Rows written before this release keepclaude-hookand are reported
as a separate legacy bucket; nothing is re-attributed after the fact, because
those days genuinely mixed hosts and a guessed attribution is worse than none.
Anything reading the event files or the report's buckets has to be updated. ownmem init --updateinstalls the unattended daily pass onSessionStart
andStop, and generates<memory-dir>/git-hooks/post-commitas a third
trigger. That pass commits the telemetry packages it writes and points
core.hooksPathat that directory while the setting is empty and the hook is
present. Both are new behaviour for a 0.5.x installation and both are
disclosed at install time; settelemetry.auto_commitor
telemetry.manage_hooks_pathtofalsein<memory-dir>/config.json, or
passownmem daily --no-commit, to switch them off. Not upgrading changes
nothing: 0.5.x hooks stay as they are.- The hook configuration is now v2 and the installed version is recorded in
<memory-dir>/config.json. Runownmem init --updateonce. v1 entries are
replaced where they stand rather than appended beside, and hooks written by
hand are left untouched.init --checkand the daily pass both report an
installation that is still on v1.
Added
ownmem archive [--day] [--backfill]reduces a finished UTC day of local
telemetry to a counted package under<memory-dir>/telemetry/, small enough
to commit. Counts only: no query text or digest, topic body, path, machine or
account name, or timestamp finer than the day. Idempotent, and a day with
nothing new is not rewritten.ownmem report --since 7d --fleetmerges the committed packages from every
machine, leads with which machine covered which day, and names the days that
have commits but no package. Overlapping days are counted once.ownmem dailyis the unattended pass behind both of those: archive, commit,
inspect what is already in Git, and print only what is wrong. It runs real
work at most once per UTC day and always exits 0, so it can sit on a session
hook and apost-commithook without ever blocking either.- Codex hook support:
ownmem init --hookwrites<project>/.codex/hooks.json
with the same events as the Claude configuration. Reaching those hooks takes
three separate permissions --hooks = trueunder[features]in
~/.codex/config.toml, the project trusted in that same file, and the hook
trust prompt on first sight -- and an untrusted project is silent, because it
never discovers the file at all.initnames all three, and reports a
checkout that is missing from the project trust list. A Codex hook process
receives no environment of its own, so every command declares its host
explicitly and finds the checkout from its working directory. - Grok CLI is a supported host (
--hosts grok). It reads the Claude files
through a compatibility layer, so it shares that configuration;init --check
reports when the checkout is missing from grok's trusted-folder list. - Agent attribution: recall, command, and turn events say which host produced
them, and the report buckets by agent instead of merging three agents into one
average.
Fixed
- The daily pass points
core.hooksPathat<memory-dir>/git-hooks/, which
ownmem initgenerates, and leaves the setting alone until that directory
holds apost-commithook. A path in this project's own checkout was used
during development; in any other repository it named a directory that does not
exist, and acore.hooksPathpointing at nothing installs no hooks at all --
every hook that repository had would have stopped running, silently. - Repository root resolution prefers the git checkout root when it carries an
installation, so a nested memory directory copy -- a fixture, an exported tree
-- inside a subdirectory no longer claims the root and receives that
checkout's local data. A checkout without an installation still yields to the
nearest one below it, so a monorepo package that installed its own memory
keeps answering for the directories under it. PostToolUseandStophooks now run. v1 registeredownmem posttooland
ownmem stop, which are subcommands ofownmem hookand not of the CLI, so
both answered "unknown memory command" and every installation collected
command outcomes and turn corrections from nowhere. v2 registers
ownmem hook posttoolandownmem hook stop.- The hook daemon keys its resident runtime per agent, so two hosts working in
one checkout no longer share one connection and one attribution. ownmem initon the defaultcorelayer no longer accepts--hookand then
installs nothing: asking for hooks now installs the layers they need.init --checkno longer reportsmissingforever on a repository that
replaced the synthetic example topic it was told to replace, and--updateno
longer puts that topic back into a governed corpus.- The host set chosen at install time is remembered instead of re-detected.
Grok leaves no marker in a repository, so an installation that named it
reported drift on the next check.
OwnMem 0.5.5
Fixed
- A filtered test rerun no longer shrinks a file's roll-up in the test-execution ledger. Selecting one case of a forty-case file derived a roll-up of one, and because the latest record per key won, a memory citing the suite then read
passedon the strength of that single case. On an unchanged file a passing roll-up that observed fewer cases now leaves the wider record standing; a failure, a wider run, or a change to the tested file still lands. ownmemhealth no longer prints0 query(s), 0.0% abstainedfor an install that never wrote a usage log. The usage log is opt-in (recall --usage-file), so its absence is reported as unavailable rather than as a measurement.
OwnMem 0.5.4
Added
swift-testis a known test runner in the test-execution ledger, for
projects whose tests run through SwiftPM'sswift test --xunit-output.ingestTestRunaccepts any runner the caller supplies an adapter for, so a
project can connect a toolchain of its own without editing the known list.
OwnMem 0.5.3
Fixed
- Trust receipts no longer bind a test anchor to a file inside a nested checkout
(a linked git worktree such as.claude/worktrees/<agent>/, a submodule, a
nested clone). The lookup by suite name descended into those copies,.claude
sorted ahead of the real directory, and once the worktree was cleaned up the
memory was quarantined asmissing-pathwith its test untouched in the main
tree. Any directory carrying its own.gitentry is now skipped, and the path
a memory declares next to its test locator takes precedence over the
repository-wide lookup. - Directory-anchor fingerprints skip nested checkouts for the same reason.
- A suite-level test anchor, whose symbol is the file's own type name, now
resolves to that file's roll-up in the test-execution ledger instead of
readingnever-runforever: no runner reports a case by the suite's name.
OwnMem 0.5.2
Patch release so host plugins stop teaching a frozen protocol. Skills now route to npx ownmem instead of hard-coding recall-feedback flags, and the dashboard skill no longer writes a long-lived access token under /tmp. Negated high-risk recall reads the receipt authority ceiling so evidence drift cannot leak a normative R5 prohibition. Plugin docs now state that third-party Claude Code auto-update is off by default and that npm install ownmem@latest plus npx ownmem init --update remains the version path.
OwnMem 0.5.1
Patch release for truthful recall-feedback diagnostics. Reports now distinguish wrong deliveries from wrong abstentions, preserve legacy unpaired verdicts as unknown, and publish the closed ownmem-report/v8 contract. Release verification passed repository tests, the 100-iteration 40-language benchmark, and npm pack dry-run.
OwnMem 0.5.0
Highlights
- Faster exact identifier, path, and error recall by narrowing candidate scoring before ranking.
- Lower allocation pressure during full index compilation; audited 1,000-topic P95 improved from about 2.4 seconds to about 1.9 seconds.
- Query-span and no-answer observability for safer evaluation without exposing query text.
- Versioned runtime and query semantics so benchmark and report windows remain attributable after upgrades.
- Refreshed README content in English, German, Spanish, French, Japanese, Korean, Brazilian Portuguese, Simplified Chinese, and Traditional Chinese.
- Clearer product wording and discovery metadata for AI coding agent memory, project memory, and supported hosts.
The release benchmark covers 40 languages and 25 scripts with 128 positive and 40 negative queries. Recall@1, Recall@5, MRR, and abstention precision passed at 100% in the release gate, with zero model or network calls.
Upgrade
npm install -g ownmem@0.5.0
npx ownmem init --update
npx ownmem audit
npx ownmem compileThis release uses query schema v5 and runtime semantics v0.10. No manual data migration is required.
See CHANGELOG.md for the complete change list.
OwnMem 0.4.0
Added
correct_abstainrecords the other way recall can be right: it returned
nothing, and nothing was the right answer.correctrejects an empty result
set, so until now a correct abstention could only be filed aswrongor
coverage_gap-- recall's successes were being counted as its failures, and
every operator's own error rate was inflated by exactly that much. It judges
recall's behaviour;coverage_gapjudges the corpus, and both can be true of
one query: a question about an unrelated product iscorrect_abstainand no
gap at all, while a real question this repository has never written down is
both. It never takes--expected, and it is refused unless recall did in
fact return nothing.- The feedback reader exports
FEEDBACK_CORRECT_VERDICTS. Three call sites
independently spelled "still needs a person" asverdict !== 'correct', so a
second correct verdict would silently have been counted as outstanding work
in all three. readMissDismissalReceiptsreads anownmem-miss-dismissal-receipt/v1
ledger, andpendingTriggerBackfillsnow excludes a miss recorded in it
rather than re-proposing it every run. A dismissal is deliberately not a
resolution: a resolution asserts the miss stopped reproducing, while a
dismissal only records that a person looked and decided no trigger edit can
reach it, so a queue with no terminal state re-grades that decision forever.
A receipt without a reason is rejected. The reader and the exclusion ship
first; no CLI command writes this ledger yet.
Fixed
- A rejected telemetry event no longer leaves its feedback row behind. The
event is validated against a closed schema and can throw, and it used to be
built after the row had already been appended: the operator reads an error,
re-runs the command, and the ledger now holds the same verdict twice. lib/features/trust.mjsrefuses to run as a direct entry point instead of
loading, exporting everything and exiting 0 having done nothing at all. A
clean exit from a module that needs the defaults its wrapper supplies reads
as a successful run: two such invocations reported success while the ledger
stayed stale.
Migration
ownmem-recall-feedback/v3gains one enum value rather than a new schema id.
A 0.4.0 reader accepts every 0.3.0 ledger unchanged, but a 0.3.0 reader
rejects a row carryingcorrect_abstainas invalid. Upgrade every reader in
a repository before writing the new verdict into its ledger.
OwnMem 0.3.0
OwnMem 0.2.0
Added
- A structural regression gate checks the root allowlist, local documentation
links, ESM imports, canonical schema URLs, npm publication boundary, and
cross-host skill mirrors. ownmem embedexposes the optional embedding workflow through the stable CLI
instead of requiring a package-internal script path.
Changed
- Runtime entry points now have explicit boundaries:
bin/ownmem.mjsis the
executable,lib/index.mjsis the package API, feature orchestration lives in
lib/features/, and runtime contracts live under domain-groupedschemas/. - Tests and locked benchmark evidence moved to
test/andbenchmarks/; npm
now publishes an explicit runtime allowlist instead of every root-level MJS
and JSON file. - Community health files moved to
.github/; translated READMEs, project docs,
and media moved todocs/, reducing the GitHub root from 67 entries to 22. - CI now uses five targeted runtime/platform combinations instead of repeating
the full release gate across a nine-job Cartesian matrix. Superseded runs are
cancelled, and official Actions are pinned to reviewed release commits.
Fixed
- The structure gate now reads the executable bit for
bin/ownmem.mjsfrom
Git's cross-platform index metadata. Windows no longer fails because its
filesystem does not expose POSIX execute bits throughfs.stat().
Migration
- Invoke runtime behavior through
ownmem <command>and import the supported
API fromownmem; root-levelmemory-*.mjspackage internals no longer ship. - Resolve JSON contracts through
ownmem/schemas/*. The three schemas with
canonical GitHub URLs now identify their real paths underschemas/.