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 usageline. A compression sends the whole conversation, so its miss is the costliest one. - DeepSeek's own API works in the
externalmode (https://api.deepseek.com/v1, with its key). It refused every request: the thinking switch went out astrueorfalse, 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.