v0.16.0
Install
npm install -g neotoma@0.16.0| 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/clientimport { 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-clientfrom 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
-
@neotoma/agentunit + integration turn-lifecycle tests - Python
test_memory.py - Inspector skinning unit + integration (24 tests)
-
override_validation+ graph-neighborhood tenant isolation -
merge_repoint_relationship_edgesintegration (9 tests) -
spawn_platformcross-platform spawn helper (src/shared/spawn_platform.test.ts) -
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