Skip to content

v0.16.0

Choose a tag to compare

@markmhendrickson markmhendrickson released this 18 Jun 16:28
b969383

Install

npm install -g neotoma@0.16.0
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.

  • #1668store: 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

  • @neotoma/agent unit + integration turn-lifecycle tests
  • Python test_memory.py
  • Inspector skinning unit + integration (24 tests)
  • override_validation + graph-neighborhood tenant isolation
  • merge_repoint_relationship_edges integration (9 tests)
  • spawn_platform cross-platform spawn helper (src/shared/spawn_platform.test.ts)
  • 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