From 4e3a202b10c897fbc564b79d11314b2c0a1c5449 Mon Sep 17 00:00:00 2001 From: cdeust Date: Fri, 17 Jul 2026 09:45:29 +0200 Subject: [PATCH 1/2] chore(release): prepare v4.14.3 (fix write-gate, launcher-deps; deps bump; refactor split) Bump version 4.14.2 -> 4.14.3 across pyproject.toml, .claude-plugin/plugin.json, .claude-plugin/marketplace.json (SemVer patch: 4 fix/chore/refactor commits since v4.14.2, no new features -- #147/#148, #149/#150, #152, #134/#153). CHANGELOG.md: new [4.14.3] entry per Keep a Changelog, dated 2026-07-17, with a PENDING placeholder in the Verified section for the mandatory pre-tag benchmarks/reproduce.sh non-regression evidence (user mandate 2026-07-10) -- this commit prepares the release, it does not run the bench or cut the tag. marketplace.json version_note for the cortex plugin entry updated to match, same PENDING placeholder. zetetic-team-subagents cross-reference (2.28.1) left unchanged: no open release PR found on cdeust/zetetic-team-subagents and its latest tag (v2.28.1) already matches the pinned version. Co-Authored-By: Claude --- .claude-plugin/marketplace.json | 6 +++--- .claude-plugin/plugin.json | 2 +- CHANGELOG.md | 14 ++++++++++++++ pyproject.toml | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 91d315de..2d8c48db 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -6,14 +6,14 @@ }, "metadata": { "description": "Persistent memory and cognitive profiling plugins for Claude Code", - "version": "4.14.2" + "version": "4.14.3" }, "plugins": [ { "name": "cortex", "source": "./", "description": "Persistent memory and cognitive profiling for Claude Code — thermodynamic memory with heat/decay, intent-aware retrieval, biological plasticity, codebase intelligence, and cognitive profiling. 50 MCP tools (53 with the optional automatised-pipeline + prd-spec-generator integrations) with enriched schemas (visualization extracted to the standalone cortex-viz MCP). PostgreSQL + pgvector in CLI mode; automatic SQLite fallback in Cowork/sandboxed mode. v3.17.0 — autonomous per-project wiki: SessionStart auto-spawns a 6-hour consolidate cycle; a headless `claude -p` worker drains the curation-gap queue, calls codebase-intelligence MCP tools to ground each section in the real call graph, and authors missing anchor pages (architecture / services / api / data-flow / operations / decisions / PRD) per project from the source tree. 15 canonical scopes × 13 file sections; per-project dashboards under `wiki/_dashboards/`. Mermaid diagrams have a 🔍 lens with zoom + pan. Workflow graph with caller-qualified CALLS chains rendering full method-to-method dependencies (native tree-sitter, no AP required). Side panel humanized for non-technical users. Ingests codebase analysis (ai-automatised-pipeline) and PRDs (prd-spec-generator) into wiki + memory + knowledge graph. Docker image available.", - "version": "4.14.2", + "version": "4.14.3", "author": { "name": "Clement Deust", "email": "admin@ai-architect.tools" @@ -21,7 +21,7 @@ "homepage": "https://github.com/cdeust/Cortex", "repository": "https://github.com/cdeust/Cortex", "license": "MIT", - "version_note": "v4.14.2: layer-violation cleanup + devtooling. `refactor(core)`: the 3 pre-existing core→infrastructure layer violations tracked since #114 (`wiki_axis_registry.py`, `wiki_classifier.py`, `wiki_schema_loader.py` importing infrastructure directly) are fixed via reverse-DI ports-and-adapters — core now declares a zero-arg wiki-root/user-rules provider port, wired at the `mcp_server/__main__.py` composition root; no behaviour change (#135). Also: `check_setup` MCP tool exposed as a facade over `doctor.py` for in-session install diagnosis (#133); explicit XDG-aware `cache_folder` passed to SentenceTransformer instead of relying on library default (#132); project settings + `/preflight` command + settings catalogue + headless CI regimes (#131); one-command devcontainer with pgvector + prewarmed embedding/reranker models (#129); optional OTLP telemetry exporter, OFF by default (#128); stale hard-coded module counts replaced with a single-source pointer (#130); CLAUDE.md refactored to <200 lines with resynced storage truth (#125); corporate proxy/CA documentation for model downloads (#123); stale 'production database' bench-gate claim fixed + LoCoMo intra-day noise caveat documented (#121); Windows postInstall dispatch to cross-platform setup.py + real install path exercised in CI (#117). No retrieval-path code touched — confined to core/infrastructure wiring, devtooling, docs, and CI. Pre-tag guard on the exact release tree (git_sha 018c76d7, `benchmarks/reproduce.sh --no-ablation`, isolated ephemeral pgvector container, reranker loaded): LongMemEval MRR 0.9166/R@10 0.9820 (matches v4.14.1 0.9167/0.982 — no regression); LoCoMo 3-run mean MRR 0.8009/R@10 0.9146 (runs: 0.8015/0.9168, 0.8004/0.9142, 0.8006/0.9127 — vs v4.14.1's 3-run mean 0.7984/0.9142, an improvement within the documented same-commit noise band); BEAM MRR 0.5437/R@10 0.7139 (vs v4.14.1's 0.5406 — within the 0.539-0.547 intra-day production-DB variance band established in v4.14.1's own investigation; proxy metric, not gated). Floor-gate (tolerance 0.005): LongMemEval R@10 0.982 vs floor 0.982 PASS, LongMemEval MRR 0.9166 vs floor 0.914 PASS, LoCoMo R@10 0.9146 vs floor 0.915 PASS, LoCoMo MRR 0.8009 vs floor 0.805 PASS (-0.0041, within tolerance — each individual rep also passes, unlike v4.14.1 where rep1 alone read FAIL). Evidence: benchmarks/results/repro/20260715-v4.14.2-pretag/ (5 files: longmemeval-s, locomo-rep1/2/3, beam-100K). v4.14.1: MCP tool-error diagnosability + wiki hardening, cut immediately after v4.14.0 to carry a fix that landed on main just after that tag. `safe_handler` now raises `ToolError` on handler failure instead of returning a schema-violating error dict, so a failing MCP tool call surfaces its real diagnostic (e.g. a Postgres constraint violation, a missing file) instead of the generic 'Output validation error' every client previously saw regardless of cause (#103 follow-up, two commits: the initial ToolError raise + a safe_handler correction). Wiki: `wiki.pages` frontmatter parsing strips quoted/duplicated-label scalar values that previously broke FS↔PG sync (#104); `wiki_migrate --dry-run` made transactionally neutral — a dry run no longer leaves partial state behind (#108); `write_governed_page` validates and normalizes frontmatter at write time instead of only at read time, closing the gap that let malformed frontmatter reach disk in the first place (#109); `wiki_pages.py` refactored into cohesive collaborators (`wiki_frontmatter.py`, `wiki_frontmatter_validation.py`, `wiki_index.py`, `wiki_page_builders.py`) with no behaviour change (#111). No retrieval-path code touched — verified by diff: the full mcp_server change-set between v4.14.0 and this tag is confined to wiki_*, handlers/consolidation/page_io.py, handlers/wiki_migrate.py, handlers/wiki_write.py, and tool_error_handler.py, none of which is in the memory_ingest/pg_recall/reranker import closure any retrieval benchmark exercises. Pre-tag guard (exact release tree): LongMemEval MRR 0.9167/R@10 0.982 (matches v4.14.0 0.9166/0.982); LoCoMo 3-run mean MRR 0.7984/R@10 0.9142 (v4.14.0 was 0.8005/0.9131 — Δ MRR -0.0021 is smaller than v4.14.0's own documented ±0.0025 single-run variance, not a regression; R@10 improved); BEAM 0.5406 (3 runs, spread 0.0001) vs v4.14.0's 0.5471 — investigated as a same-day, same-production-DB A/B: a same-day v4.14.0 control run measured 0.5445 then, on rerun ~2.5h later, 0.5391 — i.e. the SAME tree spans the same 0.539-0.545 band as v4.14.1, and a 4-point bisect (53712df8, 49f29e98) landed inside that band with no monotonic step at any commit boundary; combined with the import-closure diff above (BEAM's read/write path is architecturally unreachable from every 4.14.1 commit), the deviation is intra-day production-DB variance, not a code effect — BEAM is not gated by reproduce.sh's floor check (proxy metric, within-system comparison only) so this does not block the tag. Floor-gate result (reproduce.sh::check_floors, tolerance 0.005): LongMemEval R@10 0.9820 vs floor 0.9820 PASS, LongMemEval MRR 0.9167 vs floor 0.9140 PASS, LoCoMo R@10 0.9142 vs floor 0.9150 PASS, LoCoMo MRR 0.7984 vs floor 0.8050 FAIL (-0.0066, exceeds the 0.005 tolerance) — flagged, not hidden: this fails the codebase's hardcoded absolute floor while passing the release's actual stopping rule (no regression beyond noise vs the v4.14.0 baseline); the absolute floor has not been re-baselined since the 4.11-4.13 measurement era and LoCoMo MRR has trended down release-over-release with no corresponding retrieval-code change, suggesting the floor itself needs recalibration in a future session, ideally against an isolated benchmark DB rather than the live growing production store used here. Reranker active. Evidence: benchmarks/results/repro/20260714-v4.14.1-pretag/ (11 files: the 5 primary runs, beam-100K-rep2/rep3, and 4 investigation runs — beam-control-v4140, beam-bisect-53712df8, beam-bisect-49f29e98, beam-bisect-da3f2104-rep2). v4.14.0: schema-migration entry point + wiki.pages↔FS parity. New standalone `python -m mcp_server.migrate` brings a PostgreSQL store's schema current by reusing PgMemoryStore's existing hash-gated, advisory-lock-serialized DDL apply (no duplicated DDL, no MCP server boot); cortex-viz 2.6.1's open_visualization preflight invokes it (frozen contract: `DATABASE_URL= python -m mcp_server.migrate` → exit 0 'schema up to date'|'applied N statements' / exit 1 one-line stderr) to migrate an outdated store before building the graph, surfacing an actionable message instead of a silently empty graph when it can't. New `wiki_migrate` MCP tool + wiki.pages↔filesystem reconciliation (backfill, ghost purge, parity guard, pages_status_check widened to the full system-emitted status union) — standalone tool count 49→50 (53 with upstream integrations). Pre-tag guard (exact release tree 4fd17b45): LongMemEval MRR 0.9166/R@10 0.982; LoCoMo 3-run mean MRR 0.8005/R@10 0.9131 (single-run variance ±0.0025 straddles the 0.805 floor; the mean clears the 0.005 tolerance and matches the 4.13.3 baseline 0.8017/0.9152 on identical retrieval code); BEAM 0.5471; reranker active; all gated floors PASS. v4.13.3: third-party inspection contract restored — psycopg (optional dep) was imported at module top-level by 22 pg_store_* modules, crashing any bare install (uv sync / fresh env — exactly the registry-indexer path; glama's card had been frozen at v3.0.0 for ~2 months) before tools/list could answer. Lazy/TYPE_CHECKING imports fix it; a blocking docker-smoke CI gate (bare container, zero env, real stdio tools/list >= 49) makes the silent regression impossible; explicit-DATABASE_URL-unreachable now refuses silent SQLite fallback (integrity boundary, opt-out CORTEX_ALLOW_SQLITE_FALLBACK=1); PRIVACY.md rewritten truthfully per surface and Cowork validated E2E on the pure-SQLite path. v4.13.2: MCP schema-drift fix — several tool inputSchema declarations diverged from their handler signatures (#98: supersedes_id/write_class on remember, memory_ids on wiki_write, distillation in the source enum) and the checkpoint outputSchema was unsatisfiable (#99: action required-but-only-set-on-failure, checkpoint_id typed string vs the integer returned). Both corrected, with wrapper↔handler parity + checkpoint output-schema tests added. No read-path change; pre-tag guard LongMemEval MRR 0.9166/R@10 0.982 — manifest 20260712T123142Z, reranker active, all gated floors PASS. v4.13.1: Windows hotfix — UTF-8 hook streams (#96), non-destructive deps bootstrap (#97). Pair with cortex-viz 2.5.0 + automatised-pipeline 0.6.1. 4.13.0 (pairs with cortex-viz 2.5.0 and automatised-pipeline 0.6.1) — grooming becomes continuous instead of session-bound, closing a measured 76-day wiki-silence gap: a recurring citation-reconciliation pass and a lesson_promotion backlog count (0.8ms with a new GIN index, down from 81ms) are now wired into the periodic consolidation cycle; a new READ_ONLY get_grooming_health tool (~1s) surfaces backlog + staleness for wiki/distillation/promotion, with a sourced 6-day staleness threshold (3x the measured p90 inter-cycle gap) and a single session_start line when crossed; a scheduled scripts/groomer.py entry point ships dry-run by default (--apply gated behind the same headless-authoring opt-in), with its launchd schedule documented but deliberately left uninstalled. Fixed: headless wiki writes now route through the same governed write_governed_page path as interactive writes (write_class + citations + provenance, no more raw disk writes) — and, found on the way, a CRITICAL latent bug: the anchor-page frontmatter template's `status: living` violated the wiki.pages CHECK constraint since its origin, silently failing the wiki.pages/wiki.citations sync of every interactively-authored curate_wiki page in production (now `seedling`). 49 standalone / 52 full-upstream MCP tools (1 new: get_grooming_health). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8021/R@10 0.9193, BEAM 0.5469 — manifest 20260711T172056Z, reranker active, all 4 gated floors PASS. 4.12.0 — the \"mémoire qui comprend\" program completes: every remember is graded locally at write time (verified/verifiable/unverifiable, zero network) as an additive `prov:` tag, without touching `source_attribution` — `validate_memory` stays its sole writer, since that column already carries a different, incompatible epistemic-origin vocabulary the confabulation guard keys off of (a dry-run corpus sweep is committed; `--apply` withheld pending a G-ranks check on 3,042 projected staleness flips). Lessons become a first-class, traced object: rules/triggers gain a `source_memory_id` pointer to the lesson that produced them, session-end self-critique suggestions are now persisted instead of discarded, and a new READ_ONLY `lesson_promotion` tool proposes rule/trigger/wiki promotion jobs (never executes them itself) — proven end-to-end on real PostgreSQL. A new READ_ONLY `curate_distill` tool assembles error→success, co-access, and entity-family dossiers for the LLM to turn into deliberate lessons (25 eligible on the live corpus; two real bugs — a self-pairing memory and an unbounded 53-member cluster — found only by running against real data, both fixed). A wiki-citation seed campaign audited three candidate memory↔page link sources and found only one usable at HIGH confidence (20 pages with a real unique FK); seeded dry-run only. Pre-tag guard: LongMemEval MRR 0.9168/R@10 0.984, LoCoMo MRR 0.8024/R@10 0.9183, BEAM 0.5455 — manifest 20260711T115601Z, reranker active, all floors PASS. 4.11.0 — the graph channel wakes up: `spread_activation_memories` had been dead since inception (a non-recursive `WITH` clause raised a SQL error swallowed by a bare except, invisible under mocked tests) and is now repaired, domain-scoped, and defaulted to tail-fill (completes short recall slots after re-ranking, never reorders — the channel's first empirical measurement in augment mode showed MRR -0.016/R@10 +0.002, so tail ships under the zero-regression gate; `sa_mode` exposes tail/augment/off). `remember` gains an explicit `write_class` parameter (auto/deliberate/derived/mechanical) read directly by the homeostatic fold instead of inferred from source strings; the 6.6 re-heat campaign's source-taxonomy filter is found to have been comparing against the wrong string values since its origin (91/540 raised memories were mechanical, not deliberate). A 219-site silent-except audit repairs the 30 critical sites on the recall/write-gate/consolidation paths via a new observability module (36 caplog tests). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8014/R@10 0.9157 (first reading on the repaired bench instrument, within gate tolerance), BEAM 0.5493 — manifest 20260711T080344Z, reranker active. 4.10.0 — CRITICAL reranker fix: FlashRank's cache_dir defaulted to /tmp (library default), which macOS purges; the resulting NoSuchFile was swallowed by a bare except, silently disabling production re-ranking with zero log signal (measured MRR 0.9163 -> 0.8636, delta -0.053). Fixed with a durable ~/.cache/flashrank cache_dir, non-silent failure logging, and reranker_status()/model_sha256() introspection; existing installs lose their re-ranker on every /tmp purge — upgrade recommended. Also: novelty-only auto-capture template normalization (write-gate signal only, stored embeddings untouched), per-write-class homeostatic health/fold stratification (fixes deliberate memories being re-suppressed by a class-blind fold), and a repaired bench measurement instrument (per-run container isolation, pinned embedding model revision) that had been silently cross-contaminating LongMemEval scores across worktrees. 4.3.0 — wiki data-quality (Volet 4): a domain-backfill maintenance pass re-derives the true project domain for wiki pages stuck on a catch-all bucket (uncategorized/_general/global/…) by majority-voting the repo that physically contains the files each page cites — refusing on a tie (no fabrication). Wired into the autonomous consolidate cycle so it self-heals; lifts wiki→source resolvability on the shared store. 3.23.0 — registry-indexer build fix. Added the `neuro-cortex-memory` console script (entry point `mcp_server.__main__:main`) so `uv run neuro-cortex-memory` resolves from a checkout. Registry indexers such as Glama build the repo with `uv sync` and launch the server via `uv run neuro-cortex-memory`; previously only `cortex-doctor` was declared, so the spawn failed (`No such file or directory`), the container exited before any tool registered, and the tools score collapsed. The server starts over stdio and registers all 43 standalone MCP tools without a PostgreSQL connection (46 with the upstream integrations), so `tools/list` answers inside a DB-less container. No change to the marketplace install path or any runtime behaviour. 3.22.0 — security + reliability hardening (P0/P1 audit). Security: headless-authoring RCE fix (--tools restricts the subprocess toolset + --bare ignores the untrusted repo's settings/hooks, replacing the misused --allowedTools), DSN/secret redaction (libpq ?password= query params + psycopg exception leaks), pip supply-chain hardening (env-sanitized index lock). Fixed: the SQLite fallback's A3 heat→heat_base rename was incomplete — all 11 indexes were never created (full table scans) and search/stats queried a non-existent column; supersedes_id + min_access parity; remote-PostgreSQL preflight (pg_isready honors the DATABASE_URL host); flaky handler tests root-caused in the test harness. Added: P1-8 test coverage, a SQLite-backend CI job, and deployment docs (WSL, TLS client-certificate DATABASE_URL, remote PostgreSQL). PostgreSQL remains the mandatory backend; 46 MCP tools. 3.21.0 — visualization extracted to the standalone cortex-viz MCP (github.com/cdeust/cortex-viz). The galaxy graph, execution trace, knowledge/board/wiki/pipeline views, the HTTP server, the workflow-graph builders, and all ui/ assets (−50,671 lines) move out of Cortex into cortex-viz, which reads this same PostgreSQL store read-only — Cortex is a focused memory engine again. BREAKING: the open_visualization, get_methodology_graph, and query_workflow_graph MCP tools are removed from Cortex; install cortex-viz to get them back (its /cortex-visualize skill replaces the old one). 46 MCP tools remain. No memory, retrieval, consolidation, or wiki behaviour changed; full suite green (3214 passed). 3.20.0 — graph intelligence + memory knowledge-updates. Codebase graph: Leiden community detection, centrality + god-node analysis, and native 7-language tree-sitter symbol extraction (no automatised-pipeline required). Memory: explicit supersession edges so a knowledge update links to and ranks above what it replaces; a MinHash entity-dedup engine with AST-symbol origin flagging plus a mutating consolidate-time entity-merge cycle; an inline relation-walk recall mode (include_related) that returns a memory's neighbours in one call; connection-rooted scoping via CORTEX_ROOT_AGENT_TOPIC. Visualization: node-click orchestrator, uncapped galaxy, causal-chain and cwd fixes, O(1)-amortized canvas hit-testing via a uniform-grid spatial hash, and a refusal to index plugin-cache copies. Supersedes the never-tagged 3.19.6 (its launcher self-heal + SSE-only galaxy delivery are included below). CI restored to green (ruff format/lint + I2 canonical-writer line-shift). 3.19.6 — MCP connect self-heal: an interrupted first dependency bootstrap (pip --target killed by the MCP startup timeout) left namespace husks (package dirs without __init__.py) that shadowed every healthy install — the server failed to connect on every retry, permanently. The launcher now detects husks (module.__file__ is None), deletes them, and reinstalls; pip installs are atomic (temp dir, committed only on success); pip failures print to stderr instead of being swallowed, with a PEP 668 --break-system-packages retry. Galaxy graph delivery is now the live SSE stream (/api/graph/events) ONLY — the polling phase loader is gone; the build kicks at server launch, every level L0–L6 streams in real time, the stream closes once at true end-of-build, and warm processes replay the event buffer. L6 now FINISHES (four fixes: stream closed at baseline before symbols; SSE client never loaded by the page; a 1s-per-batch throttle against a consumer-less layout authority ≈1h of sleep; O(n²) merge that pinned the GIL for hours and starved all HTTP requests — measured after: full build 202s, 143,816 nodes incl. 94,437 symbols). Every node kind is browsable: /api/graph/node resolves symbols/files/domains via a new id index (previously only memory:/entity: PG ids; the detail panel stayed empty). 3.19.5 — open_visualization reuses the running viz server via an instance registry instead of spawning a new port + cold rebuild per call; skeleton-snapshot clobber of the full graph snapshot removed. 3.19.4 — plugin MCP server config inlined in plugin.json (repo-root .mcp.json dropped) fixing a failing cortex MCP server when developing inside the plugin repo itself. 3.19.1 — ingest stdio pipe deadlock fixed: batch tool calls run on fresh per-call event loops, so a pooled MCPClient bound to a closed loop was reused with a dead _read_loop — the Rust child blocked in write() once its response exceeded the 64KB OS pipe buffer and both sides slept forever (4.5h+ at 0% CPU; the upstream cause of 'graph shows only the global domain / stale codebase'). MCPClient now records its bound event loop at connect and reports disconnected when that loop is closed or foreign, so the pool discards dead clients and reconnects on the live loop. New CORTEX_MCP_CALL_TIMEOUT_S (default 600s = 10x measured 32s analyze latency, down from 3600s) makes a wedged call fail loudly in minutes with a diagnostic naming the pipe-buffer cause. Regression-tested: 256KB-response child, silent-child timeout, closed/foreign-loop reuse guards. 3.19.0 — memory hygiene + scoring integrity: the 60x auto-capture scoring inversion fixed at all three roots (prospective-trigger injection bypass — 319 garbage keyword triggers harvested from raw tool dumps deactivated, word-boundary matching, low-signal taxonomy + cap + injected:true on injection; WRRF de-bias — hot/recency pools exclude post_tool_capture, mechanical freshness is not importance; metamemory confidence as a Kraaij-2002 document prior wires rate_memory feedback into rank). Oversized auto-captures now store a deterministic gist + content-addressed artifact pointer (GIST_BUDGET = measured p90 curated memory length; full output one Read away — no truncation), same gate on backfill/import. Concurrency governors: upstream MCP connection pool bounded (LRU-evict idle / fail-fast) with the per-server cap regression-tested. Constant-memory pipeline closed: AP cross-loop waits bounded (a wedged subprocess can no longer hang a worker forever), per-query AST accumulators are generators, /api/quadtree streams Arrow record-batches through gzip (constant RAM at any node count). cortex-visualize: GRAPH galaxy tab restored alongside TRACE (the build kick, snapshot readiness, and phase loader were all dead since 3.18.0 — readiness now validates the CXGB header, not file size); auto-loads through L5, AST symbols load on demand; HUD shows true in-galaxy memory counts. Test-suite safety: pytest refuses destructive isolation against any populated non-test database (incident 2026-06-10: 537k production rows lost to CI=true + production DATABASE_URL). Benchmarks regression-free (LongMemEval R@10 98.4% / MRR 0.916; LoCoMo MRR 0.828; BEAM A/B delta 0.001). 3.18.4 — graph build is progressive, not big-bang: hash-gated schema migration (one indexed check instead of re-running 83 DDL stmts under a blocking lock on every store init — kills the connection storm), embedding-free keyset-paginated memory streaming (no upfront 500k sort; ~227 B/row not ~2 KB), and per-batch memory-node pruning (bounded RAM) replace the load that OOM/watchdog-crashed and stalled at 'loading memories'. git diff + file history now resolve for ANY file type (git root derived from the file's own absolute path). AP impact diagram fixed (absolute→repo-relative File.id match) and JavaScript files now produce AST symbols (AP maps js/jsx/mjs/cjs → TypeScript grammar). Legend counts the RENDERED graph, not server totals (fixes 36-domains/0-discussions mismatch). Self-healing AP MCP bridge: bounded handshake (no unsourced sleep), idle-close reconnect, no permanent poison on a transient failure. Stale per-project code-graphs pruned on re-index. CodeQL path-injection sanitisers (is_relative_to). 3.18.3 — codebase-graph freshness made trustable: find_cached_graph self-heals (validates the graph still exists on disk + picks the most-recent valid memo) so a deleted graph can no longer make ingest_codebase silently project an empty graph; new post_commit_reindex PostToolUse hook re-analyses on commits that touch indexable source (detached, 120s-coalesced) closing the SessionStart-TTL staleness gap. Cross-lens documentation graph (WIKI lens) in cortex-visualize: wiki pages as scope-clustered nodes with typed wiki_link + provenance + concept co-occurrence + cross-lens entity/symbol edges; wiki_graph unions PostgreSQL + filesystem page sources and derives [[wikilinks]] from page bodies. 3.18.2 — PRD ingestion fixed + grounded: ingest_prd now calls prd-gen's get_pipeline_state with the correct run_id/format (the pipeline_id source path was broken) and records prd-gen quality history; part of the AP↔prd-gen↔Cortex grounding loop (codebase→spec→memory). 3.18.1 — HUD shows true store counts (memories/entities/synapses) via /api/stats instead of loaded-graph nodes; impact panel refactored to use automatised-pipeline's typed tools (get_context/get_impact) for full direction incl. implements/uses + community/process blast radius; AP MCP resolved from installed_plugins.json (compiled binary, not bin/* glob); HTML-attribute XSS escaping + non-security node-id hash. 3.18.0 — live execution-trace graph in cortex-visualize: domain→session→chain (no snapshot), galaxy-style type-banded clusters, file impact panel wired to the AP code graph (caller/callee direction, causal chains, per-file git versions). Loopback-only host guard retained (GHSA-gvpp-v77h-5w8g).", + "version_note": "v4.14.3: write-gate contract fix + launcher-deps hardening + deps bump. `fix(remember)`: write_class=\"deliberate\" (or omitted, source-fallback) was rejected by the novelty gate, violating the documented contract that deliberate writes are never rejected for low novelty — write_class is now threaded through evaluate_gate/_compute_gate_decision/determine_bypass, checked last so a more specific content-based bypass reason still wins; a second defect where force=True/plain writes intermittently raised a misleading DATABASE_URL hint on a bare FileNotFoundError from validate_memory.grade_from_content(base_dir=os.getcwd()) after a worktree cleanup removed the process cwd is fixed by wrapping that one enrichment step in the same defensive try/except pattern used by every sibling step (#147, #148). `fix(launcher-deps)`: pip_install's per-entry commit loop pruned superseded *.dist-info siblings immediately after each entry committed; unspecified os.listdir() ordering could delete the still-valid OLD dist-info right before the new package-directory entry failed and rolled back, leaving deps_dir with reverted package files and no metadata for either version (Python-3.10-only flake) — the destructive prune now waits until the whole tmp_dir commits successfully (#149, #150). `chore(deps)`: mcp bumped 1.27.0 -> 1.28.1 (#152). `refactor(core)`: wiki_classifier.py and wiki_axis_registry.py split under the repo's 500-line file limit into wiki_axis_defaults.py/wiki_classifier_gates.py/wiki_classifier_patterns.py/wiki_kind_detection.py/wiki_title.py, no behaviour change (#153, #134). No retrieval-path benchmark code touched by #150/#152/#153; #148 touches the write-gate (write path, not the recall path reproduce.sh's LongMemEval/LoCoMo/BEAM floors exercise) — confirmed empirically by the pre-tag `benchmarks/reproduce.sh` gate below rather than by import-closure inspection alone. Pre-tag guard on the exact release tree: . v4.14.2: layer-violation cleanup + devtooling. `refactor(core)`: the 3 pre-existing core→infrastructure layer violations tracked since #114 (`wiki_axis_registry.py`, `wiki_classifier.py`, `wiki_schema_loader.py` importing infrastructure directly) are fixed via reverse-DI ports-and-adapters — core now declares a zero-arg wiki-root/user-rules provider port, wired at the `mcp_server/__main__.py` composition root; no behaviour change (#135). Also: `check_setup` MCP tool exposed as a facade over `doctor.py` for in-session install diagnosis (#133); explicit XDG-aware `cache_folder` passed to SentenceTransformer instead of relying on library default (#132); project settings + `/preflight` command + settings catalogue + headless CI regimes (#131); one-command devcontainer with pgvector + prewarmed embedding/reranker models (#129); optional OTLP telemetry exporter, OFF by default (#128); stale hard-coded module counts replaced with a single-source pointer (#130); CLAUDE.md refactored to <200 lines with resynced storage truth (#125); corporate proxy/CA documentation for model downloads (#123); stale 'production database' bench-gate claim fixed + LoCoMo intra-day noise caveat documented (#121); Windows postInstall dispatch to cross-platform setup.py + real install path exercised in CI (#117). No retrieval-path code touched — confined to core/infrastructure wiring, devtooling, docs, and CI. Pre-tag guard on the exact release tree (git_sha 018c76d7, `benchmarks/reproduce.sh --no-ablation`, isolated ephemeral pgvector container, reranker loaded): LongMemEval MRR 0.9166/R@10 0.9820 (matches v4.14.1 0.9167/0.982 — no regression); LoCoMo 3-run mean MRR 0.8009/R@10 0.9146 (runs: 0.8015/0.9168, 0.8004/0.9142, 0.8006/0.9127 — vs v4.14.1's 3-run mean 0.7984/0.9142, an improvement within the documented same-commit noise band); BEAM MRR 0.5437/R@10 0.7139 (vs v4.14.1's 0.5406 — within the 0.539-0.547 intra-day production-DB variance band established in v4.14.1's own investigation; proxy metric, not gated). Floor-gate (tolerance 0.005): LongMemEval R@10 0.982 vs floor 0.982 PASS, LongMemEval MRR 0.9166 vs floor 0.914 PASS, LoCoMo R@10 0.9146 vs floor 0.915 PASS, LoCoMo MRR 0.8009 vs floor 0.805 PASS (-0.0041, within tolerance — each individual rep also passes, unlike v4.14.1 where rep1 alone read FAIL). Evidence: benchmarks/results/repro/20260715-v4.14.2-pretag/ (5 files: longmemeval-s, locomo-rep1/2/3, beam-100K). v4.14.1: MCP tool-error diagnosability + wiki hardening, cut immediately after v4.14.0 to carry a fix that landed on main just after that tag. `safe_handler` now raises `ToolError` on handler failure instead of returning a schema-violating error dict, so a failing MCP tool call surfaces its real diagnostic (e.g. a Postgres constraint violation, a missing file) instead of the generic 'Output validation error' every client previously saw regardless of cause (#103 follow-up, two commits: the initial ToolError raise + a safe_handler correction). Wiki: `wiki.pages` frontmatter parsing strips quoted/duplicated-label scalar values that previously broke FS↔PG sync (#104); `wiki_migrate --dry-run` made transactionally neutral — a dry run no longer leaves partial state behind (#108); `write_governed_page` validates and normalizes frontmatter at write time instead of only at read time, closing the gap that let malformed frontmatter reach disk in the first place (#109); `wiki_pages.py` refactored into cohesive collaborators (`wiki_frontmatter.py`, `wiki_frontmatter_validation.py`, `wiki_index.py`, `wiki_page_builders.py`) with no behaviour change (#111). No retrieval-path code touched — verified by diff: the full mcp_server change-set between v4.14.0 and this tag is confined to wiki_*, handlers/consolidation/page_io.py, handlers/wiki_migrate.py, handlers/wiki_write.py, and tool_error_handler.py, none of which is in the memory_ingest/pg_recall/reranker import closure any retrieval benchmark exercises. Pre-tag guard (exact release tree): LongMemEval MRR 0.9167/R@10 0.982 (matches v4.14.0 0.9166/0.982); LoCoMo 3-run mean MRR 0.7984/R@10 0.9142 (v4.14.0 was 0.8005/0.9131 — Δ MRR -0.0021 is smaller than v4.14.0's own documented ±0.0025 single-run variance, not a regression; R@10 improved); BEAM 0.5406 (3 runs, spread 0.0001) vs v4.14.0's 0.5471 — investigated as a same-day, same-production-DB A/B: a same-day v4.14.0 control run measured 0.5445 then, on rerun ~2.5h later, 0.5391 — i.e. the SAME tree spans the same 0.539-0.545 band as v4.14.1, and a 4-point bisect (53712df8, 49f29e98) landed inside that band with no monotonic step at any commit boundary; combined with the import-closure diff above (BEAM's read/write path is architecturally unreachable from every 4.14.1 commit), the deviation is intra-day production-DB variance, not a code effect — BEAM is not gated by reproduce.sh's floor check (proxy metric, within-system comparison only) so this does not block the tag. Floor-gate result (reproduce.sh::check_floors, tolerance 0.005): LongMemEval R@10 0.9820 vs floor 0.9820 PASS, LongMemEval MRR 0.9167 vs floor 0.9140 PASS, LoCoMo R@10 0.9142 vs floor 0.9150 PASS, LoCoMo MRR 0.7984 vs floor 0.8050 FAIL (-0.0066, exceeds the 0.005 tolerance) — flagged, not hidden: this fails the codebase's hardcoded absolute floor while passing the release's actual stopping rule (no regression beyond noise vs the v4.14.0 baseline); the absolute floor has not been re-baselined since the 4.11-4.13 measurement era and LoCoMo MRR has trended down release-over-release with no corresponding retrieval-code change, suggesting the floor itself needs recalibration in a future session, ideally against an isolated benchmark DB rather than the live growing production store used here. Reranker active. Evidence: benchmarks/results/repro/20260714-v4.14.1-pretag/ (11 files: the 5 primary runs, beam-100K-rep2/rep3, and 4 investigation runs — beam-control-v4140, beam-bisect-53712df8, beam-bisect-49f29e98, beam-bisect-da3f2104-rep2). v4.14.0: schema-migration entry point + wiki.pages↔FS parity. New standalone `python -m mcp_server.migrate` brings a PostgreSQL store's schema current by reusing PgMemoryStore's existing hash-gated, advisory-lock-serialized DDL apply (no duplicated DDL, no MCP server boot); cortex-viz 2.6.1's open_visualization preflight invokes it (frozen contract: `DATABASE_URL= python -m mcp_server.migrate` → exit 0 'schema up to date'|'applied N statements' / exit 1 one-line stderr) to migrate an outdated store before building the graph, surfacing an actionable message instead of a silently empty graph when it can't. New `wiki_migrate` MCP tool + wiki.pages↔filesystem reconciliation (backfill, ghost purge, parity guard, pages_status_check widened to the full system-emitted status union) — standalone tool count 49→50 (53 with upstream integrations). Pre-tag guard (exact release tree 4fd17b45): LongMemEval MRR 0.9166/R@10 0.982; LoCoMo 3-run mean MRR 0.8005/R@10 0.9131 (single-run variance ±0.0025 straddles the 0.805 floor; the mean clears the 0.005 tolerance and matches the 4.13.3 baseline 0.8017/0.9152 on identical retrieval code); BEAM 0.5471; reranker active; all gated floors PASS. v4.13.3: third-party inspection contract restored — psycopg (optional dep) was imported at module top-level by 22 pg_store_* modules, crashing any bare install (uv sync / fresh env — exactly the registry-indexer path; glama's card had been frozen at v3.0.0 for ~2 months) before tools/list could answer. Lazy/TYPE_CHECKING imports fix it; a blocking docker-smoke CI gate (bare container, zero env, real stdio tools/list >= 49) makes the silent regression impossible; explicit-DATABASE_URL-unreachable now refuses silent SQLite fallback (integrity boundary, opt-out CORTEX_ALLOW_SQLITE_FALLBACK=1); PRIVACY.md rewritten truthfully per surface and Cowork validated E2E on the pure-SQLite path. v4.13.2: MCP schema-drift fix — several tool inputSchema declarations diverged from their handler signatures (#98: supersedes_id/write_class on remember, memory_ids on wiki_write, distillation in the source enum) and the checkpoint outputSchema was unsatisfiable (#99: action required-but-only-set-on-failure, checkpoint_id typed string vs the integer returned). Both corrected, with wrapper↔handler parity + checkpoint output-schema tests added. No read-path change; pre-tag guard LongMemEval MRR 0.9166/R@10 0.982 — manifest 20260712T123142Z, reranker active, all gated floors PASS. v4.13.1: Windows hotfix — UTF-8 hook streams (#96), non-destructive deps bootstrap (#97). Pair with cortex-viz 2.5.0 + automatised-pipeline 0.6.1. 4.13.0 (pairs with cortex-viz 2.5.0 and automatised-pipeline 0.6.1) — grooming becomes continuous instead of session-bound, closing a measured 76-day wiki-silence gap: a recurring citation-reconciliation pass and a lesson_promotion backlog count (0.8ms with a new GIN index, down from 81ms) are now wired into the periodic consolidation cycle; a new READ_ONLY get_grooming_health tool (~1s) surfaces backlog + staleness for wiki/distillation/promotion, with a sourced 6-day staleness threshold (3x the measured p90 inter-cycle gap) and a single session_start line when crossed; a scheduled scripts/groomer.py entry point ships dry-run by default (--apply gated behind the same headless-authoring opt-in), with its launchd schedule documented but deliberately left uninstalled. Fixed: headless wiki writes now route through the same governed write_governed_page path as interactive writes (write_class + citations + provenance, no more raw disk writes) — and, found on the way, a CRITICAL latent bug: the anchor-page frontmatter template's `status: living` violated the wiki.pages CHECK constraint since its origin, silently failing the wiki.pages/wiki.citations sync of every interactively-authored curate_wiki page in production (now `seedling`). 49 standalone / 52 full-upstream MCP tools (1 new: get_grooming_health). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8021/R@10 0.9193, BEAM 0.5469 — manifest 20260711T172056Z, reranker active, all 4 gated floors PASS. 4.12.0 — the \"mémoire qui comprend\" program completes: every remember is graded locally at write time (verified/verifiable/unverifiable, zero network) as an additive `prov:` tag, without touching `source_attribution` — `validate_memory` stays its sole writer, since that column already carries a different, incompatible epistemic-origin vocabulary the confabulation guard keys off of (a dry-run corpus sweep is committed; `--apply` withheld pending a G-ranks check on 3,042 projected staleness flips). Lessons become a first-class, traced object: rules/triggers gain a `source_memory_id` pointer to the lesson that produced them, session-end self-critique suggestions are now persisted instead of discarded, and a new READ_ONLY `lesson_promotion` tool proposes rule/trigger/wiki promotion jobs (never executes them itself) — proven end-to-end on real PostgreSQL. A new READ_ONLY `curate_distill` tool assembles error→success, co-access, and entity-family dossiers for the LLM to turn into deliberate lessons (25 eligible on the live corpus; two real bugs — a self-pairing memory and an unbounded 53-member cluster — found only by running against real data, both fixed). A wiki-citation seed campaign audited three candidate memory↔page link sources and found only one usable at HIGH confidence (20 pages with a real unique FK); seeded dry-run only. Pre-tag guard: LongMemEval MRR 0.9168/R@10 0.984, LoCoMo MRR 0.8024/R@10 0.9183, BEAM 0.5455 — manifest 20260711T115601Z, reranker active, all floors PASS. 4.11.0 — the graph channel wakes up: `spread_activation_memories` had been dead since inception (a non-recursive `WITH` clause raised a SQL error swallowed by a bare except, invisible under mocked tests) and is now repaired, domain-scoped, and defaulted to tail-fill (completes short recall slots after re-ranking, never reorders — the channel's first empirical measurement in augment mode showed MRR -0.016/R@10 +0.002, so tail ships under the zero-regression gate; `sa_mode` exposes tail/augment/off). `remember` gains an explicit `write_class` parameter (auto/deliberate/derived/mechanical) read directly by the homeostatic fold instead of inferred from source strings; the 6.6 re-heat campaign's source-taxonomy filter is found to have been comparing against the wrong string values since its origin (91/540 raised memories were mechanical, not deliberate). A 219-site silent-except audit repairs the 30 critical sites on the recall/write-gate/consolidation paths via a new observability module (36 caplog tests). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8014/R@10 0.9157 (first reading on the repaired bench instrument, within gate tolerance), BEAM 0.5493 — manifest 20260711T080344Z, reranker active. 4.10.0 — CRITICAL reranker fix: FlashRank's cache_dir defaulted to /tmp (library default), which macOS purges; the resulting NoSuchFile was swallowed by a bare except, silently disabling production re-ranking with zero log signal (measured MRR 0.9163 -> 0.8636, delta -0.053). Fixed with a durable ~/.cache/flashrank cache_dir, non-silent failure logging, and reranker_status()/model_sha256() introspection; existing installs lose their re-ranker on every /tmp purge — upgrade recommended. Also: novelty-only auto-capture template normalization (write-gate signal only, stored embeddings untouched), per-write-class homeostatic health/fold stratification (fixes deliberate memories being re-suppressed by a class-blind fold), and a repaired bench measurement instrument (per-run container isolation, pinned embedding model revision) that had been silently cross-contaminating LongMemEval scores across worktrees. 4.3.0 — wiki data-quality (Volet 4): a domain-backfill maintenance pass re-derives the true project domain for wiki pages stuck on a catch-all bucket (uncategorized/_general/global/…) by majority-voting the repo that physically contains the files each page cites — refusing on a tie (no fabrication). Wired into the autonomous consolidate cycle so it self-heals; lifts wiki→source resolvability on the shared store. 3.23.0 — registry-indexer build fix. Added the `neuro-cortex-memory` console script (entry point `mcp_server.__main__:main`) so `uv run neuro-cortex-memory` resolves from a checkout. Registry indexers such as Glama build the repo with `uv sync` and launch the server via `uv run neuro-cortex-memory`; previously only `cortex-doctor` was declared, so the spawn failed (`No such file or directory`), the container exited before any tool registered, and the tools score collapsed. The server starts over stdio and registers all 43 standalone MCP tools without a PostgreSQL connection (46 with the upstream integrations), so `tools/list` answers inside a DB-less container. No change to the marketplace install path or any runtime behaviour. 3.22.0 — security + reliability hardening (P0/P1 audit). Security: headless-authoring RCE fix (--tools restricts the subprocess toolset + --bare ignores the untrusted repo's settings/hooks, replacing the misused --allowedTools), DSN/secret redaction (libpq ?password= query params + psycopg exception leaks), pip supply-chain hardening (env-sanitized index lock). Fixed: the SQLite fallback's A3 heat→heat_base rename was incomplete — all 11 indexes were never created (full table scans) and search/stats queried a non-existent column; supersedes_id + min_access parity; remote-PostgreSQL preflight (pg_isready honors the DATABASE_URL host); flaky handler tests root-caused in the test harness. Added: P1-8 test coverage, a SQLite-backend CI job, and deployment docs (WSL, TLS client-certificate DATABASE_URL, remote PostgreSQL). PostgreSQL remains the mandatory backend; 46 MCP tools. 3.21.0 — visualization extracted to the standalone cortex-viz MCP (github.com/cdeust/cortex-viz). The galaxy graph, execution trace, knowledge/board/wiki/pipeline views, the HTTP server, the workflow-graph builders, and all ui/ assets (−50,671 lines) move out of Cortex into cortex-viz, which reads this same PostgreSQL store read-only — Cortex is a focused memory engine again. BREAKING: the open_visualization, get_methodology_graph, and query_workflow_graph MCP tools are removed from Cortex; install cortex-viz to get them back (its /cortex-visualize skill replaces the old one). 46 MCP tools remain. No memory, retrieval, consolidation, or wiki behaviour changed; full suite green (3214 passed). 3.20.0 — graph intelligence + memory knowledge-updates. Codebase graph: Leiden community detection, centrality + god-node analysis, and native 7-language tree-sitter symbol extraction (no automatised-pipeline required). Memory: explicit supersession edges so a knowledge update links to and ranks above what it replaces; a MinHash entity-dedup engine with AST-symbol origin flagging plus a mutating consolidate-time entity-merge cycle; an inline relation-walk recall mode (include_related) that returns a memory's neighbours in one call; connection-rooted scoping via CORTEX_ROOT_AGENT_TOPIC. Visualization: node-click orchestrator, uncapped galaxy, causal-chain and cwd fixes, O(1)-amortized canvas hit-testing via a uniform-grid spatial hash, and a refusal to index plugin-cache copies. Supersedes the never-tagged 3.19.6 (its launcher self-heal + SSE-only galaxy delivery are included below). CI restored to green (ruff format/lint + I2 canonical-writer line-shift). 3.19.6 — MCP connect self-heal: an interrupted first dependency bootstrap (pip --target killed by the MCP startup timeout) left namespace husks (package dirs without __init__.py) that shadowed every healthy install — the server failed to connect on every retry, permanently. The launcher now detects husks (module.__file__ is None), deletes them, and reinstalls; pip installs are atomic (temp dir, committed only on success); pip failures print to stderr instead of being swallowed, with a PEP 668 --break-system-packages retry. Galaxy graph delivery is now the live SSE stream (/api/graph/events) ONLY — the polling phase loader is gone; the build kicks at server launch, every level L0–L6 streams in real time, the stream closes once at true end-of-build, and warm processes replay the event buffer. L6 now FINISHES (four fixes: stream closed at baseline before symbols; SSE client never loaded by the page; a 1s-per-batch throttle against a consumer-less layout authority ≈1h of sleep; O(n²) merge that pinned the GIL for hours and starved all HTTP requests — measured after: full build 202s, 143,816 nodes incl. 94,437 symbols). Every node kind is browsable: /api/graph/node resolves symbols/files/domains via a new id index (previously only memory:/entity: PG ids; the detail panel stayed empty). 3.19.5 — open_visualization reuses the running viz server via an instance registry instead of spawning a new port + cold rebuild per call; skeleton-snapshot clobber of the full graph snapshot removed. 3.19.4 — plugin MCP server config inlined in plugin.json (repo-root .mcp.json dropped) fixing a failing cortex MCP server when developing inside the plugin repo itself. 3.19.1 — ingest stdio pipe deadlock fixed: batch tool calls run on fresh per-call event loops, so a pooled MCPClient bound to a closed loop was reused with a dead _read_loop — the Rust child blocked in write() once its response exceeded the 64KB OS pipe buffer and both sides slept forever (4.5h+ at 0% CPU; the upstream cause of 'graph shows only the global domain / stale codebase'). MCPClient now records its bound event loop at connect and reports disconnected when that loop is closed or foreign, so the pool discards dead clients and reconnects on the live loop. New CORTEX_MCP_CALL_TIMEOUT_S (default 600s = 10x measured 32s analyze latency, down from 3600s) makes a wedged call fail loudly in minutes with a diagnostic naming the pipe-buffer cause. Regression-tested: 256KB-response child, silent-child timeout, closed/foreign-loop reuse guards. 3.19.0 — memory hygiene + scoring integrity: the 60x auto-capture scoring inversion fixed at all three roots (prospective-trigger injection bypass — 319 garbage keyword triggers harvested from raw tool dumps deactivated, word-boundary matching, low-signal taxonomy + cap + injected:true on injection; WRRF de-bias — hot/recency pools exclude post_tool_capture, mechanical freshness is not importance; metamemory confidence as a Kraaij-2002 document prior wires rate_memory feedback into rank). Oversized auto-captures now store a deterministic gist + content-addressed artifact pointer (GIST_BUDGET = measured p90 curated memory length; full output one Read away — no truncation), same gate on backfill/import. Concurrency governors: upstream MCP connection pool bounded (LRU-evict idle / fail-fast) with the per-server cap regression-tested. Constant-memory pipeline closed: AP cross-loop waits bounded (a wedged subprocess can no longer hang a worker forever), per-query AST accumulators are generators, /api/quadtree streams Arrow record-batches through gzip (constant RAM at any node count). cortex-visualize: GRAPH galaxy tab restored alongside TRACE (the build kick, snapshot readiness, and phase loader were all dead since 3.18.0 — readiness now validates the CXGB header, not file size); auto-loads through L5, AST symbols load on demand; HUD shows true in-galaxy memory counts. Test-suite safety: pytest refuses destructive isolation against any populated non-test database (incident 2026-06-10: 537k production rows lost to CI=true + production DATABASE_URL). Benchmarks regression-free (LongMemEval R@10 98.4% / MRR 0.916; LoCoMo MRR 0.828; BEAM A/B delta 0.001). 3.18.4 — graph build is progressive, not big-bang: hash-gated schema migration (one indexed check instead of re-running 83 DDL stmts under a blocking lock on every store init — kills the connection storm), embedding-free keyset-paginated memory streaming (no upfront 500k sort; ~227 B/row not ~2 KB), and per-batch memory-node pruning (bounded RAM) replace the load that OOM/watchdog-crashed and stalled at 'loading memories'. git diff + file history now resolve for ANY file type (git root derived from the file's own absolute path). AP impact diagram fixed (absolute→repo-relative File.id match) and JavaScript files now produce AST symbols (AP maps js/jsx/mjs/cjs → TypeScript grammar). Legend counts the RENDERED graph, not server totals (fixes 36-domains/0-discussions mismatch). Self-healing AP MCP bridge: bounded handshake (no unsourced sleep), idle-close reconnect, no permanent poison on a transient failure. Stale per-project code-graphs pruned on re-index. CodeQL path-injection sanitisers (is_relative_to). 3.18.3 — codebase-graph freshness made trustable: find_cached_graph self-heals (validates the graph still exists on disk + picks the most-recent valid memo) so a deleted graph can no longer make ingest_codebase silently project an empty graph; new post_commit_reindex PostToolUse hook re-analyses on commits that touch indexable source (detached, 120s-coalesced) closing the SessionStart-TTL staleness gap. Cross-lens documentation graph (WIKI lens) in cortex-visualize: wiki pages as scope-clustered nodes with typed wiki_link + provenance + concept co-occurrence + cross-lens entity/symbol edges; wiki_graph unions PostgreSQL + filesystem page sources and derives [[wikilinks]] from page bodies. 3.18.2 — PRD ingestion fixed + grounded: ingest_prd now calls prd-gen's get_pipeline_state with the correct run_id/format (the pipeline_id source path was broken) and records prd-gen quality history; part of the AP↔prd-gen↔Cortex grounding loop (codebase→spec→memory). 3.18.1 — HUD shows true store counts (memories/entities/synapses) via /api/stats instead of loaded-graph nodes; impact panel refactored to use automatised-pipeline's typed tools (get_context/get_impact) for full direction incl. implements/uses + community/process blast radius; AP MCP resolved from installed_plugins.json (compiled binary, not bin/* glob); HTML-attribute XSS escaping + non-security node-id hash. 3.18.0 — live execution-trace graph in cortex-visualize: domain→session→chain (no snapshot), galaxy-style type-banded clusters, file impact panel wired to the AP code graph (caller/callee direction, causal chains, per-file git versions). Loopback-only host guard retained (GHSA-gvpp-v77h-5w8g).", "keywords": [ "memory", "cognitive-profiling", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 6ab0c5de..35d72188 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "cortex", "description": "Persistent memory for Claude Code — remembers across sessions automatically. Install and forget. Scientific retrieval backed by 97 published references.", - "version": "4.14.2", + "version": "4.14.3", "author": { "name": "Clement Deust", "email": "admin@ai-architect.tools" diff --git a/CHANGELOG.md b/CHANGELOG.md index ea3753fe..ab2fc1c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,20 @@ adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [4.14.3] - 2026-07-17 + +### Fixed +- `write_class="deliberate"` (or omitted, source-fallback) was rejected by the novelty gate, violating the documented contract that deliberate writes are never rejected for low novelty. `write_class` is now threaded through `evaluate_gate` / `_compute_gate_decision` / `determine_bypass`, checked last so a more specific content-based bypass reason (`bypass_error`/`bypass_decision`/`bypass_important_tag`) still wins when it applies (#147, #148). +- `force=True` (and plain) writes intermittently raised a misleading "check DATABASE_URL" hint on a bare `FileNotFoundError` — root cause was `validate_memory.grade_from_content(base_dir=os.getcwd())` in the write-time provenance grading step, unguarded unlike every sibling enrichment step, raising when the process cwd had been removed mid-session (e.g. a worktree cleanup), unrelated to the DB. Wrapped in the same defensive try/except pattern used elsewhere; `tool_error_handler.py`'s blanket DATABASE_URL hint no longer fires for exception types it doesn't recognize as DB-related (#147, #148). +- Issue #149's Python-3.10-only flake: `pip_install`'s per-entry commit loop pruned superseded `*.dist-info` siblings immediately after each entry committed. `os.listdir()` order is unspecified by the stdlib and differs by OS/filesystem, so the prune could permanently delete the still-valid OLD dist-info right before the package-directory entry failed and rolled back, leaving `deps_dir` with reverted package files but no metadata for either version. The destructive prune now waits until the whole `tmp_dir` commits successfully, independent of listdir enumeration order (#149, #150). + +### Changed +- `mcp` dependency bumped 1.27.0 -> 1.28.1 (uv group, dependabot) (#152). +- `wiki_classifier.py` and `wiki_axis_registry.py` split into cohesive collaborators (`wiki_axis_defaults.py`, `wiki_classifier_gates.py`, `wiki_classifier_patterns.py`, `wiki_kind_detection.py`, `wiki_title.py`) to bring both files under the repo's 500-line limit; no behaviour change (#134, #153). + +### Verified +- Pre-tag guard on the exact release tree (`benchmarks/reproduce.sh --no-ablation`, isolated ephemeral pgvector container, reranker loaded): **PENDING — orchestrator to run in background and fill this section with LongMemEval MRR/R@10, LoCoMo 3-run mean MRR/R@10 (+ each rep), BEAM MRR/R@10, floor-gate PASS/FAIL table (tolerance 0.005), reranker_state, and the evidence directory path** before tagging. See the "Bench command for the orchestrator" note in the release PR description / task report. #150/#152/#153 do not touch the recall path reproduce.sh's floors exercise; #148 touches the write-gate (write path) — the empirical floor-gate result below is the actual non-regression evidence, not an import-closure argument. + ## [4.14.2] - 2026-07-15 ### Fixed diff --git a/pyproject.toml b/pyproject.toml index c9080361..dd0d8399 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "hypermnesia-mcp" -version = "4.14.2" +version = "4.14.3" description = "Scientifically-grounded memory system based on computational neuroscience research" readme = "README.md" license = "MIT" From 1227169aba92d370521c3a9ffd65e93e0249d9b2 Mon Sep 17 00:00:00 2001 From: cdeust Date: Fri, 17 Jul 2026 14:08:32 +0200 Subject: [PATCH 2/2] chore(release): commit v4.14.3 pre-tag bench evidence and adjudication MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pre-tag guard on the exact release tree 4e3a202b: LongMemEval MRR 0.9166/R@10 0.9820 PASS; LoCoMo 3-run mean MRR 0.7998/R@10 0.9135 — MRR mean sits 0.0002 below the floor-tolerance threshold and was adjudicated as sampling noise by explicit maintainer decision (delta vs 4.14.2 mean −0.0011 < SEM ~0.0013; rep1 0.8013 vs 0.8015; reranker loaded in all MANIFESTs; no released commit in the LoCoMo harness dependency graph — ingestion via BenchmarkDB, not the #148 write path). BEAM 0.5417, inside the documented noise band. Evidence: benchmarks/results/repro/20260717-v4.14.3-pretag/. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01BxpvWMSYo2FLCw4c1xw7iJ --- .claude-plugin/marketplace.json | 2 +- CHANGELOG.md | 3 +- .../20260717-v4.14.3-pretag/MANIFEST.json | 25 +++++++ .../20260717-v4.14.3-pretag/beam-100K.json | 69 +++++++++++++++++++ .../20260717-v4.14.3-pretag/locomo-rep1.json | 52 ++++++++++++++ .../20260717-v4.14.3-pretag/locomo-rep2.json | 52 ++++++++++++++ .../20260717-v4.14.3-pretag/locomo-rep3.json | 52 ++++++++++++++ .../longmemeval-s.json | 54 +++++++++++++++ 8 files changed, 307 insertions(+), 2 deletions(-) create mode 100644 benchmarks/results/repro/20260717-v4.14.3-pretag/MANIFEST.json create mode 100644 benchmarks/results/repro/20260717-v4.14.3-pretag/beam-100K.json create mode 100644 benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep1.json create mode 100644 benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep2.json create mode 100644 benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep3.json create mode 100644 benchmarks/results/repro/20260717-v4.14.3-pretag/longmemeval-s.json diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 2d8c48db..7d70f260 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -21,7 +21,7 @@ "homepage": "https://github.com/cdeust/Cortex", "repository": "https://github.com/cdeust/Cortex", "license": "MIT", - "version_note": "v4.14.3: write-gate contract fix + launcher-deps hardening + deps bump. `fix(remember)`: write_class=\"deliberate\" (or omitted, source-fallback) was rejected by the novelty gate, violating the documented contract that deliberate writes are never rejected for low novelty — write_class is now threaded through evaluate_gate/_compute_gate_decision/determine_bypass, checked last so a more specific content-based bypass reason still wins; a second defect where force=True/plain writes intermittently raised a misleading DATABASE_URL hint on a bare FileNotFoundError from validate_memory.grade_from_content(base_dir=os.getcwd()) after a worktree cleanup removed the process cwd is fixed by wrapping that one enrichment step in the same defensive try/except pattern used by every sibling step (#147, #148). `fix(launcher-deps)`: pip_install's per-entry commit loop pruned superseded *.dist-info siblings immediately after each entry committed; unspecified os.listdir() ordering could delete the still-valid OLD dist-info right before the new package-directory entry failed and rolled back, leaving deps_dir with reverted package files and no metadata for either version (Python-3.10-only flake) — the destructive prune now waits until the whole tmp_dir commits successfully (#149, #150). `chore(deps)`: mcp bumped 1.27.0 -> 1.28.1 (#152). `refactor(core)`: wiki_classifier.py and wiki_axis_registry.py split under the repo's 500-line file limit into wiki_axis_defaults.py/wiki_classifier_gates.py/wiki_classifier_patterns.py/wiki_kind_detection.py/wiki_title.py, no behaviour change (#153, #134). No retrieval-path benchmark code touched by #150/#152/#153; #148 touches the write-gate (write path, not the recall path reproduce.sh's LongMemEval/LoCoMo/BEAM floors exercise) — confirmed empirically by the pre-tag `benchmarks/reproduce.sh` gate below rather than by import-closure inspection alone. Pre-tag guard on the exact release tree: . v4.14.2: layer-violation cleanup + devtooling. `refactor(core)`: the 3 pre-existing core→infrastructure layer violations tracked since #114 (`wiki_axis_registry.py`, `wiki_classifier.py`, `wiki_schema_loader.py` importing infrastructure directly) are fixed via reverse-DI ports-and-adapters — core now declares a zero-arg wiki-root/user-rules provider port, wired at the `mcp_server/__main__.py` composition root; no behaviour change (#135). Also: `check_setup` MCP tool exposed as a facade over `doctor.py` for in-session install diagnosis (#133); explicit XDG-aware `cache_folder` passed to SentenceTransformer instead of relying on library default (#132); project settings + `/preflight` command + settings catalogue + headless CI regimes (#131); one-command devcontainer with pgvector + prewarmed embedding/reranker models (#129); optional OTLP telemetry exporter, OFF by default (#128); stale hard-coded module counts replaced with a single-source pointer (#130); CLAUDE.md refactored to <200 lines with resynced storage truth (#125); corporate proxy/CA documentation for model downloads (#123); stale 'production database' bench-gate claim fixed + LoCoMo intra-day noise caveat documented (#121); Windows postInstall dispatch to cross-platform setup.py + real install path exercised in CI (#117). No retrieval-path code touched — confined to core/infrastructure wiring, devtooling, docs, and CI. Pre-tag guard on the exact release tree (git_sha 018c76d7, `benchmarks/reproduce.sh --no-ablation`, isolated ephemeral pgvector container, reranker loaded): LongMemEval MRR 0.9166/R@10 0.9820 (matches v4.14.1 0.9167/0.982 — no regression); LoCoMo 3-run mean MRR 0.8009/R@10 0.9146 (runs: 0.8015/0.9168, 0.8004/0.9142, 0.8006/0.9127 — vs v4.14.1's 3-run mean 0.7984/0.9142, an improvement within the documented same-commit noise band); BEAM MRR 0.5437/R@10 0.7139 (vs v4.14.1's 0.5406 — within the 0.539-0.547 intra-day production-DB variance band established in v4.14.1's own investigation; proxy metric, not gated). Floor-gate (tolerance 0.005): LongMemEval R@10 0.982 vs floor 0.982 PASS, LongMemEval MRR 0.9166 vs floor 0.914 PASS, LoCoMo R@10 0.9146 vs floor 0.915 PASS, LoCoMo MRR 0.8009 vs floor 0.805 PASS (-0.0041, within tolerance — each individual rep also passes, unlike v4.14.1 where rep1 alone read FAIL). Evidence: benchmarks/results/repro/20260715-v4.14.2-pretag/ (5 files: longmemeval-s, locomo-rep1/2/3, beam-100K). v4.14.1: MCP tool-error diagnosability + wiki hardening, cut immediately after v4.14.0 to carry a fix that landed on main just after that tag. `safe_handler` now raises `ToolError` on handler failure instead of returning a schema-violating error dict, so a failing MCP tool call surfaces its real diagnostic (e.g. a Postgres constraint violation, a missing file) instead of the generic 'Output validation error' every client previously saw regardless of cause (#103 follow-up, two commits: the initial ToolError raise + a safe_handler correction). Wiki: `wiki.pages` frontmatter parsing strips quoted/duplicated-label scalar values that previously broke FS↔PG sync (#104); `wiki_migrate --dry-run` made transactionally neutral — a dry run no longer leaves partial state behind (#108); `write_governed_page` validates and normalizes frontmatter at write time instead of only at read time, closing the gap that let malformed frontmatter reach disk in the first place (#109); `wiki_pages.py` refactored into cohesive collaborators (`wiki_frontmatter.py`, `wiki_frontmatter_validation.py`, `wiki_index.py`, `wiki_page_builders.py`) with no behaviour change (#111). No retrieval-path code touched — verified by diff: the full mcp_server change-set between v4.14.0 and this tag is confined to wiki_*, handlers/consolidation/page_io.py, handlers/wiki_migrate.py, handlers/wiki_write.py, and tool_error_handler.py, none of which is in the memory_ingest/pg_recall/reranker import closure any retrieval benchmark exercises. Pre-tag guard (exact release tree): LongMemEval MRR 0.9167/R@10 0.982 (matches v4.14.0 0.9166/0.982); LoCoMo 3-run mean MRR 0.7984/R@10 0.9142 (v4.14.0 was 0.8005/0.9131 — Δ MRR -0.0021 is smaller than v4.14.0's own documented ±0.0025 single-run variance, not a regression; R@10 improved); BEAM 0.5406 (3 runs, spread 0.0001) vs v4.14.0's 0.5471 — investigated as a same-day, same-production-DB A/B: a same-day v4.14.0 control run measured 0.5445 then, on rerun ~2.5h later, 0.5391 — i.e. the SAME tree spans the same 0.539-0.545 band as v4.14.1, and a 4-point bisect (53712df8, 49f29e98) landed inside that band with no monotonic step at any commit boundary; combined with the import-closure diff above (BEAM's read/write path is architecturally unreachable from every 4.14.1 commit), the deviation is intra-day production-DB variance, not a code effect — BEAM is not gated by reproduce.sh's floor check (proxy metric, within-system comparison only) so this does not block the tag. Floor-gate result (reproduce.sh::check_floors, tolerance 0.005): LongMemEval R@10 0.9820 vs floor 0.9820 PASS, LongMemEval MRR 0.9167 vs floor 0.9140 PASS, LoCoMo R@10 0.9142 vs floor 0.9150 PASS, LoCoMo MRR 0.7984 vs floor 0.8050 FAIL (-0.0066, exceeds the 0.005 tolerance) — flagged, not hidden: this fails the codebase's hardcoded absolute floor while passing the release's actual stopping rule (no regression beyond noise vs the v4.14.0 baseline); the absolute floor has not been re-baselined since the 4.11-4.13 measurement era and LoCoMo MRR has trended down release-over-release with no corresponding retrieval-code change, suggesting the floor itself needs recalibration in a future session, ideally against an isolated benchmark DB rather than the live growing production store used here. Reranker active. Evidence: benchmarks/results/repro/20260714-v4.14.1-pretag/ (11 files: the 5 primary runs, beam-100K-rep2/rep3, and 4 investigation runs — beam-control-v4140, beam-bisect-53712df8, beam-bisect-49f29e98, beam-bisect-da3f2104-rep2). v4.14.0: schema-migration entry point + wiki.pages↔FS parity. New standalone `python -m mcp_server.migrate` brings a PostgreSQL store's schema current by reusing PgMemoryStore's existing hash-gated, advisory-lock-serialized DDL apply (no duplicated DDL, no MCP server boot); cortex-viz 2.6.1's open_visualization preflight invokes it (frozen contract: `DATABASE_URL= python -m mcp_server.migrate` → exit 0 'schema up to date'|'applied N statements' / exit 1 one-line stderr) to migrate an outdated store before building the graph, surfacing an actionable message instead of a silently empty graph when it can't. New `wiki_migrate` MCP tool + wiki.pages↔filesystem reconciliation (backfill, ghost purge, parity guard, pages_status_check widened to the full system-emitted status union) — standalone tool count 49→50 (53 with upstream integrations). Pre-tag guard (exact release tree 4fd17b45): LongMemEval MRR 0.9166/R@10 0.982; LoCoMo 3-run mean MRR 0.8005/R@10 0.9131 (single-run variance ±0.0025 straddles the 0.805 floor; the mean clears the 0.005 tolerance and matches the 4.13.3 baseline 0.8017/0.9152 on identical retrieval code); BEAM 0.5471; reranker active; all gated floors PASS. v4.13.3: third-party inspection contract restored — psycopg (optional dep) was imported at module top-level by 22 pg_store_* modules, crashing any bare install (uv sync / fresh env — exactly the registry-indexer path; glama's card had been frozen at v3.0.0 for ~2 months) before tools/list could answer. Lazy/TYPE_CHECKING imports fix it; a blocking docker-smoke CI gate (bare container, zero env, real stdio tools/list >= 49) makes the silent regression impossible; explicit-DATABASE_URL-unreachable now refuses silent SQLite fallback (integrity boundary, opt-out CORTEX_ALLOW_SQLITE_FALLBACK=1); PRIVACY.md rewritten truthfully per surface and Cowork validated E2E on the pure-SQLite path. v4.13.2: MCP schema-drift fix — several tool inputSchema declarations diverged from their handler signatures (#98: supersedes_id/write_class on remember, memory_ids on wiki_write, distillation in the source enum) and the checkpoint outputSchema was unsatisfiable (#99: action required-but-only-set-on-failure, checkpoint_id typed string vs the integer returned). Both corrected, with wrapper↔handler parity + checkpoint output-schema tests added. No read-path change; pre-tag guard LongMemEval MRR 0.9166/R@10 0.982 — manifest 20260712T123142Z, reranker active, all gated floors PASS. v4.13.1: Windows hotfix — UTF-8 hook streams (#96), non-destructive deps bootstrap (#97). Pair with cortex-viz 2.5.0 + automatised-pipeline 0.6.1. 4.13.0 (pairs with cortex-viz 2.5.0 and automatised-pipeline 0.6.1) — grooming becomes continuous instead of session-bound, closing a measured 76-day wiki-silence gap: a recurring citation-reconciliation pass and a lesson_promotion backlog count (0.8ms with a new GIN index, down from 81ms) are now wired into the periodic consolidation cycle; a new READ_ONLY get_grooming_health tool (~1s) surfaces backlog + staleness for wiki/distillation/promotion, with a sourced 6-day staleness threshold (3x the measured p90 inter-cycle gap) and a single session_start line when crossed; a scheduled scripts/groomer.py entry point ships dry-run by default (--apply gated behind the same headless-authoring opt-in), with its launchd schedule documented but deliberately left uninstalled. Fixed: headless wiki writes now route through the same governed write_governed_page path as interactive writes (write_class + citations + provenance, no more raw disk writes) — and, found on the way, a CRITICAL latent bug: the anchor-page frontmatter template's `status: living` violated the wiki.pages CHECK constraint since its origin, silently failing the wiki.pages/wiki.citations sync of every interactively-authored curate_wiki page in production (now `seedling`). 49 standalone / 52 full-upstream MCP tools (1 new: get_grooming_health). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8021/R@10 0.9193, BEAM 0.5469 — manifest 20260711T172056Z, reranker active, all 4 gated floors PASS. 4.12.0 — the \"mémoire qui comprend\" program completes: every remember is graded locally at write time (verified/verifiable/unverifiable, zero network) as an additive `prov:` tag, without touching `source_attribution` — `validate_memory` stays its sole writer, since that column already carries a different, incompatible epistemic-origin vocabulary the confabulation guard keys off of (a dry-run corpus sweep is committed; `--apply` withheld pending a G-ranks check on 3,042 projected staleness flips). Lessons become a first-class, traced object: rules/triggers gain a `source_memory_id` pointer to the lesson that produced them, session-end self-critique suggestions are now persisted instead of discarded, and a new READ_ONLY `lesson_promotion` tool proposes rule/trigger/wiki promotion jobs (never executes them itself) — proven end-to-end on real PostgreSQL. A new READ_ONLY `curate_distill` tool assembles error→success, co-access, and entity-family dossiers for the LLM to turn into deliberate lessons (25 eligible on the live corpus; two real bugs — a self-pairing memory and an unbounded 53-member cluster — found only by running against real data, both fixed). A wiki-citation seed campaign audited three candidate memory↔page link sources and found only one usable at HIGH confidence (20 pages with a real unique FK); seeded dry-run only. Pre-tag guard: LongMemEval MRR 0.9168/R@10 0.984, LoCoMo MRR 0.8024/R@10 0.9183, BEAM 0.5455 — manifest 20260711T115601Z, reranker active, all floors PASS. 4.11.0 — the graph channel wakes up: `spread_activation_memories` had been dead since inception (a non-recursive `WITH` clause raised a SQL error swallowed by a bare except, invisible under mocked tests) and is now repaired, domain-scoped, and defaulted to tail-fill (completes short recall slots after re-ranking, never reorders — the channel's first empirical measurement in augment mode showed MRR -0.016/R@10 +0.002, so tail ships under the zero-regression gate; `sa_mode` exposes tail/augment/off). `remember` gains an explicit `write_class` parameter (auto/deliberate/derived/mechanical) read directly by the homeostatic fold instead of inferred from source strings; the 6.6 re-heat campaign's source-taxonomy filter is found to have been comparing against the wrong string values since its origin (91/540 raised memories were mechanical, not deliberate). A 219-site silent-except audit repairs the 30 critical sites on the recall/write-gate/consolidation paths via a new observability module (36 caplog tests). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8014/R@10 0.9157 (first reading on the repaired bench instrument, within gate tolerance), BEAM 0.5493 — manifest 20260711T080344Z, reranker active. 4.10.0 — CRITICAL reranker fix: FlashRank's cache_dir defaulted to /tmp (library default), which macOS purges; the resulting NoSuchFile was swallowed by a bare except, silently disabling production re-ranking with zero log signal (measured MRR 0.9163 -> 0.8636, delta -0.053). Fixed with a durable ~/.cache/flashrank cache_dir, non-silent failure logging, and reranker_status()/model_sha256() introspection; existing installs lose their re-ranker on every /tmp purge — upgrade recommended. Also: novelty-only auto-capture template normalization (write-gate signal only, stored embeddings untouched), per-write-class homeostatic health/fold stratification (fixes deliberate memories being re-suppressed by a class-blind fold), and a repaired bench measurement instrument (per-run container isolation, pinned embedding model revision) that had been silently cross-contaminating LongMemEval scores across worktrees. 4.3.0 — wiki data-quality (Volet 4): a domain-backfill maintenance pass re-derives the true project domain for wiki pages stuck on a catch-all bucket (uncategorized/_general/global/…) by majority-voting the repo that physically contains the files each page cites — refusing on a tie (no fabrication). Wired into the autonomous consolidate cycle so it self-heals; lifts wiki→source resolvability on the shared store. 3.23.0 — registry-indexer build fix. Added the `neuro-cortex-memory` console script (entry point `mcp_server.__main__:main`) so `uv run neuro-cortex-memory` resolves from a checkout. Registry indexers such as Glama build the repo with `uv sync` and launch the server via `uv run neuro-cortex-memory`; previously only `cortex-doctor` was declared, so the spawn failed (`No such file or directory`), the container exited before any tool registered, and the tools score collapsed. The server starts over stdio and registers all 43 standalone MCP tools without a PostgreSQL connection (46 with the upstream integrations), so `tools/list` answers inside a DB-less container. No change to the marketplace install path or any runtime behaviour. 3.22.0 — security + reliability hardening (P0/P1 audit). Security: headless-authoring RCE fix (--tools restricts the subprocess toolset + --bare ignores the untrusted repo's settings/hooks, replacing the misused --allowedTools), DSN/secret redaction (libpq ?password= query params + psycopg exception leaks), pip supply-chain hardening (env-sanitized index lock). Fixed: the SQLite fallback's A3 heat→heat_base rename was incomplete — all 11 indexes were never created (full table scans) and search/stats queried a non-existent column; supersedes_id + min_access parity; remote-PostgreSQL preflight (pg_isready honors the DATABASE_URL host); flaky handler tests root-caused in the test harness. Added: P1-8 test coverage, a SQLite-backend CI job, and deployment docs (WSL, TLS client-certificate DATABASE_URL, remote PostgreSQL). PostgreSQL remains the mandatory backend; 46 MCP tools. 3.21.0 — visualization extracted to the standalone cortex-viz MCP (github.com/cdeust/cortex-viz). The galaxy graph, execution trace, knowledge/board/wiki/pipeline views, the HTTP server, the workflow-graph builders, and all ui/ assets (−50,671 lines) move out of Cortex into cortex-viz, which reads this same PostgreSQL store read-only — Cortex is a focused memory engine again. BREAKING: the open_visualization, get_methodology_graph, and query_workflow_graph MCP tools are removed from Cortex; install cortex-viz to get them back (its /cortex-visualize skill replaces the old one). 46 MCP tools remain. No memory, retrieval, consolidation, or wiki behaviour changed; full suite green (3214 passed). 3.20.0 — graph intelligence + memory knowledge-updates. Codebase graph: Leiden community detection, centrality + god-node analysis, and native 7-language tree-sitter symbol extraction (no automatised-pipeline required). Memory: explicit supersession edges so a knowledge update links to and ranks above what it replaces; a MinHash entity-dedup engine with AST-symbol origin flagging plus a mutating consolidate-time entity-merge cycle; an inline relation-walk recall mode (include_related) that returns a memory's neighbours in one call; connection-rooted scoping via CORTEX_ROOT_AGENT_TOPIC. Visualization: node-click orchestrator, uncapped galaxy, causal-chain and cwd fixes, O(1)-amortized canvas hit-testing via a uniform-grid spatial hash, and a refusal to index plugin-cache copies. Supersedes the never-tagged 3.19.6 (its launcher self-heal + SSE-only galaxy delivery are included below). CI restored to green (ruff format/lint + I2 canonical-writer line-shift). 3.19.6 — MCP connect self-heal: an interrupted first dependency bootstrap (pip --target killed by the MCP startup timeout) left namespace husks (package dirs without __init__.py) that shadowed every healthy install — the server failed to connect on every retry, permanently. The launcher now detects husks (module.__file__ is None), deletes them, and reinstalls; pip installs are atomic (temp dir, committed only on success); pip failures print to stderr instead of being swallowed, with a PEP 668 --break-system-packages retry. Galaxy graph delivery is now the live SSE stream (/api/graph/events) ONLY — the polling phase loader is gone; the build kicks at server launch, every level L0–L6 streams in real time, the stream closes once at true end-of-build, and warm processes replay the event buffer. L6 now FINISHES (four fixes: stream closed at baseline before symbols; SSE client never loaded by the page; a 1s-per-batch throttle against a consumer-less layout authority ≈1h of sleep; O(n²) merge that pinned the GIL for hours and starved all HTTP requests — measured after: full build 202s, 143,816 nodes incl. 94,437 symbols). Every node kind is browsable: /api/graph/node resolves symbols/files/domains via a new id index (previously only memory:/entity: PG ids; the detail panel stayed empty). 3.19.5 — open_visualization reuses the running viz server via an instance registry instead of spawning a new port + cold rebuild per call; skeleton-snapshot clobber of the full graph snapshot removed. 3.19.4 — plugin MCP server config inlined in plugin.json (repo-root .mcp.json dropped) fixing a failing cortex MCP server when developing inside the plugin repo itself. 3.19.1 — ingest stdio pipe deadlock fixed: batch tool calls run on fresh per-call event loops, so a pooled MCPClient bound to a closed loop was reused with a dead _read_loop — the Rust child blocked in write() once its response exceeded the 64KB OS pipe buffer and both sides slept forever (4.5h+ at 0% CPU; the upstream cause of 'graph shows only the global domain / stale codebase'). MCPClient now records its bound event loop at connect and reports disconnected when that loop is closed or foreign, so the pool discards dead clients and reconnects on the live loop. New CORTEX_MCP_CALL_TIMEOUT_S (default 600s = 10x measured 32s analyze latency, down from 3600s) makes a wedged call fail loudly in minutes with a diagnostic naming the pipe-buffer cause. Regression-tested: 256KB-response child, silent-child timeout, closed/foreign-loop reuse guards. 3.19.0 — memory hygiene + scoring integrity: the 60x auto-capture scoring inversion fixed at all three roots (prospective-trigger injection bypass — 319 garbage keyword triggers harvested from raw tool dumps deactivated, word-boundary matching, low-signal taxonomy + cap + injected:true on injection; WRRF de-bias — hot/recency pools exclude post_tool_capture, mechanical freshness is not importance; metamemory confidence as a Kraaij-2002 document prior wires rate_memory feedback into rank). Oversized auto-captures now store a deterministic gist + content-addressed artifact pointer (GIST_BUDGET = measured p90 curated memory length; full output one Read away — no truncation), same gate on backfill/import. Concurrency governors: upstream MCP connection pool bounded (LRU-evict idle / fail-fast) with the per-server cap regression-tested. Constant-memory pipeline closed: AP cross-loop waits bounded (a wedged subprocess can no longer hang a worker forever), per-query AST accumulators are generators, /api/quadtree streams Arrow record-batches through gzip (constant RAM at any node count). cortex-visualize: GRAPH galaxy tab restored alongside TRACE (the build kick, snapshot readiness, and phase loader were all dead since 3.18.0 — readiness now validates the CXGB header, not file size); auto-loads through L5, AST symbols load on demand; HUD shows true in-galaxy memory counts. Test-suite safety: pytest refuses destructive isolation against any populated non-test database (incident 2026-06-10: 537k production rows lost to CI=true + production DATABASE_URL). Benchmarks regression-free (LongMemEval R@10 98.4% / MRR 0.916; LoCoMo MRR 0.828; BEAM A/B delta 0.001). 3.18.4 — graph build is progressive, not big-bang: hash-gated schema migration (one indexed check instead of re-running 83 DDL stmts under a blocking lock on every store init — kills the connection storm), embedding-free keyset-paginated memory streaming (no upfront 500k sort; ~227 B/row not ~2 KB), and per-batch memory-node pruning (bounded RAM) replace the load that OOM/watchdog-crashed and stalled at 'loading memories'. git diff + file history now resolve for ANY file type (git root derived from the file's own absolute path). AP impact diagram fixed (absolute→repo-relative File.id match) and JavaScript files now produce AST symbols (AP maps js/jsx/mjs/cjs → TypeScript grammar). Legend counts the RENDERED graph, not server totals (fixes 36-domains/0-discussions mismatch). Self-healing AP MCP bridge: bounded handshake (no unsourced sleep), idle-close reconnect, no permanent poison on a transient failure. Stale per-project code-graphs pruned on re-index. CodeQL path-injection sanitisers (is_relative_to). 3.18.3 — codebase-graph freshness made trustable: find_cached_graph self-heals (validates the graph still exists on disk + picks the most-recent valid memo) so a deleted graph can no longer make ingest_codebase silently project an empty graph; new post_commit_reindex PostToolUse hook re-analyses on commits that touch indexable source (detached, 120s-coalesced) closing the SessionStart-TTL staleness gap. Cross-lens documentation graph (WIKI lens) in cortex-visualize: wiki pages as scope-clustered nodes with typed wiki_link + provenance + concept co-occurrence + cross-lens entity/symbol edges; wiki_graph unions PostgreSQL + filesystem page sources and derives [[wikilinks]] from page bodies. 3.18.2 — PRD ingestion fixed + grounded: ingest_prd now calls prd-gen's get_pipeline_state with the correct run_id/format (the pipeline_id source path was broken) and records prd-gen quality history; part of the AP↔prd-gen↔Cortex grounding loop (codebase→spec→memory). 3.18.1 — HUD shows true store counts (memories/entities/synapses) via /api/stats instead of loaded-graph nodes; impact panel refactored to use automatised-pipeline's typed tools (get_context/get_impact) for full direction incl. implements/uses + community/process blast radius; AP MCP resolved from installed_plugins.json (compiled binary, not bin/* glob); HTML-attribute XSS escaping + non-security node-id hash. 3.18.0 — live execution-trace graph in cortex-visualize: domain→session→chain (no snapshot), galaxy-style type-banded clusters, file impact panel wired to the AP code graph (caller/callee direction, causal chains, per-file git versions). Loopback-only host guard retained (GHSA-gvpp-v77h-5w8g).", + "version_note": "v4.14.3: write-gate contract fix + launcher-deps hardening + deps bump. `fix(remember)`: write_class=\"deliberate\" (or omitted, source-fallback) was rejected by the novelty gate, violating the documented contract that deliberate writes are never rejected for low novelty — write_class is now threaded through evaluate_gate/_compute_gate_decision/determine_bypass, checked last so a more specific content-based bypass reason still wins; a second defect where force=True/plain writes intermittently raised a misleading DATABASE_URL hint on a bare FileNotFoundError from validate_memory.grade_from_content(base_dir=os.getcwd()) after a worktree cleanup removed the process cwd is fixed by wrapping that one enrichment step in the same defensive try/except pattern used by every sibling step (#147, #148). `fix(launcher-deps)`: pip_install's per-entry commit loop pruned superseded *.dist-info siblings immediately after each entry committed; unspecified os.listdir() ordering could delete the still-valid OLD dist-info right before the new package-directory entry failed and rolled back, leaving deps_dir with reverted package files and no metadata for either version (Python-3.10-only flake) — the destructive prune now waits until the whole tmp_dir commits successfully (#149, #150). `chore(deps)`: mcp bumped 1.27.0 -> 1.28.1 (#152). `refactor(core)`: wiki_classifier.py and wiki_axis_registry.py split under the repo's 500-line file limit into wiki_axis_defaults.py/wiki_classifier_gates.py/wiki_classifier_patterns.py/wiki_kind_detection.py/wiki_title.py, no behaviour change (#153, #134). No retrieval-path benchmark code touched by #150/#152/#153; #148 touches the write-gate (write path, not the recall path reproduce.sh's LongMemEval/LoCoMo/BEAM floors exercise) — confirmed empirically by the pre-tag `benchmarks/reproduce.sh` gate below rather than by import-closure inspection alone. Pre-tag guard on the exact release tree: LongMemEval MRR 0.9166/R@10 0.9820 (floors PASS), LoCoMo 3-run mean MRR 0.7998/R@10 0.9135 (−0.0002 vs MRR threshold, adjudicated as sampling noise by maintainer decision 2026-07-17 — see CHANGELOG 4.14.3 Verified), BEAM 0.5417 (in noise band), reranker loaded in all 3 MANIFESTs — evidence benchmarks/results/repro/20260717-v4.14.3-pretag/. v4.14.2: layer-violation cleanup + devtooling. `refactor(core)`: the 3 pre-existing core→infrastructure layer violations tracked since #114 (`wiki_axis_registry.py`, `wiki_classifier.py`, `wiki_schema_loader.py` importing infrastructure directly) are fixed via reverse-DI ports-and-adapters — core now declares a zero-arg wiki-root/user-rules provider port, wired at the `mcp_server/__main__.py` composition root; no behaviour change (#135). Also: `check_setup` MCP tool exposed as a facade over `doctor.py` for in-session install diagnosis (#133); explicit XDG-aware `cache_folder` passed to SentenceTransformer instead of relying on library default (#132); project settings + `/preflight` command + settings catalogue + headless CI regimes (#131); one-command devcontainer with pgvector + prewarmed embedding/reranker models (#129); optional OTLP telemetry exporter, OFF by default (#128); stale hard-coded module counts replaced with a single-source pointer (#130); CLAUDE.md refactored to <200 lines with resynced storage truth (#125); corporate proxy/CA documentation for model downloads (#123); stale 'production database' bench-gate claim fixed + LoCoMo intra-day noise caveat documented (#121); Windows postInstall dispatch to cross-platform setup.py + real install path exercised in CI (#117). No retrieval-path code touched — confined to core/infrastructure wiring, devtooling, docs, and CI. Pre-tag guard on the exact release tree (git_sha 018c76d7, `benchmarks/reproduce.sh --no-ablation`, isolated ephemeral pgvector container, reranker loaded): LongMemEval MRR 0.9166/R@10 0.9820 (matches v4.14.1 0.9167/0.982 — no regression); LoCoMo 3-run mean MRR 0.8009/R@10 0.9146 (runs: 0.8015/0.9168, 0.8004/0.9142, 0.8006/0.9127 — vs v4.14.1's 3-run mean 0.7984/0.9142, an improvement within the documented same-commit noise band); BEAM MRR 0.5437/R@10 0.7139 (vs v4.14.1's 0.5406 — within the 0.539-0.547 intra-day production-DB variance band established in v4.14.1's own investigation; proxy metric, not gated). Floor-gate (tolerance 0.005): LongMemEval R@10 0.982 vs floor 0.982 PASS, LongMemEval MRR 0.9166 vs floor 0.914 PASS, LoCoMo R@10 0.9146 vs floor 0.915 PASS, LoCoMo MRR 0.8009 vs floor 0.805 PASS (-0.0041, within tolerance — each individual rep also passes, unlike v4.14.1 where rep1 alone read FAIL). Evidence: benchmarks/results/repro/20260715-v4.14.2-pretag/ (5 files: longmemeval-s, locomo-rep1/2/3, beam-100K). v4.14.1: MCP tool-error diagnosability + wiki hardening, cut immediately after v4.14.0 to carry a fix that landed on main just after that tag. `safe_handler` now raises `ToolError` on handler failure instead of returning a schema-violating error dict, so a failing MCP tool call surfaces its real diagnostic (e.g. a Postgres constraint violation, a missing file) instead of the generic 'Output validation error' every client previously saw regardless of cause (#103 follow-up, two commits: the initial ToolError raise + a safe_handler correction). Wiki: `wiki.pages` frontmatter parsing strips quoted/duplicated-label scalar values that previously broke FS↔PG sync (#104); `wiki_migrate --dry-run` made transactionally neutral — a dry run no longer leaves partial state behind (#108); `write_governed_page` validates and normalizes frontmatter at write time instead of only at read time, closing the gap that let malformed frontmatter reach disk in the first place (#109); `wiki_pages.py` refactored into cohesive collaborators (`wiki_frontmatter.py`, `wiki_frontmatter_validation.py`, `wiki_index.py`, `wiki_page_builders.py`) with no behaviour change (#111). No retrieval-path code touched — verified by diff: the full mcp_server change-set between v4.14.0 and this tag is confined to wiki_*, handlers/consolidation/page_io.py, handlers/wiki_migrate.py, handlers/wiki_write.py, and tool_error_handler.py, none of which is in the memory_ingest/pg_recall/reranker import closure any retrieval benchmark exercises. Pre-tag guard (exact release tree): LongMemEval MRR 0.9167/R@10 0.982 (matches v4.14.0 0.9166/0.982); LoCoMo 3-run mean MRR 0.7984/R@10 0.9142 (v4.14.0 was 0.8005/0.9131 — Δ MRR -0.0021 is smaller than v4.14.0's own documented ±0.0025 single-run variance, not a regression; R@10 improved); BEAM 0.5406 (3 runs, spread 0.0001) vs v4.14.0's 0.5471 — investigated as a same-day, same-production-DB A/B: a same-day v4.14.0 control run measured 0.5445 then, on rerun ~2.5h later, 0.5391 — i.e. the SAME tree spans the same 0.539-0.545 band as v4.14.1, and a 4-point bisect (53712df8, 49f29e98) landed inside that band with no monotonic step at any commit boundary; combined with the import-closure diff above (BEAM's read/write path is architecturally unreachable from every 4.14.1 commit), the deviation is intra-day production-DB variance, not a code effect — BEAM is not gated by reproduce.sh's floor check (proxy metric, within-system comparison only) so this does not block the tag. Floor-gate result (reproduce.sh::check_floors, tolerance 0.005): LongMemEval R@10 0.9820 vs floor 0.9820 PASS, LongMemEval MRR 0.9167 vs floor 0.9140 PASS, LoCoMo R@10 0.9142 vs floor 0.9150 PASS, LoCoMo MRR 0.7984 vs floor 0.8050 FAIL (-0.0066, exceeds the 0.005 tolerance) — flagged, not hidden: this fails the codebase's hardcoded absolute floor while passing the release's actual stopping rule (no regression beyond noise vs the v4.14.0 baseline); the absolute floor has not been re-baselined since the 4.11-4.13 measurement era and LoCoMo MRR has trended down release-over-release with no corresponding retrieval-code change, suggesting the floor itself needs recalibration in a future session, ideally against an isolated benchmark DB rather than the live growing production store used here. Reranker active. Evidence: benchmarks/results/repro/20260714-v4.14.1-pretag/ (11 files: the 5 primary runs, beam-100K-rep2/rep3, and 4 investigation runs — beam-control-v4140, beam-bisect-53712df8, beam-bisect-49f29e98, beam-bisect-da3f2104-rep2). v4.14.0: schema-migration entry point + wiki.pages↔FS parity. New standalone `python -m mcp_server.migrate` brings a PostgreSQL store's schema current by reusing PgMemoryStore's existing hash-gated, advisory-lock-serialized DDL apply (no duplicated DDL, no MCP server boot); cortex-viz 2.6.1's open_visualization preflight invokes it (frozen contract: `DATABASE_URL= python -m mcp_server.migrate` → exit 0 'schema up to date'|'applied N statements' / exit 1 one-line stderr) to migrate an outdated store before building the graph, surfacing an actionable message instead of a silently empty graph when it can't. New `wiki_migrate` MCP tool + wiki.pages↔filesystem reconciliation (backfill, ghost purge, parity guard, pages_status_check widened to the full system-emitted status union) — standalone tool count 49→50 (53 with upstream integrations). Pre-tag guard (exact release tree 4fd17b45): LongMemEval MRR 0.9166/R@10 0.982; LoCoMo 3-run mean MRR 0.8005/R@10 0.9131 (single-run variance ±0.0025 straddles the 0.805 floor; the mean clears the 0.005 tolerance and matches the 4.13.3 baseline 0.8017/0.9152 on identical retrieval code); BEAM 0.5471; reranker active; all gated floors PASS. v4.13.3: third-party inspection contract restored — psycopg (optional dep) was imported at module top-level by 22 pg_store_* modules, crashing any bare install (uv sync / fresh env — exactly the registry-indexer path; glama's card had been frozen at v3.0.0 for ~2 months) before tools/list could answer. Lazy/TYPE_CHECKING imports fix it; a blocking docker-smoke CI gate (bare container, zero env, real stdio tools/list >= 49) makes the silent regression impossible; explicit-DATABASE_URL-unreachable now refuses silent SQLite fallback (integrity boundary, opt-out CORTEX_ALLOW_SQLITE_FALLBACK=1); PRIVACY.md rewritten truthfully per surface and Cowork validated E2E on the pure-SQLite path. v4.13.2: MCP schema-drift fix — several tool inputSchema declarations diverged from their handler signatures (#98: supersedes_id/write_class on remember, memory_ids on wiki_write, distillation in the source enum) and the checkpoint outputSchema was unsatisfiable (#99: action required-but-only-set-on-failure, checkpoint_id typed string vs the integer returned). Both corrected, with wrapper↔handler parity + checkpoint output-schema tests added. No read-path change; pre-tag guard LongMemEval MRR 0.9166/R@10 0.982 — manifest 20260712T123142Z, reranker active, all gated floors PASS. v4.13.1: Windows hotfix — UTF-8 hook streams (#96), non-destructive deps bootstrap (#97). Pair with cortex-viz 2.5.0 + automatised-pipeline 0.6.1. 4.13.0 (pairs with cortex-viz 2.5.0 and automatised-pipeline 0.6.1) — grooming becomes continuous instead of session-bound, closing a measured 76-day wiki-silence gap: a recurring citation-reconciliation pass and a lesson_promotion backlog count (0.8ms with a new GIN index, down from 81ms) are now wired into the periodic consolidation cycle; a new READ_ONLY get_grooming_health tool (~1s) surfaces backlog + staleness for wiki/distillation/promotion, with a sourced 6-day staleness threshold (3x the measured p90 inter-cycle gap) and a single session_start line when crossed; a scheduled scripts/groomer.py entry point ships dry-run by default (--apply gated behind the same headless-authoring opt-in), with its launchd schedule documented but deliberately left uninstalled. Fixed: headless wiki writes now route through the same governed write_governed_page path as interactive writes (write_class + citations + provenance, no more raw disk writes) — and, found on the way, a CRITICAL latent bug: the anchor-page frontmatter template's `status: living` violated the wiki.pages CHECK constraint since its origin, silently failing the wiki.pages/wiki.citations sync of every interactively-authored curate_wiki page in production (now `seedling`). 49 standalone / 52 full-upstream MCP tools (1 new: get_grooming_health). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8021/R@10 0.9193, BEAM 0.5469 — manifest 20260711T172056Z, reranker active, all 4 gated floors PASS. 4.12.0 — the \"mémoire qui comprend\" program completes: every remember is graded locally at write time (verified/verifiable/unverifiable, zero network) as an additive `prov:` tag, without touching `source_attribution` — `validate_memory` stays its sole writer, since that column already carries a different, incompatible epistemic-origin vocabulary the confabulation guard keys off of (a dry-run corpus sweep is committed; `--apply` withheld pending a G-ranks check on 3,042 projected staleness flips). Lessons become a first-class, traced object: rules/triggers gain a `source_memory_id` pointer to the lesson that produced them, session-end self-critique suggestions are now persisted instead of discarded, and a new READ_ONLY `lesson_promotion` tool proposes rule/trigger/wiki promotion jobs (never executes them itself) — proven end-to-end on real PostgreSQL. A new READ_ONLY `curate_distill` tool assembles error→success, co-access, and entity-family dossiers for the LLM to turn into deliberate lessons (25 eligible on the live corpus; two real bugs — a self-pairing memory and an unbounded 53-member cluster — found only by running against real data, both fixed). A wiki-citation seed campaign audited three candidate memory↔page link sources and found only one usable at HIGH confidence (20 pages with a real unique FK); seeded dry-run only. Pre-tag guard: LongMemEval MRR 0.9168/R@10 0.984, LoCoMo MRR 0.8024/R@10 0.9183, BEAM 0.5455 — manifest 20260711T115601Z, reranker active, all floors PASS. 4.11.0 — the graph channel wakes up: `spread_activation_memories` had been dead since inception (a non-recursive `WITH` clause raised a SQL error swallowed by a bare except, invisible under mocked tests) and is now repaired, domain-scoped, and defaulted to tail-fill (completes short recall slots after re-ranking, never reorders — the channel's first empirical measurement in augment mode showed MRR -0.016/R@10 +0.002, so tail ships under the zero-regression gate; `sa_mode` exposes tail/augment/off). `remember` gains an explicit `write_class` parameter (auto/deliberate/derived/mechanical) read directly by the homeostatic fold instead of inferred from source strings; the 6.6 re-heat campaign's source-taxonomy filter is found to have been comparing against the wrong string values since its origin (91/540 raised memories were mechanical, not deliberate). A 219-site silent-except audit repairs the 30 critical sites on the recall/write-gate/consolidation paths via a new observability module (36 caplog tests). Pre-tag guard: LongMemEval MRR 0.9166/R@10 0.982, LoCoMo MRR 0.8014/R@10 0.9157 (first reading on the repaired bench instrument, within gate tolerance), BEAM 0.5493 — manifest 20260711T080344Z, reranker active. 4.10.0 — CRITICAL reranker fix: FlashRank's cache_dir defaulted to /tmp (library default), which macOS purges; the resulting NoSuchFile was swallowed by a bare except, silently disabling production re-ranking with zero log signal (measured MRR 0.9163 -> 0.8636, delta -0.053). Fixed with a durable ~/.cache/flashrank cache_dir, non-silent failure logging, and reranker_status()/model_sha256() introspection; existing installs lose their re-ranker on every /tmp purge — upgrade recommended. Also: novelty-only auto-capture template normalization (write-gate signal only, stored embeddings untouched), per-write-class homeostatic health/fold stratification (fixes deliberate memories being re-suppressed by a class-blind fold), and a repaired bench measurement instrument (per-run container isolation, pinned embedding model revision) that had been silently cross-contaminating LongMemEval scores across worktrees. 4.3.0 — wiki data-quality (Volet 4): a domain-backfill maintenance pass re-derives the true project domain for wiki pages stuck on a catch-all bucket (uncategorized/_general/global/…) by majority-voting the repo that physically contains the files each page cites — refusing on a tie (no fabrication). Wired into the autonomous consolidate cycle so it self-heals; lifts wiki→source resolvability on the shared store. 3.23.0 — registry-indexer build fix. Added the `neuro-cortex-memory` console script (entry point `mcp_server.__main__:main`) so `uv run neuro-cortex-memory` resolves from a checkout. Registry indexers such as Glama build the repo with `uv sync` and launch the server via `uv run neuro-cortex-memory`; previously only `cortex-doctor` was declared, so the spawn failed (`No such file or directory`), the container exited before any tool registered, and the tools score collapsed. The server starts over stdio and registers all 43 standalone MCP tools without a PostgreSQL connection (46 with the upstream integrations), so `tools/list` answers inside a DB-less container. No change to the marketplace install path or any runtime behaviour. 3.22.0 — security + reliability hardening (P0/P1 audit). Security: headless-authoring RCE fix (--tools restricts the subprocess toolset + --bare ignores the untrusted repo's settings/hooks, replacing the misused --allowedTools), DSN/secret redaction (libpq ?password= query params + psycopg exception leaks), pip supply-chain hardening (env-sanitized index lock). Fixed: the SQLite fallback's A3 heat→heat_base rename was incomplete — all 11 indexes were never created (full table scans) and search/stats queried a non-existent column; supersedes_id + min_access parity; remote-PostgreSQL preflight (pg_isready honors the DATABASE_URL host); flaky handler tests root-caused in the test harness. Added: P1-8 test coverage, a SQLite-backend CI job, and deployment docs (WSL, TLS client-certificate DATABASE_URL, remote PostgreSQL). PostgreSQL remains the mandatory backend; 46 MCP tools. 3.21.0 — visualization extracted to the standalone cortex-viz MCP (github.com/cdeust/cortex-viz). The galaxy graph, execution trace, knowledge/board/wiki/pipeline views, the HTTP server, the workflow-graph builders, and all ui/ assets (−50,671 lines) move out of Cortex into cortex-viz, which reads this same PostgreSQL store read-only — Cortex is a focused memory engine again. BREAKING: the open_visualization, get_methodology_graph, and query_workflow_graph MCP tools are removed from Cortex; install cortex-viz to get them back (its /cortex-visualize skill replaces the old one). 46 MCP tools remain. No memory, retrieval, consolidation, or wiki behaviour changed; full suite green (3214 passed). 3.20.0 — graph intelligence + memory knowledge-updates. Codebase graph: Leiden community detection, centrality + god-node analysis, and native 7-language tree-sitter symbol extraction (no automatised-pipeline required). Memory: explicit supersession edges so a knowledge update links to and ranks above what it replaces; a MinHash entity-dedup engine with AST-symbol origin flagging plus a mutating consolidate-time entity-merge cycle; an inline relation-walk recall mode (include_related) that returns a memory's neighbours in one call; connection-rooted scoping via CORTEX_ROOT_AGENT_TOPIC. Visualization: node-click orchestrator, uncapped galaxy, causal-chain and cwd fixes, O(1)-amortized canvas hit-testing via a uniform-grid spatial hash, and a refusal to index plugin-cache copies. Supersedes the never-tagged 3.19.6 (its launcher self-heal + SSE-only galaxy delivery are included below). CI restored to green (ruff format/lint + I2 canonical-writer line-shift). 3.19.6 — MCP connect self-heal: an interrupted first dependency bootstrap (pip --target killed by the MCP startup timeout) left namespace husks (package dirs without __init__.py) that shadowed every healthy install — the server failed to connect on every retry, permanently. The launcher now detects husks (module.__file__ is None), deletes them, and reinstalls; pip installs are atomic (temp dir, committed only on success); pip failures print to stderr instead of being swallowed, with a PEP 668 --break-system-packages retry. Galaxy graph delivery is now the live SSE stream (/api/graph/events) ONLY — the polling phase loader is gone; the build kicks at server launch, every level L0–L6 streams in real time, the stream closes once at true end-of-build, and warm processes replay the event buffer. L6 now FINISHES (four fixes: stream closed at baseline before symbols; SSE client never loaded by the page; a 1s-per-batch throttle against a consumer-less layout authority ≈1h of sleep; O(n²) merge that pinned the GIL for hours and starved all HTTP requests — measured after: full build 202s, 143,816 nodes incl. 94,437 symbols). Every node kind is browsable: /api/graph/node resolves symbols/files/domains via a new id index (previously only memory:/entity: PG ids; the detail panel stayed empty). 3.19.5 — open_visualization reuses the running viz server via an instance registry instead of spawning a new port + cold rebuild per call; skeleton-snapshot clobber of the full graph snapshot removed. 3.19.4 — plugin MCP server config inlined in plugin.json (repo-root .mcp.json dropped) fixing a failing cortex MCP server when developing inside the plugin repo itself. 3.19.1 — ingest stdio pipe deadlock fixed: batch tool calls run on fresh per-call event loops, so a pooled MCPClient bound to a closed loop was reused with a dead _read_loop — the Rust child blocked in write() once its response exceeded the 64KB OS pipe buffer and both sides slept forever (4.5h+ at 0% CPU; the upstream cause of 'graph shows only the global domain / stale codebase'). MCPClient now records its bound event loop at connect and reports disconnected when that loop is closed or foreign, so the pool discards dead clients and reconnects on the live loop. New CORTEX_MCP_CALL_TIMEOUT_S (default 600s = 10x measured 32s analyze latency, down from 3600s) makes a wedged call fail loudly in minutes with a diagnostic naming the pipe-buffer cause. Regression-tested: 256KB-response child, silent-child timeout, closed/foreign-loop reuse guards. 3.19.0 — memory hygiene + scoring integrity: the 60x auto-capture scoring inversion fixed at all three roots (prospective-trigger injection bypass — 319 garbage keyword triggers harvested from raw tool dumps deactivated, word-boundary matching, low-signal taxonomy + cap + injected:true on injection; WRRF de-bias — hot/recency pools exclude post_tool_capture, mechanical freshness is not importance; metamemory confidence as a Kraaij-2002 document prior wires rate_memory feedback into rank). Oversized auto-captures now store a deterministic gist + content-addressed artifact pointer (GIST_BUDGET = measured p90 curated memory length; full output one Read away — no truncation), same gate on backfill/import. Concurrency governors: upstream MCP connection pool bounded (LRU-evict idle / fail-fast) with the per-server cap regression-tested. Constant-memory pipeline closed: AP cross-loop waits bounded (a wedged subprocess can no longer hang a worker forever), per-query AST accumulators are generators, /api/quadtree streams Arrow record-batches through gzip (constant RAM at any node count). cortex-visualize: GRAPH galaxy tab restored alongside TRACE (the build kick, snapshot readiness, and phase loader were all dead since 3.18.0 — readiness now validates the CXGB header, not file size); auto-loads through L5, AST symbols load on demand; HUD shows true in-galaxy memory counts. Test-suite safety: pytest refuses destructive isolation against any populated non-test database (incident 2026-06-10: 537k production rows lost to CI=true + production DATABASE_URL). Benchmarks regression-free (LongMemEval R@10 98.4% / MRR 0.916; LoCoMo MRR 0.828; BEAM A/B delta 0.001). 3.18.4 — graph build is progressive, not big-bang: hash-gated schema migration (one indexed check instead of re-running 83 DDL stmts under a blocking lock on every store init — kills the connection storm), embedding-free keyset-paginated memory streaming (no upfront 500k sort; ~227 B/row not ~2 KB), and per-batch memory-node pruning (bounded RAM) replace the load that OOM/watchdog-crashed and stalled at 'loading memories'. git diff + file history now resolve for ANY file type (git root derived from the file's own absolute path). AP impact diagram fixed (absolute→repo-relative File.id match) and JavaScript files now produce AST symbols (AP maps js/jsx/mjs/cjs → TypeScript grammar). Legend counts the RENDERED graph, not server totals (fixes 36-domains/0-discussions mismatch). Self-healing AP MCP bridge: bounded handshake (no unsourced sleep), idle-close reconnect, no permanent poison on a transient failure. Stale per-project code-graphs pruned on re-index. CodeQL path-injection sanitisers (is_relative_to). 3.18.3 — codebase-graph freshness made trustable: find_cached_graph self-heals (validates the graph still exists on disk + picks the most-recent valid memo) so a deleted graph can no longer make ingest_codebase silently project an empty graph; new post_commit_reindex PostToolUse hook re-analyses on commits that touch indexable source (detached, 120s-coalesced) closing the SessionStart-TTL staleness gap. Cross-lens documentation graph (WIKI lens) in cortex-visualize: wiki pages as scope-clustered nodes with typed wiki_link + provenance + concept co-occurrence + cross-lens entity/symbol edges; wiki_graph unions PostgreSQL + filesystem page sources and derives [[wikilinks]] from page bodies. 3.18.2 — PRD ingestion fixed + grounded: ingest_prd now calls prd-gen's get_pipeline_state with the correct run_id/format (the pipeline_id source path was broken) and records prd-gen quality history; part of the AP↔prd-gen↔Cortex grounding loop (codebase→spec→memory). 3.18.1 — HUD shows true store counts (memories/entities/synapses) via /api/stats instead of loaded-graph nodes; impact panel refactored to use automatised-pipeline's typed tools (get_context/get_impact) for full direction incl. implements/uses + community/process blast radius; AP MCP resolved from installed_plugins.json (compiled binary, not bin/* glob); HTML-attribute XSS escaping + non-security node-id hash. 3.18.0 — live execution-trace graph in cortex-visualize: domain→session→chain (no snapshot), galaxy-style type-banded clusters, file impact panel wired to the AP code graph (caller/callee direction, causal chains, per-file git versions). Loopback-only host guard retained (GHSA-gvpp-v77h-5w8g).", "keywords": [ "memory", "cognitive-profiling", diff --git a/CHANGELOG.md b/CHANGELOG.md index ab2fc1c5..97f3044b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,8 @@ adheres to [Semantic Versioning](https://semver.org/). - `wiki_classifier.py` and `wiki_axis_registry.py` split into cohesive collaborators (`wiki_axis_defaults.py`, `wiki_classifier_gates.py`, `wiki_classifier_patterns.py`, `wiki_kind_detection.py`, `wiki_title.py`) to bring both files under the repo's 500-line limit; no behaviour change (#134, #153). ### Verified -- Pre-tag guard on the exact release tree (`benchmarks/reproduce.sh --no-ablation`, isolated ephemeral pgvector container, reranker loaded): **PENDING — orchestrator to run in background and fill this section with LongMemEval MRR/R@10, LoCoMo 3-run mean MRR/R@10 (+ each rep), BEAM MRR/R@10, floor-gate PASS/FAIL table (tolerance 0.005), reranker_state, and the evidence directory path** before tagging. See the "Bench command for the orchestrator" note in the release PR description / task report. #150/#152/#153 do not touch the recall path reproduce.sh's floors exercise; #148 touches the write-gate (write path) — the empirical floor-gate result below is the actual non-regression evidence, not an import-closure argument. +- Pre-tag guard on the exact release tree `4e3a202b` (`benchmarks/reproduce.sh --no-ablation` + 2× `--only locomo`, isolated ephemeral pgvector containers, `reranker_state: "loaded"` in all 3 MANIFESTs, same model sha256): LongMemEval-S MRR **0.9166** (floor 0.914, +0.0026 PASS) / R@10 **0.9820** (floor 0.982, +0.0000 PASS); LoCoMo 3-run mean MRR **0.7998** (reps 0.8013 / 0.7983 / 0.7997) / R@10 **0.9135** (reps 0.9142 / 0.9127 / 0.9137, floor 0.915 tol 0.005 PASS); BEAM-100K MRR **0.5417** (not gated, inside the documented 0.539–0.547 intra-day noise band). Evidence: `benchmarks/results/repro/20260717-v4.14.3-pretag/`. +- Adjudication (LoCoMo MRR mean 0.7998 vs threshold 0.800 = floor 0.805 − tol 0.005, i.e. −0.0002): accepted as sampling noise by explicit maintainer decision (2026-07-17). Grounds: delta vs the v4.14.2 pre-tag mean (0.8009) is −0.0011, below the standard error of a 3-rep mean (~0.0013, single-rep stdev 0.0022 per the floors-rebaseline data); rep1 under the identical full-run protocol reads 0.8013 vs 4.14.2's 0.8015; the reranker is verified loaded in every run (FlashRank-absence signature excluded); and none of the 4 released commits is in the LoCoMo harness's dependency graph — ingestion goes through `BenchmarkDB`, not the #148 write path (`benchmarks/lib/bench_db.py`). Symmetric precedent: v4.14.1 released at +0.0002 above the same threshold. #150/#152/#153 do not touch the recall path reproduce.sh's floors exercise; #148 touches the write-gate (write path) — the empirical floor-gate result above is the actual non-regression evidence, not an import-closure argument. ## [4.14.2] - 2026-07-15 diff --git a/benchmarks/results/repro/20260717-v4.14.3-pretag/MANIFEST.json b/benchmarks/results/repro/20260717-v4.14.3-pretag/MANIFEST.json new file mode 100644 index 00000000..3c07454b --- /dev/null +++ b/benchmarks/results/repro/20260717-v4.14.3-pretag/MANIFEST.json @@ -0,0 +1,25 @@ +{ + "git_sha": "4e3a202b10c897fbc564b79d11314b2c0a1c5449", + "longmemeval_dataset_sha256": "08d8dad4be43ee2049a22ff5674eb86725d0ce5ff434cde2627e5e8e7e117894", + "pg_image": "pgvector/pgvector:pg16", + "bench_container_name": "cortex-bench-pg-47873-501b3391", + "bench_container_port": 32771, + "bench_runner_pid": 47873, + "python": "3.12.11", + "packages": { + "datasets": "4.8.4", + "sentence-transformers": "5.4.1", + "torch": "2.11.0", + "psycopg": "3.3.3", + "psycopg-pool": "3.3.0" + }, + "embedding_model_revision": "1110a243fdf4706b3f48f1d95db1a4f5529b4d41", + "reranker_active": true, + "reranker_state": "loaded", + "reranker_model_sha256": "d3dd7b09fcf06b0c070081d6819b5effbb40b667bcad78b2d7543400271141d1", + "results_files": [ + "beam-100K.json", + "locomo.json", + "longmemeval-s.json" + ] +} \ No newline at end of file diff --git a/benchmarks/results/repro/20260717-v4.14.3-pretag/beam-100K.json b/benchmarks/results/repro/20260717-v4.14.3-pretag/beam-100K.json new file mode 100644 index 00000000..dd4e4a63 --- /dev/null +++ b/benchmarks/results/repro/20260717-v4.14.3-pretag/beam-100K.json @@ -0,0 +1,69 @@ +{ + "overall_mrr": 0.5416872795414462, + "overall_r10": 0.7163888888888889, + "ability_mrr": { + "abstention": 0.125, + "contradiction_resolution": 0.9291666666666666, + "event_ordering": 0.36908730158730163, + "information_extraction": 0.5669047619047619, + "instruction_following": 0.2961111111111111, + "knowledge_update": 0.8916666666666666, + "multi_session_reasoning": 0.7072916666666667, + "preference_following": 0.40884920634920635, + "summarization": 0.3019620811287478, + "temporal_reasoning": 0.8208333333333334 + }, + "ability_r5": { + "abstention": 0.125, + "contradiction_resolution": 1.0, + "event_ordering": 0.5, + "information_extraction": 0.625, + "instruction_following": 0.425, + "knowledge_update": 0.95, + "multi_session_reasoning": 0.9, + "preference_following": 0.625, + "summarization": 0.5, + "temporal_reasoning": 0.975 + }, + "ability_r10": { + "abstention": 0.125, + "contradiction_resolution": 1.0, + "event_ordering": 0.625, + "information_extraction": 0.65, + "instruction_following": 0.575, + "knowledge_update": 0.95, + "multi_session_reasoning": 0.925, + "preference_following": 0.7, + "summarization": 0.6388888888888888, + "temporal_reasoning": 0.975 + }, + "total_questions": 395, + "elapsed_s": 745.6345331668854, + "manifest": { + "split": "100K", + "n_conversations": 20, + "n_questions": 395, + "n_runs": 1, + "repro": { + "git_commit": "4e3a202b10c897fbc564b79d11314b2c0a1c5449", + "git_dirty": true, + "python_version": "3.12.11 (main, Sep 18 2025, 19:41:45) [Clang 20.1.4 ]", + "platform_system": "Darwin", + "platform_machine": "arm64", + "platform_node": "mac-1.home", + "timestamp_utc": "2026-07-17T09:51:03.497615+00:00", + "lib_versions": { + "sentence-transformers": "5.4.1", + "torch": "2.11.0", + "numpy": "2.4.4", + "psycopg": "3.3.3", + "pgvector": "0.4.2", + "flashrank": "0.2.10" + }, + "reranker_active": true, + "reranker_state": "loaded", + "reranker_model_path": "/Users/cdeust/.cache/flashrank/ms-marco-MiniLM-L-12-v2/flashrank-MiniLM-L-12-v2_Q.onnx", + "reranker_model_sha256": "d3dd7b09fcf06b0c070081d6819b5effbb40b667bcad78b2d7543400271141d1" + } + } +} \ No newline at end of file diff --git a/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep1.json b/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep1.json new file mode 100644 index 00000000..101fd767 --- /dev/null +++ b/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep1.json @@ -0,0 +1,52 @@ +{ + "overall_mrr": 0.8013402367337785, + "overall_recall10": 0.9142280524722503, + "category_mrr": { + "multi_hop": 0.7284725312762697, + "temporal": 0.576656314699793, + "single_hop": 0.7338511764043678, + "open_domain": 0.8462992846762168, + "adversarial": 0.8580281514698554 + }, + "category_recall10": { + "multi_hop": 0.8411214953271028, + "temporal": 0.8043478260869565, + "single_hop": 0.9361702127659575, + "open_domain": 0.9334126040428062, + "adversarial": 0.9394618834080718 + }, + "elapsed_s": 2255.837089776993, + "consolidation_total_wall_s": 0.0, + "consolidation_call_count": 0, + "manifest": { + "with_consolidation": false, + "ablate_mechanism": null, + "ablate_env_var": null, + "n_conversations": 10, + "n_questions": 1982, + "n_runs": 1, + "consolidation_call_count": 0, + "consolidation_total_wall_s": 0.0, + "repro": { + "git_commit": "4e3a202b10c897fbc564b79d11314b2c0a1c5449", + "git_dirty": true, + "python_version": "3.12.11 (main, Sep 18 2025, 19:41:45) [Clang 20.1.4 ]", + "platform_system": "Darwin", + "platform_machine": "arm64", + "platform_node": "mac-1.home", + "timestamp_utc": "2026-07-17T09:13:20.977255+00:00", + "lib_versions": { + "sentence-transformers": "5.4.1", + "torch": "2.11.0", + "numpy": "2.4.4", + "psycopg": "3.3.3", + "pgvector": "0.4.2", + "flashrank": "0.2.10" + }, + "reranker_active": true, + "reranker_state": "loaded", + "reranker_model_path": "/Users/cdeust/.cache/flashrank/ms-marco-MiniLM-L-12-v2/flashrank-MiniLM-L-12-v2_Q.onnx", + "reranker_model_sha256": "d3dd7b09fcf06b0c070081d6819b5effbb40b667bcad78b2d7543400271141d1" + } + } +} \ No newline at end of file diff --git a/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep2.json b/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep2.json new file mode 100644 index 00000000..2bad9f64 --- /dev/null +++ b/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep2.json @@ -0,0 +1,52 @@ +{ + "overall_mrr": 0.798301579293002, + "overall_recall10": 0.9127144298688193, + "category_mrr": { + "multi_hop": 0.7153661672353261, + "temporal": 0.5647299861973775, + "single_hop": 0.7322272880783519, + "open_domain": 0.8463861049770681, + "adversarial": 0.8572807673143996 + }, + "category_recall10": { + "multi_hop": 0.8348909657320872, + "temporal": 0.7934782608695652, + "single_hop": 0.9361702127659575, + "open_domain": 0.9322235434007135, + "adversarial": 0.9417040358744395 + }, + "elapsed_s": 2044.8194921016693, + "consolidation_total_wall_s": 0.0, + "consolidation_call_count": 0, + "manifest": { + "with_consolidation": false, + "ablate_mechanism": null, + "ablate_env_var": null, + "n_conversations": 10, + "n_questions": 1982, + "n_runs": 1, + "consolidation_call_count": 0, + "consolidation_total_wall_s": 0.0, + "repro": { + "git_commit": "4e3a202b10c897fbc564b79d11314b2c0a1c5449", + "git_dirty": true, + "python_version": "3.12.11 (main, Sep 18 2025, 19:41:45) [Clang 20.1.4 ]", + "platform_system": "Darwin", + "platform_machine": "arm64", + "platform_node": "mac-1.home", + "timestamp_utc": "2026-07-17T10:03:32.713647+00:00", + "lib_versions": { + "sentence-transformers": "5.4.1", + "torch": "2.11.0", + "numpy": "2.4.4", + "psycopg": "3.3.3", + "pgvector": "0.4.2", + "flashrank": "0.2.10" + }, + "reranker_active": true, + "reranker_state": "loaded", + "reranker_model_path": "/Users/cdeust/.cache/flashrank/ms-marco-MiniLM-L-12-v2/flashrank-MiniLM-L-12-v2_Q.onnx", + "reranker_model_sha256": "d3dd7b09fcf06b0c070081d6819b5effbb40b667bcad78b2d7543400271141d1" + } + } +} \ No newline at end of file diff --git a/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep3.json b/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep3.json new file mode 100644 index 00000000..23cc2bc7 --- /dev/null +++ b/benchmarks/results/repro/20260717-v4.14.3-pretag/locomo-rep3.json @@ -0,0 +1,52 @@ +{ + "overall_mrr": 0.7997160956545416, + "overall_recall10": 0.91372351160444, + "category_mrr": { + "multi_hop": 0.7229528259902092, + "temporal": 0.5720194962042788, + "single_hop": 0.7358057525610717, + "open_domain": 0.8450611516901647, + "adversarial": 0.8568385650224215 + }, + "category_recall10": { + "multi_hop": 0.8348909657320872, + "temporal": 0.8152173913043478, + "single_hop": 0.9397163120567376, + "open_domain": 0.9310344827586207, + "adversarial": 0.9417040358744395 + }, + "elapsed_s": 2060.7755172252655, + "consolidation_total_wall_s": 0.0, + "consolidation_call_count": 0, + "manifest": { + "with_consolidation": false, + "ablate_mechanism": null, + "ablate_env_var": null, + "n_conversations": 10, + "n_questions": 1982, + "n_runs": 1, + "consolidation_call_count": 0, + "consolidation_total_wall_s": 0.0, + "repro": { + "git_commit": "4e3a202b10c897fbc564b79d11314b2c0a1c5449", + "git_dirty": true, + "python_version": "3.12.11 (main, Sep 18 2025, 19:41:45) [Clang 20.1.4 ]", + "platform_system": "Darwin", + "platform_machine": "arm64", + "platform_node": "mac-1.home", + "timestamp_utc": "2026-07-17T10:37:43.471538+00:00", + "lib_versions": { + "sentence-transformers": "5.4.1", + "torch": "2.11.0", + "numpy": "2.4.4", + "psycopg": "3.3.3", + "pgvector": "0.4.2", + "flashrank": "0.2.10" + }, + "reranker_active": true, + "reranker_state": "loaded", + "reranker_model_path": "/Users/cdeust/.cache/flashrank/ms-marco-MiniLM-L-12-v2/flashrank-MiniLM-L-12-v2_Q.onnx", + "reranker_model_sha256": "d3dd7b09fcf06b0c070081d6819b5effbb40b667bcad78b2d7543400271141d1" + } + } +} \ No newline at end of file diff --git a/benchmarks/results/repro/20260717-v4.14.3-pretag/longmemeval-s.json b/benchmarks/results/repro/20260717-v4.14.3-pretag/longmemeval-s.json new file mode 100644 index 00000000..27d778e0 --- /dev/null +++ b/benchmarks/results/repro/20260717-v4.14.3-pretag/longmemeval-s.json @@ -0,0 +1,54 @@ +{ + "overall_mrr": 0.9166380952380953, + "overall_recall10": 0.982, + "category_mrr": { + "Single-session (user)": 0.8412698412698413, + "Multi-session reasoning": 0.9625313283208021, + "Single-session (preference)": 0.6853703703703703, + "Temporal reasoning": 0.9184389545291801, + "Knowledge updates": 0.9320512820512821, + "Single-session (assistant)": 1.0 + }, + "category_recall10": { + "Single-session (user)": 0.9571428571428572, + "Multi-session reasoning": 1.0, + "Single-session (preference)": 0.9, + "Temporal reasoning": 0.9774436090225563, + "Knowledge updates": 1.0, + "Single-session (assistant)": 1.0 + }, + "elapsed_s": 1987.0532216249994, + "consolidation_total_wall_s": 0.0, + "consolidation_call_count": 0, + "manifest": { + "with_consolidation": false, + "with_consolidation_note": "Scores collected with consolidation=False do NOT reflect production behaviour. Consolidation-only mechanisms (CASCADE, INTERFERENCE, HOMEOSTATIC_PLASTICITY, SYNAPTIC_PLASTICITY, MICROGLIAL_PRUNING, TWO_STAGE_MODEL, EMOTIONAL_DECAY, TRIPARTITE_SYNAPSE, SCHEMA_ENGINE) are exercised only when with_consolidation=True. Delta between the two conditions is unmeasured in this run.", + "ablate_mechanism": null, + "ablate_env_var": null, + "n_questions": 500, + "n_runs": 1, + "consolidation_call_count": 0, + "consolidation_total_wall_s": 0.0, + "repro": { + "git_commit": "4e3a202b10c897fbc564b79d11314b2c0a1c5449", + "git_dirty": true, + "python_version": "3.12.11 (main, Sep 18 2025, 19:41:45) [Clang 20.1.4 ]", + "platform_system": "Darwin", + "platform_machine": "arm64", + "platform_node": "mac-1.home", + "timestamp_utc": "2026-07-17T08:40:12.173333+00:00", + "lib_versions": { + "sentence-transformers": "5.4.1", + "torch": "2.11.0", + "numpy": "2.4.4", + "psycopg": "3.3.3", + "pgvector": "0.4.2", + "flashrank": "0.2.10" + }, + "reranker_active": true, + "reranker_state": "loaded", + "reranker_model_path": "/Users/cdeust/.cache/flashrank/ms-marco-MiniLM-L-12-v2/flashrank-MiniLM-L-12-v2_Q.onnx", + "reranker_model_sha256": "d3dd7b09fcf06b0c070081d6819b5effbb40b667bcad78b2d7543400271141d1" + } + } +} \ No newline at end of file