Skip to content

Releases: grpcer/ownmem

OwnMem 0.6.0

Choose a tag to compare

@grpcer grpcer released this 09 Sep 13:21

[0.6.0] - 2026-09-09

Breaking

  • Events record surface as hook rather than claude-hook, and carry two new
    top-level fields: agent (which coding agent produced the row) and nested
    (more than one host marker was present, so attribution is refused rather than
    guessed). Rows written before this release keep claude-hook and 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 --update installs the unattended daily pass on SessionStart
    and Stop, and generates <memory-dir>/git-hooks/post-commit as a third
    trigger. That pass commits the telemetry packages it writes and points
    core.hooksPath at 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; set telemetry.auto_commit or
    telemetry.manage_hooks_path to false in <memory-dir>/config.json, or
    pass ownmem 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. Run ownmem init --update once. v1 entries are
    replaced where they stand rather than appended beside, and hooks written by
    hand are left untouched. init --check and 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 --fleet merges 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 daily is 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 a post-commit hook without ever blocking either.
  • Codex hook support: ownmem init --hook writes <project>/.codex/hooks.json
    with the same events as the Claude configuration. Reaching those hooks takes
    three separate permissions -- hooks = true under [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. init names 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.hooksPath at <memory-dir>/git-hooks/, which
    ownmem init generates, and leaves the setting alone until that directory
    holds a post-commit hook. 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 a core.hooksPath pointing 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.
  • PostToolUse and Stop hooks now run. v1 registered ownmem posttool and
    ownmem stop, which are subcommands of ownmem hook and 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 posttool and ownmem 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 init on the default core layer no longer accepts --hook and then
    installs nothing: asking for hooks now installs the layers they need.
  • init --check no longer reports missing forever on a repository that
    replaced the synthetic example topic it was told to replace, and --update no
    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

Choose a tag to compare

@grpcer grpcer released this 05 Sep 16:29

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 passed on 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.
  • ownmem health no longer prints 0 query(s), 0.0% abstained for 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

Choose a tag to compare

@grpcer grpcer released this 03 Sep 06:46

Added

  • swift-test is a known test runner in the test-execution ledger, for
    projects whose tests run through SwiftPM's swift test --xunit-output.
  • ingestTestRun accepts 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

Choose a tag to compare

@grpcer grpcer released this 03 Sep 06:02

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 as missing-path with its test untouched in the main
    tree. Any directory carrying its own .git entry 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
    reading never-run forever: no runner reports a case by the suite's name.

OwnMem 0.5.2

Choose a tag to compare

@grpcer grpcer released this 02 Sep 08:37

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

Choose a tag to compare

@grpcer grpcer released this 01 Sep 04:40

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

Choose a tag to compare

@grpcer grpcer released this 31 Aug 04:23

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 compile

This 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

Choose a tag to compare

@grpcer grpcer released this 27 Aug 08:42

Added

  • correct_abstain records the other way recall can be right: it returned
    nothing, and nothing was the right answer. correct rejects an empty result
    set, so until now a correct abstention could only be filed as wrong or
    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_gap judges the corpus, and both can be true of
    one query: a question about an unrelated product is correct_abstain and 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" as verdict !== 'correct', so a
    second correct verdict would silently have been counted as outstanding work
    in all three.
  • readMissDismissalReceipts reads an ownmem-miss-dismissal-receipt/v1
    ledger, and pendingTriggerBackfills now 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.mjs refuses 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/v3 gains 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 carrying correct_abstain as invalid. Upgrade every reader in
    a repository before writing the new verdict into its ledger.

OwnMem 0.3.0

Choose a tag to compare

@grpcer grpcer released this 24 Aug 08:10

Full Changelog: v0.2.0...v0.3.0

OwnMem 0.2.0

Choose a tag to compare

@grpcer grpcer released this 18 Aug 10:19

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 embed exposes 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.mjs is the
    executable, lib/index.mjs is the package API, feature orchestration lives in
    lib/features/, and runtime contracts live under domain-grouped schemas/.
  • Tests and locked benchmark evidence moved to test/ and benchmarks/; 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 to docs/, 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.mjs from
    Git's cross-platform index metadata. Windows no longer fails because its
    filesystem does not expose POSIX execute bits through fs.stat().

Migration

  • Invoke runtime behavior through ownmem <command> and import the supported
    API from ownmem; root-level memory-*.mjs package internals no longer ship.
  • Resolve JSON contracts through ownmem/schemas/*. The three schemas with
    canonical GitHub URLs now identify their real paths under schemas/.