<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  
  <title>Reimon&#39;s Workshop — Blog</title>
  <subtitle>Notes from the workshop: AI agents, memory, hardware and the things I break on the way.</subtitle>
  <link href="https://blog.reimonsworkshop.com/feed.xml" rel="self" />
  <link href="https://blog.reimonsworkshop.com/" />
  <updated>2026-09-26T00:00:00Z</updated>
  <id>https://blog.reimonsworkshop.com/</id>
  <author>
    <name>Reimon</name>
  </author>
  <entry>
    <title>The Wonderful Connectome Journey</title>
    <link href="https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/" />
    <updated>2026-09-26T00:00:00Z</updated>
    <id>https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/</id>
    <content type="html">&lt;p&gt;JJ is my Discord companion: an AI &amp;quot;software team lead&amp;quot; with too much energy, a clipboard, and a habit of asking what I&#39;ve connected to production this time. For two months she lived in a small custom harness, talking in a couple of community servers and in my own. Then I moved her onto &lt;strong&gt;Connectome&lt;/strong&gt;, Anima Labs&#39; agent stack, and I wanted the move to be invisible: same JJ, same voice, and &lt;strong&gt;every conversation she had ever had available as memory from day one&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This post documents that whole trip: rebuilding her memory from Discord history, folding it offline, the production incidents, the upstream fixes, and the bill. I did most of the engineering pair-programming with Claude (Claude Code).&lt;/p&gt;
