Skip to content

markmhendrickson/neotoma

v0.16.0 Security

This release includes 1 security fix for security teams reviewing exposed deployments.

Published 1mo MCP Developer Tools
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 1 known CVE

Topics

agent-infrastructure agent-memory ai-agents deterministic-state entity-resolution event-sourcing
+3 more
mcp privacy-first provenance

Summary

AI summary

Broad release touches Commits, v0.16.0 Release Supplement, inspector, and mcp.

Full changelog

Install

npm install -g [email protected]

| | |
|:--|:--|
| npm | https://www.npmjs.com/package/neotoma/v/0.16.0 |
| Compare | v0.15.0v0.16.0view diff |

v0.16.0 Release Supplement

Summary

v0.16.0 ships the first-party agent SDK + memory-protocol layer, inspector skinning for embedders, merge-relationship hardening, override-policy enforcement for agent_definition writes, and the remaining PR-salvage queue from the v0.16.0 consolidation pass.

  1. @neotoma/agent harness SDK (#318) — protocol-enforcing TypeScript SDK with withMemory / NeotomaMemory turn lifecycle (bounded retrieval → user-phase store → assistant-phase store), deterministic idempotency keys, and REFERS_TO / PART_OF edges by construction.
  2. Python NeotomaMemory layer (#322) — parity memory protocol for neotoma-client (with_memory, sync + async), Claude Code hook integration, and published SDK docs (docs/developer/sdk_python.md, site pages).
  3. Inspector skinning (#1585) — configurable palette via NEOTOMA_INSPECTOR_SKIN (bundled presets under inspector/public/skins/) or NEOTOMA_INSPECTOR_SKIN_CONFIG (arbitrary JSON path); server injects sanitized CSS variables before first paint.
  4. Merge relationship repoint (#1534 / #1507)mergeEntities repoints relationship_observations to the survivor, returns relationships_repointed in the OpenAPI merge response, and collapses duplicate edges by relationship_key (not metadata hash).
  5. override_validation service (#1634 / #398) — per-field write policies on agent_definition entities enforced at observation/correction write time via enforceOverridePolicy.
  6. Issues repo discovery (#1617) — M2 .well-known/neotoma.json resolver for cross-repo issue targeting.
  7. Peer-sync runbook (#1560) — cloud availability / Stop-hook peer documentation from salvage Wave 2.
  8. Site UI salvage (#396, #395) — remove MDX locale fallback banner; docs link in header nav + mobile FAB visibility fix.
  9. Inspector pinned dashboard panel — home page (/) shows a PinnedDashboardPanel grid when the API URL is configured; sidebar caps visible pins at 8 with a Show all (N) link back to home.

RC cycle fixes (post-rc.1)

The RC smoke-test loop produced two additional merges on top of the supplement scope above. Both are user-facing and worth calling out in the GitHub release notes.

Inspector pre-merge UI audit (#1674)

Operator-focused Inspector polish + design-system consistency pass landed before tagging:

  • Operator home, mobile shell, drawer — refreshed Inspector home for operators, mobile drawer + responsive polish across pages.
  • Design-system consistency — filters, selects, code blocks, recent feeds, and design surfaces migrated onto the canonical primitives. New reusable EmptyState, ApiNotConfiguredState, ListSurface, SegmentedControl, FiltersCard, MobileFilterPopover, ActiveFilterBadges, CopyableCodeBlock primitives wired across every index page.
  • Catch-all 404 route (inspector/src/pages/not_found.tsx) plus light/dark color audit (chart-1..5 tokens, success/warning utilities, dark-mode entity colors).
  • Backend /usage route + dashboard stats service (src/services/dashboard_stats.ts, src/services/timeline_query.ts) backing the dashboard with a real usage service.
  • Ops fixes/me path redaction, dev:full:prod token loading, chokidar-polling API watcher.

Windows spawn EINVAL regression fix (#1676 / #1677)

Field-reported regression: on Windows with modern Node.js (post CVE-2024-27980 patch — Node ≥ 18.20.2 / 20.12.2 / 21.7.2, all v22+), child_process.spawn('npm.cmd', ...) and other .cmd shims (npx.cmd, claude.cmd, tsx.cmd, neotoma.cmd) threw EINVAL unless shell: true was set. Most user-visible consequence: neotoma api start failed on Windows, so the local data API never came up and CLI writes were effectively blocked.

  • New helper src/shared/spawn_platform.ts (IS_WINDOWS, WIN_SHELL, shellOnWin()) centralizes the shell: true-on-win32 decision with explicit security reasoning (args stay an argv array — no command-string concatenation, no shell-injection vector).
  • Updated spawn sitessrc/cli/index.ts, src/cli/hooks.ts, src/cli/doctor.ts, src/services/schema_registry.ts, src/mcp_dev_shim.ts now use the helper. doctor.ts also maps whichwhere on Windows.
  • Testssrc/shared/spawn_platform.test.ts covers both platform branches and the spread-into-options shape.

Session identity inspector origin (#1591 / #1688)

Agents were defaulting Inspector links to sandbox.neotoma.io when no configured origin was available. GET /session and MCP get_session_identity now expose origins.inspector_origin and origins.app_origin from NEOTOMA_PUBLIC_BASE_URL when set, otherwise from the inbound request — never a hardcoded sandbox guess. MCP instructions require agents to use session-provided origins for turn-summary links.

  • Serversrc/services/session_info.ts builds normalized origin info; OpenAPI documents SessionOriginInfo.
  • Tests — unit coverage for empty/malformed origins; integration test confirms configured URL wins over request-derived host headers.

Known issues (won't ship a fix this release)

These were surfaced during the RC audit and are tracked for follow-up; they do not block v0.16.0 but are worth user awareness.

  • #1668 — store: two agent_message rows in one request can silently merge when message_id is omitted. A single /store request with both a user and assistant agent_message (or conversation_message) sharing one turn_key and no message_id collapses to one entity (matched_existing action) instead of two distinct rows. Server-side protection (ERR_CONVERSATION_MESSAGE_ROLE_CONFLICT) has been in place since v0.12.0 for the standard ordering and now has additional single-batch regression coverage; if the guard does not fire in your environment, ensure you are on the latest server. Workaround: use the :assistant suffix on the closing message (turn_key: "{conversation_id}:{turn_id}:assistant") — the canonical pattern the MCP turn lifecycle already documents.
  • #1598 / #1587 — auto-enhance queue / schema drift errors in server logs (AUTO_ENHANCE_QUEUE). Visible in production logs as APIError:store events on certain entity types (e.g. checkpoint_brief); does not corrupt stored data — observations are preserved, but the snapshot reducer may exclude undeclared fields. Use audit_undeclared_fragments (MCP) or neotoma schemas audit-fragments (CLI) to triage; promote high-occurrence fields via update_schema_incremental / register_schema per the per-store unknown_fields hint.
  • #1667 — public endpoints returning 401 / tight CORS posture. RC audit identified some endpoints that surface 401 where 200/anonymous would be more appropriate, and a tighter-than-needed CORS configuration for public read paths. Read paths intended for public consumption should continue to be inspected against the auth posture documented in docs/subsystems/auth.md before relying on them anonymously.

What changed for npm package users

@neotoma/agent protocol-enforcing harness SDK (#318)

Provider-agnostic agent harness that wraps @neotoma/client with the canonical Neotoma turn protocol so custom agent loops get correct memory behavior without hand-implementing MCP instruction rules.

  • New package packages/agent/ (@neotoma/agent): withMemory() wrapper, explicit NeotomaMemory (open_turn / close_turn), turn_helpers, turn_report, and diagnose utilities.
  • Turn lifecycle by construction — on each call: bounded retrieval from the user message, user-phase conversation + conversation_message store with PART_OF and REFERS_TO, agent invocation with ctx.retrieved, assistant-phase store with separate turn_key suffix and idempotency key.
  • Contract teststests/contract/sdk_client_store_shape.test.ts and tests/unit/agent_memory.test.ts / tests/integration/agent_memory_turn_lifecycle.test.ts lock store payload shapes against the live client.
  • Docsdocs/developer/sdk_agent.md and site page docs/site/pages/en/sdk-agent.mdx.
npm install @neotoma/agent @neotoma/client
import { HttpTransport } from "@neotoma/client";
import { withMemory } from "@neotoma/agent";

const wrapped = withMemory(yourAgentFn, {
  transport: new HttpTransport({ baseUrl, token }),
  conversationId: "conv-2026-05-20",
  platform: "my-agent",
});

Python NeotomaMemory protocol layer (#322)

Python parity for the same store-first turn protocol — HTTP-only client reaching the Node Neotoma engine over REST.

  • New modules in packages/client-python/: memory.py, with_memory.py, helpers.py with sync and async with_memory / NeotomaMemory.open_turn / close_turn.
  • Claude Code hookspackages/claude-code-plugin/hooks/neotoma_client/ gains the same memory layer for Python hook plugins.
  • Testspackages/client-python/tests/test_memory.py.
  • Docsdocs/developer/sdk_python.md and site page docs/site/pages/en/sdk-python.mdx.
pip install neotoma-client
from neotoma_client import NeotomaClient, with_memory

client = NeotomaClient(base_url="http://127.0.0.1:3080", token="dev-local")
wrapped = with_memory(my_agent, transport=client, conversation_id="conv-1")
result = wrapped("Tell me about Acme Corp")

Inspector skinning via NEOTOMA_INSPECTOR_SKIN (#1585)

Embedders and operators can theme the bundled Inspector SPA without forking the React app.

  • NEOTOMA_INSPECTOR_SKIN=<name> — load a bundled preset from dist/inspector/skins/<name>.json (source: inspector/public/skins/). Ships with a neutral sample preset for verification.
  • NEOTOMA_INSPECTOR_SKIN_CONFIG=/abs/path/custom.json — load arbitrary skin JSON from disk.
  • Server injectionsrc/services/inspector_skin.ts sanitizes token values (HSL triplet shape only), injects window.__NEOTOMA_INSPECTOR_SKIN__ into the SPA shell before React mounts; inspector/src/lib/inspector_skin.ts applies CSS variables on load.
  • Teststests/unit/inspector_skin.test.ts, tests/integration/inspector_skinning.test.ts, inspector/src/lib/inspector_skin.test.ts.

Inspector pinned dashboard panel

Operators with a configured API URL see pinned primitives on the Inspector home page (/) as a responsive card grid (PinnedDashboardPanel). The sidebar still shows up to eight pins; when more exist, Show all (N) links to home where the full set is visible. Public marketing sections remain for visitors without a configured API URL.

  • Componentinspector/src/components/home/pinned_dashboard_panel.tsx (grid of pin tiles with kind label and relative pin time).
  • Home wiringinspector/src/pages/home.tsx renders the panel when isApiUrlConfigured() is true, above the marketing hero.
  • Sidebar capinspector/src/components/layout/pinned_primitives_sidebar.tsx (SIDEBAR_PIN_LIMIT = 8, link to /).

Merge repoints relationship edges (#1534 / #1507)

  • mergeEntities now repoints relationship_observations from the merged-away entity to the survivor and returns relationships_repointed in the POST /entities/merge 200 response (OpenAPI + generated types).
  • Dedup by relationship_key — duplicate edges differing only in observation metadata collapse to a single survivor edge (fixes stale canonical_hash dedup after repoint).
  • Integration suitetests/integration/merge_repoint_relationship_edges.test.ts (9 tests).

override_validation per-field write policies (#1634 / #398)

  • New service src/services/override_validation.ts — reads override_policy JSON on agent_definition entities and enforces per-field write restrictions by derived caller role (operator / service). Phase 1: only agent_definition carries a policy; other types pass through (fail-open default).
  • Write hooksenforceOverridePolicy wired into createObservation and createCorrection after attribution / protected-type checks.
  • Testssrc/services/__tests__/override_validation.test.ts (17), tests/integration/retrieve_graph_neighborhood_tenant_isolation.test.ts (3).

Issues M2 repo discovery (#1617)

  • Resolver for .well-known/neotoma.json manifest discovery, enabling cross-repo issue targeting without hard-coded repo assumptions.

Peer-sync documentation (#1560)

  • Cloud availability peer runbook and Stop-hook documentation from salvage Wave 2.

Site / marketing UI (#396, #395)

  • Remove locale fallback banner from MDX site pages.
  • Docs link in header nav (header_docs analytics CTA) and mobile FAB visibility fix on marketing home.

API surface & contracts

  • Additive: relationships_repointed on merge response (#1534); SDK packages are new npm/PyPI surfaces, not OpenAPI changes.
  • Behavioral: override_validation may reject corrections/observations on restricted agent_definition fields when override_policy is set.
  • Run npm run openapi:bc-diff against v0.15.1 before tagging to confirm no unintended breaking changes beyond documented merge-response field addition.

Breaking changes

  • None identified for core HTTP/MCP contracts in this supplement scope. The merge response gains relationships_repointed (additive). Confirm additionalProperties posture separately if v0.15.1 breaking notes apply to this train.

Tests and validation

  • [x] @neotoma/agent unit + integration turn-lifecycle tests
  • [x] Python test_memory.py
  • [x] Inspector skinning unit + integration (24 tests)
  • [x] override_validation + graph-neighborhood tenant isolation
  • [x] merge_repoint_relationship_edges integration (9 tests)
  • [x] spawn_platform cross-platform spawn helper (src/shared/spawn_platform.test.ts)
  • [x] store_conversation_message_role_conflict — extended to cover single-batch user + assistant payloads and the agent_message alias (regression coverage for #1668)
  • [ ] Full CI baseline + security gates on #1634, #1534, #1585 after rebase onto latest main

Related PRs

| PR | Status | Topic |
|----|--------|-------|
| #318 | Merged | @neotoma/agent SDK |
| #322 | Merged | Python NeotomaMemory |
| #1585 | In review | Inspector skinning |
| #1634 | In review | override_validation |
| #1534 | In review | Merge relationship repoint |
| #1617 | Merged | Issues repo discovery |
| #1560 | Merged | Peer-sync docs |
| #396, #395 | Merged | Site UI salvage |
| #1674 | Merged | Inspector pre-merge UI audit (mobile shell, design system, empty states, color audit, dashboard backing service) |
| #1677 (closes #1676) | Merged | Windows spawn EINVAL regression fix for .cmd shims |
| #1688 (closes #1591) | Merged | Session identity exposes inspector origin (no sandbox default) |


Commits (v0.15.0v0.16.0)

  • b969383 docs(release): add #1688 session origin fix to v0.16.0 supplement
  • 94ffaf5 fix(mcp): expose inspector origin in session identity
  • 2aab5c8 chore(release): bump version to v0.16.0 + SECURITY.md supported versions
  • 9ab2c11 docs+test(release): v0.16.0 RC supplement + #1668 single-batch regression coverage (#1679)
  • 617546e fix(cli): add win32 shell mode to .cmd spawns (#1676) (#1677)
  • b6b9744 feat(inspector): pre-merge UI audit — mobile shell, design system, empty states, color audit (#1674)
  • 5816b09 feat(cli): add 'entities export' — the import inverse for the exit-rebuild round-trip (#1666)
  • 9a71196 Merge pull request #303 from markmhendrickson/fix/issue-176-awaiting-reply-task
  • 5d54575 feat(ingestion): auto-extract awaiting-reply tasks from outbound emails
  • c9be1f0 Merge pull request #263 from markmhendrickson/claude/charming-brahmagupta-2de939
  • 914ea38 Merge pull request #298 from markmhendrickson/feat/205-mcp-initialize-skills
  • 09ebb99 Merge pull request #301 from markmhendrickson/fix/issue-192-issue-conversation-link
  • 731ebf3 feat(skills): add docs-coverage and test-coverage gates to /process_prs
  • 5636953 test(cli): add POST body assertions to onboarding import-transcripts tests
  • 0040dcc feat(mcp): auto-load skills during MCP initialize for harness (#205)
  • 4eab5e8 feat(issues): link filed issues to originating conversation turns
  • 8979bec feat(instructions): auto-file issues when pre-consented via standing rule (#194)
  • 4f1c2d1 ci(security): weekly G5 probe reads NEOTOMA_PROBE_HOSTS (sandbox + prod) (#1665)
  • b6b65ad docs(redlines): add R17 non-compete as a recorded clarification amendment (#1664)
  • 365f9cb Merge pull request #1632 from markmhendrickson/fix/retrieve-entities-honor-entity-types
  • 3e401ca Merge pull request #1629 from markmhendrickson/fix/retrieve-by-identifier-exact-id
  • f91cde7 Merge pull request #1628 from markmhendrickson/fix/mcp-sse-keepalive
  • df8eb3f Merge pull request #306 from markmhendrickson/fix/issue-174-store-first-rule
  • 48a0c9b docs(mcp): tighten store-first protocol for external tool actions
  • 9337db5 Merge pull request #305 from markmhendrickson/fix/issue-175-github-entity-guidance
  • 6f24f04 chore(test-catalog): regenerate for #305 rebase onto fixed main
  • 2a2e79e chore(test-catalog): regenerate for #305 rebase
  • 75f1af6 docs(mcp): add guidance for GitHub entity extraction from email records
  • c14e084 Merge pull request #1663 from markmhendrickson/chore/regen-test-catalog-main-drift
  • dfc7fe4 chore(test-catalog): regenerate to fix stale baseline gate on main
  • 8c9ebf1 Merge pull request #307 from markmhendrickson/fix/issue-169-init-project-local-safe
  • a87e9fa Merge pull request #289 from markmhendrickson/feat/240-env-contamination-audit
  • 19ae67f chore(test-catalog): regenerate for #289 rebase
  • 045e05f feat(audit): add ENV_CONTAMINATION check for dev/prod cross-contamination (#240)
  • 236105c feat(instructions): require task entity creation for all task-like content (#242)
  • 72994da chore(test-catalog): regenerate for #307 rebase
  • 1c96ebb fix(cli): address review concerns for --project-local and --safe flags
  • fb0fadd feat(cli): add --project-local and --safe flags to neotoma init
  • cd36eb8 Merge pull request #1633 from markmhendrickson/feat/get-entities-list-endpoint
  • c61040b Merge pull request #1631 from markmhendrickson/fix/retrieve-entities-status-column
  • e3b3111 chore: regenerate catalog + manifest for get-entities rebase
  • 6138be8 feat(entities): add GET /entities REST alias + hinted 404 (closes #1499)
  • b246d3d chore(test-catalog): regenerate for retrieve-entities-status-column rebase
  • 126b669 fix(entities): derive lightweight status from snapshot JSON, not snapshot->>status (#1627, #1625)
  • b3e79ac Merge pull request #302 from markmhendrickson/fix/issue-184-standing-rules-injection
  • 280ac0a Merge pull request #308 from markmhendrickson/fix/issue-160-auto-issue-filing
  • c0be8d7 fix(standing-rules): use merged_to_entity_id instead of SQLite alias
  • 40dda4d chore: regenerate test catalog
  • b24f7fb feat(mcp): inject standing rules into MCP initialize response
  • ff6a345 fix(issues): declare preference.key field + idempotency guard — review blockers #160
  • 2d9725e docs(mcp): auto issue filing — remove consent prompts from issue reporting instructions
  • 3912207 Merge pull request #360 from markmhendrickson/feat/fu-2026-05-004-turn-summary-mcp-apps-rendering
  • feb6387 chore(test-catalog): regenerate automated test catalog
  • f828d5e docs(mcp): add turn summary widget display rules + update ext-apps README (FU-2026-05-004)
  • 6ed3179 feat(mcp): render neotoma_turn_summary as MCP Apps widget (FU-2026-05-004)
  • 2210fbf Merge pull request #274 from markmhendrickson/fix/fu-2026-05-003-conversation-turn-index-endpoint
  • 1a8150e chore(tests): regenerate automated test catalog for FU-2026-05-003
  • d1dde9d feat(api): add GET /conversations/:id/turn-index endpoint (FU-2026-05-003 backend)
  • d2e6468 fix(security): regenerate protected_routes_manifest.json for turn-index + turn_summary routes
  • 902221a fix(rc): rebuild Inspector SPA in rolling-main autodeploy (#1662)
  • 03a1556 Merge pull request #1660 from markmhendrickson/feat/ui-branch-sweep
  • 4f559c0 feat(inspector): land sidebar build version and duplicate badge
  • a0028de feat(rendered_page): add publish_rendered_page MCP tool (#1619) (#1637)
  • 40f8f17 docs(rendered_page): make usage self-documenting (#1620) (#1642)
  • 1508940 fix(cli): skills sync --json reads the global json option (#1659)
  • f4252f9 feat(cli): auto-mirror skills to all harnesses with correct Cursor dir (#1644)
  • 6669987 feat(inspector): add pinned dashboard panel on home page (#1656)
  • a62ada2 feat(security): override_validation service with per-field write policies (salvage #398) (#1634)
  • 7381ced fix(issues-sync): include issue.updated_at in the comment-sync key (#1658)
  • cf51b83 fix(merge): repoint relationship edges on entity merge (#1507) (#1534)
  • aad884c feat(inspector): configurable skinning via NEOTOMA_INSPECTOR_SKIN (#1585)
  • b5de343 fix(issues-sync): extend migration token to the comment-sync key (#1655)
  • 7e3351d fix(issues-sync): bump sync key with migration token to clear stale rows (#1654)
  • d8ddd2f fix(issues-sync): derive sync provenance from updated_at, not wall-clock (#1650)
  • 6b3e093 Merge pull request #273 from markmhendrickson/fix/fu-2026-05-002-neotoma-turn-summary-mcp-tool
  • 01a8067 fix(issues-sync): include updated_at in pull-leg idempotency key (#1648)
  • 7536d71 feat(#1576): audit_undeclared_fragments — report stranded raw_fragments awaiting schema declaration (#1646)
  • 2f6de2e chore(tests): regenerate automated test catalog for FU-2026-05-002
  • f15778b fix(security): regenerate protected_routes_manifest.json for turn_summary route (FU-2026-05-002)
  • 28c36e5 feat(mcp): add neotoma_turn_summary tool + ext-apps widget host (FU-2026-05-002)
  • 317b33a Merge pull request #1647 from markmhendrickson/fix/agentic-evals-diagnosis-confidence
  • a625b6a feat(issues): M2 repo discovery resolver for .well-known/neotoma.json (#1617)
  • fe0e91e feat(client-python): add NeotomaMemory protocol layer and with_memory wrapper (#322)
  • 6a656f4 test(eval): fix agent_skips_store diagnosis_confidence to medium
  • 8a56744 fix(evals): re-record Tier 1 snapshots + fixture for post-#316 client behavior (#1645)
  • e0e1313 Merge pull request #272 from markmhendrickson/fix/fu-2026-05-001-store-response-conversation-message-count
  • ee883d7 feat(store): add conversation_message_count to StoreStructuredResponse (FU-2026-05-001)
  • bb3ab72 feat(sdk): add @neotoma/agent protocol-enforcing harness SDK + fix #316 (#318)
  • e2f9eb5 Merge pull request #375 from markmhendrickson/claude/cranky-hodgkin-9d404b
  • 0002a58 fix(security): sync protected_routes_manifest with openapi.yaml (#1641)
  • 72fdf14 Merge pull request #395 from markmhendrickson/claude/add-docs-mobile-header-vPqnP
  • ee969b3 Merge pull request #293 from markmhendrickson/feat/231-schema-naming-lint
  • 9dd17bb Merge pull request #1544 from markmhendrickson/docs/relationships-pagination-ordering
  • b037469 Merge pull request #1542 from markmhendrickson/docs/neotoma-sourced-harness-artifacts
  • ff46a02 docs(relationships): document pagination ordering invariant
  • 029edd8 docs(harness-plan): spec subagents (agent_definition) + curated-set manifest
  • 7b006eb docs(harness-plan): add context-triggered artifacts via GOVERNED_BY
  • 7ad19da docs: design Neotoma-sourced harness artifacts as a personalizable, mirrored instruction layer
  • 6687d4c Merge pull request #1616 from markmhendrickson/claude/eloquent-kowalevski-868058
  • a8e6994 Merge pull request #1624 from markmhendrickson/feat/rc-autodeploy-launchagent
  • e4ab9f9 Merge pull request #1560 from markmhendrickson/claude/neotoma-cloud-peering-ZbNYl
  • bdfeae3 Merge pull request #396 from markmhendrickson/claude/hide-translation-fallback-message-OYPO1
  • 7931682 docs(testing): fix test catalog counts stale after merge (440→442)
  • 11425ed Merge remote-tracking branch 'origin/main' into claude/eloquent-kowalevski-868058
  • 69aa489 docs(testing): regenerate test catalog to include cli_status_doctor_alias
  • 8425b81 style: prettier format the doctor-alias deprecation block in cli/index.ts
  • f24b71e Merge pull request #1579 from markmhendrickson/fix/1570-list-relationships-materialize-liveness
  • e21553f Merge pull request #1581 from markmhendrickson/fix/1572-1573-search-normalization-cleanup
  • 79c65bf fix(analytics): add header_docs to CtaName union
  • c41b08c Always show mobile hamburger FAB on marketing home page
  • 4fda8f8 Show docs link in mobile app header
  • 38ffd3e Add portability check to /review skill (Phase 5)
  • ec82d3e Hide translation fallback message from MDX site pages
  • ddbf11d docs(peer_sync): add cloud availability peer operator runbook
  • c474a02 test: regenerate automated test catalog for new liveness test (#1570)
  • 6016289 style: prettier-format the is_live migration block (#1570)
  • 14bc9e4 fix(perf): materialize relationship liveness for O(limit) list_relationships pagination (#1570, #1571)
  • 2b800ee test: regenerate automated test catalog for new normalizer test (#1572)
  • fab6eda refactor(search): share query normalizer + drop fixture-tuned stop-tokens (#1572, #1573)
  • 07b3cdc Merge pull request #1630 from markmhendrickson/feat/sidebar-pin-cap
  • 0b9f91e fix(retrieve_entities): honor entity_types (plural) filter
  • f801281 feat(inspector): cap sidebar pins at 8 with 'Show all' link
  • c23a461 fix(mcp/cli): resolve literal ent_ ids in retrieve_entity_by_identifier — #1561 #1550 #1597
  • 35f6244 fix(mcp): emit SSE retry: field on stream open (#1503)
  • 439fa9a Merge pull request #1580 from markmhendrickson/claude/quirky-cannon-bae8f0
  • f6d408a fix(entities): include status in lightweight list projection; add --status filter (#1618)
  • 59c0985 feat(launchd): add rc-autodeploy LaunchAgent for rolling main->RC->prod
  • deb9f76 docs: address exit-rebuild protocol review nits (#1623)
  • 75f8a6d docs: add schema-compatibility policy (#1 In place) + exit-rebuild protocol (#6) (#1608)
  • ffe2659 fix(onboarding): address PR #1616 review — doctor alias deprecation notice + doc clarity (#361, #362)
  • 688d078 Merge remote-tracking branch 'origin/main' into claude/eloquent-kowalevski-868058
  • b371c08 feat(schema): usage_digest telemetry entity with intended-use compliance signals (closes #1569) (#1578)
  • cbe4feb feat(issues): observer JSONL import subcommand (closes #271) (#1577)
  • aa8bcc7 fix(issues): write github_number back via per-field correct() (#1610) (#1613)
  • b5ff628 Merge pull request #1611 from markmhendrickson/fix/preview-deploy-token-resilience
  • c2ed28b docs(issues): specify .well-known/neotoma.json repo discovery manifest (Layer 2 / M2) (#1612)
  • 0a19442 fix(onboarding): simplify evaluate prompt, rename doctor→status, restructure evaluate page (#361, #362)
  • 911da45 fix(gha): guard concurrency.group expression against empty on push events (#1614)
  • d55666e Merge pull request #1615 from markmhendrickson/fix/1595-merge-array-stringified-recovery
  • 0090fcd refactor+docs(reducer): address PR #1615 review for #1595 recovery
  • 406c84c fix(reducer): recover JSON-array-shaped string in merge_array fields (#1595)
  • b811e54 feat(skills): add user-level /end and /status session skills (#1602)
  • dc55041 ci(preview): make docs preview deploy non-blocking on missing/expired token
  • 0497151 docs+fix(issues): address #946 target_repo review advisories (#1592)
  • 6cc31c9 feat(security): salvage /advisory skill + security practices journal (#1594)
  • a293fc3 Merge pull request #284 from markmhendrickson/feat/267-task-creation-on-intent
  • c328523 feat(instructions): require task entity creation on actionable user intent (#267)
  • 11747df feat(issues): add target_repo parameter to submit_issue (#946)
  • b010b23 docs(skills): bake subagent fan-out into process_prs queue audit
  • 18094b1 Merge pull request #364 from markmhendrickson/claude/interesting-kapitsa-bbe8f4
  • 3af823f fix(mcp/cli): list_relationships/delete discovery — #277 (#1564)
  • 21b4d49 fix(ci): APPROVED-WITH-NOTES submits as --approve so reviewDecision self-heals (#1567)
  • 14c3f26 fix(mcp/cli): retrieval false-negatives — #1495 #1496 #1551 (#1563)
  • 898e7c4 fix(mcp/cli): schema/unknown_fields/correct — #1559 #1552 #1540 #1549 #247 (#1565)
  • c0c9870 fix(mcp/cli): quick mechanical wins — #401 #1504 #1505 #1550 #1506 #367 #369 #370 (#1566)
  • fb22eb9 Merge pull request #1554 from markmhendrickson/fix/1541-merge-array-correction-replace
  • 7308474 chore(test-catalog): register new merge_array correction test (#1541)
  • 58ddb76 docs+test(reducer): address PR #1554 advisories for merge_array gate (#1541)
  • 02006c8 Merge remote-tracking branch 'origin/main' into HEAD
  • 807bbe9 fix: resolver surfaces duplicate when single-token name prefixes existing multi-token canonical name (#1457)
  • a79b7c0 Merge pull request #1553 from markmhendrickson/fix/serve-spa-at-root
  • 328cb4a Merge pull request #1546 from markmhendrickson/fix/watch-build-inspector
  • a04bffe chore(test-catalog): regenerate after merging main (mcp_sse_keepalive)
  • 31fcdb5 Merge remote-tracking branch 'origin/main' into fix/serve-spa-at-root
  • 0c5a582 fix(inspector): exclude /openapi*.yaml from early SPA-shell handler
  • 1cb4963 docs+test(reducer): address PR #1554 review for merge_array priority gate (#1541)
  • a70d2e7 fix(mcp): add SSE keepalive to /mcp transport — honor disable sentinel, harden (#1483) (#1486)
  • cdc9c0d fix(reducer): merge_array correction must replace, not union (#1541)
  • 31ddbf0 fix(inspector): serve SPA at / via early content-negotiation; retire /inspector
  • 5c51d28 chore(openapi): regenerate openapi_types to satisfy CI freshness guard
  • 52998ea fix(launchd): build + watch the Inspector SPA in watch-build agent
  • cdeeeaa docs: require surfacing ambiguous multi-candidate retrieval results for disambiguation (#1456)
  • 1f9f57f feat: surface potential duplicates in /audit skill and Inspector entity list (#1459)
  • 4c24ea8 docs(workflow): work off main, not dev, as the integration branch (#1463)
  • f484046 fix(entity-submission): steer specialized types to their submission tool (#1475)
  • d72925c fix(entity-submission): fail loud on empty entity_id from submitEntity (#1462)
  • 6baab02 fix(openapi): format generated types in openapi:generate + CI freshness guard (#1494)
  • e9a2bd5 docs: align consistency + legal docs with shipped behavior (#1533)
  • 44a4a65 fix(http): restore GET /entities/:id/html guest route for rendered pages (#1536)
  • 667e6fa docs(infra): add encryption-at-rest + data-sovereignty to topology aid (#1532)
  • 43a7ba8 feat(sse): encrypt substrate_events durable-log payload at rest (#1531)
  • 941984a docs: correct encryption-at-rest docs to reflect actual column encryption (#1530)
  • 413b4c3 docs: correct overstated 'encryption at rest' for the SQLite backend (#1529)
  • 2421ee0 docs(foundation): link dependency-commitment scorecard rows to tracking issues (#1528)
  • e4cdc3b docs(infra): sync deployment docs with busy_timeout now being set (#1519)
  • 52d3138 docs(architecture): correct stale RLS-as-current isolation framing (#1518)
  • 02144bf docs(foundation): add codebase-status scorecard to dependency commitments (#1517)
  • d5e63b6 ci(review): make Claude PR reviewer submit a formal review with state (#1516)
  • 4abbae5 feat(graph,cli): HTTP multi-hop traversal parity + bulk entity import (#1470) (#1479)
  • 20f894a docs(foundation): publish adopter dependency-stability commitments (#1515)
  • 389070a docs(infra): decouple deployment-topology doc from a specific session (#1514)
  • 1fe6f53 feat(sqlite): set busy_timeout so lock contention waits, not SQLITE_BUSY (#1512)
  • 577b35f perf(graph): add fan-out (high-degree hub) traversal benchmark (#1467) (#1513)
  • d49166a docs(infra): multi-tenant deployment topology decision aid (#1511)
  • 668c3b4 feat(sse): durable substrate-event log for restart-safe resume (#1464 Tier 2) (#1482)
  • 16a5994 feat(schema): content_field declaration + MISSING_CONTENT_FIELD store warning (#949)
  • 48edd25 feat(sse,perf): SSE resume gap detection + graph-traversal benchmark (#1464 Tier 1, #1467) (#1480)
  • eb2e5bc perf(graph): index relationship_snapshots for traversal (#1467) (#1481)
  • b9f7bd0 docs(foundation): add substrate/application collaboration boundary (#1510)
  • b7d9618 docs: document existing isolation, consistency, and concurrency guarantees (#1468, #1465, #1466) (#1478)
  • 18b2f78 docs(foundation): add redlines.md constitutional commitments (#933)
  • 961ca6c Merge pull request #327 from markmhendrickson/claude/combined
  • 89772a0 fix(review): harden snapshot_filters field names + add Vary:Accept to /docs
  • ced58ab Merge origin/main into claude/combined
  • b780437 Merge pull request #1500 from markmhendrickson/fix/sibling-cleanups-structured-entities-rel-sort-copyenv
  • 571e5e1 fix: cursor-hooks entities shape, relationship-service tiebreaker, copy:env path typo
  • f98d230 Merge pull request #1491 from markmhendrickson/fix/368-stable-relationship-pagination
  • 2108310 chore: regenerate test catalog
  • 5431290 fix(relationships): deterministic pagination order on list_relationships and retrieve_graph_neighborhood (#368)
  • 06bf9e1 Merge pull request #1490 from markmhendrickson/fix/330-split-entity-mcp-tool
  • 5a1fbf1 Merge pull request #1489 from markmhendrickson/fix/276-graph-neighborhood-entity-id
  • bf6d395 Merge pull request #1488 from markmhendrickson/fix/1484-submit-issue-literal-newlines
  • 62ae35b Merge pull request #1487 from markmhendrickson/fix/316-client-entities-shape
  • eae2a8c fix(submit_issue): normalise literal \n sequences in issue body to real newlines (#1497)
  • 5165c50 chore: regenerate test catalog
  • f93235b chore: regenerate test catalog
  • 17826a2 fix(review): trim Phase 2 always-load to 3 docs, raise max_turns to 60
  • d5967a0 feat(mcp): expose split_entity in the MCP tool surface (#330)
  • a6176e4 fix(graph): expose entity_id in retrieve_graph_neighborhood related_entities (#276)
  • b6f2f94 fix(issues): decode newlines in submit_issue body (#1484)
  • 69fd7b1 fix(client): read entities from top-level store response shape (#316)
  • b940568 chore(release): archive v0.15.0 supplement, security review, probes to completed/
  • 3802bf7 feat(inspector): marketing-shaped home + fix /docs SPA bleed-through
  • a1238d5 fix(inspector): remove unused imports and variables to clear lint errors
  • 6d3e741 feat(inspector): share stat totals grid between home and analytics
  • 04d5024 feat(inspector): restore full analytics dashboard with stat cards, conversations feed, and health panel
  • 3cf552e feat(inspector): entities page advanced filtering, board view, bulk actions, and inline editing
  • 4e5be13 chore(test-catalog): regenerate automated test catalog
  • 05f01ee fix(contract): add getUsage mapping and regenerate routes manifest
  • c4d4b43 feat(inspector): add harness connect snippets
  • ea10e17 fix(inspector): align entity type icons with shared lucide map
  • b1b15d9 feat(inspector): design catalog, route loading UX, and search abort wiring
  • d1ef450 test(eval): plan-creation fixture, field_present predicate, and blocking eval CI job
  • f5f2930 feat(skills): add /create_pr skill for standardized PR creation
  • e26e1af Merge commit '48b9d42e2b4c1658e169a9f9e6a11aefbb09799c' into claude/combined
  • 08308dd chore: combine inspector consolidation (#324) + mode taxonomy/bundling/content-negotiation (#323)
  • 5588ce6 chore: update docs + build script after inspector consolidation
  • a7391d1 Add 'inspector/' from commit 'a4dc87bd4ad33b535bce3d5dbdd06a9cba0f92c2'
  • 7b2024d chore: deregister inspector submodule (prep for subtree consolidation)
  • 7fb9ada feat: mode taxonomy + inspector bundling + content-negotiation unification
  • 48b9d42 feat(inspector): support content-negotiation unification + mode badge
  • 902f573 Wire local_sandbox mode into auth middleware — per-install sandbox principal
  • 1fc66b2 fix(config): load project .env before user config so worktree can override NEOTOMA_DATA_DIR
  • 5689503 fix(inspector): bump submodule to fix usage page TS errors
  • a4dc87b fix(inspector): fix usage page prop names for PageShell and QueryRefreshIndicator
  • 0ebbc1a feat(security): sandbox mode resolver + boot-time topology gating (plan ent_b4958d038bd41e8694fe0aef)
  • d105b3c feat(instructions): prompt for issue-filing consent on first encounter (#195)
  • 4432bdb docs(schema): standardize source field semantics across entity types (#248)
  • 022d849 fix(schema): graceful fallback when update_schema_incremental called on unregistered entity_type (#269)
  • 641f79f feat(skill): auto-create REFERS_TO from workout_session to source conversation (#258)
  • e3a1892 docs(skills): add user-facing skills guide and Feature guides entry
  • 73b04ff feat(skills): add skill entity seed schema and boot-time registration
  • 004ed9c feat(inspector): bump submodule, search fix, and shadcn docs
  • 826279c feat(inspector): entity history page, timeline layers, and design showcase
  • 9615b86 ci(review): post comment explaining why automatic review was skipped
  • ae7bfc4 Merge branch 'feat/fu-2026-05-003-inspector-turn-anchors'
  • b6b9f9b feat(inspector): graph layout helpers and relationship panel polish
  • d841834 feat(inspector): add Usage view with local aggregate stats (#212)
  • 201000d feat(process): require evals for agentic behavior PRs (#229)
  • b94b6a4 feat(schema): entity type name lint warnings on registration (#231)
  • 54fe96b feat(instructions): strengthen agent guidance for entity relationship creation (#253)
  • 31ea773 feat(instructions): require task entity creation on actionable user intent (#267)
  • a659c34 feat(inspector): mode discovery prompt for ext-apps widget host (FU-2026-05-003)
  • f2fad57 feat(inspector): per-turn anchor sections + turn timeline sidebar (FU-2026-05-003)
  • 45c2e94 feat(inspector): bundled docs, pinned primitives, and layout refresh
  • 206e14e fix(inspector): add --config vite.config.ts to all vite scripts
  • 4d3125d feat(inspector): add peer and subscription surfaces
  • 8c37608 fix(inspector): tighten external actor badge typing
  • 674e50a feat(inspector): add issue and access policy surfaces
  • a2b74e7 feat(inspector): add feedback admin surfaces
  • 500f21b feat(inspector): add compliance and feedback surfaces
  • 9b29b03 Fix: add missing attestation failure reason labels
  • 1cb9d7f feat: bundled-inspector session handshake (same-origin)
  • 6ef1f2a ci(pages): default hosted inspector API to sandbox
  • 3bb5c82 fix(inspector): safe hosted API config; sandbox UI scaffolding
  • 4b6f66b ci(pages): allow VITE_PUBLIC_BASE_PATH override for custom domains
  • 839c6d0 Add GitHub Pages demo-shell deployment
  • 14d556b Add inspector app attribution, activity, and search views
  • e3d144d Initial commit: Neotoma inspector UI

Full compare: v0.15.0...v0.16.0

Security Fixes

  • CVE-2024-27980

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track markmhendrickson/neotoma

Get notified when new releases ship.

Sign up free

About markmhendrickson/neotoma

Deterministic state layer for AI agents. Stores versioned entities (contacts, tasks, transactions, decisions) with immutable observations, full provenance, and schema-first extraction. Local-first SQLite, cross-client memory across Claude, Cursor, ChatGPT, and OpenClaw. Website

All releases →

Related context

Earlier breaking changes

  • v0.12.1 Inspector build prepublish now exits non-zero if inspector submodule is missing, breaking ad-hoc npm pack runs without init.
  • v0.12.0 Access policy source precedence: env > SchemaMetadata.guest_access_policy > config
  • v0.12.0 Legacy feedback subsystem completely removed; issues subsystem is replacement
  • v0.12.0 MCP submit_issue requires reporter_git_sha or reporter_app_version

Beta — feedback welcome: [email protected]