---
title: "What's new in Hindsight 0.4.17"
description: New features and improvements in Hindsight 0.4.17
authors: [nicoloboschi]
date: 2026-03-10T12:00
hide_table_of_contents: true
image: /img/blog/release0417.png
---

Hindsight 0.4.17 adds history tracking with diff views for mental models and observations, flexible per-request file parsing, manual retry for failed async operations, and tag management for existing documents—plus several reliability fixes.

<!-- truncate -->

- [**History Tracking**](#history-tracking): Review how mental models and observations have changed over time with diff views.
- [**Flexible File Parsing**](#flexible-file-parsing): Choose a parser per request and configure fallback chains for file uploads.
- [**Manual Retry**](#manual-retry): Retry failed async operations directly from the operations view.
- [**Tag Updates**](#tag-updates): Change or update tags on an existing document without re-ingesting it.

## History Tracking

Mental models and observations now track their full change history. Every time Hindsight consolidates new memories and updates a mental model or observation, the previous version is preserved and the diff is recorded.

The control plane UI exposes this history with an inline diff view—additions in green, removals in red—so you can see exactly how each entry evolved over time. This is useful for auditing how the system's understanding of a user or topic has shifted as new content is ingested, and for debugging consolidation behavior when a model drifts in an unexpected direction.

<figure style={{margin: '1rem 0'}}>
  <img src="/img/blog/release0417/observations.png" alt="Observation history diff view" />
  <figcaption style={{textAlign: 'center', fontSize: '0.85rem', color: 'var(--ifm-color-emphasis-600)', marginTop: '0.4rem'}}>Observation history diff</figcaption>
</figure>

<figure style={{margin: '1rem 0'}}>
  <img src="/img/blog/release0417/mm.png" alt="Mental model history diff view" />
  <figcaption style={{textAlign: 'center', fontSize: '0.85rem', color: 'var(--ifm-color-emphasis-600)', marginTop: '0.4rem'}}>Mental model history diff</figcaption>
</figure>

History is tracked automatically with no configuration required. Existing mental models and observations will accumulate history going forward from this release.

## Flexible File Parsing

File uploads can now specify which parser to use on a per-request basis, overriding the server default for that request. This is useful when you have documents that need a specific parser—for example, preferring the Iris parser for scanned PDFs while using the default for Office documents.

You can also configure a **fallback chain**: if the primary parser fails, Hindsight will try each subsequent parser in order before surfacing an error. This makes ingestion pipelines more resilient when parser availability varies or documents are unpredictable.

```python
client.retain_file(
    bank_id="my-bank",
    file=open("report.pdf", "rb"),
    parser="iris",               # Preferred parser
    parser_fallback=["default"], # Fall back to default if iris fails
)
```

A new **extension hook** fires after a file has been converted to Markdown but before the text is passed to the retain pipeline. This lets extensions inspect or transform the parsed content—strip boilerplate headers, inject metadata, or reformat sections—before any fact extraction occurs.

## Manual Retry

The operations view now includes a **Retry** button for failed async operations. Previously, a failed retain or consolidation required re-submitting the original request. Now you can trigger a retry directly from the UI without any API call, which is especially helpful for transient failures like LLM timeouts or temporary network errors.

The operations view also received two quality-of-life improvements in this release: you can now **filter by operation type** to focus on retains, consolidations, or reflections independently, and the **auto-refresh** behavior is more reliable—it no longer stalls or misses updates when the browser tab is in the background.

## Tag Updates

Documents can now have their tags changed after ingestion. Previously, tags were set once at retain time and could only be updated by deleting and re-ingesting the document.

```python
client.update_document(
    bank_id="my-bank",
    document_id="doc-abc123",
    tags=["env:prod", "project:alpha"],
)
```

Tags affect both retrieval filtering and observation scoping. Updating tags on a document will be reflected in future recall and consolidation passes without requiring re-ingestion.

## Other Updates

**Improvements**
- Token limits are now configurable for "source facts" used during consolidation and recall, giving you finer control over context usage and cost when working with large memory banks.
- The bank selector now truncates very long bank names in the dropdown, preventing layout issues in the control plane UI.

**Bug Fixes**
- Fixed webhook schema issues affecting multi-tenant retain webhooks.
- Fixed file ingestion failures by stripping null bytes from parsed file content before retaining.
- Fixed tool selection handling for OpenAI-compatible providers when using named `tool_choice`.
- Improved consolidation behavior to prioritize a bank's mission over an ephemeral-state heuristic.
- Fixed database migrations to correctly handle mental model embedding dimension changes.
- Fixed file upload failures caused by an Iris parser httpx read timeout.
- Improved reliability of running migrations by serializing Alembic upgrades within the process.
- Fixed Google Cloud Storage authentication when using Workload Identity Federation credentials.
- Fixed the bank selector to refresh the bank list when the dropdown is opened.

## Feedback and Community

Hindsight 0.4.17 is a drop-in replacement for 0.4.x with no breaking changes.

Share your feedback:

- [GitHub Discussions](https://github.com/vectorize-io/hindsight/discussions)
- [GitHub Issues](https://github.com/vectorize-io/hindsight/issues)

For detailed changes, see the [full changelog](/changelog).