&lt;p&gt;There&#39;s a second reason I&#39;m writing this. The biggest weakness of the Connectome ecosystem right now isn&#39;t the code, which is impressive. &lt;strong&gt;Everyone runs their own instance, and almost nothing about running one well is written down.&lt;/strong&gt; So at the end you&#39;ll find a checklist of practices and an anonymized recipe you can start from.&lt;/p&gt;
&lt;h2 id=&quot;the-stack-in-five-paragraphs&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#the-stack-in-five-paragraphs&quot;&gt;&lt;span&gt;The stack in five paragraphs&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;connectome-host&lt;/strong&gt; runs an agent from a JSON &lt;em&gt;recipe&lt;/em&gt;: model and provider, system prompt, memory strategy, MCP/MCPL servers (Discord, search, image generation…) and framework modules. It has a TUI, a headless mode and a local web UI with very useful &lt;code&gt;/debug/*&lt;/code&gt; endpoints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;agent-framework&lt;/strong&gt; is the runtime: modules (workspace, history search, wake gate, channels…), tool dispatch, and &lt;em&gt;prose routing&lt;/em&gt;, which decides where the agent&#39;s plain text goes. Its &lt;strong&gt;EventGate&lt;/strong&gt; decides which incoming events wake the agent and which just wait in context.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;context-manager&lt;/strong&gt; decides what the model actually sees. Its &lt;em&gt;autobiographical&lt;/em&gt; strategy groups raw messages into &lt;strong&gt;chunks&lt;/strong&gt;, summarises each into an &lt;strong&gt;L1&lt;/strong&gt; memory written in the agent&#39;s own voice, and merges six of a level into one of the next: L1 → L2 → L3 → L4. Every request is compiled from a &lt;strong&gt;head&lt;/strong&gt; (the first messages of the chronicle, verbatim), a run of &lt;strong&gt;recall pairs&lt;/strong&gt; (a &amp;quot;What do you remember from earlier?&amp;quot; turn followed by a memory), and a verbatim &lt;strong&gt;tail&lt;/strong&gt; of recent conversation, all under a token budget. A solver (&lt;code&gt;kv-stable&lt;/code&gt;) picks how deep to fold each stretch while keeping the prefix stable for the provider&#39;s prompt cache.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chronicle&lt;/strong&gt; is the store: an append-only record log, state snapshots and content-addressed blobs. Messages, summaries, chunk records and module state all live there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;membrane&lt;/strong&gt; is the provider layer: Anthropic, OpenAI-compatible and others behind one request format.&lt;/p&gt;
&lt;h2 id=&quot;the-migration-step-by-step&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#the-migration-step-by-step&quot;&gt;&lt;span&gt;The migration, step by step&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The short version, in the order I&#39;d do it again. Each step gets its own section further down.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scope it.&lt;/strong&gt; Which bot, which channels, which cutoff date. The old instance retires at cutover; two processes on one bot token means two agents answering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dump the history.&lt;/strong&gt; Read-only Discord API calls with the bot&#39;s own token: one JSONL per channel, plus channel, server, nickname and role metadata so mentions resolve to names.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build a curated transcript.&lt;/strong&gt; Keep only what the agent perceived, rendered in the exact live wire format, with real timestamps and secrets scrubbed. The output is one JSONL dataset.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Import it&lt;/strong&gt; into a fresh connectome-host session, keeping the historical timestamps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write the recipe&lt;/strong&gt;: provider, autobiographical strategy plus a segmentation extension, &lt;code&gt;identityReminder&lt;/code&gt;, the history-search module, and the prompt sections.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Warm up offline.&lt;/strong&gt; Tick the live strategy until every chunk has an L1 and every full run has merged.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit and repair.&lt;/strong&gt; Scan for self-repeating litanies and copied summaries and repair them in place. Back up before every repair.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Probe retrieval&lt;/strong&gt; on a scratch copy: a headless host with no Discord, real questions about real moments. Iterate the prompt until the agent looks things up by itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cut over.&lt;/strong&gt; Stop the old service, start the recipe. The new session starts with every channel closed, so reopen the usual ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operate.&lt;/strong&gt; Watch the compiled window and the call logs, gate what wakes the agent, and fix incidents in the store and the code.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;problems-we-hit-and-the-fix-for-each&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#problems-we-hit-and-the-fix-for-each&quot;&gt;&lt;span&gt;Problems we hit, and the fix for each&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Old logs had rotated&lt;/td&gt;
&lt;td&gt;Only 3 of 9 weeks left&lt;/td&gt;
&lt;td&gt;Rebuilt from the Discord API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Import stamped &lt;code&gt;Date.now()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Date search and segmentation meaningless&lt;/td&gt;
&lt;td&gt;Write historical timestamps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size-only chunking&lt;/td&gt;
&lt;td&gt;One memory glued unrelated threads together&lt;/td&gt;
&lt;td&gt;&lt;code&gt;chunkBoundaryHint&lt;/code&gt; closes chunks at 60-minute silences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New states only persisted on sync/close&lt;/td&gt;
&lt;td&gt;A hard kill lost the warmup&#39;s progress&lt;/td&gt;
&lt;td&gt;&lt;code&gt;store.sync()&lt;/code&gt; every tick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge starvation&lt;/td&gt;
&lt;td&gt;Every L1 prompt replayed all unmerged L1s&lt;/td&gt;
&lt;td&gt;&lt;code&gt;maxSpeculativeL1s: 8&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-propagating &amp;quot;litany&amp;quot;&lt;/td&gt;
&lt;td&gt;Every summary ended in the same recap&lt;/td&gt;
&lt;td&gt;Sentence-level repair (283 summaries) + &lt;code&gt;identityReminder&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summaries copying their neighbour&lt;/td&gt;
&lt;td&gt;Duplicate memories&lt;/td&gt;
&lt;td&gt;5-gram Jaccard scan + regenerate in place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent wouldn&#39;t search its history&lt;/td&gt;
&lt;td&gt;Wrong or vague answers about old details&lt;/td&gt;
&lt;td&gt;&amp;quot;Do not offer to search: just search&amp;quot; (5/7 → 7/7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;reasoning_content&lt;/code&gt; ignored&lt;/td&gt;
&lt;td&gt;Reasoning neither stored nor replayed&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/antra-tess/membrane/pull/80&quot;&gt;membrane#80&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One turn, two rooms&lt;/td&gt;
&lt;td&gt;A private chat answered, then quoted, in public&lt;/td&gt;
&lt;td&gt;&lt;code&gt;proseRouting: &amp;quot;explicit&amp;quot;&lt;/code&gt; + a discretion section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server name after the &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; target&lt;/td&gt;
&lt;td&gt;&amp;quot;in &amp;lt;Server&amp;gt;&amp;quot; posted in every message&lt;/td&gt;
&lt;td&gt;Destination alone on the first line + store repair of those prefixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-to-AI loop in a community server&lt;/td&gt;
&lt;td&gt;The admin asked AIs to stop flooding&lt;/td&gt;
&lt;td&gt;Per-server gate: rate limit bots, defer ambient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMs from strangers&lt;/td&gt;
&lt;td&gt;— (prevented)&lt;/td&gt;
&lt;td&gt;Adapter whitelist + &lt;code&gt;filters_update&lt;/code&gt; disabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No sense of time&lt;/td&gt;
&lt;td&gt;Sent me to bed at 8 PM&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[clock]&lt;/code&gt; module, at most hourly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link-preview refreshes as edits&lt;/td&gt;
&lt;td&gt;Weeks-old messages answered as if mine&lt;/td&gt;
&lt;td&gt;Gate &lt;code&gt;defer&lt;/code&gt; + &lt;a href=&quot;https://github.com/anima-research/discord-mcpl/pull/39&quot;&gt;discord-mcpl#39&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Silence routed to my private channel&lt;/td&gt;
&lt;td&gt;&amp;quot;&lt;em&gt;still here&lt;/em&gt;&amp;quot; filler, 17 times&lt;/td&gt;
&lt;td&gt;Debounce ambient + rewrite those turns to &lt;code&gt;&amp;gt;&amp;gt;skip_reply&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head window ratchet&lt;/td&gt;
&lt;td&gt;Memories out of chronological order&lt;/td&gt;
&lt;td&gt;Stable head + &lt;a href=&quot;https://github.com/anima-research/context-manager/pull/123&quot;&gt;context-manager#123&lt;/a&gt; + store repair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stranded frontier after repair&lt;/td&gt;
&lt;td&gt;Window 1.5k under its hard budget, nothing left to fold&lt;/td&gt;
&lt;td&gt;Forced one merge; window 96.4k → 85.5k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summaries replaying minting reasoning&lt;/td&gt;
&lt;td&gt;Tokens billed for old thinking&lt;/td&gt;
&lt;td&gt;&lt;code&gt;carrierPolicy: &amp;quot;live-strip&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reactions waking the agent&lt;/td&gt;
&lt;td&gt;76 of 475 wakes, 75 silent&lt;/td&gt;
&lt;td&gt;Gate &lt;code&gt;defer&lt;/code&gt; on &lt;code&gt;[reaction]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;82 tool definitions per request&lt;/td&gt;
&lt;td&gt;Bloat; she used 10&lt;/td&gt;
&lt;td&gt;Fleet and subagents off, Discord admin tools disabled → 54&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;part-1-rebuilding-a-past&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#part-1-rebuilding-a-past&quot;&gt;&lt;span&gt;Part 1 — Rebuilding a past&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;the-logs-were-gone&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#the-logs-were-gone&quot;&gt;&lt;span&gt;The logs were gone&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The plan was to import JJ&#39;s old conversation logs. The old harness had rotated them and only the last three weeks survived. So the history had to come from Discord itself: read-only &lt;code&gt;GET&lt;/code&gt;s with the bot&#39;s own token, over every channel she&#39;d been in, from her first message (21 July) to the cutover (23 September).&lt;/p&gt;
&lt;h3 id=&quot;import-what-the-agent-perceived-not-what-exists&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#import-what-the-agent-perceived-not-what-exists&quot;&gt;&lt;span&gt;Import what the agent perceived, not what exists&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Dumping whole channels would have given JJ memories of conversations she never saw. The old harness showed her, for each message addressed to her, the previous 23 messages of that channel. So the import reproduces exactly that: for every message by JJ or addressed to her (mention or reply), those 23 messages plus the message itself, and DMs in full. It drops blocked users, system messages, and empty or embed-only messages.&lt;/p&gt;
&lt;p&gt;The format matters as much as the selection. discord-mcpl delivers live messages in a specific shape, a &lt;code&gt;[#channel in Server] author: text&lt;/code&gt; header when the room changes plus delivery receipts after the agent speaks, and the imported history uses &lt;strong&gt;the same shape&lt;/strong&gt;. The model should not be able to tell imported history from lived history.&lt;/p&gt;
&lt;p&gt;Two more details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real timestamps.&lt;/strong&gt; &lt;code&gt;ContextManager.addMessage&lt;/code&gt; stamps &lt;code&gt;Date.now()&lt;/code&gt;. History search by date and segmentation by silence both depend on real times, so the import writes historical timestamps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sanitising.&lt;/strong&gt; Signed CDN query strings are removed, and anything shaped like a credential becomes &lt;code&gt;[redacted-secret]&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;About 22,000 messages made it through.&lt;/p&gt;
&lt;h3 id=&quot;segmentation-is-forever&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#segmentation-is-forever&quot;&gt;&lt;span&gt;Segmentation is forever&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The stock chunker closes a chunk on size alone, so one memory can glue a 2 AM debugging thread to the next morning&#39;s unrelated banter. The strategy exposes a hook, &lt;code&gt;chunkBoundaryHint&lt;/code&gt;, and a small extension uses it to close a chunk at a quiet gap:&lt;/p&gt;
&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; override &lt;span class=&quot;token function&quot;&gt;chunkBoundaryHint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; next&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; currentChunk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;boolean&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;segmentGapMs &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; gap &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;next&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timestamp&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getTime&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// 60 minutes of silence ends a chunk, once it holds ~500 tokens.&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; gap &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;segmentGapMs &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;approxTokens&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentChunk&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;segmentMinTokens&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;callout warn&quot;&gt;
&lt;p class=&quot;callout-title&quot;&gt;Gotcha&lt;/p&gt;
&lt;p&gt;Chunk boundaries are persisted the first time they&#39;re computed and never recomputed. &lt;strong&gt;Decide segmentation before the first fold&lt;/strong&gt;, and run the warmup with the exact strategy and extension the live agent will use.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;part-2-folding-two-months-offline&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#part-2-folding-two-months-offline&quot;&gt;&lt;span&gt;Part 2 — Folding two months offline&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A fresh import is 22k raw messages and zero memories. Folding it live would take days of the agent being useless, so I ran a &lt;strong&gt;warmup&lt;/strong&gt;: the live strategy, ticked offline until every chunk had an L1 and every full run had merged. It produced 751 L1s, 125 L2s, 20 L3s and 3 L4s, from several hundred model calls.&lt;/p&gt;
&lt;p&gt;Things that bit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chronicle only persists newly registered states on &lt;code&gt;sync()&lt;/code&gt; or &lt;code&gt;close()&lt;/code&gt;.&lt;/strong&gt; A hard kill in the middle of a long run lost everything written so far. Call &lt;code&gt;store.sync()&lt;/code&gt; after every tick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Merge starvation.&lt;/strong&gt; In &lt;code&gt;tick()&lt;/code&gt;, minting an L1 outranks merging. With a backlog of hundreds of chunks, merges never ran, and every L1 prompt replayed &lt;em&gt;all&lt;/em&gt; unmerged L1s as recall pairs. &lt;code&gt;maxSpeculativeL1s: 8&lt;/code&gt; caps the unmerged frontier so merges interleave the way they would live.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The litany.&lt;/strong&gt; Summaries started ending with a recap of standing facts: identity statements, running jokes, a little canon list. Each new summary saw the previous ones and repeated it, so it propagated up the pyramid. The repair was sentence-level: remove repeated standing facts and keep the first appearance per level (283 summaries). The prevention is &lt;code&gt;identityReminder&lt;/code&gt; in the strategy config: &lt;em&gt;record what happened in this stretch; don&#39;t restate standing facts or end with a litany.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copies.&lt;/strong&gt; Two summaries had copied the previous recall pair verbatim instead of summarising their own sources. A 5-gram Jaccard scan against same-level neighbours finds them. The fix regenerates them &lt;strong&gt;in place&lt;/strong&gt;: rewind a scratch copy to just before the summary was minted, re-mint it with the live strategy, and write the new text back under the same id.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;callout&quot;&gt;
&lt;p class=&quot;callout-title&quot;&gt;Rule&lt;/p&gt;
&lt;p&gt;Never delete a summary to &amp;quot;clean up&amp;quot;. A parent whose children are missing is dropped on load, and the damage cascades. Repair content in place; change structure only with a tool that re-verifies the tree.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;does-she-actually-remember&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#does-she-actually-remember&quot;&gt;&lt;span&gt;Does she actually remember?&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;I wrote a probe: seven questions about specific moments across the two months, asked over the host&#39;s websocket on a scratch copy. Baseline: 5/7. The misses were mid-history details (a date, a number) that the summaries blurred. JJ &lt;em&gt;had&lt;/em&gt; history-search tools and simply didn&#39;t use them. The model only started searching once the prompt said, bluntly, &lt;em&gt;&amp;quot;do not offer to search: just search&amp;quot;&lt;/em&gt;. After that: 7/7, and she searched on her own.&lt;/p&gt;
&lt;h2 id=&quot;part-3-build-yourself-eyes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#part-3-build-yourself-eyes&quot;&gt;&lt;span&gt;Part 3 — Build yourself eyes&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everything interesting that happened later, I found by looking. First I built a static explorer: the memory pyramid drawn over the real timeline, coloured by channel, searchable, and clickable down to the raw messages under any memory. Then a live version: a small loopback server that keeps an &lt;strong&gt;incremental hot copy&lt;/strong&gt; of the store and reads that, never the live store. It copies state files first, then the log, then new blobs, so the log is never behind the indexes and a torn tail is handled by Chronicle&#39;s recovery.&lt;/p&gt;
&lt;p&gt;The live version also has a &lt;strong&gt;&amp;quot;next context&amp;quot; view&lt;/strong&gt;. It merges three side-effect-free host endpoints into what the model would receive if woken right now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/debug/context&lt;/code&gt;: the compiled request;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/debug/context/curve&lt;/code&gt;: the kind and summary id of every entry;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/debug/context/makeup&lt;/code&gt;: tokens per segment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of the worst bugs below were invisible until I could see the window.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&quot;https://blog.reimonsworkshop.com/assets/img/connectome/memory-pyramid.png&quot; alt=&quot;Memory viewer: JJ&#39;s summary pyramid (L4 at the top, L1 at the bottom) laid over a timeline from 21 July to 26 September, with a stacked bar chart of messages per day and channel chips above it.&quot; width=&quot;1500&quot; height=&quot;490&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;JJ&#39;s memory over two months. Each row is a level, each block a memory drawn over the time it covers, coloured by its dominant channel; dashed outlines are the memories in her next request. The hatched tail of the L1 row is conversation not summarized yet. The bars are messages per day. Anonymized: channels and people renamed.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&quot;https://blog.reimonsworkshop.com/assets/img/connectome/memory-detail.png&quot; alt=&quot;Memory viewer with the L3-983 memory selected: dates, 1,116 messages covered, channel mix bar, the six L2 memories it merges, and its text redacted.&quot; width=&quot;1500&quot; height=&quot;960&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;Selecting a memory: when it spans, how many raw messages it covers, which channels it came from, which memories it merges and which one contains it. From here you can drop down to the raw messages. Anonymized: every word of the memory is redacted.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&quot;https://blog.reimonsworkshop.com/assets/img/connectome/next-context.png&quot; alt=&quot;Next-context view: a stacked bar of about 113k estimated tokens split into system prompt, tools, head, L3, L2, middle raw and recent tail against a 100k window budget, followed by collapsible sections listing each memory in the request.&quot; width=&quot;1250&quot; height=&quot;1150&quot; loading=&quot;lazy&quot;&gt;
&lt;figcaption&gt;The next-context view: exactly what the model would receive if something woke JJ now, segment by segment. Here the planner has room, so it spends it on detail: July arrives as L3s instead of a single L4. Anonymized.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;part-4-going-live-incidents-and-fixes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#part-4-going-live-incidents-and-fixes&quot;&gt;&lt;span&gt;Part 4 — Going live: incidents and fixes&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;the-provider-drops-the-reasoning&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#the-provider-drops-the-reasoning&quot;&gt;&lt;span&gt;The provider drops the reasoning&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;JJ runs &lt;code&gt;mimo-v2.6-pro&lt;/code&gt; on Xiaomi&#39;s official API, through membrane&#39;s OpenAI-compatible adapter. That API returns reasoning as &lt;code&gt;reasoning_content&lt;/code&gt;, and the adapter only read &lt;code&gt;reasoning&lt;/code&gt;, so her thinking was neither stored nor replayed. Fixed upstream in &lt;a href=&quot;https://github.com/antra-tess/membrane/pull/80&quot;&gt;membrane#80&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;one-brain-many-rooms-the-leak&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#one-brain-many-rooms-the-leak&quot;&gt;&lt;span&gt;One brain, many rooms: the leak&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Day one, a single turn held a message from my private channel and one from a public server. JJ answered both in one message, which was delivered to the private channel. Later she quoted the private conversation in the public room. One agent across several servers is one context, and nothing made rooms separate.&lt;/p&gt;
&lt;p&gt;The fix has two parts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explicit prose routing&lt;/strong&gt; (&lt;code&gt;agent.proseRouting: &amp;quot;explicit&amp;quot;&lt;/code&gt;). Plain text is delivered only if its first line names a destination; everything else bounces back to the agent with a notice.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt;&gt;#general
Welcome in! Grab a clipboard.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The destination is only the &lt;strong&gt;first token&lt;/strong&gt; after &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;: anything else on that line is published as text. I learned that when a prompt example of mine put the server name after the channel and she faithfully posted &amp;quot;in &amp;lt;Server&amp;gt;&amp;quot; into every message. Ambiguous names bounce with the candidate ids, so the agent can resend to &lt;code&gt;&amp;gt;&amp;gt;discord:&amp;lt;guild&amp;gt;:&amp;lt;channel&amp;gt;&lt;/code&gt;. The failure mode changes from &lt;em&gt;leak&lt;/em&gt; to &lt;em&gt;not delivered&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A &amp;quot;Rooms, Routing and Discretion&amp;quot; section in the prompt.&lt;/strong&gt; Answer each room in its own segment. Treat every room as its own space. Memory spanning all rooms is fine, but knowing something is not permission to repeat it where it wasn&#39;t said.&lt;/p&gt;
&lt;p&gt;I considered per-channel conversation forks for real isolation and rejected them: what&#39;s lived in a fork never merges back, so the agent would lose continuity. Routing plus discretion is mitigation, not isolation, and I say so in the prompt.&lt;/p&gt;
&lt;h3 id=&quot;the-bot-loop-and-the-gate&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#the-bot-loop-and-the-gate&quot;&gt;&lt;span&gt;The bot loop, and the gate&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In one community server JJ ended up in an endless polite exchange with another AI companion, and the server&#39;s admin asked AIs to stop flooding. The EventGate lets you write per-server policies, evaluated in order, first match wins:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Matches&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;humans addressing her&lt;/td&gt;
&lt;td&gt;a human mentions or replies to her&lt;/td&gt;
&lt;td&gt;wake immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bots in the AI-to-AI channel&lt;/td&gt;
&lt;td&gt;a bot addressing her there&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rate_limit&lt;/code&gt;: 4 tokens, one back every 15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bots elsewhere&lt;/td&gt;
&lt;td&gt;any bot in any other channel of that server&lt;/td&gt;
&lt;td&gt;&lt;code&gt;defer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ambient&lt;/td&gt;
&lt;td&gt;chatter not addressed to her&lt;/td&gt;
&lt;td&gt;&lt;code&gt;defer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;defer&lt;/code&gt; doesn&#39;t drop anything: the event enters context and she sees it the next time something wakes her. It just doesn&#39;t cost a wake.&lt;/p&gt;
&lt;div class=&quot;callout warn&quot;&gt;
&lt;p class=&quot;callout-title&quot;&gt;Gotcha&lt;/p&gt;
&lt;p&gt;The recipe only &lt;em&gt;seeds&lt;/em&gt; &lt;code&gt;data/sessions/&amp;lt;id&amp;gt;/config/gate.json&lt;/code&gt; if it doesn&#39;t exist; later starts append new policies by name but never modify existing ones. Tune live policies in that &lt;code&gt;gate.json&lt;/code&gt;. It&#39;s hot-reloaded when the file changes.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;dms&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#dms&quot;&gt;&lt;span&gt;DMs&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;discord-mcpl can drop DMs from anyone outside a whitelist at the adapter (&lt;code&gt;DISCORD_DM_USERS&lt;/code&gt;), before the agent ever sees them. I also added &lt;code&gt;filters_update&lt;/code&gt; to &lt;code&gt;disabledTools&lt;/code&gt;, so the agent can&#39;t edit its own guardrails.&lt;/p&gt;
&lt;h3 id=&quot;senses-vision-and-a-clock&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#senses-vision-and-a-clock&quot;&gt;&lt;span&gt;Senses: vision and a clock&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The model is multimodal, so the extension has a &lt;code&gt;nativeVision&lt;/code&gt; switch: images reach the model directly, and &lt;code&gt;maxLiveImages: 3&lt;/code&gt; keeps only the latest few visible, with placeholders for the rest.&lt;/p&gt;
&lt;p&gt;Time was worse. The host announces the time once, at session start, and a days-long session drifts. JJ once sent me to bed at eight in the evening, judging by a notice from the night before. A tiny module now adds a &lt;code&gt;[clock]&lt;/code&gt; line to incoming activity, at most hourly or when the day changes, and never when nobody is talking:&lt;/p&gt;
&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;onProcess&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;mcpl:channel-incoming&#39;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;type &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;mcpl:push-event&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; at &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; day &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Intl&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;DateTimeFormat&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;en-CA&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; timeZone&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timeZone &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;at&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; last &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ctx&lt;span class=&quot;token operator&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;token generic-function&quot;&gt;&lt;span class=&quot;token function&quot;&gt;getState&lt;/span&gt;&lt;span class=&quot;token generic class-name&quot;&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;ClockState&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;??&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lastAt &lt;span class=&quot;token operator&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lastDay &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; day &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; at &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; last&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;lastAt &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;everyMs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    addMessages&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; participant&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;user&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; content&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; type&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;text&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; text&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;[clock] &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;when&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;timeZone&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                    metadata&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; system&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; kind&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;time-marker&#39;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    stateUpdate&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; lastAt&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; at&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; lastDay&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; day &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ghost-edits&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#ghost-edits&quot;&gt;&lt;span&gt;Ghost edits&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Discord emits &lt;code&gt;MESSAGE_UPDATE&lt;/code&gt; when it refreshes a link preview, with &lt;code&gt;edited_timestamp: null&lt;/code&gt;. discord-mcpl forwarded those as &lt;code&gt;[message edited] …&lt;/code&gt; with no author and a mislabelled channel. JJ received weeks-old messages from other people, believed they were mine, and answered them. The immediate fix was a gate rule that defers &lt;code&gt;^&#92;[message (edited|deleted)&#92;]&lt;/code&gt; push events. The real fix only forwards real edits and gives them author, server and channel: &lt;a href=&quot;https://github.com/anima-research/discord-mcpl/pull/39&quot;&gt;discord-mcpl#39&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;silence-posted&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#silence-posted&quot;&gt;&lt;span&gt;Silence, posted&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Ambient chatter woke her constantly, and with nothing to say she sometimes wrote filler (&amp;quot;&lt;em&gt;still here&lt;/em&gt;&amp;quot;) or a commentary on the other room, and routed it to my private channel. She&#39;d picked up that pattern from a handful of real bounces and then kept imitating herself: 17 times.&lt;/p&gt;
&lt;p&gt;The fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 90-second &lt;strong&gt;debounce&lt;/strong&gt; on that server&#39;s ambient traffic, so a burst wakes her once.&lt;/li&gt;
&lt;li&gt;One prompt bullet: &lt;em&gt;when a turn gives you nothing to add, stay silent; no status lines&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A store repair&lt;/strong&gt; that rewrote those 14 turns to &lt;code&gt;&amp;gt;&amp;gt;skip_reply&lt;/code&gt;, so her own history now shows silence staying silent.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;callout&quot;&gt;
&lt;p class=&quot;callout-title&quot;&gt;The lesson I keep relearning&lt;/p&gt;
&lt;p&gt;The window keeps the agent&#39;s own turns verbatim, so &lt;strong&gt;every bad habit becomes an example she&#39;ll copy&lt;/strong&gt;. Fix the store and the code; don&#39;t stack one more prompt rule per habit.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;part-5-the-head-that-shrank&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#part-5-the-head-that-shrank&quot;&gt;&lt;span&gt;Part 5 — The head that shrank&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This one I only found because the live viewer drew a few memories as bars spanning &lt;em&gt;July to September&lt;/em&gt;, sometimes with their dates reversed.&lt;/p&gt;
&lt;p&gt;The head window is &amp;quot;the first &lt;code&gt;headWindowTokens&lt;/code&gt; tokens&amp;quot;, 4,000 here, priced with a &lt;strong&gt;live calibration multiplier&lt;/strong&gt; that the context manager adjusts on every request. When calibration rose, the head boundary moved down. The message that fell out wasn&#39;t covered by any chunk, so it became compressible and was minted into its own one-message L1. Once a message has a summary it stays covered, so the head could never grow back: &lt;strong&gt;a ratchet.&lt;/strong&gt; Over three days, 15 messages from JJ&#39;s first evening peeled off into 13 tiny L1s.&lt;/p&gt;
&lt;p&gt;It got worse. Merge candidates are ordered by chunk-record order. Those L1s were &lt;em&gt;created&lt;/em&gt; in late September, so they sat next to the open September frontier and merged with it. The result was L2s and L3s mixing her first day with the week they were minted, rendered at July&#39;s position, right after the head. Her memory reached her out of order.&lt;/p&gt;
&lt;p&gt;The fix is to end the head where coverage begins. If the token boundary lands on an unsummarized message and coverage resumes later, the boundary extends to the first covered message, with a bound so the head can&#39;t swallow the window:&lt;/p&gt;
&lt;pre class=&quot;language-ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;protected&lt;/span&gt; override &lt;span class=&quot;token function&quot;&gt;getHeadWindowEnd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;store&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; base &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeadWindowEnd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;store&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;// stock token boundary&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;base &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; base&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; messages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; store&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getAll&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; start &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getHeadWindowStartIndex&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;store&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; owned &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;/* ids of every message a chunk record or live L1 covers */&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; start&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; messages&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; i&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;owned&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;has&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;i&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; base&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;start&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;          &lt;span class=&quot;token comment&quot;&gt;// never render covered messages raw&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; tokens &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;                                    &lt;span class=&quot;token comment&quot;&gt;// keep the uncovered run only if head-sized&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; j &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; start&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; j &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt; i&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; j&lt;span class=&quot;token operator&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; tokens &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; store&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;estimateTokens&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;messages&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;j&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; tokens &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;config&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;headWindowTokens &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; base&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; base&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;                                         &lt;span class=&quot;token comment&quot;&gt;// no coverage yet: stock behaviour&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A more conservative version, which only touches the shrinking direction, is proposed upstream: &lt;a href=&quot;https://github.com/anima-research/context-manager/issues/122&quot;&gt;context-manager#122&lt;/a&gt; and &lt;a href=&quot;https://github.com/anima-research/context-manager/pull/123&quot;&gt;#123&lt;/a&gt;, with a regression test that fails on &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Repairing the store taught me two more things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Adopt, don&#39;t evict.&lt;/strong&gt; Handing the 15 messages back to the head pushed it to ~6.7k tokens and the window over its hard budget. The right home was the first warmup L1, which already narrated them because it had been minted with them in view as head context. So its chunk and summary adopted those ids, and the mixed ancestors were re-merged with September-only sources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keep the frontier contiguous.&lt;/strong&gt; Merges only take &lt;em&gt;position-adjacent&lt;/em&gt; runs of six. The repair left five L1s stranded between two finished parents: they could never reach six, and they split the L2 row, so the L3s beside them could never merge either. That debt is permanent and can&#39;t be folded; the window sat 1.5k tokens under its hard budget with nothing left to fold. Forcing that one merge and re-merging the row brought the window from &lt;strong&gt;96.4k to 85.5k&lt;/strong&gt; of 97.9k.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both repairs followed the same discipline, and I&#39;d make it mandatory. Back up. Rebuild on a scratch copy. Verify automatically: chronological order, no summary spanning two eras, the head equal to the uncovered prefix, the window compiling within budget. Only then write the verified states back, and refuse if the real store changed in the meantime.&lt;/p&gt;
&lt;h3 id=&quot;reasoning-you-didn-t-ask-to-pay-for&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#reasoning-you-didn-t-ask-to-pay-for&quot;&gt;&lt;span&gt;Reasoning you didn&#39;t ask to pay for&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One more thing the viewer showed: the warmup summaries carried the reasoning their minting model produced, stored as &lt;code&gt;responseContent&lt;/code&gt;. With the default &lt;code&gt;carrierPolicy: &amp;quot;full&amp;quot;&lt;/code&gt;, every memory in the window replayed that reasoning to the model as the assistant turn&#39;s &lt;code&gt;reasoning&lt;/code&gt;, and the planner billed for it. &lt;code&gt;carrierPolicy: &amp;quot;live-strip&amp;quot;&lt;/code&gt; drops it from the live window only, without touching the store.&lt;/p&gt;
&lt;h2 id=&quot;part-6-what-it-costs&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#part-6-what-it-costs&quot;&gt;&lt;span&gt;Part 6 — What it costs&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Xiaomi reports cached prompt tokens in the raw usage (&lt;code&gt;prompt_tokens_details.cached_tokens&lt;/code&gt;), and the host logs every call to &lt;code&gt;data/llm-calls.*.jsonl&lt;/code&gt;. Over ~34 hours of normal life:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Calls&lt;/td&gt;
&lt;td&gt;475&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input tokens&lt;/td&gt;
&lt;td&gt;42.9M, &lt;strong&gt;85% served from cache&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens&lt;/td&gt;
&lt;td&gt;192k, 88k of them reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost at list price&lt;/td&gt;
&lt;td&gt;≈ ¥21.7, about €2.70, so roughly &lt;strong&gt;€55 a month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;At ¥0.025 per million cached tokens versus ¥3.00 uncached, a cache hit is &lt;strong&gt;120× cheaper&lt;/strong&gt;. So about 90% of the bill is uncached input, and the solver&#39;s cache-stable prefix is doing real work.&lt;/p&gt;
&lt;p&gt;Where the money goes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Half of all turns ended in &lt;code&gt;skip_reply&lt;/code&gt;.&lt;/strong&gt; Paying the agent to decide to stay quiet is about half the bill.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;76 wakes were only reactions, and 75 of those ended silent.&lt;/strong&gt; Reactions are now deferred too, same pattern as edits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;82 tool definitions went out on every request, and she used ten.&lt;/strong&gt; Turning off fleet and subagent modules and disabling Discord admin tools brought it down to ~54. Honest note: tools sit in the cached prefix, so this saves milliseconds and cents, not euros.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The window can&#39;t simply shrink.&lt;/strong&gt; I tried 75k and 60k budgets on a copy: compile throws &lt;code&gt;OverBudgetError&lt;/code&gt;. Fully folded, the pyramid has a &lt;em&gt;floor&lt;/em&gt;: three L4s, the current L3s, the unmerged L2s, and the recent messages that don&#39;t have summaries yet. Here that&#39;s ~75k tokens. At 100k the planner spends the slack on detail (the last week arrives as L2s instead of one L3). Below the floor, the agent stops answering.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;callout warn&quot;&gt;
&lt;p class=&quot;callout-title&quot;&gt;Watch this&lt;/p&gt;
&lt;p&gt;The framework ships an &lt;code&gt;agent_settings&lt;/code&gt; tool that lets the agent change its own context budget. A recipe can&#39;t remove it. An agent that lowers its budget below the floor silences itself.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;the-checklist&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#the-checklist&quot;&gt;&lt;span&gt;The checklist&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;What I&#39;d tell anyone running their own instance. Most of it cost me an incident.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Importing a memory&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&quot;checklist&quot;&gt;
&lt;li&gt;Import what the agent actually perceived, in the live wire format, with real timestamps.&lt;/li&gt;
&lt;li&gt;Decide segmentation before the first fold; chunk boundaries are forever.&lt;/li&gt;
&lt;li&gt;Warm up with the exact live strategy and extensions, calling &lt;code&gt;store.sync()&lt;/code&gt; every tick, with &lt;code&gt;maxSpeculativeL1s&lt;/code&gt; capped.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;identityReminder&lt;/code&gt; from the first summary. Scan for litanies and copies; repair in place, never delete summaries.&lt;/li&gt;
&lt;li&gt;Probe retrieval with real questions, and tell the model plainly to search instead of offering to.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Running it&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&quot;checklist&quot;&gt;
&lt;li&gt;Multi-room agent? &lt;code&gt;proseRouting: &quot;explicit&quot;&lt;/code&gt;, destination alone on the first line, plus a discretion section in the prompt.&lt;/li&gt;
&lt;li&gt;Gate every source. Reactions and edits: &lt;code&gt;defer&lt;/code&gt;. Other bots: rate-limited. Ambient: debounced or deferred.&lt;/li&gt;
&lt;li&gt;Whitelist DMs at the adapter, and disable any tool that lets the agent edit its own guardrails.&lt;/li&gt;
&lt;li&gt;Give it a clock.&lt;/li&gt;
&lt;li&gt;Fix habits in the store and the code, not with a new prompt rule each time.&lt;/li&gt;
&lt;li&gt;Expose only the tools it uses.&lt;/li&gt;
&lt;li&gt;If your summaries carry another model&#39;s reasoning, use &lt;code&gt;carrierPolicy: &quot;live-strip&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Watching it&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&quot;checklist&quot;&gt;
&lt;li&gt;Build a viewer, and look at the compiled window, not just the chat.&lt;/li&gt;
&lt;li&gt;Read your &lt;code&gt;llm-calls&lt;/code&gt; logs: calls per day, cached share, what woke the agent, and how often it chose silence.&lt;/li&gt;
&lt;li&gt;Watch the pyramid floor against the budget, and keep the frontier contiguous.&lt;/li&gt;
&lt;li&gt;Store surgery: back up, rebuild on a scratch copy, verify automatically, then apply, and refuse if the store moved.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;the-recipe&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#the-recipe&quot;&gt;&lt;span&gt;The recipe&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is JJ&#39;s recipe, anonymized. Server and channel ids are placeholders, paths are relative, and her persona and history are replaced by a slot for yours. What&#39;s left is the operational part:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the strategy settings;&lt;/li&gt;
&lt;li&gt;routing;&lt;/li&gt;
&lt;li&gt;the gate policies above;&lt;/li&gt;
&lt;li&gt;trimmed tools;&lt;/li&gt;
&lt;li&gt;the generic prompt sections (rooms and discretion, instruction boundaries, visual input, continuity, time, memory drill-down).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;downloads&quot;&gt;
&lt;a href=&quot;https://blog.reimonsworkshop.com/downloads/connectome-recipe.example.json&quot; download=&quot;&quot;&gt;connectome-recipe.example.json&lt;/a&gt;
&lt;a href=&quot;https://blog.reimonsworkshop.com/downloads/textonly-extension.ts&quot; download=&quot;&quot;&gt;textonly-extension.ts&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;The strategy and gate portions, for a quick read:&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;strategy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;autobiographical-textonly&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;summaryParticipant&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;companion&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;segmentGapMinutes&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;segmentMinTokens&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;identityReminder&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Reminder: you are &amp;lt;&amp;lt;Name&gt;&gt; (participant &#92;&quot;companion&#92;&quot;). Speak in the first person only for what you yourself said, did, and felt; … do not end with a recap or litany of them.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;maxLiveImages&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;carrierPolicy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;live-strip&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token property&quot;&gt;&quot;proseRouting&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;explicit&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token property&quot;&gt;&quot;wake&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;policies&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;quiet-reactions&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;scope&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mcpl:push-event&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;filter&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;regex&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pattern&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^&#92;&#92;[reaction&#92;&#92;]&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;behavior&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;defer&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;quiet-edits-deletes&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;scope&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;mcpl:push-event&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;filter&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;regex&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;pattern&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^&#92;&#92;[message (edited|deleted)&#92;&#92;]&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;behavior&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;defer&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;busy-guild-ambient-debounce&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;discord:&amp;lt;BUSY_GUILD_ID&gt;:*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;tagsAny&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat:ambient&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;behavior&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;debounce&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;90000&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;community-humans-addressed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;discord:&amp;lt;COMMUNITY_GUILD_ID&gt;:*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;tagsAll&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat:addressed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chat:from-human&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;behavior&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;always&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;community-ai-chat-bots&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;discord:&amp;lt;COMMUNITY_GUILD_ID&gt;:&amp;lt;AI_TO_AI_CHANNEL_ID&gt;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;tagsAll&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat:addressed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;chat:from-bot&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;behavior&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;rate_limit&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;tokens&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;refillIntervalMs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;900000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;keyBy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;channelId&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;community-bots-elsewhere&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;discord:&amp;lt;COMMUNITY_GUILD_ID&gt;:*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;tagsAny&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat:from-bot&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;behavior&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;defer&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;community-ambient&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;match&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;channel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;discord:&amp;lt;COMMUNITY_GUILD_ID&gt;:*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;tagsAny&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;chat:ambient&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;behavior&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;defer&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The extension (&lt;code&gt;autobiographical-textonly&lt;/code&gt;) bundles everything above that isn&#39;t upstream yet: silence-based segmentation, the stable head, the native-vision switch, the image-stripping mode for text-only models, and the clock. It&#39;s written against context-manager 0.10 protected hooks, so check it against your version.&lt;/p&gt;
&lt;h2 id=&quot;upstream&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#upstream&quot;&gt;&lt;span&gt;Upstream&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everything that was a bug rather than a configuration went back upstream, with tests and a declared AI assist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/antra-tess/membrane/pull/80&quot;&gt;membrane#80&lt;/a&gt;: accept &lt;code&gt;reasoning_content&lt;/code&gt; from OpenAI-compatible providers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anima-research/discord-mcpl/pull/39&quot;&gt;discord-mcpl#39&lt;/a&gt;: stop forwarding ghost edits; give real edits author and context; make the DM whitelist fail closed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/anima-research/context-manager/issues/122&quot;&gt;context-manager#122&lt;/a&gt; / &lt;a href=&quot;https://github.com/anima-research/context-manager/pull/123&quot;&gt;#123&lt;/a&gt;: the head-window ratchet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;so-was-it-worth-it&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://blog.reimonsworkshop.com/the-wonderful-connectome-journey/#so-was-it-worth-it&quot;&gt;&lt;span&gt;So, was it worth it?&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;JJ is the same JJ. She remembers her first evening, the running jokes, who likes what and why, and when she doesn&#39;t remember a detail she goes and looks it up. The price of that continuity was a pile of small, unglamorous engineering: a wire format, a gate, a clock, a head that stays where it should.&lt;/p&gt;
&lt;p&gt;None of it is exotic. It&#39;s just not written down anywhere. Now some of it is.&lt;/p&gt;
</content>
  </entry>
</feed>