What's Changed
- docs: changelog and blog post for v0.9.2 by @nicoloboschi in #3765
- fix(retain): batch a document's chunk embeddings instead of one request per chunk by @nicoloboschi in #3785
- perf(tokenizer): replace tiktoken with quicktok and default to o200k_base by @nicoloboschi in #3788
- fix(benchmarks): repair retain_memory's imports of removed engine symbols by @nicoloboschi in #3789
- retain: rebuild an oversized item's sub-batch from its original span by @nicoloboschi in #3806
- fix(search): score pg_textsearch results per row by @mameikagou in #3802
- retain: accumulate a document's body instead of rebuilding it per sub-batch by @nicoloboschi in #3809
- fix(coding-agents): don't let one stray file abort the Claude import, and give Prime Agent the companion skill (#3771, #3772) by @nicoloboschi in #3812
- fix(control-plane): scope the Knowledge view's page and mental model ids to the current bank by @nicoloboschi in #3813
- blog: Your Agent Can Now Manage Its Own Knowledge Base Over MCP by @benfrank241 in #3822
- feat(recall): add a per-bank enable_text_search toggle for pure vector recall by @nicoloboschi in #3819
- feat(templates): add Business Executive bank template by @benfrank241 in #3834
- blog: How We Made Retain's Peak Memory Flat, from 4 MB to 90 MB Documents by @benfrank241 in #3839
- fix(transfer): remap mental model evidence ids by @nicoloboschi in #3833
- feat(alembic): let a deployment own a maintenance routine by @cdbartholomew in #3842
- docs: update retain extraction mode documentation by @nicoloboschi in #3838
- feat: export knowledge base in document transfers by @nicoloboschi in #3855
- fix(llm): honor OpenAI's x-ratelimit-reset-* headers on 429s by @romanbsd in #3508
- blog: Cross-Encoder Reranking — The Last Stage of Agent Memory Recall by @benfrank241 in #3868
- fix(retain): bound the within-batch link passes so a delta cannot OOM the worker (#3848) by @nicoloboschi in #3856
- Fix TEI stale socket retries by @oldnicke in #3375
- feat(control-plane): add i18n for knowledge base and refine mental models by @Sanderhoff-alt in #3677
- fix(embeddings): bounded retry/backoff + timeout for litellm/litellm-sdk providers by @icculp in #3090
- fix(worker): detect stuck tasks by stage progress by @BrianHotopp in #3720
- test: restore the global metrics collector instead of leaking it (#3780) by @nicoloboschi in #3816
- fix(providers): native ollama path honours the configured LLM timeout by @MasterST1337 in #3797
- feat(helm): add extraContainers and extraInitContainers to api, worker and control plane by @Adrastopoulos in #3801
- fix(reflect): accept a top-level array of delta operations by @ebarkhordar in #3829
- feat(helm): add Prometheus operator ServiceMonitor support by @aWN4Y25pa2EK in #3847
- perf(local): skip full GC for CPU reranker providers by @Sanderhoff-alt in #3858
- feat(pg_search): allow extension function schema to be configured by @Sanderhoff-alt in #3759
- fix(worker): bound wedged consolidation tasks by @Sanderhoff-alt in #3746
- [CLI] Add a
--trigger-mode full|deltaflag tomental-models updateby @mdbenito in #3513 - fix(sdk): send only the trigger settings the caller named by @nicoloboschi in #3913
- fix(retain, reflect): drop the source-language rule when an output language is set by @feniix in #3777
- fix(retain): sanitize model-derived fact text by @BrianMcBrayer in #3730
- fix(kb): apply a knowledge-node patch in one transaction by @nicoloboschi in #3914
- fix(admin): sync identity sequences after restore by @r266-tech in #3844
- fix(api): preserve webhook validation status codes by @r266-tech in #3832
- fix(openclaw): add non-interactive flags to plugin install in smoke test by @Sanderhoff-alt in #3917
- feat(mental-models): meter model content by what is delivered, not by which endpoint served it by @cdbartholomew in #3869
- fix(embed): read CLI profile config as UTF-8 by @koriyoshi2041 in #3850
- fix(tests): name the ANN index the plan must use (#3619) by @nicoloboschi in #3911
- fix: propagate configured temperature through reflect calls by @koriyoshi2041 in #3828
- fix(db): memoise InvalidNameError GUC rejections like UndefinedObjectError by @Andreymi in #3826
- fix(api): round-trip the whole retain item so reprocess replays it faithfully by @shauneccles in #3874
- fix(security): run operation validator in get_mental_model_history (#… by @Sword-Saint69 in #3835
- fix(cli): preserve base64 '=' padding when parsing config-file api_key by @2anoubis in #3909
- fix(search): delegate pgroonga query tokenization to pgroonga_tokenize by @Sanderhoff-alt in #3907
- fix(retain): constrain occurred_start/occurred_end so grammar-constrained models can't emit prose by @nickanderson in #3845
- refactor(bank): eliminate redundant existence queries in _ensure_bank_exists by @Sanderhoff-alt in #3672
- perf(retain): optimize embedding_to_pgvector serialization via zero-copy orjson by @Sanderhoff-alt in #3815
- fix(llm): raise OutputTooLongError when a non-streaming completion is truncated by @ebarkhordar in #3827
- fix: recover Codex OAuth refresh after shared auth rotation by @dwayn in #3804
- fix(tests): stop generating webhook parametrize uuids at collection time by @nicoloboschi in #3922
- fix(consolidation): apply one LLM response's writes in one transaction by @nicoloboschi in #3923
- fix(coding-agents): stop unsafe gitlog cleanup by @r266-tech in #3879
- fix(embed): decode control center log tail as UTF-8 by @koriyoshi2041 in #3918
- fix(llm): derive visible output tokens from total on OpenAI-compatible providers (#3851) by @nicoloboschi in #3920
- fix(coding-agents): stop opencode's install from replacing a JSONC config by @etnperlong in #3843
- feat: expose core mental model trigger settings over MCP by @Sanderhoff-alt in #3739
- docs(docker): add guide and recipe for building CUDA standalone image by @Sanderhoff-alt in #3749
- fix(reflect): accept id-bearing blocks in delta add_section ops (#3901) by @nicoloboschi in #3919
- docs: stop recommending --user for Docker bind mounts (#3863) by @nicoloboschi in #3934
- fix(search): embed the whole mental-model document on every write by @nicoloboschi in #3928
- fix(daemon): drop the idle timeout that could kill an in-flight request by @nicoloboschi in #3930
- fix(anthropic): group consecutive tool results into one user message by @zlguo1996 in #3910
- fix(llm): repair malformed JSON in the openai-compatible provider (#3683) by @nicoloboschi in #3935
- fix(documents): skip the retag cascade when a tags PATCH changes nothing (#3912) by @nicoloboschi in #3931
- fix(embeddings): add retry logic and dimensions config for LiteLLM provider (#3695) by @Sanderhoff-alt in #3744
- fix(recall): score coarse dates from their period, not its first day (#3893) by @nicoloboschi in #3933
- fix(docker): ship images free of fixed HIGH CVEs and scan them daily by @nicoloboschi in #3936
- memories: unify store-owned writes, delta-retain CAS, and PG-free tracking by @nicoloboschi in #3696
- docs(hermes): disable Hermes's built-in memory via config flags by @nicoloboschi in #3940
- fix(recall): honour min_scores.keyword on every text-search backend (#3882) by @nicoloboschi in #3938
- fix(llm): give every provider a real per-request deadline (#3898) by @nicoloboschi in #3946
- Fuse observation graph expansion into one database fetch by @jervaise in #3859
- fix(embeddings): bound ONNX forward passes and import embed calls (#3891) by @nicoloboschi in #3948
- fix(search): drop search-trace fields that are structurally always empty by @nicoloboschi in #3947
- feat(reflect): send the operation schema on mental model delta refresh by @nicoloboschi in #3937
- fix(retain): make reprocess re-extract instead of silently no-opping (#3899) by @nicoloboschi in #3949
- config: read a bank's own config fresh, not through the per-process cache by @nicoloboschi in #3952
- fix(tests): isolate the worker claim tests in their own schema (#3963) by @nicoloboschi in #3970
- feat(coding-agents): add native DeepAgents Dcode integration by @nicoloboschi in #3967
- fix(docker): drop npm from the runtime stages and scan every runtime base by @rschlek in #3960
- config: keep the hot path cached; freshness belongs to the caller that needs it by @nicoloboschi in #3975
- coding-agents: keep the installed runtime current by itself by @nicoloboschi in #3965
- fix(monitoring): make Grafana dashboards importable on older Grafana by @oldnicke in #3972
- memories: an edit writes its own vector, in the same write as the fields by @nicoloboschi in #3964
- fix(knowledge): switch native knowledge BM25 from websearch AND to disjunctive OR by @Sanderhoff-alt in #3945
- fix(coding-agents): only ever ADD to a bank's config, never overwrite it by @nicoloboschi in #3966
- fix(engine): authorize and provision banks before legacy mutations by @Sanderhoff-alt in #3969
- feat(coding-agents): add qwen-code as a hook harness by @nicoloboschi in #3979
- metrics: time the operation-validator hooks, which run outside the operation's timer by @nicoloboschi in #3976
- fix(coding-agents): stop a failed git probe from forking a worktree into its own bank by @nicoloboschi in #3981
- fix(consolidation): resolve observation_scopes before tag-set batching by @ferrastas in #3954
- fix(structured-output): strip $ref sibling keywords from strict schemas by @nicoloboschi in #3944
- fix(bank-template): resolve stale snapshot race during template import by @Sanderhoff-alt in #3971
- fix(retain): stop deriving the extraction narrator from the bank's display name (#3962) by @nicoloboschi in #3978
- fix(mental-models): skip the reflect loop when the scope holds nothing to read by @nicoloboschi in #3943
- fix(coding-agents): survey prompt says Glob, not Read, for the directory layout by @MasterST1337 in #3796
- docs(docker): reserve shared memory for embedded PostgreSQL by @aunitt in #3896
- fix(coding-agents): identify safe MCP knowledge reads by @altaywtf in #3818
- fix(worker): rotate slots across banks so bulk ingest stops starving them (#3861) by @nicoloboschi in #3980
- feat(llm): per-provider Codex credentials directory (#3793) by @nicoloboschi in #3983
- feat(webhooks): emit X-Hub-Signature-256 and a timestamped signature by @nicoloboschi in #3986
- fix(ci): stop one stalled Gemini call from outliving the caller, and isolate the third claim-test file by @nicoloboschi in #3982
- fix(reflect): name the sections array the document schema requires by @nicoloboschi in #3984
- coding-agents: support opencode 2, whose plugin API shares nothing with v1's by @nicoloboschi in #3985
- fix(recall): boost the prioritised arm in rank space, not score space (#3956) by @nicoloboschi in #3987
- feat(coding-agents): add per_source observation scoping by @shauneccles in #3872
- chore(coding-agents): sync generated files after per_source (#3872) by @nicoloboschi in #3994
- feat(extensions): add hindsight-extensions registry and unbundle Supabase by @nicoloboschi in #3988
- feat(coding-agents): first-class pi support, sharing one extension adapter and installer with Prime Agent by @nicoloboschi in #3993
- feat(changelog): enumerate each release's migrations, with tables and volume by @nicoloboschi in #3996
- fix(coding-agents): the runtime auto-update never fired — registry 406 on the /latest media type by @nicoloboschi in #3997
- blog: What's New in Hindsight Cloud — June-August Updates by @benfrank241 in #3951
- blog: date the Cloud roundup 2026-09-01 by @benfrank241 in #4000
- metrics: time the recall phases, so the request's largest share stops being a residual by @nicoloboschi in #3999
- fix(reflect): fail the run when a retrieval tool fails, and record refused refreshes by @nicoloboschi in #4003
- fix(llm): name the phase a stalled LLM request died in (#3881) by @nicoloboschi in #3992
- fix(tracing): name API traces after the operation and link queued retain to its worker by @nicoloboschi in #4006
- metrics: record a store-answered recall's phases on ordinary traffic, not only under a trace by @nicoloboschi in #4007
- fix(retain): invalidate observations when a re-retain changes a document's scoping by @nicoloboschi in #4019
- docs: make every integration changelog reachable, and compact the Integrations Hub by @nicoloboschi in #4005
- fix(local-models): copy misaligned weights out of mapped storage, and fail fast by @nicoloboschi in #4020
- fix(loop-watchdog): don't report the stall that stop() itself causes by @nicoloboschi in #4021
- feat(entity-labels): add an open-vocabulary multi-valued label type (multi-text) by @nicoloboschi in #4027
- perf(tokenizer): move token counting from quicktok to toktok-rs by @nicoloboschi in #4022
- fix(api): warm dateparser locale dictionaries once, under a lock by @nicoloboschi in #4032
- perf(api): stop importing LiteLLM and markitdown on every startup by @nicoloboschi in #4031
- fix(mental-models): return 409 on a duplicate mental-model id by @kubaodias in #4024
- fix(clients): close the bank-config drift between the wrapper SDKs and the server by @nicoloboschi in #4030
- feat(api): run migrations in a subprocess, controlled by a flag by @nicoloboschi in #4033
- fix: two test regressions from #4022 and #4031 (tokenizer cache leak, markitdown OCR fail-fast) by @nicoloboschi in #4036
- feat(recall): fuzzy tag matching on tag_groups leaves (#4026) by @nicoloboschi in #4028
- fix(cursor): register hooks on init, ship rules_file.py, flush on sessionEnd by @nicoloboschi in #4041
- fix(recall): score fuzzy tag similarity on the value, not the namespaced tag by @nicoloboschi in #4045
- refactor(retain): format pgvector literals without orjson, and drop orjson entirely by @nicoloboschi in #4040
- blog: Four More Coding Agents That Remember Your Project by @benfrank241 in #4042
- feat: run Hindsight on free-threaded CPython 3.14 (-py3.14t image) by @nicoloboschi in #4037
- feat(api): serve from several event loops in one process by @nicoloboschi in #4067
- memories: drop count_chunks from the extension seam by @nicoloboschi in #4080
- perf(embeddings): issue a remote provider's batches concurrently (#4039) by @nicoloboschi in #4043
- refactor(api-slim): write each duplicated policy once by @nicoloboschi in #4083
- chore(deps): bump esbuild to 0.28.x and body-parser to 1.20.6 by @cdbartholomew in #4050
- chore(deps): bump nltk to 3.10.3 in the llamaindex and pipecat locks by @cdbartholomew in #4051
- chore(deps): bump fast-uri to 3.1.7 and browserslist to 4.28.8 by @cdbartholomew in #4088
- ci: run the core suite when the workspace lockfile or root manifest changes by @cdbartholomew in #4089
- chore(deps): bump torch to 2.13.0 and tornado to 6.5.8 by @cdbartholomew in #4052
- chore(deps): bump agno to 3.0.5 by @cdbartholomew in #4096
- blog: Enterprise Features in Hindsight Cloud by @benfrank241 in #4004
- chore(deps): override json-repair past crewai's pin by @cdbartholomew in #4098
- security: pin the llama.cpp prompt cache to RAM by @cdbartholomew in #4102
- fix(tracing): attach bank ID to retain spans by @koriyoshi2041 in #4109
- fix(temporal): stop dateparser segfaulting the API under free-threading by @nicoloboschi in #4110
- fix(api): paginate GET /observations/scopes and GET /webhooks by @nicoloboschi in #4075
- chore(deps): remove unused tornado dependency by @nicoloboschi in #4111
- fix(cli): print the server's response body on API errors (#4049) by @nicoloboschi in #4113
- fix(api): run tenant provisioning migrations through the isolation boundary by @nicoloboschi in #4117
- fix(embed): forward every HINDSIGHT_* var to the daemon instead of a whitelist by @nicoloboschi in #4119
- feat(llm): add Meta Model API as a first-class provider by @nicoloboschi in #4081
- feat(retain): inline images and files as first-class content by @nicoloboschi in #4077
- fix(api): install every PostgreSQL extension in the public schema (#4118) by @nicoloboschi in #4121
- fix(retain): keep per-memory entity-label tags when a re-retain rewrites document tags (#4068) by @nicoloboschi in #4120
- fix(api): give each event loop its own extension context by @nicoloboschi in #4123
- fix(embeddings): let litellm-sdk invoke a Bedrock inference profile ARN by @nicoloboschi in #4114
- refactor(api-slim): return a named result from LLMInterface.call by @nicoloboschi in #4122
- fix(reflect): run split synthesis's map calls at temperature 0 by @nicoloboschi in #4115
- fix(embeddings): route Gemini through the shared embedding retry policy by @nicoloboschi in #4124
- fix(opencode-go): send x-opencode-session, one id per operation (#4071) by @benfrank241 in #4084
- feat(control-plane): banks overview page with bulk delete by @nicoloboschi in #4125
- chore(deps): bump banks to 2.5.0 in the llamaindex integration lock by @cdbartholomew in #4132
- test: make two deselection markers actually apply by @nicoloboschi in #4126
- fix(embeddings): route Cohere and ZeroEntropy through the shared retry policy by @nicoloboschi in #4129
- feat(api)!: retire the bank profile and background endpoints by @nicoloboschi in #4127
- fix(embeddings): one TEI http client per thread, not one per provider by @nicoloboschi in #4138
- fix(codex): defer work until quota reset by @0xble in #4161
- fix(reranker): give every remote reranker bounded retry by @nicoloboschi in #4139
- chore: update the tagline to "Agent Memory That Learns" by @cdbartholomew in #4093
- fix(cli): restore default SIGPIPE handling to prevent abort on broken pipe by @2anoubis in #3925
- fix(openclaw): restore compatibility with OpenClaw 2026.8.1+ by @nicoloboschi in #4178
- fix(temporal): "last weekend" asked on a weekend means the previous one by @NgoQuocViet2001 in #4076
- fix(retain): scrub the whole retain item at the engine ingress, not field by field by @nicoloboschi in #3921
- fix(llm): identify OpenAI-compatible requests by @SharkyRawr in #4078
- fix(cache): preserve force refresh across event loops by @koriyoshi2041 in #4072
- fix(openclaw): resolve Dashboard agent identity from four-part session keys by @r266-tech in #4149
- fix(coding-agents): scope knowledge pages to the bank, not the session's cwd (#4146) by @nicoloboschi in #4184
- fix(operations): allow cancelling in-flight operations (#4131) by @nicoloboschi in #4177
- feat(openclaw): add recall score floors by @koriyoshi2041 in #4145
- fix(server): load .env before importing MemoryEngine to honor concurrency limits by @Sanderhoff-alt in #3939
- fix(docker): drop unused libxml2 from runtime images by @rschlek in #4055
- perf(docker): replace RUN chown with COPY --chown to speed up image building by @SharkyRawr in #4141
- fix(api-slim): read the opencode-go retry assertion off LLMCallResult.content by @nicoloboschi in #4181
- fix(ci): unbreak test-api — the call envelope and the temporal golden corpus by @nicoloboschi in #4185
- fix(api-slim): never import an observation citing a missing source unit by @nicoloboschi in #4179
- fix(docker): drop unused libxml2 from the freethreaded runtime image by @nicoloboschi in #4187
- feat(llm): route retain items to a chain member by their metadata by @nicoloboschi in #4188
- fix(reflect): enforce max_tokens on the forced synthesis path too (#4156) by @nicoloboschi in #4180
- fix(concurrency): serve CrossLoopSemaphore waiters in arrival order by @ebarkhordar in #4157
- fix(consolidation): teach the prompt to name delete targets, and count discarded batch responses by @nicoloboschi in #4183
- test(temporal): re-snapshot the golden corpus for the "last weekend" fix by @nicoloboschi in #4192
- fix(embeddings): bound embedding input by the model's context, prefix included by @nicoloboschi in #4182
- chore(docker): move the image Node runtime from EOL 20 to Active LTS 24 by @nicoloboschi in #4193
- fix(openclaw): fail the smoke test on any hindsight doctor diagnostic by @nicoloboschi in #4190
- fix(api): 404 bank-scoped reads for a bank that does not exist (#4175) by @nicoloboschi in #4186
- fix(coding-agents): read DSH transcript via snapshotEvents by @leilei3167 in #4148
- test(api-slim): regenerate the temporal golden corpus for the weekend fix by @nicoloboschi in #4191
- ci: build the control plane on Node 24, matching the image by @nicoloboschi in #4194
- fix(embeddings): send each Gemini input as its own Content by @Sanderhoff-alt in #4001
- fix(docker): stop installing curl into the cp-only image by @nicoloboschi in #4199
- fix(docker): drop the NodeSource bootstrap from the standalone image by @nicoloboschi in #4200
- fix(search): clamp future dates before the exponential recency power by @ebarkhordar in #4105
- feat(coding-agents): add Factory Droid harness by @mrwogu in #4011
- fix(local-ml): floor torch at 2.11.0 so arm64 images run on ARMv8.0 CPUs by @nicoloboschi in #4201
- perf(api-slim): stop the mental-model staleness check walking the bank (#4169) by @nicoloboschi in #4195
- feat(api,control-plane): a prompt tester for retain, and prompt preview for every operation by @nicoloboschi in #4140
- fix(embeddings): one request per text for the Vertex single-content models by @nicoloboschi in #4204
- perf(entity-resolver): optimize in-batch dedup via prefix filtering by @Sanderhoff-alt in #3991
- feat(coding-agents): spread page refreshes with hashed cron fields (
H) by @nicoloboschi in #4208 - fix(docker): drop curl from the API runtime images by @nicoloboschi in #4202
- perf(config): stop deep-copying the global config on every resolution (#4209) by @nicoloboschi in #4211
- perf(retain): accelerate within-batch semantic link calculation by @Sanderhoff-alt in #3977
- fix(coding-agents): replay a failed retain append instead of replacing the transcript (#3989) by @nicoloboschi in #4210
- test(system): blackbox system-test suite driven only through the public API by @nicoloboschi in #4212
- chore(deps): bump qs to 6.16.0 in the coding-agents lock by @cdbartholomew in #4220
- chore(deps): bump qs, @humanfs/node and postcss-selector-parser in the root lock by @cdbartholomew in #4219
- feat(profiling): env-configured CPU profile, reported to the logs by @nicoloboschi in #4215
- fix(recall): report the caller's query_timestamp in the search trace by @nicoloboschi in #4227
- fix(retain): give a split append the whole document as its body, not just the tail (#3989) by @nicoloboschi in #4229
- docs: point the Slack community links at a redirect by @cdbartholomew in #4223
- fix: defer retain completion outbox until store commit by @kyletser in #4203
- fix(python-client): add the missing async twins to the convenience wrapper (#4221) by @nicoloboschi in #4228
- perf(recall): stop building trace payloads when no trace was asked for by @nicoloboschi in #4231
- feat(mental-models): default list to metadata; MCP list returns metadata only by @cdbartholomew in #4225
- fix(api): type the list and graph rows instead of returning bare dicts (#4218) by @nicoloboschi in #4233
- fix(retain): a store-owned retain must not fail on its own log line by @nicoloboschi in #4236
- perf(api): replace both BaseHTTPMiddleware with pure ASGI (3.2x on cheap routes) by @nicoloboschi in #4235
- feat(extensions): add StaticKeysTenantExtension — env-configured per-user API keys with per-schema isolation by @rafaelkallis in #3675
- revert: drop free-threaded CPython 3.14 support (#4037, #4067) by @nicoloboschi in #4234
- fix(api): expose the bank template import request body by @nicoloboschi in #4247
- fix(reflect): say when the structured-output extraction failed (#4230) by @nicoloboschi in #4248
- feat(coding-agents): refresh knowledge pages hourly and staggered by default by @nicoloboschi in #4241
- feat(coding-agents): add ZCode as a supported harness (#4240) by @nicoloboschi in #4258
- fix(retain): stop chunk ids colliding across banks by @nicoloboschi in #4257
- chore(deps): update httpx2 and httpcore2 in the pydantic-ai integration by @cdbartholomew in #4262
- chore(deps): update sharp and vitest in the cloudflare-oauth-proxy integration by @cdbartholomew in #4263
- chore(deps): update js-yaml in the zapier integration by @cdbartholomew in #4264
- chore(deps): update npm dependencies in the root lockfile by @cdbartholomew in #4261
- chore(deps): update hono and vitest in the coding-agents integration by @cdbartholomew in #4266
- chore(deps): update vitest in the ai-sdk integration by @cdbartholomew in #4267
- chore(deps): update vitest in the chat integration by @cdbartholomew in #4268
- chore(deps): update vitest in the eliza integration by @cdbartholomew in #4269
- chore(deps): update vitest in the opencode integration by @cdbartholomew in #4271
- chore(deps): update vitest in the eve integration by @cdbartholomew in #4270
- chore(deps): update vitest in the flowise integration by @cdbartholomew in #4273
- chore(deps): update vitest in the obsidian integration by @cdbartholomew in #4275
- chore(deps): update vitest in the n8n integration by @cdbartholomew in #4274
- docs(documents): say the tags PATCH replaces the array, and test clearing it by @nicoloboschi in #4272
- feat(api,control-plane): recall results carry the attachments behind each fact by @nicoloboschi in #4277
- refactor(config): make HindsightConfig the only parser of HINDSIGHT_API_* env vars by @nicoloboschi in #4260
- feat(control-plane): add a pause button for constellation ambient motion by @nicoloboschi in #4289
- test(system): blackbox system-test coverage across the epic by @nicoloboschi in #4216
- fix(reflect): uniquify tool_call ids so strict APIs accept the turn by @gwthm-in in #4250
- fix(curation): clear the legacy event_date when occurred_start is cleared by @nicoloboschi in #4278
- feat(control-plane): pin the current bank to the top of the bank selector by @nicoloboschi in #4298
- fix(entities): give mention_count back when the mentions go (#4291) by @nicoloboschi in #4296
- fix(coding-agents): repair Grok config.toml left with an unmarked Hindsight block by @nicoloboschi in #4302
- test(retain): make the post-commit convergence test causal, not a wall-clock race by @nicoloboschi in #4294
- perf(db): skip asyncpg's release-time reset by @nicoloboschi in #4259
- perf(recall): account for a recall's time per phase, and fix the three things that showed up by @nicoloboschi in #4299
- fix(recall): a store-owned bank's attachment lookup does not read memory_units by @nicoloboschi in #4306
- perf(recall): three CPU cuts on the recall path (audit serialization, phase sampling, on-loop query embedding) by @nicoloboschi in #4314
- fix(coding-agents): record why an automatic reflect failed by @nicoloboschi in #4316
- fix(api): declare binary download bodies so generated clients return bytes by @nicoloboschi in #4315
- refactor: replace httpx and sync HTTP with aiohttp across production code by @nicoloboschi in #4318
- test(system): the remaining epic stories, and two bugs they found by @nicoloboschi in #4293
- fix(coding-agents): admit one codebase survey per bank, held by a heartbeat lease by @nicoloboschi in #4303
- fix(reflect): grounding defects in reflect and knowledge-page delta refresh, plus system-evals by @nicoloboschi in #4304
- feat(coding-agents): warn when the old Claude Code plugin is still installed by @nicoloboschi in #4320
- feat(api): attachments on recall and read surfaces for store-owned banks by @nicoloboschi in #4321
- feat(coding-agents): fall back to page search, then observation recall, when session reflect fails by @nicoloboschi in #4324
- feat(coding-agents): record Hindsight tool usage and move logs to ~/.hindsight/coding-agents-logs by @nicoloboschi in #4325
- chore(deps): update vitest and esbuild in the paperclip integration by @cdbartholomew in #4300
- chore(deps): update vitest in the openclaw integration by @cdbartholomew in #4301
- chore(deps): update adm-zip in the zapier integration by @cdbartholomew in #4322
- chore(deps): update js-yaml and vitest in the nemoclaw integration by @cdbartholomew in #4265
- feat(metrics): /metrics covers every worker (labelled api_worker), and event-loop lag as a histogram by @nicoloboschi in #4319
- fix(coding-agents): keep the reflect fallback silent in the chat by @nicoloboschi in #4354
- feat(api,clients): admission control with a bounded wait, and client retry by @nicoloboschi in #4253
- feat(llm): per-member timeout and retry budget in a multi-LLM chain by @cdbartholomew in #4336
- chore(embed): re-sync the bundled env.example with the repo-root template by @nicoloboschi in #4355
- fix(migrations): don't maintain memory_units or mental_models indexes under a custom memories store by @nicoloboschi in #4326
- fix(profiling): arm the profiler in the workers, not only the supervisor by @nicoloboschi in #4254
- chore(db): drop the unused memory_units_bm25 materialized view by @nicoloboschi in #4357
- docs: changelog and blog post for v0.10.0 by @nicoloboschi in #4245
- fix(docs): link the models page to configuration relatively, not via /docs/ by @nicoloboschi in #4361
New Contributors
- @mameikagou made their first contribution in #3802
- @romanbsd made their first contribution in #3508
- @icculp made their first contribution in #3090
- @BrianHotopp made their first contribution in #3720
- @MasterST1337 made their first contribution in #3797
- @Adrastopoulos made their first contribution in #3801
- @aWN4Y25pa2EK made their first contribution in #3847
- @BrianMcBrayer made their first contribution in #3730
- @shauneccles made their first contribution in #3874
- @Sword-Saint69 made their first contribution in #3835
- @2anoubis made their first contribution in #3909
- @nickanderson made their first contribution in #3845
- @dwayn made their first contribution in #3804
- @etnperlong made their first contribution in #3843
- @zlguo1996 made their first contribution in #3910
- @jervaise made their first contribution in #3859
- @rschlek made their first contribution in #3960
- @aunitt made their first contribution in #3896
- @0xble made their first contribution in #4161
- @NgoQuocViet2001 made their first contribution in #4076
- @SharkyRawr made their first contribution in #4078
- @leilei3167 made their first contribution in #4148
- @mrwogu made their first contribution in #4011
- @kyletser made their first contribution in #4203
- @rafaelkallis made their first contribution in #3675
- @gwthm-in made their first contribution in #4250
Full Changelog: v0.9.2...v0.10.0