Commit Graph

223 Commits

Author SHA1 Message Date
Nicolò Boschi 7b25993f22 docs: changelog and blog post for v0.10.0 (#4245)
* docs: changelog and blog post for v0.10.0

* fix(changelog): batch a release's commits and summarize them in parallel

The 0.10.0 range summarized to 37 entries, against 65 for the 145-commit release
before it: whole user-facing fixes were unlisted.

Measured on that range, holding model and prompt fixed, one call over the whole
release produces 120 entries against 152 for five batches — 40 commits get an
entry only when batched, against 8 only when not. The input was never the
constraint: a 245-commit release is ~8500 tokens of commit subjects in total, so
every arrangement fits the context window many times over. What batching bounds
is how many commits the model weighs at once before it starts summarizing them
away.

* Commits are batched by token count and the batches summarized concurrently,
  followed by a dedup pass that merges the same change described twice across a
  batch boundary. The dedup result is re-ordered by the release's own commit
  order and filtered to commit_ids that were in the input, so a dropped or
  invented id cannot reorder the changelog or point a reader at a commit that
  isn't there.

* max_completion_tokens=16000 was a *shared* budget on a reasoning model —
  reasoning bills against it, so a long commit list spends most of it before the
  first entry is emitted. Worth 8 entries on its own (37 -> 45). Raised to 100000.

* The grouping rule read as licence to merge unrelated fixes that touch the same
  area, and "focus on user-facing changes" as licence to drop anything whose
  commit title sounds internal. Both are now scoped; this was the largest single
  effect (45 -> 126).

Default model is now gpt-5.6-terra.
2026-09-14 12:30:53 +02:00
Nicolò Boschi 1f513a6393 feat(coding-agents): add ZCode as a supported harness (#4240) (#4258)
feat(coding-agents): add ZCode as a supported harness (#4240)

Adds ZCode (Z.ai's GLM coding agent) to the shared coding-agents package, so its
users get the same knowledge-page, reflect and configuration experience as every
other supported agent instead of the standalone hindsight-zcode integration.

Three hook registrations, a stdio MCP server and the companion skill, all in
ZCode's own CLI config and home (~/.zcode) — never the user's real Claude Code
settings, even though ZCode embeds the Claude Code agent runtime and speaks its
hook protocol. Config hooks ship disabled, so the installer flips hooks.enabled;
uninstall removes the block again when nothing else is registered there.

The one genuinely new mechanism is a per-session TURN JOURNAL (core/turn-journal.ts).
Every other hook harness hands its Stop hook a file holding the whole conversation,
which is what the incremental write-back needs: retainLiveSession re-reads the full
transcript and the retain cursor sends only the turns added since the last write.
ZCode has no such file — Stop carries the reply plus a temp, assistant-only
transcript it deletes as the hook returns, and no user prompt at all. So the plugin
keeps the conversation itself: the prompt hook appends the user turn, the Stop hook
appends the reply, and retain then reads it exactly as any host transcript. Nothing
downstream changes.

Two host quirks worth knowing, both verified against the runtime rather than assumed:

- hook budgets are `timeoutMs` MILLISECONDS (30000/30000/60000), like qwen-code and
  unlike everything else; the declared timeoutUnit makes that checkable.
- registrations use ZCode's "process" argv shape, not a command string — it spawns
  hooks without a shell, so `node "…/zcode-hook.js"` would be looked up verbatim as
  one executable name and never run.

`--import-conversations` is deliberately unsupported and says why: ZCode persists no
session transcripts, so there is no history on disk to backfill from.

Verified against real ZCode 0.16.5: all three hooks fire with correct bank
derivation, the journal captures the user/assistant pair, `zcode skills list` finds
the companion skill, and all 8 hindsight MCP tools reach the model. A Docker E2E
(e2e/Dockerfile.zcode) asserts injection AND retention end to end against the
published tarball — fuller than grok-build, factory-droid and qwen-code, which are
retention-only. Its entry script merges the stub provider into the config rather
than rendering it, because that file is the same one the installer owns.

Guard tests, since the sibling that forgets is the one nobody tests: a family-wide
check that journalPrompt and retain.journal are declared together, and that a journal
harness parses neither a host transcript path nor a Stop-event reply — both would be
applied on top of the journal, and ZCode's own payload carries last_assistant_message.
2026-09-09 14:50:26 +02:00
Wojciech Guziak 254bc988d4 feat(coding-agents): add Factory Droid harness (#4011)
Adds Factory Droid as a supported harness: three hook entry points on Droid's
Claude-shaped protocol, a transcript reader for its JSONL sessions, installer
wiring for ~/.factory (hooks.json, mcp.json, skills/), and the control-plane logo.

Also lands, on top of the original contribution:

- One harness roster for the docs site. The gallery card and the sidebar preview
  kept separate hand-maintained lists and both had drifted — dcode, opencode2, pi
  and prime-agent were each missing from one of them. Both now derive from
  src/lib/coding-agent-harnesses.ts, bound by a test to the registry that decides
  what `install <harness>` accepts, so a new harness cannot ship without its logo
  or its README entry.

- A Docker E2E for the harness. Droid needs no Factory account for it: with a BYOK
  customModels entry it runs fully offline against the stub model.

- A fix to the E2E runner, which drove the container with spawnSync and so starved
  the stub model living in the same process. That silently broke dcode, qwen-code
  and dsh; qwen-code's E2E passes again with it.

Verified end to end against a real Droid session (recall injected, session
retained) and with full CI on ci/4011-factory-droid: 109/109 jobs green.
2026-09-07 15:56:31 +02:00
Ben 82729887a0 blog: Enterprise Features in Hindsight Cloud (#4004)
* blog: Enterprise Features in Hindsight Cloud

An overview of the enterprise capabilities Hindsight Cloud offers, with
each entry stating the failure it prevents rather than only what it does:

- Single sign-on over OIDC or SAML, with domain verification, provisioning
  on first sign-in, and no password fallback once a domain is routed.
- Organization-wide MFA enforcement across TOTP, WebAuthn, SMS and email,
  gated on the session having cleared a factor rather than merely having
  one enrolled.
- Idle session timeout.
- Owner, Admin and Member roles.
- API key expiry and per-bank scoping, plus scoped child keys as the
  isolation primitive for multi-tenant applications.
- Audit logging, opt-in per bank.
- Memory Defense on the retain path, and the Enterprise detector set.
- Bring your own cloud, with PrivateLink on AWS.

Describes capabilities only. No compliance or certification claims, no
regional hosting claims, and no implementation detail or internal
identifiers.

Cover is w03 (aperture): layers closing around a memory graph.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: apply review feedback on enterprise features

Four corrections from review:

- MFA factors were wrong. The post listed authenticator apps, WebAuthn
  passkeys, SMS and email. Cloud offers two: an authenticator app (TOTP)
  and an emailed one-time code. The four-factor list was the underlying
  identity provider's capability, not what Cloud exposes.
- Idle session timeout is now enabled for every organization, so it moves
  from Enterprise to all plans.
- Webhooks were missing entirely. Added as an Enterprise section: events
  on completed retains and consolidations, HMAC-signed payloads,
  asynchronous delivery with retries and per-delivery history, and Memory
  Defense violation alerts that can be routed to a SIEM.
- On-premise deployment was missing. Added alongside bring-your-own-cloud,
  for the case where data cannot leave your own hardware rather than just
  your own cloud account.

The at-a-glance table, description, and FAQ are updated to match.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: describe private connectivity as provider-neutral

The previous wording put the infrastructure template and private
connectivity behind "on AWS that includes...", which reads as though those
are AWS-only capabilities. They are not tied to one provider.

Both are now described as part of the bring-your-own-cloud deployment
generally: the deployment ships the templates you apply in your own
account, and traffic uses whichever private-endpoint mechanism your
provider offers. The FAQ answer is updated the same way.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: drop the infrastructure-template paragraph from bring your own cloud

Leaves the section on the two claims that matter: the deployment goes into
your own cloud account, and private connectivity keeps traffic off the
public internet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: date the enterprise features post 2026-09-03

The post was drafted on 09-01 and changed substantially after that across
four rounds of review: MFA factors corrected, idle session timeout moved to
all plans, webhooks added, on-premise added, and private connectivity
described as provider-neutral. Dating it to publish day rather than draft
day, before it goes live rather than after.

Filename, frontmatter date and slug move together. The 09-01 cross-link to
the June-August roundup is unchanged and correct.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 16:30:36 -04:00
Ben f5f61fb48c blog: Four More Coding Agents That Remember Your Project (#4042)
* blog: Four New Coding Agents, and Four Ways to Fail Silently

Covers coding-agents 0.5.0, which adds pi, Qwen Code, DeepAgents Dcode and
opencode 2, bringing the package to 16 harnesses.

The angle is that three of the four integrations, wired the obvious way,
failed without producing an error:

- opencode 2 rewrote the plugin contract, and handing either host the
  other's export loads a plugin that registers nothing and reports no
  error. Both CLIs also read the same config file, which v1 rejects
  outright if it contains v2's plugins key.
- Qwen Code speaks Claude Code's hook protocol field for field, but its
  timeouts are milliseconds, so the usual values register 30ms hooks. It
  looks fine in testing because orphaned processes still finish.
- Dcode's last_assistant_message is a Python repr, so encrypted reasoning
  payload was retained as the assistant turn and re-appended every turn.
- pi and Prime Agent shared one package.json key, so the host it did not
  name loaded the other's bundle under the wrong harness.

Screenshots are the install output and the three new hosts at startup.
Captions describe what each frame actually shows and do not claim to show
memory injection, which these captures do not.

Cover is c03: the four harness marks converging on one memory core.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: reframe around the agents, not the integration work

The first draft read as a bug-fix changelog: four sections, each about a
trap we hit wiring a host. That is inward-facing, and it buries what a
reader actually wants to know.

Rewritten around three things:

- How a coding agent works, and what it loses on every session reset. The
  mechanical part is rederivable from the code; the last mile is a
  decision that was never in the code at all.
- What memory adds to that loop: cold seed at session start, recall per
  prompt, native tools during, write-back at the end.
- Sixteen agents sharing one bank per repository, so switching agents
  costs nothing. This is the strongest point in the release and the first
  draft did not make it at all.

Each new agent now gets described for what it is rather than for how it
broke. Qwen Code's QWEN.md convention and Dcode's headless mode are used
to make the memory argument concrete, which also gives the screenshots
something to support.

The integration difficulties are kept as one short closing aside with a
single example, rather than the spine of the post.

Title changed to match. Adds a comparison table for the four agents.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 14:54:39 -04:00
Ben e393c4ceb2 blog: What's New in Hindsight Cloud — June-August Updates (#3951)
* blog: What's New in Hindsight Cloud — June-August Updates

Resumes the "What's New in Hindsight Cloud" series, which last ran on
2026-05-19. Covers thirteen releases (v0.7.0 through v0.9.2): the
client-managed knowledge base, cron-scheduled mental model refreshes,
per-bank recall pipeline controls, the refreshed design system,
Constellation, and bank-to-bank transfers.

Every feature was verified to be an ancestor of the v0.9.2 tag, and each
capability was checked against what Hindsight Cloud actually offers today,
so the post describes only what a Cloud customer can use. Where a capability
is available through the API rather than the console, the post says so.

Cover is r02 (cream editorial).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: title the cover "What's New in Hindsight Cloud"

Matches the post title and the series name, rather than referring to the
console generically.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: apply review feedback and re-verify every claim

Review feedback:
- Drop reversible curation. It is not in the console.
- Cloud offers document export, not import. Rewrote the transfer section
  as export only and said so explicitly.
- Drop recall pipeline controls.
- Fact-check the rest for both API and console exposure.

The audit found two more claims that are not in the console and removed
them: the API version in the sidebar, and refresh operations recording
what they changed.

Re-verified as present and kept: knowledge base tree, page editor,
page-level search, refresh triggers and staleness badges; the mental model
refresh-trigger selector, cron schedule preview and next-refresh display;
Constellation animation, inline detail and fullscreen; document tag
filtering, entity timelines and in-flight retain badges; background
document export with the optional-observations toggle; operation progress;
observation scopes; and per-bank audit log. Dry-run refresh and dry-run
extraction are labelled as API-side because that is where they exist.

Cover updated to match the revised feature list. Three cross-links added
and verified.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: add the enterprise features shipped in this window

Adds four sections covering enterprise work that landed since the last
roundup:

- Single sign-on and MFA: bring-your-own IdP over OIDC or SAML, email
  domain claiming with DNS verification, provisioning on first sign-in,
  organization-wide MFA enforcement across TOTP/WebAuthn/SMS/email, and
  an idle session timeout for orgs with session-management obligations.
- Audit logging: a queryable trail of retain, recall and reflect, opt-in
  per bank rather than all-or-nothing.
- Memory Defense Enterprise: prompt injection guard, size anomaly,
  protected document tags, the broad pattern catalog, base64 decoding,
  and LLM screening.
- Bring your own cloud: deployment into a customer AWS, GCP or Azure
  account, with PrivateLink from the application VPC on AWS.

Described at the capability level only. Implementation details, internal
identifiers and customer names are deliberately excluded.

Cover and closing CTA updated to match.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: drop the enterprise CTA from the closing section

The "Try it" section goes back to the signup link alone, matching the
rest of the series. Enterprise gating is still stated inline where it
matters, in the SSO/MFA and audit logging sections.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: drop the bring-your-own-cloud section

BYOC is not new, so presenting it as part of this window's updates
overstates it. Removed the section along with its table-of-contents
entry and the mentions in the intro and description.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 11:27:28 -03:00
Nicolò Boschi 71a9a7008f feat(coding-agents): first-class pi support, sharing one extension adapter and installer with Prime Agent (#3993)
Adds pi (@earendil-works/pi-coding-agent) as a harness and extracts createPiExtension(harness),
the extension adapter pi and its fork Prime Agent share. Supersedes #3775.

The `pi` key is removed from package.json: both hosts read that same key, so it could only ever
name one bundle, and the host it did not name loaded the other's and reported the wrong harness.
`hindsight-coding-agents install pi|prime-agent` is now the only route for both.

Also makes the companion skill self-update for every host that installs one — the paths now live
once in core/skill-dirs.ts, which both the installer and skill-sync read.

Co-authored-by: Sebastian Otaegui <feniix@gmail.com>
2026-09-01 15:11:06 +02:00
Nicolò Boschi 1aef228f7b feat(coding-agents): add qwen-code as a hook harness (#3979)
* feat(coding-agents): add qwen-code as a hook harness

Qwen Code speaks Claude Code's hook protocol field for field -- same stdin
envelope (session_id / transcript_path / cwd / hook_event_name), same
hookSpecificOutput.additionalContext + systemMessage output, same exit
semantics, and a settings.json shape byte-for-byte what cmdHook() already
emits. So HOOK_HARNESSES["qwen-code"] is claude-code's spec with three deltas,
none of which is visible from the diff:

1. TIMEOUTS ARE MILLISECONDS. Qwen passes a command hook's `timeout` straight
   to setTimeout ("Timeout in milliseconds, default 60000" -- its own bundled
   docs/features/hooks.md). Every other harness here is seconds, so the
   installed values are 30000/30000/60000. Writing 30/60 would register 30ms
   hooks, and that misconfiguration LOOKS fine in testing: Qwen spawns without
   detached:true and kills only the direct child, so the orphaned work still
   completes. HookHarnessSpec therefore declares `timeoutUnit`, and the
   lifecycle tests normalise through it -- changing 30_000 to 30, or dropping
   the unit, now fails a test instead of shipping dead hooks. The prompt budget
   must also clear core/hook.ts's HOOK_REFLECT_CAP_MS (25_000).

2. parse reads `submitted_prompt`, not `prompt`. UserPromptSubmit also fires on
   tool-result continuations, where `prompt` holds model-bound tool output;
   keying on it would recall ~20x per user turn against tool results.
   `submitted_prompt` is attached only when the turn is both the first and a
   genuine userQuery. Accepted cost: it is the interactive TUI's projection, so
   headless (`qwen -p`), serve, SDK and ACP sessions seed and retain but never
   recall. The E2E declares injectsIntoModel: false for exactly that reason --
   a different reason from grok-build's passive hook.

3. type:"user" is NOT a user turn. `provenance` is the discriminator: across a
   22-transcript corpus, synthetic records (notification 285, cron 21,
   goal_runtime 1) outnumber real_user ones (69) by 4.4:1. transcript-qwen.ts
   gates on it, rejecting a present-but-malformed value outright rather than
   falling through to a subtype heuristic, and requiring a positive subagent
   marker (agentId/isSidechain) before accepting an absent one -- subagent
   transcripts use a third envelope with neither provenance nor subtype.

Qwen also echoes injected context back into its own transcript, wrapped in
<qwen:user-prompt-submit-context> with the inner tags HTML-escaped, so the
shared stripInjectedMemory (which matches raw tags) cannot see it. The reader
removes it using the two forms of pairing evidence Qwen's contract defines:
systemPayload.hookContext present -> use systemPayload.displayText, the host's
own pre-hook projection, with no tag matching at all; otherwise a COMPLETE
tagged context in the FINAL part after at least one other part. It deliberately
does NOT match the tag as a substring -- the contract is explicit that the tag
is "a provenance marker, not ... a general trust boundary" and that consumers
"must not infer that arbitrary tag-like user text is hook provenance", so a
prompt merely quoting the tag is preserved intact.

Also here:
- registry.test.ts gains the REVERSE parity check. The existing one is
  directional (installer -> registry), so a harness present in the registry but
  missing from INSTALLERS passes it while `install <name>` returns "unknown
  harness". That is exactly how this change was briefly broken.
- readQwenTranscript catches lazy-read faults. readJsonlTail guards
  statSync/openSync, but the generator reads at iteration, and runRetainHook
  calls the reader outside buildRetain's catch -- so a directory passed as
  transcript_path (which passes both guards, then throws EISDIR on the first
  readSync) rejected the whole Stop hook. NOTE: the underlying gap is in the
  shared jsonl.ts and affects every harness; it deserves its own fix rather
  than riding along here.
- Logo asset from homarr-labs/dashboard-icons (Apache-2.0, svg/qwen.svg).

Tests: 675 pass. Note HINDSIGHT_BANK_ID must be unset in the environment, or
config.test.ts's "missing files yield defaults" fails on the leaked value.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WkVVSuv7j1FwTtVpkzzmWR

* chore(coding-agents): regenerate docs artifacts and apply prettier

Address the two CI-blocking review items on #3769:

- Regenerate the two artifacts derived from the README's new Qwen Code
  section: hindsight-docs/docs-integrations/coding-agents.md (via
  sync-coding-agents-doc.mjs) and the docs-skill copy (via
  generate-docs-skill.sh).
- Run prettier over the package with 3.7.4 -- the version CI's root
  `npm ci` pins -- covering the four files the review names, plus
  package.json, where it restores the literal ellipsis in `description`
  that the branch had accidentally left as a unicode escape sequence.

Verified: sync-coding-agents-doc.mjs --check, build-skill.mjs --check,
and prettier --check all pass; 675 tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qx1ByUMo3SJhXP7MBxEQ1g

* fix(coding-agents): close the qwen-code harness parity gaps

Rebased onto main (the branch was 98 commits behind and conflicted with the
dcode harness) and closed the sites a new hook harness must also appear in,
found by sweeping every place an existing harness is registered:

- `SKILL_DIRS` (core/skill-sync.ts) did not map qwen-code, so the skill the
  installer copies into ~/.qwen/skills would have been installed once and then
  never refreshed by `npm update -g`. Verified ~/.qwen/skills is Qwen's real
  user-level skills root (Storage.getUserSkillsDirs, SKILL_PROVIDER_CONFIG_DIRS
  = [".qwen", ".agents"]). Added a family-wide guard asserting SKILL_DIRS covers
  every `installSkill` call site, with the five pre-existing gaps (copilot-cli,
  grok-build, cline-cli, dsh, prime-agent) listed explicitly so a new harness
  cannot silently join them.
- The docs site had no qwen-code icon, so the README's own logo would 404, and
  the harness was absent from both coding-agent logo rosters.
- package-lock.json did not carry the three new bins.

Two comments asserted things that are not true of qwen-code 0.22.3 and are
corrected against its source: the hook runner spawns `detached` and calls
`terminateHookProcessTree` on timeout, so a milliseconds/seconds mix-up loses
the retain outright rather than orphaning it; and headless `qwen -p` DOES carry
`submitted_prompt` — the E2E is retention-only because the stub model echoes
only the first 20 000 characters of the request, which Qwen's system prompt
alone exceeds.

Verified end to end against a local API: installed the published tarball into a
container, ran `qwen -p`, and confirmed session_start / reflect_ok / pages_ok /
retain_ok, a document tagged `harness:qwen-code`, and zero injected-memory
leakage in the retained text.

Claude-Session: https://claude.ai/code/session_01DNWFQn8AUN6SApcswHG3aN

---------

Co-authored-by: Mallory M <mallorymiller1984@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-01 11:16:02 +02:00
Nicolò Boschi 4388e0f95b feat(coding-agents): add native DeepAgents Dcode integration (#3887)
Registers `dcode` (LangChain's deepagents-code) as a native Agent Plugin: root `plugin.json`
contributing the shared skill, the Hooks V2 SessionStart/UserPromptSubmit/Stop lifecycle, and the
`hindsight_*` MCP server, installed through Dcode's own marketplace/plugin manager.

Includes fixes found by running it against deepagents-code 0.1.65:

- Decode `last_assistant_message`. Dcode's transcript lags the Stop event, so that field is
  load-bearing, but it is computed as `str(content)` — a Python repr whenever the provider returns
  content blocks. It was retaining ~1.8KB of encrypted reasoning payload as the assistant turn, and
  never comparing equal to the transcript's clean text, so an already-flushed reply was appended
  again every turn. Guarded family-wide: any harness surfacing the field must declare a decoder.
- Annotate the six read-only MCP tools with `readOnlyHint`. Dcode rejects unannotated MCP calls in
  headless mode, which made recall and the knowledge-page tools unusable under `dcode -n`.
- Parity: local history import (attributed via `dcode threads list --json`, since the transcripts
  carry no cwd), a Docker E2E adapter and image, the harness icon on the docs site as well as the
  control plane, and a clean uninstall that also retires the marketplace it registered.
- Document that Dcode cannot host the codebase survey: `hindsight_ingest_document` writes, so its
  headless runtime gates it by design; it falls back to another agent's CLI like eight other
  harnesses.

Supersedes #3887.

Co-authored-by: Paritoshdagar <paritoshdagar@gmail.com>

Claude-Session: https://claude.ai/code/session_01DNWFQn8AUN6SApcswHG3aN
2026-09-01 10:13:24 +02:00
Ben 56e8962fe9 blog: Cross-Encoder Reranking — The Last Stage of Agent Memory Recall (#3868)
* blog: Cross-Encoder Reranking — The Last Stage of Agent Memory Recall

Deep dive on the reranking stage: cross-encoder vs bi-encoder, conditional
score normalization, the multiplicative recency/temporal/proof-count boosts,
the RRF-passthrough seeding fix, the candidate budget, and the reranker
failover chain.

All claims verified against the v0.9.2 tree, so nothing here documents an
unreleased setting.

Cover image is a placeholder pending final art.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

* blog: final cover for the cross-encoder reranking post

Replaces the placeholder with c01 (navy funnel): 300 fused candidates
narrowing to a reranked shortlist.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AE4NCnCKXUzNDF3N9FaQja

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 14:28:51 -04:00
Ben 944e793591 blog: How We Made Retain's Peak Memory Flat, from 4 MB to 90 MB Documents (#3839)
* blog: How We Made Retain's Peak Memory Flat, from 4 MB to 90 MB Documents

* blog: use isometric before/after cover with v0.9.2 badge

* blog: emphasize v0.9.2 on the isometric retain cover

* blog: drop redundant v0.9.2 badge from retain cover
2026-08-27 11:16:32 -04:00
Ben dc1664d0c7 blog: Your Agent Can Now Manage Its Own Knowledge Base Over MCP (#3822)
* blog: Your Agent Can Now Manage Its Own Knowledge Base Over MCP

* blog: use teal-indigo gradient cover matching the Knowledge Pages series

* blog: use the versioned knowledge-page graphic on the gradient cover
2026-08-26 15:09:12 -04:00
Nicolò Boschi cea8caba66 docs: changelog and blog post for v0.9.2 (#3765)
* docs: changelog and blog post for v0.9.2

* docs: rework the 0.9.2 blog post and flag the last_refreshed_at break

- drop the 'largest reliability release' framing and the movie-style section
  titles; plain, specific headings for a point release
- Recall: name the actual field and shape, one bullet per change
- replace the correctness section with Mental Models, covering the delta
  markdown corruption, retracted-fact unsay, the last_refreshed_at semantics,
  refresh pacing/dedupe and the new refresh outcome
- retitle 'Built for Many Banks' -> 'Running Many Banks'
- add 'Retain on Large Documents' for #3763
- promote last_refreshed_at to Breaking Changes in the changelog, where its
  commit already labelled it

* docs: keep last_refreshed_at a bug fix, not a breaking change

* docs: concrete opener and specific section titles for the 0.9.2 post

- open on the actual defects (welded table, 6000 refreshes/day) instead of
  framing the release as four things the engine decided by itself
- every section title now names what changed rather than the area it touched
- drop the 15-of-16-constructs statistic from the markdown-corruption bullet

* docs: lead the 0.9.2 post with features, not bug fixes

Rebuild the post around what 0.9.2 adds: knowledge-base MCP tools, the
caller-supplied recall window, the mental-model refresh floor and typed refresh
outcome, the Copilot provider and asymmetric embedding prefixes, and the two new
operator ceilings (retain memory budget, vector-index row threshold).

The mental-model corruption, retracted-fact and last_refreshed_at narratives are
gone; fixes now collapse into one closing line pointing at the changelog, which
carries all 44 of them.

* docs: regenerate the 0.9.2 changelog on the rebased main

Picks up #3763, #3764, #3770 and #3783, which landed after the first run.
Re-adds eight entries the summarizer dropped again: the Copilot provider and
knowledge-base MCP tools (both headlined in the blog post), bank-list
pagination, worker tracing, last_refreshed_at, the maintenance DDL deadlock,
Vertex AI multi-region, and the Windows daemon windows.

Also notes the sub-batch split streaming in the retain section of the post.

* docs: add the 0.9.2 release infographic to the blog post

* docs: sync the skill openapi.json to 0.9.2

release.sh regenerates the docs skill before bumping the OpenAPI version, so
the skill's copy lags the release commit by one version.
2026-08-25 12:35:50 +02:00
Ben 21fbb9f935 blog: Knowledge Graphs vs. Vector Search for Agent Memory (#3766)
* blog: Knowledge Graphs vs. Vector Search for Agent Memory

* blog: use teal split-panel cover for KG-vs-vector post

* blog: address BM25 objection (exact match is keyword's job, not the graph's)
2026-08-24 15:07:52 -04:00
Ben 94017ede34 docs: use the elizaOS brand mark for the integration icon (#3707) 2026-08-21 13:05:38 -04:00
Ben a9287a03a4 blog: Give Your elizaOS Agent a Long-Term Memory (#3705)
* blog: Give Your elizaOS Agent a Long-Term Memory

* blog: use slate co-brand cover for elizaOS post
2026-08-21 13:05:33 -04:00
Ben 1f98da79da blog: Introducing Hindsight Academy — learn agent memory by doing (#3682)
* blog: Introducing Hindsight Academy — learn agent memory by doing

* blog: use badge cover for Hindsight Academy
2026-08-20 14:13:21 -04:00
Ben a544b1965e blog: Give Every Hermes Bot Its Own Memory (Bot Mode + Hindsight) (#3648) 2026-08-19 13:11:49 -04:00
Ben b46f9694f6 blog: 20,000 Stars — How Hindsight Got Here, Version by Version (#3503)
* blog: Hindsight Hits 20,000 Stars — by the numbers

* blog(20k): rework into a version-by-version release timeline (feedback)

* blog(20k): add at-a-glance timeline table

* blog(20k): expand every era with real feature depth + scale (reviewer feedback)

* blog(20k): new cover — rising star-curve (v1c)
2026-08-17 11:20:27 -04:00
Ben a6c2d90eec blog: Give DeepSeek Harness a Memory of Your Codebase (#3507)
* blog: Give DeepSeek Harness a Memory of Your Codebase

* blog(deepseek-harness): swap cover for editorial diff-panel design

Replaces the plain gradient lockup with the editorial template used across
recent covers: DeepSeek whale x Hindsight lockup, a bold headline
("One command. DeepSeek Harness never forgets your repo."), and a
project-memory diff panel showing the repo conventions the integration
retains (uses pgm not npm, Conventional Commits, tie-break rule).
2026-08-14 15:44:14 -04:00
Nicolò Boschi 28760f62d4 feat(coding-agents): DeepSeek Harness (dsh) support (#3504)
Adds `dsh` as a persistent-plugin harness: a native Cordis plugin that binds
DeepSeek Harness's typed lifecycle events to the shared RuntimeCore.

  agent/session-start  -> seedIfCold      (cold check + background seed)
  agent/pre-step       -> onPrompt        (recall) + the injection as a
                          `{kind:'plugin', form:'recall'}` message
  agent/turn-stopping  -> onSessionIdle   (write-back of the completed exchange)
  ctx.tools            -> the hindsight_* suite, registered natively

Its Claude Code / Codex hook bridges are deliberately not used: neither ships in
a default profile, so a bridge would cost the same install while losing the
session id, the transcript and the awaited stop boundary.

dsh is the first host where ONE process serves SEVERAL repositories — its Web UI
opens each session in whatever directory the user picks — so the bank, client and
seed are resolved per session workspace and the core is constructed with that
workspace root, which is what binds the tools' git checks to the right repo.

The plugin imports nothing from dsh: host shapes are structurally typed and tool
definitions are built in the registry's own shape, so there is no dsh package for
pnpm to resolve inside a profile and no version to keep in step.

Also here:
- backfill reads dsh session logs. They are a CONCATENATION of zstd frames, and
  both of Node's decoders stop after the first one — a plain decompress returns
  only the header line — so core/zstd-frames.ts walks the frame structure and
  decodes each frame (RFC 8878 §3.1).
- transcript normalization keeps only `source.kind === 'user'` messages: dsh
  delivers plugin context (its runtime snapshots, the skill catalog, our own
  recalled memory) as user-role messages on the same surface.
- describeError: Node's fetch reports every transport failure as the bare string
  "fetch failed" and hides the reason on `cause`, which made an unreachable
  apiUrl an investigation instead of a log line.
- vitest pins HINDSIGHT_CONFIG at a path with no file; loadConfig otherwise
  resolved the developer's real ~/.hindsight/coding-agent.json, so a machine with
  a token configured failed assertions a clean machine passed.

Verified against @deepseek-ai/dsh 0.1.0-rc.6: recall reaches the model, all 8
tools reach the model and dispatch, sessions are retained, and the Docker E2E
(e2e/Dockerfile.dsh, driven through the stub model like the other credential-less
harnesses) runs the whole lifecycle in a container.
2026-08-14 17:56:57 +02:00
Nicolò Boschi 3c24979a40 docs: changelog and blog post for v0.9.1 (#3438)
* fix(changelog-gen): exclude integration/plugin commits and MDX-escape summaries

Two fixes to the core changelog generator:
- Drop any commit that touches hindsight-integrations/ (not just commits that
  touch *only* that path), so integration/plugin PRs that also touch shared
  docs/CI/scripts stop leaking into the core changelog. Guard the core-changelog
  LLM prompt with an explicit skip rule too (not applied to an integration's own
  changelog).
- Escape < and > in summary prose so an HTML/JSX-like token (e.g. <think>) is
  rendered as text instead of failing MDX compilation of the changelog page.

* docs: changelog and blog post for v0.9.1
2026-08-14 11:20:35 +02:00
Ben 7edfd6f1d7 blog: Claude Code Now Builds and Reads Its Own Knowledge Base (#3464)
* blog: Knowledge Pages — a self-healing wiki for your Hermes agent

* blog(knowledge-pages): use g05d lockup cover (Hermes x white Hindsight mark)

* blog(knowledge-pages): feature tour with real Control Plane screenshots + Hermes value framing

* blog(knowledge-pages): retitle to 'Turn Your Hermes Agent's Memory Into a Living Knowledge Base'

* blog: pivot to Coding Agents — 'Claude Code Now Builds and Reads Its Own Knowledge Base'
2026-08-13 14:53:47 -04:00
Ben f36a462d1d feat(eliza): add Hindsight long-term memory integration for elizaOS (#2385)
Adds @vectorize-io/hindsight-eliza, an elizaOS plugin that gives agents
long-term memory backed by Hindsight:

- HINDSIGHT_MEMORY provider recalls relevant memories into the prompt
  before each model call.
- HINDSIGHT_RETAIN evaluator retains conversation messages after each
  turn (fire-and-forget; agent replies optional).
- Bank defaults to the message entityId for per-user isolation; both
  sides fail safe so a Hindsight outage never blocks the agent.

Targets @elizaos/core ^1.7.2 (current npm latest, not the 2.x beta on
main). Includes tests, CI job, release-script + changelog-generator
entries, and docs gallery entry + page.
2026-08-13 11:11:24 -04:00
Ben bad06de5ad blog: Give Any Agent Plugins Client Long-Term Memory (#3440)
* blog: Give Any Agent Plugins Client Long-Term Memory
2026-08-12 14:25:14 -04:00
Ben 29cd6c6ab0 feat(coding-agents): add Prime Agent as a supported harness (#3240)
* feat(coding-agents): add Prime Agent as a supported harness

Adds Prime Agent (PrimeIntellect) as a plugin harness in
@vectorize-io/hindsight-coding-agents, giving it the shared reflect-and-inject
core (auto-seed, knowledge pages, attribution, per-repo bank naming) like
opencode/cline. A Prime Agent extension entry (src/prime-agent.ts) wires
before_agent_start -> recall + system-prompt injection and agent_end ->
transcript write-back onto RuntimeCore, and registers the hindsight_* knowledge
tools natively via pi.registerTool (Zod raw shape -> JSON Schema; Prime Agent
forwards it to the model provider). Installer registers the built extension in
~/.prime/agent/settings.json; registry lists it for backfill. Includes a
transcript normalizer, unit tests for the hooks/tool adapter/converter/installer,
a README entry, and the synced docs page.

Supersedes the standalone @vectorize-io/hindsight-prime-agent package.

* fix(coding-agents): register Prime Agent in the control plane, wire its E2E, pass the workspace

Follow-ups from review, on top of a rebase onto main (the branch was 66 commits
behind and predates the append write-back, bounded transcript reads, the retain
stamp and both 0.2.x releases).

Control-plane registry. CLAUDE.md requires a new harness to land its logo entry
in the same change, and this one didn't: documents retained by Prime Agent carry
metadata.harness = "prime-agent" and a harness:prime-agent tag, which the
documents list resolves a logo from, so every one of them rendered as bare
metadata. Verified against a real local run before fixing. Neither guardrail
catches this — the parity test's EMITTED_HARNESSES is a hand-maintained list, and
it lives in the control plane, so `detect-changes` never runs it for a
coding-agents-only PR. Added to the registry, the icon copied into
public/img/harness, and the id added to that list so it is covered from now on.
The mark is dark line art, so invertOnDark like the other monochrome ones.

E2E. Every other harness has a Docker E2E entry; this one had none. Added
Dockerfile.prime-agent and a setup entry, so it joins the roster that installs
the CLI, seeds a bank with a decision the prompt never mentions, and requires the
agent to carry it back out. It skips cleanly without credentials, like the rest.
Prime Agent ships no npm package — the upstream repo is a private monorepo — so
the image uses the vendor installer and puts ~/.local/bin on PATH.

createRuntime passed four arguments to RuntimeCore, dropping the workspace
directory added in #3346. Harmless today because repoPath is process.cwd(), but
{gitProject} and {project} in retainTags/retainMetadata would silently resolve
against the wrong directory the moment those diverge; plugin-entry and cline both
pass it explicitly.

Regenerated the docs skill mirror, which verify-generated-files was failing on.

---------

Co-authored-by: Nicolò Boschi <boschi1997@gmail.com>
2026-08-12 07:03:48 +02:00
Ben 5781d28d8f blog: Best Open-Source Agent Memory Systems (Self-Hosted, 2026) (#3192)
* blog: Best Open-Source Agent Memory Systems (Self-Hosted, 2026)

A fair, benchmark-grounded comparison of the self-hostable open-source agent
memory systems (Hindsight, Mem0, Graphiti/Zep, Letta, Cognee): comparison
table, per-system profiles, "what self-hosted really costs", FAQ, and a
"when to pick each" guide. Every stat/claim verified against live sources
(GitHub stars, licenses, Zep CE deprecation, benchmarks). Swiss-type cover.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* blog(oss-memory): refresh GitHub star counts to current

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-11 13:53:52 -04:00
Ben 6cb39aef8f blog: guest post — writenode, continuity over retrieval (Josh Groves) (#3243)
* blog: guest post — writenode, continuity over retrieval (by Josh Groves)

Community guest post by Josh Groves (@Xp3rtMag1c1an), maker of writenode, on
building an AI note-taking Chrome extension on Hindsight: per-user memory
banks, a mode classifier, Node Gravity, and the SOURCE NODE chat. Adds the
post, four product screenshots, a co-brand cover, and an authors.yml entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* blog(writenode): add benfrank241 as co-author

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* blog(writenode): update date to 2026-08-10

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-10 10:07:08 -04:00
Nicolò Boschi eb47374fa3 docs: changelog and blog posts for v0.9.0 (#3189)
* docs: draft blog posts for v0.9.0 (release + coding-agents)

* docs: 0.9.0 changelog + consolidate coding-agents launch post

* docs: update launch post to the shipped coding-agents harness list

* docs(blog): add per-agent wall time to the 0.9.0 benchmark table

The table reported corrections and cost but not how long a task took, which is
the number a reader feels. Computed from the same runs as the other columns —
outputs/sdebench/{hindsight,vanilla}-{claude,codex,opencode}-{1,2,3} on the
benchmark repo's main, meta.wall_s averaged per task across the three runs of
each arm:

  Claude Code   84.7s -> 75.1s  (-11%)
  opencode     174.2s -> 163.3s (-6%)
  Codex CLI     53.6s -> 48.6s  (-9%)

Verified against the published columns before trusting the source: the same
files reproduce corrections 0.85/0.36, 1.20/0.80, 1.34/0.47 and costs -24%,
-13%, -52% exactly.

The prose claim is deliberately the weaker one — every memory run beat its
agent's vanilla AVERAGE, which holds for all nine. 'Faster than every vanilla
run' does not: opencode's slowest memory run (171s) is slower than its fastest
vanilla run (163s), and Codex ties at 51s.

* docs: regen 0.9.0 changelog and expand release blog for new features

* docs: refresh 0.9.0 changelog (99 commits)

* docs: date the 0.9.0 posts (launch 08-06, release 08-07) and unset draft

* docs(blog): embed 0.9.0 launch video, add coding-agent logos cover, cross-link posts

* docs(blog): drop cover image from the 0.9.0 release post (keep it on the launch post)

* docs(blog): fix coding-agents install to npx, link the Coding Agents docs page

* docs: regenerate 0.9.0 changelog against the release tag; sync docs-skill mirror
2026-08-07 18:23:20 +02:00
Nicolò Boschi fecacc4ea8 docs: launch Coding Agents + mark the per-agent plugins superseded (#3162)
* docs: launch the Coding Agents page and mark the per-agent plugins superseded

Hold until the Coding Agents plugin is announced — merging this makes the page
public and tells existing users their plugin is legacy, so it should land with
the announcement rather than before it.

Two halves:

- Launch. Undoes the deliberate hide: the page drops `unlisted`, its entry
  returns to integrations.json (which drives both the gallery and the sidebar),
  and coding-agents leaves the EXCLUDED set in check-integrations.mjs, so the
  released-tag check guards it like every other integration.

- Supersede. The six overlapping integrations — claude-code, codex, opencode,
  cursor-cli, cline, copilot-cli — get an admonition in the style already used
  on the Hermes page: what replaces them, the install command for their harness,
  and a link to the migration section. Pages and packages keep working; nothing
  is deleted and no registry deprecation is published, so existing links and
  installs are unaffected.

Each notice states plainly that memory does not move — the old plugins scope a
bank per agent per project where this one uses a bank per repo — and points at
`--import-conversations` for Claude Code and Codex, the two whose transcripts
record enough to attribute a session to a repo. The other four say so instead of
implying an import exists.

* docs: group the integrations sidebars into coding agents / frameworks / apps

Both sidebars driven by integrations.json rendered one flat run of 59 entries.
Split them into three groups so a coding agent is distinguishable from an SDK.

The existing `category` field couldn't drive this on its own: its `tool` bucket
mixed CLI agents and editors with chat apps, note-taking and voice platforms.
The 19 coding agents move to a new `coding-agent` category; `framework` is
unchanged, and `tool`/`mcp` become the catch-all group.

Grouping lives in src/lib/integration-groups.ts, kept free of the @site alias and
of any JSON import so both consumers can use it — the theme swizzle (webpack) and
sidebars-integrations.ts (evaluated at config load). An unrecognised category
falls into the last group rather than disappearing from the sidebar.

* docs: regenerate the docs-skill mirror for the supersede admonitions

scripts/generate-docs-skill.sh mirrors docs-integrations/ into skills/; the
launch commit edited seven pages without re-running it, so the mirror still
described the per-agent plugins as current.

* docs: spell out the migration path for Claude Code and Codex

Both pages said memory "does not move automatically", which is now only half
true: the server endpoint IS carried over (~/.hindsight/claude-code.json and
~/.hindsight/codex.json, same keys), so nobody is silently switched to Cloud.

Each page now states what moves — the endpoint automatically, conversations via
--import-conversations — and what does not: the recall/retain settings, missions
and bank-naming options. It also says why conversations come from local
transcripts rather than the old bank: that bank defaulted to a single static
bank shared by every project, whose documents record only a session id, so
attributing them to a repo requires the local transcripts regardless.

These are the only two superseded plugins with an endpoint to carry; the other
four pages already say their history can't be imported and are unchanged.

* feat(claude-code,codex): deprecation notice in the old plugins' sessions

Folded in from #3205 so the launch lands as one change: the docs that announce
the Coding Agents plugin and the in-session notice that points existing users at
them ship together, rather than one arriving without the other.

Both plugins keep working, but they are deprecated — development has moved to
@vectorize-io/hindsight-coding-agents. A changelog entry reaches nobody who
installed a year ago, so the SessionStart hook says it, via systemMessage (the
channel Claude Code shows the USER; additionalContext would only reach the
model). Codex accepts the same hook output shape, so one design serves both.

Emitted before the existing early returns: neither the memory settings nor
whether the server is reachable changes the fact that the plugin is deprecated.

Shown every session, with `"upgradeNotice": false` as the permanent opt-out —
stated in the message itself, which is what makes that frequency acceptable.
With no rate limit there is no state file and none of its failure modes; what
remains is a config check that returns None rather than raising, because a
promotional message must never be why a session breaks.

* docs: per-harness install sections, featured hub cards, browsable sidebar

Page
- One subsection per harness with its logo and a copyable install command,
  replacing the table: the command is what a reader came for, and a table cell
  is not copyable.
- Title is just "Coding Agents"; the old keyword-stuffed title read as spam in
  the sidebar and breadcrumbs.
- "Ingestion internals (no CLI)" is dropped from the docs page via the existing
  DROP_SECTIONS mechanism, staying in the README where the contributor-facing
  audience is.

Integrations Hub
- A Featured grid pins Coding Agents, Vercel AI SDK and OpenClaw above the
  rest, and only on the unfiltered view — pinned cards above non-matching
  search results would read as noise.
- The Coding Agents card draws all ten supported harness logos. "One install,
  every agent" is the whole pitch and a single icon cannot carry it.
- Logos come from the control plane's harness set, which is already keyed by the
  exact harness ids the plugin uses, so the two stay consistent by construction.

Sidebar
- Groups are open but show six entries each, with the tail behind a nested
  "Show all N". Fully expanded, 59 entries were a wall; fully collapsed hid that
  the list was worth opening.
- The umbrella Coding Agents entry leads its group instead of sorting under "C",
  since it is the entry point to every other agent in that list.

* fix(docs): point the page's harness logos at this build, not production

The README must use absolute URLs so the logos render on npm and GitHub, but the
docs page inherited them verbatim — pinning every image to hindsight.vectorize.io,
where /img/harness/* does not exist yet. Logos were broken locally and in
previews, and would only start working after a deploy.

The sync script now rewrites our own absolute asset URLs to site-relative, next
to the repo-relative-link rewrite it already does for the same reason: two
audiences needing different URLs from one source.

* docs: curate the sidebar previews, harness logos for coding agents

The coding-agent group now previews HARNESSES, not pages: ten logos that all
link to the Coding Agents page. Listing ten integration pages there presented
one plugin as ten separate integrations, which is the opposite of its pitch —
and the logos make the group recognisable at a glance. Every individual page
moves behind "Show all", which is also what keeps it associated with the
sidebar.

The other groups get hand-picked previews instead of the first six
alphabetically — the first names in a sorted list are an accident of spelling,
not a description of the group:
  Frameworks & SDKs — LangGraph/LangChain, Vercel AI SDK, Vercel Chat, Eve, CrewAI
  Apps & tools      — ChatGPT, Hermes, OpenClaw, Obsidian

Hermes, NemoClaw, OpenClaw and Paperclip move from framework to tool.

The overflow label counts what opening it actually reveals: "Show 21 more" where
some entries are already previewed above, "Show all 19" for coding agents, whose
overflow really is every page.

* docs: inline sidebar preview, full list on the integration pages

The two sidebars do different jobs, so they now show different things.

Main docs sidebar — a preview: three groups rendered INLINE and
non-collapsible, nothing behind a disclosure. Ten harness logos for coding
agents, five frameworks, four apps, then an "All integrations" link to the
gallery, which offers search and filters a sidebar cannot.

Integration pages — the full list again: flat, alphabetical, every entry. Once
you are on one of these pages you are comparing and hopping between them, so
hiding two thirds behind "Show N more" worked against the reader. Listing each
page directly is also what associates it with this sidebar.

* docs: promote the sidebar groups, separate Featured, brand the umbrella card

Sidebar: the "Integrations" placeholder is replaced BY its contents instead of
filled, so the three groups sit at the same level as the rest of the navigation.
The wrapper was two levels of nesting to say one thing, and it indented every
entry beneath it.

Hub: a divider and an "All integrations" heading separate the pinned Featured
cards from the full list, which otherwise read as one uninterrupted run.

The Coding Agents card carries the Hindsight mark rather than the GitHub logo —
it is our own package, and the GitHub icon said nothing about it.

* docs: install with npx, no global install

Every example across the README, the seven integration pages, the companion
skill and the generated docs now runs the installer with npx. Nothing here asks
anyone to keep a package installed whose only job is to wire other tools up.

The paragraph telling people to install globally — and warning that npx was
refused — is replaced by what actually happens: install copies what it needs
into ~/.hindsight/coding-agents and points each agent's wiring there, so it does
not matter where it ran from, and updating is the same command again.

Depends on #3241, which makes that staging real; until it ships in 0.0.6 the
published installer still refuses to run from an npx cache.

* docs: move the superseded pages into a Legacy section, out of the gallery

The six per-agent pages the Coding Agents plugin replaces — Claude Code, Codex,
Cursor CLI, Copilot CLI, opencode, Cline — move to a `legacy` category.

They keep their pages and their migration banners: people still run these
plugins and still arrive from old links, so removing the pages would break both.
What changes is where they are offered. The gallery is where someone comes to
CHOOSE an integration, and offering one we are actively migrating them off
points them at a dead end — so legacy entries are filtered out of it, including
the hero banner, whose hardcoded list still advertised Claude Code and now
advertises the plugin that replaced it.

In the sidebar they sit in a collapsed "Legacy" section at the end instead of
mixed in alphabetically, so the main list is only what we would recommend today.
Docusaurus expands that section automatically when you are on one of the pages.

Grouping keys off an explicit `harnessPreview` flag now: "no previewIds" used to
imply the coding-agent group, which the Legacy group would also have matched.
2026-08-07 17:00:50 +02:00
Ben 559ab9dbff blog: Per-User Memory for AI Products — Multi-Tenant Patterns (#3180)
* blog: Per-User Memory for AI Products — Multi-Tenant Patterns

A patterns guide for SaaS/AI-product builders on isolated per-user memory: the
hard-boundary vs soft-partition decision (banks vs tags), reading across
private/org/global scopes without a cross-bank query, a CI cross-tenant
leakage test, GDPR deletion, and scaling to many tenants on one store.
Editorial deep-dive cover.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* blog(per-user-multi-tenant): swap cover to dark comparison-card template

Reuse the context-window-is-not-memory template (dark, teal-accent title +
comparison cards). Positive framing: "Every user gets their own bank" with
BANKS (isolate a tenant) + TAGS (partition a bank).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-04 13:47:35 -04:00
Ben 500a9e637a blog(evaluate-agent-memory): swap cover for a more contextual design (#3117)
The previous cover read as a context-free "10 things to look for." New cover
keeps the editorial template but leads with the subject ("Evaluating / agent
memory") and moves the listicle framing into a "THE 10-POINT CHECKLIST"
eyebrow, so the topic is clear at a glance.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-31 15:23:52 -04:00
Ben 486a8c41d6 blog: How to Actually Evaluate an Agent-Memory System (#3106)
* blog: How to Actually Evaluate an Agent-Memory System

A buyer's-guide / evaluation-framework post: the write→store→manage→read
lifecycle, the dimensions that matter (retrieval beyond similarity, entity
resolution, conflict updates, freshness, test-time learning), the production
dimensions most guides skip (data ownership, PII/secret security, cost,
observability, multi-tenant scoping), how to read LongMemEval, and a
copy-paste checklist. Editorial deep-dive cover.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* blog: retitle to "The 10 Things to Look For", swap LongMemEval→BEAM

Reviewer feedback:
- Drop "(2026)" from the title (blog posts don't use a year; that's the
  /articles convention).
- Retitle to the listicle framing "The 10 Things to Look For in an
  Agent-Memory System"; number the dimensions table and checklist 1–10 so the
  count is honest and consistent.
- Reframe the benchmark section around BEAM (10M-token tier) instead of
  LongMemEval, kept loose — the takeaway is "build your own eval on your
  domain." Remove LongMemEval-specific competitor scores.
- New editorial cover ("10 things / to look for", CHECKLIST tag).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* blog: drop unverified BEAM "next-best 40.6%" comparison

The agentmemorybenchmark.ai leaderboard only lists Hindsight at the 10M tier
(64.1%, verified). The 40.6% next-best figure isn't on that leaderboard, so
state only the verifiable number and leave the fuller comparison to the
beam-sota post.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-31 14:44:40 -04:00
Nicolò Boschi 74cff93098 docs: give the documents table its own section in the 0.8.6 blog post (#3064)
* docs: cover the reworked documents table in the 0.8.6 blog post

* docs: give the documents table its own section in the 0.8.6 blog post

* docs: add the documents table screencast to the 0.8.6 blog post

* docs: replace the 0.8.6 blog GIFs with 30fps MP4 video
2026-07-30 11:50:17 +02:00
Ben cc1eaeeeba blog: Give GitHub Copilot CLI a memory of your codebase (#3055)
* blog: Give GitHub Copilot CLI a memory of your codebase

Tutorial for hindsight-copilot-cli (published, v0.1.0): persistent memory
for GitHub Copilot CLI via hooks. Recall on sessionStart, retain on
agentStop/sessionEnd, subagents seeded with baseline project memory.
Grounded in the integration source; documents the once-per-session recall
limitation honestly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* blog: co-brand Copilot cover with the official GitHub Copilot mark

Add the GitHub Copilot logo (top-left lockup + terminal title bar) so the
cover reads as a Copilot x Hindsight co-brand.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 16:01:37 -04:00
Nicolò Boschi 6268654bf6 docs: changelog and blog post for v0.8.6 (#3051)
* docs: changelog and blog post for v0.8.6

* docs: focus 0.8.6 blog post on new features

* docs: lead 0.8.6 blog with the entity timeline

* docs: use entity timeline gif in 0.8.6 blog post

* docs: drop embedded-engine bullet from 0.8.6 blog post

* chore(docs-skill): sync openapi version to 0.8.6
2026-07-29 18:14:45 +02:00
Ben 2dc40f3bc7 blog: How to move your agent's memory off a vector database (#3022)
* blog: How to move your agent's memory off a vector database

Practical migration guide from Pinecone/Chroma to Hindsight: export the
text (not the vectors), map namespaces to banks, batch-retain, verify with
recall/reflect. Complements the existing "case against vector DBs" post
with the how-to. Grounded in the public SDK (create_bank, batch retain).
2026-07-28 14:22:32 -04:00
Ben 2d0cd46084 blog: What people actually build with agent memory (use cases) (#2990)
* blog: What people actually build with agent memory (use cases)

Overview post walking through the concrete patterns teams build on
Hindsight: coding agents, per-user products, support/account assistants,
voice, chat platforms, self-built framework agents, multi-agent shared
banks, and automations. One primitive (retain/recall/reflect over a
bank), scoped and surfaced differently.
2026-07-27 14:44:07 -04:00
Ben ed120a256d blog: recall vs reflect (the two ways to read agent memory) (#2954)
* blog: recall vs reflect (the two ways to read agent memory)

Feature/decision piece contrasting Hindsight's two read operations:
recall (hybrid retrieval + rerank, no LLM, ranked facts, sub-second)
vs reflect (agentic loop with an LLM, hierarchical retrieval, synthesized
answer, response_schema, validated cited sources). Includes comparison
table, decision guide, and FAQ. Grounded in the recall/reflect engine
and API docs. Cover: recall vs reflect contrast panels.

* blog: use Inside retain() editorial theme for recall vs reflect cover

* blog: fact-check fixes to recall section

Adversarial verification against the recall engine found three
inaccuracies: recall runs 3 retrieval strategies always (semantic, BM25,
graph) with temporal conditional (not 4); no MMR/diversity pass is
implemented (docstring only); high budget defaults to 1000 not 600.
Softened 'local cross-encoder' since remote rerankers are configurable.
reflect claims all verified accurate.

* blog: fix API-doc link paths (/developer/api/... not /docs/...)
2026-07-24 14:20:20 -04:00
Naga Satish Chilakamarti 7f05187325 docs: add TealTiger community integration listing (#2831)
* docs: add TealTiger governance memory integration listing

Adds TealTiger to the integrations page as a community integration.
Governance-aware agent memory with importance-weighted retention.

Related: #2284
PyPI: https://pypi.org/project/tealtiger-hindsight/

* Delete hindsight-docs/docs-integrations/tealtiger.md

* Update TealTiger integration link to GitHub
2026-07-24 15:56:15 +02:00
Ben 0db0d3ec93 blog: Give Roo Code a Memory So Every Task Builds on the Last (#2931)
* blog: persistent memory for Roo Code (task-based agent)

How-to for the Roo Code integration: one-command install that wires
Hindsight's MCP tools (recall/retain, auto-approved) plus a custom rules
file so Roo recalls context before each task and retains a summary after.
Covers project vs global scope, cloud/self-host, verification, cross-tool
bank sharing, and FAQ. Grounded in the integration doc + README; package
live on PyPI. Cover: Roo kangaroo mark + recall->task->retain loop.

* blog: rebuild Roo Code cover in iridescent-mesh template with Roo mark

* blog: drop MCP from Roo Code cover subtitle
2026-07-23 15:30:14 -04:00
Ben 4dc8348348 blog: Your 1M-Token Context Window Is Not Memory (#2910)
* blog: Your 1M-Token Context Window Is Not Memory

Thought-leadership piece: a context window is working memory that resets
each session and degrades before it fills (lost-in-the-middle, Chroma
context rot), so a bigger window is not a memory system. Includes a
context-window-vs-memory comparison table and the one-question test.
Cited research linked; em-dash-free.

* blog: add Hindsight Cloud CTAs (embedded mid-article + Hindsight paragraph)
2026-07-22 15:24:43 -04:00
Ben dd6766c37d blog: Make Thinking Machines' Inkling your agent's memory (tutorial) (#2882)
* blog: use Thinking Machines' Inkling as a Hindsight memory model (tutorial)

Clickbaity how-to: point Hindsight's internal LLM at Inkling via any
OpenAI-compatible endpoint (four env vars, NVIDIA free key). Includes
real test results: clean structured fact extraction, unprompted temporal
resolution (last week -> 2026-07-14), entity resolution, and a coherent
reflect, all out of the box. Honest caveats (not on leaderboard, 975B
hosted-only, latency; gpt-oss-20b still fastest for high-volume retain).

* blog: swap Inkling cover to Hermes split-duotone style with Thinking Machines wordmark

* blog: use Inkling's real brand graphic (ink blob) on the cover

* blog: name Thinking Machines in title and body (Inkling is Thinking Machines' model)

* blog: cover title now names Thinking Machines Lab
2026-07-21 16:09:07 -04:00
Ben e07ca1bd0a blog: Persistent memory for ZCode (Z.ai GLM coding agent) (#2838)
* blog: persistent memory for ZCode (Z.ai GLM coding agent)

Announcement/how-to for the ZCode integration: hooks-based (no MCP),
recall before each prompt + retain each turn, cross-tool shared bank with
Claude Code and Cursor, per-project isolation, cloud or self-hosted.
Grounded in the merged integration doc, README, and hook source. Cover:
emerald mesh + glassy tool panels with the ZCode mark.
2026-07-20 14:59:33 -04:00
Ben b11e053323 feat(zcode): add Hindsight long-term memory integration for ZCode (#2549)
* feat(zcode): add Hindsight long-term memory integration for ZCode

Adds a hooks-based, no-MCP integration for ZCode (Z.ai's GLM desktop
coding agent). ZCode embeds the Claude Code agent runtime and reads the
standard Claude Code hook schema from its own config namespace
(~/.zcode/cli/config.json), so `hindsight-zcode install` wires three
process hooks — SessionStart, UserPromptSubmit (recall), and Stop
(retain) — without touching the user's ~/.claude config and without an
MCP server.

Recall injects relevant memories as additionalContext before each
prompt; retain assembles each turn from the prompt (captured at
UserPromptSubmit) and the response (Stop payload) and stores it to
Hindsight. Verified end-to-end in ZCode 3.2.2: hooks fire, retain
persists to the cloud bank, and recall injects memory into the agent.

Includes the pip package + installer, hook scripts, tests, CI job,
release-integration wiring, changelog registration, docs page, and
gallery entry.

* feat(zcode): add self-serve marketplace + hooks-only plugin variant

Publishes the ZCode integration as a hooks-only Claude Code plugin
(hindsight-zcode) in the repo's plugin marketplace, so ZCode users can
install it via 'zcode plugins add-marketplace vectorize-io/hindsight'
without pip and without depending on Z.ai's marketplace.

The plugin reuses the pip package's hook scripts via CLAUDE_PLUGIN_ROOT
(no duplication) — settings.json resolves as a sibling of scripts/ in
both the pip and plugin layouts. Adds a plugin manifest, plugin-format
hooks.json (SessionStart/UserPromptSubmit/Stop — no SessionEnd),
marketplace entry, validation tests, and docs.

* fix(zcode): drop changelog link from docs page (page exists only after release)

The /changelog/integrations/zcode page is generated at release time, so
linking to it broke the Docusaurus build (build-docs + verify-generated-files).
Most unreleased integration pages omit this link; follow that convention.
2026-07-20 10:58:24 -04:00
Ben 327aa05e80 blog: The Fully Open Agent Memory Stack (Hermes + Hindsight) (#2771)
* blog: The Fully Open Agent Memory Stack (Hermes + Hindsight)

Grounded technical piece: every layer of a Hermes + Hindsight stack is
open source and self-hostable (open-weights model via vLLM/llama.cpp,
MIT Hermes Agent, MIT Hindsight with local embeddings/reranker/LLM and
no external calls). Includes wiring, honest caveats (64K context,
auto-hook version gate, model license differences), and when it matters.

* blog: recommend gpt-oss-20b, add leaderboard + real M3 Max run

Address review: pivot the model recommendation from the Hermes model to
gpt-oss-20b (trendy, Apache-2.0, 128K, native tools, ~13GB) and explain
why a 'small' Kimi does not actually fit a laptop. Add a 'which model
for Hindsight' section citing the published model leaderboard (gpt-oss-20b
tops retain), and a 'does it fit on a laptop' section with real numbers
from running the full stack on an M3 Max (retain ~8s, recall ~0.6s).
Update cover model panel to gpt-oss-20b.
2026-07-17 15:05:50 -04:00
Ben 9bf0023163 docs(guides): add 44 integration memory guides (#2778)
Add per-integration guides under hindsight-docs/guides/, each with a
hero cover image following the existing guide template.

33 setup guides ("Add <Tool> Memory with Hindsight") for integrations
that had none: aider, ag2, agent-framework, agno, autogen,
claude-agent-sdk, cline, composio, continue, cursor, cursor-cli, dify,
eliza, flowise, gemini-spark, github-copilot, google-adk, grok-build,
haystack, litellm, n8n, nemoclaw, obsidian, omo, openai-agents,
openhands, roo-code, superagent, vapi, windsurf, zapier, zcode, zed.

11 distinct-angle guides for integrations that already had a setup
guide (each cross-links the existing setup guide instead of repeating
install): agentcore (cross-session strategy), codex (per-repo bank
strategy), crewai (shared crew memory), langgraph (state vs long-term),
llamaindex (beyond RAG), opencode (team shared banks), paperclip
(shared across agents), pipecat (voice memory across calls), pydantic-ai
(type-safe async memory), smolagents (memory across runs), strands
(per-agent vs shared banks).

Each guide is grounded in the integration's docs-integrations page and
its README/source.
2026-07-17 15:01:40 -04:00
Ben 685e50b9af blog: One Bank or Many? A Field Guide to Structuring Agent Memory (#2747)
* blog: One Bank or Many? structuring agent memory

A field guide to bank strategy in Hindsight: a bank is a recall
boundary, when to use separate banks vs tags within one bank, the
dynamicBankId/granularity config, anti-patterns, and a decision
checklist. All claims grounded in the source.
2026-07-16 14:37:55 -04:00
Ben 1549987015 docs: Add Omnigent integration page (#2710)
* docs: add Omnigent integration page

Adds the Omnigent integration to the docs site:
- docs-integrations/omnigent.md — full integration guide (install, YAML
  config, how runner-local dispatch works, bank scoping, config reference,
  self-hosted, Remy example, harness table, further reading)
- src/data/integrations.json — registry entry (category: framework, official)
- static/img/icons/omnigent.png — placeholder icon (to be updated)

Tool names use the correct Omnigent source names: memory_recall/retain/reflect.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: fix broken links, real Omnigent logo, regen skill

- Remove changelog link (Omnigent has no released Hindsight package/changelog)
- Drop the not-yet-merged blog self-link; add Omnigent GitHub link instead
- Replace placeholder icon with the real Omnigent logo (from omnigent-ai/omnigent)
- Regenerate skills/hindsight-docs integration reference for omnigent

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs(omnigent): correct tool names to hindsight_* + fix harness table

- Revert memory_* -> hindsight_recall/retain/reflect: released omnigent v0.5.1
  (and main, and the Remy example) use hindsight_* names. The memory_* rename
  is on an unmerged branch (integration/hindsight-memory-tool), not released.
- Fix the harness table: Codex and OpenCode have official Hindsight integrations,
  Pi has a community one (epimetheus); reframe around 'one central setup' rather
  than implying those tools have no native support.
- Regenerate skills/hindsight-docs reference.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 15:38:15 -04:00
Ben b0e5d103d8 Blog: Give Every Agent You Run in Omnigent a Persistent Memory (#2709)
* Blog: Omnigent as the universal Hindsight memory bridge

Tutorial-style post on adding persistent memory to Omnigent. Key angle:
Omnigent intercepts hindsight_recall/retain/reflect at the runner level, so
every wrapped harness (Claude Code, Codex, Cursor, Hermes, Pi) gets memory
through one setup, even those with no native Hindsight support. Covers
install, YAML spec, bank scoping, the Remy example, and cloud/self-hosted.
Grounded in omnigent-ai/omnigent source. Bridge-diagram cover.
2026-07-15 15:15:07 -04:00