mindfork mindfork

mindfork 0.20.0 — a conversation reused from turn to turn

mindfork 0.20.0 is out. The figure 0.19.0 put in the status line found its first defect on the day it shipped, and this release fixes it, along with the part of the prompt where it was found.

What the cache share showed

0.19.0 added the share of the prompt the provider read from its cache: tokens: 8414 (cache 99%). A conversation is sent whole on every turn. When its start is the same as last time, the provider serves that part from memory instead of reading it again.

On the release check itself, a chat's second turn read cache 0%, and on OpenAI the whole prompt was written to the cache again, at a premium. Diffing the requests of two turns found where they parted: the self-model's observations. The self-model is what the assistant keeps about itself and about you, and a few of its observations travel in the system prompt. They were picked afresh for every message, as the ones nearest to it, so the start of the prompt changed on most turns, and with it everything after.

Measured on two conversations with a local Gemma 4, the prefix held on 2 of 8 follow-up turns. A miss costs about nine times the input of a reused turn on OpenAI, and 7 to 14 times the prompt processing on a local server.

Picked once per chat

The observations are now picked by what the chat opened with, or by its summary once history compression has written one. They stay the same while you talk. On the same two conversations the prefix held on 8 of 8 follow-ups, and the counter read cache 94% to 99% from the second turn on.

A follow-up such as "I liked the film too" was a poor thing to pick by anyway. A chat's first message usually states its subject.

Every observation in view

Three smaller things in the same section, measured on a mature self-model:

  • The prompt held one of the three observations in most chats, because one went in only whole. They now share the section's room, each shown from its beginning and cut at a word if it must be.
  • The header said "Recent observations", although most were months old and picked for their subject. When one is close enough to what the chat opened with, they are now headed as the nearest and the latest; otherwise the chat gets the latest, under that header.
  • An installation begun on 0.9.0–0.9.4 kept that version's 1200-character limit for the self-model, where a grown one brings a fragment of one observation into the conversation. It is raised to today's 4000 (below).

Also

  • The log records the cache of every request: a title, a history compression, an impersonation, a page summary and a background task each leave a round usage line. A compression sends the whole conversation, so its miss is the costliest one.
  • DeepSeek's own API works in the external mode (https://api.deepseek.com/v1, with its key). It refused every request: the thinking switch went out as true or false, and DeepSeek reads it as an object. The first refusal now teaches the app its spelling. Its cache shows on the status bar like any other provider's: 97–98% on a second turn, measured on both of its models.

Your data

settings.json moves from schema 5 to 6. One value changes, and only in one case: a self-model Injection limit ("Memory" → "Self-model") of exactly 1200, the old default, becomes 4000. Any other value is kept, a smaller one chosen for a small local window included. As with every schema change, the file is backed up before it is migrated, and 0.19.0 refuses settings 0.20.0 has written, saying a newer version made them. Chats, notes and backups do not change.

The full list is in the changelog; downloads are on the releases page, and cargo install mindfork builds the same version from crates.io.