This release includes 1 security fix for security teams reviewing exposed deployments.
Topics
+3 more
Summary
AI summaryBroad 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.0 → v0.16.0 — view 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.
@neotoma/agentharness SDK (#318) — protocol-enforcing TypeScript SDK withwithMemory/NeotomaMemoryturn lifecycle (bounded retrieval → user-phase store → assistant-phase store), deterministic idempotency keys, andREFERS_TO/PART_OFedges by construction.- Python
NeotomaMemorylayer (#322) — parity memory protocol forneotoma-client(with_memory, sync + async), Claude Code hook integration, and published SDK docs (docs/developer/sdk_python.md, site pages). - Inspector skinning (#1585) — configurable palette via
NEOTOMA_INSPECTOR_SKIN(bundled presets underinspector/public/skins/) orNEOTOMA_INSPECTOR_SKIN_CONFIG(arbitrary JSON path); server injects sanitized CSS variables before first paint. - Merge relationship repoint (#1534 / #1507) —
mergeEntitiesrepointsrelationship_observationsto the survivor, returnsrelationships_repointedin the OpenAPI merge response, and collapses duplicate edges byrelationship_key(not metadata hash). override_validationservice (#1634 / #398) — per-field write policies onagent_definitionentities enforced at observation/correction write time viaenforceOverridePolicy.- Issues repo discovery (#1617) — M2
.well-known/neotoma.jsonresolver for cross-repo issue targeting. - Peer-sync runbook (#1560) — cloud availability / Stop-hook peer documentation from salvage Wave 2.
- Site UI salvage (#396, #395) — remove MDX locale fallback banner; docs link in header nav + mobile FAB visibility fix.
- Inspector pinned dashboard panel — home page (
/) shows aPinnedDashboardPanelgrid 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,CopyableCodeBlockprimitives wired across every index page. - Catch-all 404 route (
inspector/src/pages/not_found.tsx) plus light/dark color audit (chart-1..5tokens,success/warningutilities, dark-mode entity colors). - Backend
/usageroute + dashboard stats service (src/services/dashboard_stats.ts,src/services/timeline_query.ts) backing the dashboard with a real usage service. - Ops fixes —
/mepath redaction,dev:full:prodtoken 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 theshell: true-on-win32 decision with explicit security reasoning (args stay an argv array — no command-string concatenation, no shell-injection vector). - Updated spawn sites —
src/cli/index.ts,src/cli/hooks.ts,src/cli/doctor.ts,src/services/schema_registry.ts,src/mcp_dev_shim.tsnow use the helper.doctor.tsalso mapswhich→whereon Windows. - Tests —
src/shared/spawn_platform.test.tscovers 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.
- Server —
src/services/session_info.tsbuilds normalized origin info; OpenAPI documentsSessionOriginInfo. - 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: twoagent_messagerows in one request can silently merge whenmessage_idis omitted. A single/storerequest with both a user and assistantagent_message(orconversation_message) sharing oneturn_keyand nomessage_idcollapses to one entity (matched_existingaction) 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:assistantsuffix 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 asAPIError:storeevents on certain entity types (e.g.checkpoint_brief); does not corrupt stored data — observations are preserved, but the snapshot reducer may exclude undeclared fields. Useaudit_undeclared_fragments(MCP) orneotoma schemas audit-fragments(CLI) to triage; promote high-occurrence fields viaupdate_schema_incremental/register_schemaper the per-storeunknown_fieldshint. - #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.mdbefore 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, explicitNeotomaMemory(open_turn/close_turn),turn_helpers,turn_report, anddiagnoseutilities. - Turn lifecycle by construction — on each call: bounded retrieval from the user message, user-phase
conversation+conversation_messagestore withPART_OFandREFERS_TO, agent invocation withctx.retrieved, assistant-phase store with separateturn_keysuffix and idempotency key. - Contract tests —
tests/contract/sdk_client_store_shape.test.tsandtests/unit/agent_memory.test.ts/tests/integration/agent_memory_turn_lifecycle.test.tslock store payload shapes against the live client. - Docs —
docs/developer/sdk_agent.mdand site pagedocs/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.pywith sync and asyncwith_memory/NeotomaMemory.open_turn/close_turn. - Claude Code hooks —
packages/claude-code-plugin/hooks/neotoma_client/gains the same memory layer for Python hook plugins. - Tests —
packages/client-python/tests/test_memory.py. - Docs —
docs/developer/sdk_python.mdand site pagedocs/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 fromdist/inspector/skins/<name>.json(source:inspector/public/skins/). Ships with a neutralsamplepreset for verification.NEOTOMA_INSPECTOR_SKIN_CONFIG=/abs/path/custom.json— load arbitrary skin JSON from disk.- Server injection —
src/services/inspector_skin.tssanitizes token values (HSL triplet shape only), injectswindow.__NEOTOMA_INSPECTOR_SKIN__into the SPA shell before React mounts;inspector/src/lib/inspector_skin.tsapplies CSS variables on load. - Tests —
tests/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.
- Component —
inspector/src/components/home/pinned_dashboard_panel.tsx(grid of pin tiles with kind label and relative pin time). - Home wiring —
inspector/src/pages/home.tsxrenders the panel whenisApiUrlConfigured()is true, above the marketing hero. - Sidebar cap —
inspector/src/components/layout/pinned_primitives_sidebar.tsx(SIDEBAR_PIN_LIMIT = 8, link to/).
Merge repoints relationship edges (#1534 / #1507)
mergeEntitiesnow repointsrelationship_observationsfrom the merged-away entity to the survivor and returnsrelationships_repointedin thePOST /entities/merge200 response (OpenAPI + generated types).- Dedup by
relationship_key— duplicate edges differing only in observation metadata collapse to a single survivor edge (fixes stalecanonical_hashdedup after repoint). - Integration suite —
tests/integration/merge_repoint_relationship_edges.test.ts(9 tests).
override_validation per-field write policies (#1634 / #398)
- New service
src/services/override_validation.ts— readsoverride_policyJSON onagent_definitionentities and enforces per-field write restrictions by derived caller role (operator/service). Phase 1: onlyagent_definitioncarries a policy; other types pass through (fail-open default). - Write hooks —
enforceOverridePolicywired intocreateObservationandcreateCorrectionafter attribution / protected-type checks. - Tests —
src/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.jsonmanifest 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_docsanalytics CTA) and mobile FAB visibility fix on marketing home.
API surface & contracts
- Additive:
relationships_repointedon merge response (#1534); SDK packages are new npm/PyPI surfaces, not OpenAPI changes. - Behavioral:
override_validationmay reject corrections/observations on restrictedagent_definitionfields whenoverride_policyis set. - Run
npm run openapi:bc-diffagainst 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). ConfirmadditionalPropertiesposture separately if v0.15.1 breaking notes apply to this train.
Tests and validation
- [x]
@neotoma/agentunit + 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_edgesintegration (9 tests) - [x]
spawn_platformcross-platform spawn helper (src/shared/spawn_platform.test.ts) - [x]
store_conversation_message_role_conflict— extended to cover single-batch user + assistant payloads and theagent_messagealias (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.0 → v0.16.0)
b969383docs(release): add #1688 session origin fix to v0.16.0 supplement94ffaf5fix(mcp): expose inspector origin in session identity2aab5c8chore(release): bump version to v0.16.0 + SECURITY.md supported versions9ab2c11docs+test(release): v0.16.0 RC supplement + #1668 single-batch regression coverage (#1679)617546efix(cli): add win32 shell mode to .cmd spawns (#1676) (#1677)b6b9744feat(inspector): pre-merge UI audit — mobile shell, design system, empty states, color audit (#1674)5816b09feat(cli): add 'entities export' — the import inverse for the exit-rebuild round-trip (#1666)9a71196Merge pull request #303 from markmhendrickson/fix/issue-176-awaiting-reply-task5d54575feat(ingestion): auto-extract awaiting-reply tasks from outbound emailsc9be1f0Merge pull request #263 from markmhendrickson/claude/charming-brahmagupta-2de939914ea38Merge pull request #298 from markmhendrickson/feat/205-mcp-initialize-skills09ebb99Merge pull request #301 from markmhendrickson/fix/issue-192-issue-conversation-link731ebf3feat(skills): add docs-coverage and test-coverage gates to /process_prs5636953test(cli): add POST body assertions to onboarding import-transcripts tests0040dccfeat(mcp): auto-load skills during MCP initialize for harness (#205)4eab5e8feat(issues): link filed issues to originating conversation turns8979becfeat(instructions): auto-file issues when pre-consented via standing rule (#194)4f1c2d1ci(security): weekly G5 probe reads NEOTOMA_PROBE_HOSTS (sandbox + prod) (#1665)b6b65addocs(redlines): add R17 non-compete as a recorded clarification amendment (#1664)365f9cbMerge pull request #1632 from markmhendrickson/fix/retrieve-entities-honor-entity-types3e401caMerge pull request #1629 from markmhendrickson/fix/retrieve-by-identifier-exact-idf91cde7Merge pull request #1628 from markmhendrickson/fix/mcp-sse-keepalivedf8eb3fMerge pull request #306 from markmhendrickson/fix/issue-174-store-first-rule48a0c9bdocs(mcp): tighten store-first protocol for external tool actions9337db5Merge pull request #305 from markmhendrickson/fix/issue-175-github-entity-guidance6f24f04chore(test-catalog): regenerate for #305 rebase onto fixed main2a2e79echore(test-catalog): regenerate for #305 rebase75f1af6docs(mcp): add guidance for GitHub entity extraction from email recordsc14e084Merge pull request #1663 from markmhendrickson/chore/regen-test-catalog-main-driftdfc7fe4chore(test-catalog): regenerate to fix stale baseline gate on main8c9ebf1Merge pull request #307 from markmhendrickson/fix/issue-169-init-project-local-safea87e9faMerge pull request #289 from markmhendrickson/feat/240-env-contamination-audit19ae67fchore(test-catalog): regenerate for #289 rebase045e05ffeat(audit): add ENV_CONTAMINATION check for dev/prod cross-contamination (#240)236105cfeat(instructions): require task entity creation for all task-like content (#242)72994dachore(test-catalog): regenerate for #307 rebase1c96ebbfix(cli): address review concerns for --project-local and --safe flagsfb0faddfeat(cli): add --project-local and --safe flags to neotoma initcd36eb8Merge pull request #1633 from markmhendrickson/feat/get-entities-list-endpointc61040bMerge pull request #1631 from markmhendrickson/fix/retrieve-entities-status-columne3b3111chore: regenerate catalog + manifest for get-entities rebase6138be8feat(entities): add GET /entities REST alias + hinted 404 (closes #1499)b246d3dchore(test-catalog): regenerate for retrieve-entities-status-column rebase126b669fix(entities): derive lightweight status from snapshot JSON, not snapshot->>status (#1627, #1625)b3e79acMerge pull request #302 from markmhendrickson/fix/issue-184-standing-rules-injection280ac0aMerge pull request #308 from markmhendrickson/fix/issue-160-auto-issue-filingc0be8d7fix(standing-rules): use merged_to_entity_id instead of SQLite alias40dda4dchore: regenerate test catalogb24f7fbfeat(mcp): inject standing rules into MCP initialize responseff6a345fix(issues): declare preference.key field + idempotency guard — review blockers #1602d9725edocs(mcp): auto issue filing — remove consent prompts from issue reporting instructions3912207Merge pull request #360 from markmhendrickson/feat/fu-2026-05-004-turn-summary-mcp-apps-renderingfeb6387chore(test-catalog): regenerate automated test catalogf828d5edocs(mcp): add turn summary widget display rules + update ext-apps README (FU-2026-05-004)6ed3179feat(mcp): render neotoma_turn_summary as MCP Apps widget (FU-2026-05-004)2210fbfMerge pull request #274 from markmhendrickson/fix/fu-2026-05-003-conversation-turn-index-endpoint1a8150echore(tests): regenerate automated test catalog for FU-2026-05-003d1dde9dfeat(api): add GET /conversations/:id/turn-index endpoint (FU-2026-05-003 backend)d2e6468fix(security): regenerate protected_routes_manifest.json for turn-index + turn_summary routes902221afix(rc): rebuild Inspector SPA in rolling-main autodeploy (#1662)03a1556Merge pull request #1660 from markmhendrickson/feat/ui-branch-sweep4f559c0feat(inspector): land sidebar build version and duplicate badgea0028defeat(rendered_page): add publish_rendered_page MCP tool (#1619) (#1637)40f8f17docs(rendered_page): make usage self-documenting (#1620) (#1642)1508940fix(cli): skills sync --json reads the global json option (#1659)f4252f9feat(cli): auto-mirror skills to all harnesses with correct Cursor dir (#1644)6669987feat(inspector): add pinned dashboard panel on home page (#1656)a62ada2feat(security): override_validation service with per-field write policies (salvage #398) (#1634)7381cedfix(issues-sync): include issue.updated_at in the comment-sync key (#1658)cf51b83fix(merge): repoint relationship edges on entity merge (#1507) (#1534)aad884cfeat(inspector): configurable skinning via NEOTOMA_INSPECTOR_SKIN (#1585)b5de343fix(issues-sync): extend migration token to the comment-sync key (#1655)7e3351dfix(issues-sync): bump sync key with migration token to clear stale rows (#1654)d8ddd2ffix(issues-sync): derive sync provenance from updated_at, not wall-clock (#1650)6b3e093Merge pull request #273 from markmhendrickson/fix/fu-2026-05-002-neotoma-turn-summary-mcp-tool01a8067fix(issues-sync): include updated_at in pull-leg idempotency key (#1648)7536d71feat(#1576): audit_undeclared_fragments — report stranded raw_fragments awaiting schema declaration (#1646)2f6de2echore(tests): regenerate automated test catalog for FU-2026-05-002f15778bfix(security): regenerate protected_routes_manifest.json for turn_summary route (FU-2026-05-002)28c36e5feat(mcp): add neotoma_turn_summary tool + ext-apps widget host (FU-2026-05-002)317b33aMerge pull request #1647 from markmhendrickson/fix/agentic-evals-diagnosis-confidencea625b6afeat(issues): M2 repo discovery resolver for .well-known/neotoma.json (#1617)fe0e91efeat(client-python): add NeotomaMemory protocol layer and with_memory wrapper (#322)6a656f4test(eval): fix agent_skips_store diagnosis_confidence to medium8a56744fix(evals): re-record Tier 1 snapshots + fixture for post-#316 client behavior (#1645)e0e1313Merge pull request #272 from markmhendrickson/fix/fu-2026-05-001-store-response-conversation-message-countee883d7feat(store): add conversation_message_count to StoreStructuredResponse (FU-2026-05-001)bb3ab72feat(sdk): add @neotoma/agent protocol-enforcing harness SDK + fix #316 (#318)e2f9eb5Merge pull request #375 from markmhendrickson/claude/cranky-hodgkin-9d404b0002a58fix(security): sync protected_routes_manifest with openapi.yaml (#1641)72fdf14Merge pull request #395 from markmhendrickson/claude/add-docs-mobile-header-vPqnPee969b3Merge pull request #293 from markmhendrickson/feat/231-schema-naming-lint9dd17bbMerge pull request #1544 from markmhendrickson/docs/relationships-pagination-orderingb037469Merge pull request #1542 from markmhendrickson/docs/neotoma-sourced-harness-artifactsff46a02docs(relationships): document pagination ordering invariant029edd8docs(harness-plan): spec subagents (agent_definition) + curated-set manifest7b006ebdocs(harness-plan): add context-triggered artifacts via GOVERNED_BY7ad19dadocs: design Neotoma-sourced harness artifacts as a personalizable, mirrored instruction layer6687d4cMerge pull request #1616 from markmhendrickson/claude/eloquent-kowalevski-868058a8e6994Merge pull request #1624 from markmhendrickson/feat/rc-autodeploy-launchagente4ab9f9Merge pull request #1560 from markmhendrickson/claude/neotoma-cloud-peering-ZbNYlbdfeae3Merge pull request #396 from markmhendrickson/claude/hide-translation-fallback-message-OYPO17931682docs(testing): fix test catalog counts stale after merge (440→442)11425edMerge remote-tracking branch 'origin/main' into claude/eloquent-kowalevski-86805869aa489docs(testing): regenerate test catalog to include cli_status_doctor_alias8425b81style: prettier format the doctor-alias deprecation block in cli/index.tsf24b71eMerge pull request #1579 from markmhendrickson/fix/1570-list-relationships-materialize-livenesse21553fMerge pull request #1581 from markmhendrickson/fix/1572-1573-search-normalization-cleanup79c65bffix(analytics): add header_docs to CtaName unionc41b08cAlways show mobile hamburger FAB on marketing home page4fda8f8Show docs link in mobile app header38ffd3eAdd portability check to /review skill (Phase 5)ec82d3eHide translation fallback message from MDX site pagesddbf11ddocs(peer_sync): add cloud availability peer operator runbookc474a02test: regenerate automated test catalog for new liveness test (#1570)6016289style: prettier-format the is_live migration block (#1570)14bc9e4fix(perf): materialize relationship liveness for O(limit) list_relationships pagination (#1570, #1571)2b800eetest: regenerate automated test catalog for new normalizer test (#1572)fab6edarefactor(search): share query normalizer + drop fixture-tuned stop-tokens (#1572, #1573)07b3cdcMerge pull request #1630 from markmhendrickson/feat/sidebar-pin-cap0b9f91efix(retrieve_entities): honor entity_types (plural) filterf801281feat(inspector): cap sidebar pins at 8 with 'Show all' linkc23a461fix(mcp/cli): resolve literal ent_ ids in retrieve_entity_by_identifier — #1561 #1550 #159735f6244fix(mcp): emit SSE retry: field on stream open (#1503)439fa9aMerge pull request #1580 from markmhendrickson/claude/quirky-cannon-bae8f0f6d408afix(entities): include status in lightweight list projection; add --status filter (#1618)59c0985feat(launchd): add rc-autodeploy LaunchAgent for rolling main->RC->proddeb9f76docs: address exit-rebuild protocol review nits (#1623)75f8a6ddocs: add schema-compatibility policy (#1 In place) + exit-rebuild protocol (#6) (#1608)ffe2659fix(onboarding): address PR #1616 review — doctor alias deprecation notice + doc clarity (#361, #362)688d078Merge remote-tracking branch 'origin/main' into claude/eloquent-kowalevski-868058b371c08feat(schema): usage_digest telemetry entity with intended-use compliance signals (closes #1569) (#1578)cbe4febfeat(issues): observer JSONL import subcommand (closes #271) (#1577)aa8bcc7fix(issues): write github_number back via per-field correct() (#1610) (#1613)b5ff628Merge pull request #1611 from markmhendrickson/fix/preview-deploy-token-resiliencec2ed28bdocs(issues): specify .well-known/neotoma.json repo discovery manifest (Layer 2 / M2) (#1612)0a19442fix(onboarding): simplify evaluate prompt, rename doctor→status, restructure evaluate page (#361, #362)911da45fix(gha): guard concurrency.group expression against empty on push events (#1614)d55666eMerge pull request #1615 from markmhendrickson/fix/1595-merge-array-stringified-recovery0090fcdrefactor+docs(reducer): address PR #1615 review for #1595 recovery406c84cfix(reducer): recover JSON-array-shaped string in merge_array fields (#1595)b811e54feat(skills): add user-level /end and /status session skills (#1602)dc55041ci(preview): make docs preview deploy non-blocking on missing/expired token0497151docs+fix(issues): address #946 target_repo review advisories (#1592)6cc31c9feat(security): salvage /advisory skill + security practices journal (#1594)a293fc3Merge pull request #284 from markmhendrickson/feat/267-task-creation-on-intentc328523feat(instructions): require task entity creation on actionable user intent (#267)11747dffeat(issues): add target_repo parameter to submit_issue (#946)b010b23docs(skills): bake subagent fan-out into process_prs queue audit18094b1Merge pull request #364 from markmhendrickson/claude/interesting-kapitsa-bbe8f43af823ffix(mcp/cli): list_relationships/delete discovery — #277 (#1564)21b4d49fix(ci): APPROVED-WITH-NOTES submits as --approve so reviewDecision self-heals (#1567)14c3f26fix(mcp/cli): retrieval false-negatives — #1495 #1496 #1551 (#1563)898e7c4fix(mcp/cli): schema/unknown_fields/correct — #1559 #1552 #1540 #1549 #247 (#1565)c0c9870fix(mcp/cli): quick mechanical wins — #401 #1504 #1505 #1550 #1506 #367 #369 #370 (#1566)fb22eb9Merge pull request #1554 from markmhendrickson/fix/1541-merge-array-correction-replace7308474chore(test-catalog): register new merge_array correction test (#1541)58ddb76docs+test(reducer): address PR #1554 advisories for merge_array gate (#1541)02006c8Merge remote-tracking branch 'origin/main' into HEAD807bbe9fix: resolver surfaces duplicate when single-token name prefixes existing multi-token canonical name (#1457)a79b7c0Merge pull request #1553 from markmhendrickson/fix/serve-spa-at-root328cb4aMerge pull request #1546 from markmhendrickson/fix/watch-build-inspectora04bffechore(test-catalog): regenerate after merging main (mcp_sse_keepalive)31fcdb5Merge remote-tracking branch 'origin/main' into fix/serve-spa-at-root0c5a582fix(inspector): exclude /openapi*.yaml from early SPA-shell handler1cb4963docs+test(reducer): address PR #1554 review for merge_array priority gate (#1541)a70d2e7fix(mcp): add SSE keepalive to /mcp transport — honor disable sentinel, harden (#1483) (#1486)cdc9c0dfix(reducer): merge_array correction must replace, not union (#1541)31ddbf0fix(inspector): serve SPA at / via early content-negotiation; retire /inspector5c51d28chore(openapi): regenerate openapi_types to satisfy CI freshness guard52998eafix(launchd): build + watch the Inspector SPA in watch-build agentcdeeeaadocs: require surfacing ambiguous multi-candidate retrieval results for disambiguation (#1456)1f9f57ffeat: surface potential duplicates in /audit skill and Inspector entity list (#1459)4c24ea8docs(workflow): work off main, not dev, as the integration branch (#1463)f484046fix(entity-submission): steer specialized types to their submission tool (#1475)d72925cfix(entity-submission): fail loud on empty entity_id from submitEntity (#1462)6baab02fix(openapi): format generated types in openapi:generate + CI freshness guard (#1494)e9a2bd5docs: align consistency + legal docs with shipped behavior (#1533)44a4a65fix(http): restore GET /entities/:id/html guest route for rendered pages (#1536)667e6fadocs(infra): add encryption-at-rest + data-sovereignty to topology aid (#1532)43a7ba8feat(sse): encrypt substrate_events durable-log payload at rest (#1531)941984adocs: correct encryption-at-rest docs to reflect actual column encryption (#1530)413b4c3docs: correct overstated 'encryption at rest' for the SQLite backend (#1529)2421ee0docs(foundation): link dependency-commitment scorecard rows to tracking issues (#1528)e4cdc3bdocs(infra): sync deployment docs with busy_timeout now being set (#1519)52d3138docs(architecture): correct stale RLS-as-current isolation framing (#1518)02144bfdocs(foundation): add codebase-status scorecard to dependency commitments (#1517)d5e63b6ci(review): make Claude PR reviewer submit a formal review with state (#1516)4abbae5feat(graph,cli): HTTP multi-hop traversal parity + bulk entity import (#1470) (#1479)20f894adocs(foundation): publish adopter dependency-stability commitments (#1515)389070adocs(infra): decouple deployment-topology doc from a specific session (#1514)1fe6f53feat(sqlite): set busy_timeout so lock contention waits, not SQLITE_BUSY (#1512)577b35fperf(graph): add fan-out (high-degree hub) traversal benchmark (#1467) (#1513)d49166adocs(infra): multi-tenant deployment topology decision aid (#1511)668c3b4feat(sse): durable substrate-event log for restart-safe resume (#1464 Tier 2) (#1482)16a5994feat(schema): content_field declaration + MISSING_CONTENT_FIELD store warning (#949)48edd25feat(sse,perf): SSE resume gap detection + graph-traversal benchmark (#1464 Tier 1, #1467) (#1480)eb2e5bcperf(graph): index relationship_snapshots for traversal (#1467) (#1481)b9f7bd0docs(foundation): add substrate/application collaboration boundary (#1510)b7d9618docs: document existing isolation, consistency, and concurrency guarantees (#1468, #1465, #1466) (#1478)18b2f78docs(foundation): add redlines.md constitutional commitments (#933)961ca6cMerge pull request #327 from markmhendrickson/claude/combined89772a0fix(review): harden snapshot_filters field names + add Vary:Accept to /docsced58abMerge origin/main into claude/combinedb780437Merge pull request #1500 from markmhendrickson/fix/sibling-cleanups-structured-entities-rel-sort-copyenv571e5e1fix: cursor-hooks entities shape, relationship-service tiebreaker, copy:env path typof98d230Merge pull request #1491 from markmhendrickson/fix/368-stable-relationship-pagination2108310chore: regenerate test catalog5431290fix(relationships): deterministic pagination order on list_relationships and retrieve_graph_neighborhood (#368)06bf9e1Merge pull request #1490 from markmhendrickson/fix/330-split-entity-mcp-tool5a1fbf1Merge pull request #1489 from markmhendrickson/fix/276-graph-neighborhood-entity-idbf6d395Merge pull request #1488 from markmhendrickson/fix/1484-submit-issue-literal-newlines62ae35bMerge pull request #1487 from markmhendrickson/fix/316-client-entities-shapeeae2a8cfix(submit_issue): normalise literal \n sequences in issue body to real newlines (#1497)5165c50chore: regenerate test catalogf93235bchore: regenerate test catalog17826a2fix(review): trim Phase 2 always-load to 3 docs, raise max_turns to 60d5967a0feat(mcp): expose split_entity in the MCP tool surface (#330)a6176e4fix(graph): expose entity_id in retrieve_graph_neighborhood related_entities (#276)b6f2f94fix(issues): decode newlines in submit_issue body (#1484)69fd7b1fix(client): read entities from top-level store response shape (#316)b940568chore(release): archive v0.15.0 supplement, security review, probes to completed/3802bf7feat(inspector): marketing-shaped home + fix /docs SPA bleed-througha1238d5fix(inspector): remove unused imports and variables to clear lint errors6d3e741feat(inspector): share stat totals grid between home and analytics04d5024feat(inspector): restore full analytics dashboard with stat cards, conversations feed, and health panel3cf552efeat(inspector): entities page advanced filtering, board view, bulk actions, and inline editing4e5be13chore(test-catalog): regenerate automated test catalog05f01eefix(contract): add getUsage mapping and regenerate routes manifestc4d4b43feat(inspector): add harness connect snippetsea10e17fix(inspector): align entity type icons with shared lucide mapb1b15d9feat(inspector): design catalog, route loading UX, and search abort wiringd1ef450test(eval): plan-creation fixture, field_present predicate, and blocking eval CI jobf5f2930feat(skills): add /create_pr skill for standardized PR creatione26e1afMerge commit '48b9d42e2b4c1658e169a9f9e6a11aefbb09799c' into claude/combined08308ddchore: combine inspector consolidation (#324) + mode taxonomy/bundling/content-negotiation (#323)5588ce6chore: update docs + build script after inspector consolidationa7391d1Add 'inspector/' from commit 'a4dc87bd4ad33b535bce3d5dbdd06a9cba0f92c2'7b2024dchore: deregister inspector submodule (prep for subtree consolidation)7fb9adafeat: mode taxonomy + inspector bundling + content-negotiation unification48b9d42feat(inspector): support content-negotiation unification + mode badge902f573Wire local_sandbox mode into auth middleware — per-install sandbox principal1fc66b2fix(config): load project .env before user config so worktree can override NEOTOMA_DATA_DIR5689503fix(inspector): bump submodule to fix usage page TS errorsa4dc87bfix(inspector): fix usage page prop names for PageShell and QueryRefreshIndicator0ebbc1afeat(security): sandbox mode resolver + boot-time topology gating (plan ent_b4958d038bd41e8694fe0aef)d105b3cfeat(instructions): prompt for issue-filing consent on first encounter (#195)4432bdbdocs(schema): standardize source field semantics across entity types (#248)022d849fix(schema): graceful fallback when update_schema_incremental called on unregistered entity_type (#269)641f79ffeat(skill): auto-create REFERS_TO from workout_session to source conversation (#258)e3a1892docs(skills): add user-facing skills guide and Feature guides entry73b04fffeat(skills): add skill entity seed schema and boot-time registration004ed9cfeat(inspector): bump submodule, search fix, and shadcn docs826279cfeat(inspector): entity history page, timeline layers, and design showcase9615b86ci(review): post comment explaining why automatic review was skippedae7bfc4Merge branch 'feat/fu-2026-05-003-inspector-turn-anchors'b6b9f9bfeat(inspector): graph layout helpers and relationship panel polishd841834feat(inspector): add Usage view with local aggregate stats (#212)201000dfeat(process): require evals for agentic behavior PRs (#229)b94b6a4feat(schema): entity type name lint warnings on registration (#231)54fe96bfeat(instructions): strengthen agent guidance for entity relationship creation (#253)31ea773feat(instructions): require task entity creation on actionable user intent (#267)a659c34feat(inspector): mode discovery prompt for ext-apps widget host (FU-2026-05-003)f2fad57feat(inspector): per-turn anchor sections + turn timeline sidebar (FU-2026-05-003)45c2e94feat(inspector): bundled docs, pinned primitives, and layout refresh206e14efix(inspector): add --config vite.config.ts to all vite scripts4d3125dfeat(inspector): add peer and subscription surfaces8c37608fix(inspector): tighten external actor badge typing674e50afeat(inspector): add issue and access policy surfacesa2b74e7feat(inspector): add feedback admin surfaces500f21bfeat(inspector): add compliance and feedback surfaces9b29b03Fix: add missing attestation failure reason labels1cb9d7ffeat: bundled-inspector session handshake (same-origin)6ef1f2aci(pages): default hosted inspector API to sandbox3bb5c82fix(inspector): safe hosted API config; sandbox UI scaffolding4b6f66bci(pages): allow VITE_PUBLIC_BASE_PATH override for custom domains839c6d0Add GitHub Pages demo-shell deployment14d556bAdd inspector app attribution, activity, and search viewse3d144dInitial 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
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
Related context
Related tools
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]