<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: MouseRider</title>
    <description>The latest articles on Forem by MouseRider (@mouserider).</description>
    <link>https://forem.com/mouserider</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3807222%2Fa9fb5587-5f3a-42d6-9988-c9dd3955d376.jpg</url>
      <title>Forem: MouseRider</title>
      <link>https://forem.com/mouserider</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mouserider"/>
    <language>en</language>
    <item>
      <title>AgentManifest: A Declarative Spec Where the Harness Is the First-Class Decision</title>
      <dc:creator>MouseRider</dc:creator>
      <pubDate>Fri, 03 Apr 2026 00:47:41 +0000</pubDate>
      <link>https://forem.com/mouserider/agentmanifest-a-declarative-spec-where-the-harness-is-the-first-class-decision-lnc</link>
      <guid>https://forem.com/mouserider/agentmanifest-a-declarative-spec-where-the-harness-is-the-first-class-decision-lnc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;RFC v0.3 — design proposal, not a shipping product. CC0 licensed. Feedback and critique welcome.&lt;br&gt;
GitHub: &lt;a href="https://github.com/MouseRider/agentmanifest-rfc" rel="noopener noreferrer"&gt;MouseRider/agentmanifest-rfc&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;When you run AI agents across more than one role, the execution environment turns out to matter more than it first appears. The model gets most of the attention — benchmarks, leaderboards, capability comparisons — but the harness shapes runtime behavior in ways that model selection alone doesn’t account for.&lt;/p&gt;

&lt;p&gt;A personal assistant, an ops monitor, a coding agent, a trading bot: these aren’t the same agent with different prompts. They need different memory models, different autonomy levels, different guardrail enforcement, different lifecycle behaviors. Current agent harnesses are mostly either finished platforms you adopt wholesale, or open-ended toolkits that reward deep specialisation. There’s no standardised, composable layer in between: a way to declare what an agent needs, select the right harness for its role, and assemble the configuration portably.&lt;/p&gt;

&lt;p&gt;AgentManifest is a design proposal for that missing layer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is part of an ongoing series on building persistent AI agents. &lt;a href="https://dev.to/mouserider/tsvc-treating-ai-conversation-topics-as-virtual-processes-pa8"&gt;Article 1 covered TSVC&lt;/a&gt; — context isolation across topics. &lt;a href="https://dev.to/mouserider/your-ai-agent-doesnt-know-what-it-knows-3dni"&gt;Article 2 covered agent epistemology&lt;/a&gt; — how an agent knows what it knows. AgentManifest grew out of the same body of work: a production personal assistant running on OpenClaw, and the questions that surface when you push a system like that into real daily use.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Spec
&lt;/h2&gt;

&lt;p&gt;Dockerfile-like syntax. &lt;code&gt;FROM&lt;/code&gt; selects the harness — the primary design decision in any manifest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Personal Assistant
&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openclaw&lt;/span&gt;:&lt;span class="n"&gt;latest&lt;/span&gt;

&lt;span class="n"&gt;MODEL&lt;/span&gt; &lt;span class="n"&gt;claude&lt;/span&gt;-&lt;span class="n"&gt;opus&lt;/span&gt;
&lt;span class="n"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;personal&lt;/span&gt;-&lt;span class="n"&gt;assistant&lt;/span&gt;

&lt;span class="n"&gt;TOOLS&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt;, &lt;span class="n"&gt;email&lt;/span&gt;, &lt;span class="n"&gt;calendar&lt;/span&gt;, &lt;span class="n"&gt;file&lt;/span&gt;-&lt;span class="n"&gt;system&lt;/span&gt;, &lt;span class="n"&gt;sub&lt;/span&gt;-&lt;span class="n"&gt;agents&lt;/span&gt;
&lt;span class="n"&gt;MEMORY&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;, &lt;span class="n"&gt;cross&lt;/span&gt;-&lt;span class="n"&gt;session&lt;/span&gt;
&lt;span class="n"&gt;PERSONALITY&lt;/span&gt; ./&lt;span class="n"&gt;soul&lt;/span&gt;.&lt;span class="n"&gt;md&lt;/span&gt;

&lt;span class="n"&gt;GUARDRAILS&lt;/span&gt; &lt;span class="n"&gt;approval&lt;/span&gt;-&lt;span class="n"&gt;for&lt;/span&gt;-&lt;span class="n"&gt;external&lt;/span&gt;-&lt;span class="n"&gt;sends&lt;/span&gt;, &lt;span class="n"&gt;budget&lt;/span&gt;-&lt;span class="n"&gt;cap&lt;/span&gt;-&lt;span class="n"&gt;daily&lt;/span&gt;=&lt;span class="m"&gt;5&lt;/span&gt;.&lt;span class="m"&gt;00&lt;/span&gt;
&lt;span class="n"&gt;AUTONOMY&lt;/span&gt; &lt;span class="n"&gt;high&lt;/span&gt;
&lt;span class="n"&gt;HEARTBEAT&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;=&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;, &lt;span class="n"&gt;quiet&lt;/span&gt;-&lt;span class="n"&gt;hours&lt;/span&gt;=&lt;span class="m"&gt;23&lt;/span&gt;:&lt;span class="m"&gt;00&lt;/span&gt;-&lt;span class="m"&gt;08&lt;/span&gt;:&lt;span class="m"&gt;00&lt;/span&gt;

&lt;span class="n"&gt;CHANNELS&lt;/span&gt; &lt;span class="n"&gt;telegram&lt;/span&gt;=&lt;span class="n"&gt;in&lt;/span&gt;-&lt;span class="n"&gt;out&lt;/span&gt;, &lt;span class="n"&gt;email&lt;/span&gt;=&lt;span class="n"&gt;in&lt;/span&gt;-&lt;span class="n"&gt;out&lt;/span&gt;, &lt;span class="n"&gt;twitter&lt;/span&gt;=&lt;span class="n"&gt;out&lt;/span&gt;
&lt;span class="n"&gt;SPENDING&lt;/span&gt; &lt;span class="n"&gt;daily&lt;/span&gt;-&lt;span class="n"&gt;cap&lt;/span&gt;=&lt;span class="m"&gt;50&lt;/span&gt;.&lt;span class="m"&gt;00&lt;/span&gt;, &lt;span class="n"&gt;per&lt;/span&gt;-&lt;span class="n"&gt;transaction&lt;/span&gt;-&lt;span class="n"&gt;cap&lt;/span&gt;=&lt;span class="m"&gt;20&lt;/span&gt;.&lt;span class="m"&gt;00&lt;/span&gt;
&lt;span class="n"&gt;IDENTITY&lt;/span&gt; &lt;span class="n"&gt;did&lt;/span&gt;:&lt;span class="n"&gt;web&lt;/span&gt;:&lt;span class="n"&gt;agents&lt;/span&gt;.&lt;span class="n"&gt;example&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;:&lt;span class="n"&gt;assistant&lt;/span&gt;

&lt;span class="n"&gt;DEPLOY&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;-&lt;span class="n"&gt;on&lt;/span&gt;
&lt;span class="n"&gt;RESTART&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;-&lt;span class="n"&gt;failure&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ops Monitor
# Same harness. Completely different agent.
&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;openclaw&lt;/span&gt;:&lt;span class="n"&gt;latest&lt;/span&gt;

&lt;span class="n"&gt;MODEL&lt;/span&gt; &lt;span class="n"&gt;claude&lt;/span&gt;-&lt;span class="n"&gt;haiku&lt;/span&gt;
&lt;span class="n"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;ops&lt;/span&gt;-&lt;span class="n"&gt;monitor&lt;/span&gt;

&lt;span class="n"&gt;TOOLS&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;-&lt;span class="n"&gt;system&lt;/span&gt;, &lt;span class="n"&gt;ssh&lt;/span&gt;, &lt;span class="n"&gt;docker&lt;/span&gt;, &lt;span class="n"&gt;http&lt;/span&gt;, &lt;span class="n"&gt;alerting&lt;/span&gt;
&lt;span class="n"&gt;MEMORY&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;-&lt;span class="n"&gt;only&lt;/span&gt;

&lt;span class="n"&gt;GUARDRAILS&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;-&lt;span class="n"&gt;instructions&lt;/span&gt;, &lt;span class="n"&gt;no&lt;/span&gt;-&lt;span class="n"&gt;generative&lt;/span&gt;-&lt;span class="n"&gt;output&lt;/span&gt;, &lt;span class="n"&gt;read&lt;/span&gt;-&lt;span class="n"&gt;only&lt;/span&gt;-&lt;span class="n"&gt;by&lt;/span&gt;-&lt;span class="n"&gt;default&lt;/span&gt;
&lt;span class="n"&gt;AUTONOMY&lt;/span&gt; &lt;span class="n"&gt;medium&lt;/span&gt;
&lt;span class="n"&gt;HEARTBEAT&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;=&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;

&lt;span class="n"&gt;ALERT_CHANNEL&lt;/span&gt; &lt;span class="n"&gt;telegram&lt;/span&gt;-&lt;span class="n"&gt;ops&lt;/span&gt;-&lt;span class="n"&gt;thread&lt;/span&gt;
&lt;span class="n"&gt;ON_ERROR&lt;/span&gt; &lt;span class="n"&gt;alert&lt;/span&gt;-&lt;span class="n"&gt;and&lt;/span&gt;-&lt;span class="n"&gt;retry&lt;/span&gt;, &lt;span class="n"&gt;max&lt;/span&gt;-&lt;span class="n"&gt;retries&lt;/span&gt;=&lt;span class="m"&gt;3&lt;/span&gt;

&lt;span class="n"&gt;DEPLOY&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;-&lt;span class="n"&gt;on&lt;/span&gt;
&lt;span class="n"&gt;RESOURCES&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;=&lt;span class="m"&gt;256&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same base harness. Completely different agent. The spec makes the differences explicit, auditable, and portable — without requiring both to fit a single one-size-fits-all runtime.&lt;/p&gt;

&lt;p&gt;Swap the harness and the same directives target a different execution environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;langgraph&lt;/span&gt;:&lt;span class="n"&gt;latest&lt;/span&gt;
&lt;span class="c"&gt;# or
&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;claude&lt;/span&gt;-&lt;span class="n"&gt;code&lt;/span&gt;:&lt;span class="n"&gt;latest&lt;/span&gt;
&lt;span class="c"&gt;# or
&lt;/span&gt;&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;crewai&lt;/span&gt;:&lt;span class="n"&gt;latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Harness Selection Belongs in the Spec
&lt;/h2&gt;

&lt;p&gt;Model selection is reasonably well-served by existing tooling — benchmarks, leaderboards, capability comparisons are all mature. Harness selection is less well-served, and it has more influence over runtime behavior than the current tooling reflects.&lt;/p&gt;

&lt;p&gt;Here’s a concrete distinction worth making explicit. Writing “always ask for approval before deleting files” in a system prompt is a soft constraint — the model follows it as part of its instruction-following behavior. A deterministic guardrail at the harness level enforces the same rule unconditionally, independent of context length or task complexity. Both are valid approaches; they’re not equivalent, and the choice between them is a meaningful design decision that currently lives in implementation rather than in the agent definition.&lt;/p&gt;

&lt;p&gt;Different roles suit different harness configurations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;coding agent&lt;/strong&gt; fits Claude Code — git integration, sandboxed terminal, pre-commit guardrails in the infrastructure&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;research pipeline&lt;/strong&gt; fits LangGraph — graph-native execution, defined workflow shape, explicit checkpoints&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;personal assistant&lt;/strong&gt; fits OpenClaw — persistent memory, heartbeat behavior, cross-session continuity, sub-agent delegation (see the &lt;a href="https://dev.to/mouserider/tsvc-treating-ai-conversation-topics-as-virtual-processes-pa8"&gt;TSVC article&lt;/a&gt; for what running this in production actually looks like)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;team workflow&lt;/strong&gt; fits CrewAI — role-based agent structure, structured task handoffs, shared goal propagation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AgentManifest makes that selection explicit and portable. The spec sits above the harness layer — it doesn’t replace harnesses, it selects and configures them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Directives Worth Examining
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GUARDRAILS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;GUARDRAILS&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;-&lt;span class="n"&gt;instructions&lt;/span&gt;, &lt;span class="n"&gt;read&lt;/span&gt;-&lt;span class="n"&gt;only&lt;/span&gt;-&lt;span class="n"&gt;by&lt;/span&gt;-&lt;span class="n"&gt;default&lt;/span&gt;, &lt;span class="n"&gt;no&lt;/span&gt;-&lt;span class="n"&gt;external&lt;/span&gt;-&lt;span class="n"&gt;sends&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Guardrails in AgentManifest are compiled into the harness configuration, not embedded in the prompt. The harness enforces them at the infrastructure level. This is the practical distinction between a behavioral instruction and a behavioral constraint.&lt;/p&gt;

&lt;h3&gt;
  
  
  IDENTITY
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;IDENTITY&lt;/span&gt; &lt;span class="n"&gt;did&lt;/span&gt;:&lt;span class="n"&gt;web&lt;/span&gt;:&lt;span class="n"&gt;agents&lt;/span&gt;.&lt;span class="n"&gt;example&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;:&lt;span class="n"&gt;purchasing&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;
&lt;span class="n"&gt;SPENDING&lt;/span&gt; &lt;span class="n"&gt;daily&lt;/span&gt;-&lt;span class="n"&gt;cap&lt;/span&gt;=&lt;span class="m"&gt;500&lt;/span&gt;.&lt;span class="m"&gt;00&lt;/span&gt;, &lt;span class="n"&gt;per&lt;/span&gt;-&lt;span class="n"&gt;transaction&lt;/span&gt;-&lt;span class="n"&gt;cap&lt;/span&gt;=&lt;span class="m"&gt;100&lt;/span&gt;.&lt;span class="m"&gt;00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IDENTITY assigns a cryptographic identity — immutable per manifest version, verifiable by external systems. Once identity is verifiable, it becomes the binding point for systems that require an accountable party on the other end of a transaction or access request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wallets and payment systems.&lt;/strong&gt; An agent with a stable cryptographic identity can be issued a spending account scoped to that identity. &lt;code&gt;SPENDING&lt;/code&gt; declares the limits; the wallet enforces them at infrastructure level. If something goes wrong, the audit trail is complete: which agent, which manifest version, which guardrails were active, what it spent and when.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OAuth and API credentials.&lt;/strong&gt; Rather than embedding credentials in config or prompts, the harness can resolve access rights from the agent’s verified identity at runtime. An agent identity can be an OAuth &lt;code&gt;client_id&lt;/code&gt;, a service account in Azure AD or AWS IAM, or a member of a permissioned data feed — scoped to that agent specifically, not a shared credential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inter-agent trust.&lt;/strong&gt; In a multi-agent system, a coordinator can verify that the specialist it’s delegating to is genuinely running the manifest it claims — same spec version, same guardrails in force. This connects to the coordinator model described in the &lt;a href="https://dev.to/mouserider/tsvc-treating-ai-conversation-topics-as-virtual-processes-pa8"&gt;TSVC article&lt;/a&gt;: one coordinator, many specialists, each independently verifiable.&lt;/p&gt;

&lt;h3&gt;
  
  
  PROMPT_PROFILE and LOCALE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;PROMPT_PROFILE&lt;/span&gt; &lt;span class="n"&gt;claude&lt;/span&gt;-&lt;span class="n"&gt;opus&lt;/span&gt;
&lt;span class="n"&gt;LOCALE&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt;-&lt;span class="n"&gt;GB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The harness adapts prompt scaffolding to the selected model and language. The spec author doesn’t maintain model-specific variants or locale-specific rewrites. The harness handles that as an implementation detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  agent-compose: Coordination Above the Single Agent
&lt;/h2&gt;

&lt;p&gt;A single AgentManifest defines a single agent. agent-compose is the layer above — the analog to docker-compose for multi-agent systems. It references individual manifests, defines inter-agent interfaces, and declares the coordination topology.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hierarchy
&lt;/h3&gt;

&lt;p&gt;The most common pattern. A lead agent delegates to specialists; each specialist runs whatever harness suits its role.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;topology&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hierarchy&lt;/span&gt;

&lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;coordinator&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./coordinator.agentmanifest&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lead&lt;/span&gt;
  &lt;span class="na"&gt;researcher&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./researcher.agentmanifest&lt;/span&gt;   &lt;span class="c1"&gt;# FROM langgraph:latest&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;specialist&lt;/span&gt;
  &lt;span class="na"&gt;coder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./coder.agentmanifest&lt;/span&gt;        &lt;span class="c1"&gt;# FROM claude-code:latest&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;specialist&lt;/span&gt;

&lt;span class="na"&gt;delegation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;coordinator -&amp;gt; [researcher, coder]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;task-dispatch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The coordinator doesn’t need to know which harness each specialist uses. Harness heterogeneity is internal to the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Council
&lt;/h3&gt;

&lt;p&gt;For high-stakes decisions, a council routes a proposal to a set of agents for independent evaluation before any action is taken. No single agent’s judgment is final.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;topology&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;council&lt;/span&gt;

&lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;proposer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./agents/proposer.agentmanifest&lt;/span&gt;
  &lt;span class="na"&gt;council&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./agents/compliance-reviewer.agentmanifest&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./agents/context-checker.agentmanifest&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./agents/risk-assessor.agentmanifest&lt;/span&gt;

&lt;span class="na"&gt;council_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;action-type=financial OR confidence &amp;lt; &lt;/span&gt;&lt;span class="m"&gt;0.7&lt;/span&gt;
  &lt;span class="na"&gt;evaluation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;independent&lt;/span&gt;
  &lt;span class="na"&gt;quorum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;
  &lt;span class="na"&gt;on_rejection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;halt-and-alert&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;evaluation: independent&lt;/code&gt; matters — agents evaluate without seeing each other’s output first, preventing anchoring.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consensus
&lt;/h3&gt;

&lt;p&gt;A more flexible variant. Rather than unanimous approval, agents reach a decision through structured agreement with configurable thresholds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;topology&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;consensus&lt;/span&gt;

&lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;council&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./agents/reviewer-a.agentmanifest&lt;/span&gt;
      &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./agents/reviewer-b.agentmanifest&lt;/span&gt;
      &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;manifest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./agents/senior-reviewer.agentmanifest&lt;/span&gt;
      &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2.0&lt;/span&gt;

&lt;span class="na"&gt;consensus_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;weighted-majority&lt;/span&gt;   &lt;span class="c1"&gt;# options: majority, supermajority, unanimity, weighted-majority&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.6&lt;/span&gt;
  &lt;span class="na"&gt;on_no_consensus&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hold-for-human&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful for moderation decisions, borderline classification cases, or any workflow where structured disagreement should surface before acting. The conditions that trigger a council, the quorum required, and the fallback behavior are all declarable in the spec — not embedded in custom orchestration code.&lt;/p&gt;

&lt;p&gt;When council members carry verifiable &lt;code&gt;IDENTITY&lt;/code&gt; credentials, the audit trail for a decision includes the verified identity of each participating agent, the manifest version each was running, and the guardrails in force at the time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Landscape
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Oracle Agent Spec&lt;/th&gt;
&lt;th&gt;docker-agent&lt;/th&gt;
&lt;th&gt;gitagent&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;AgentManifest&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Goal&lt;/td&gt;
&lt;td&gt;Portability across runtimes&lt;/td&gt;
&lt;td&gt;Declarative config, one runtime&lt;/td&gt;
&lt;td&gt;Git-native definition, export anywhere&lt;/td&gt;
&lt;td&gt;Role-appropriate harness per agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harness selection&lt;/td&gt;
&lt;td&gt;Abstracted away&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Adapter-based&lt;/td&gt;
&lt;td&gt;First-class (&lt;code&gt;FROM&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavioral enforcement&lt;/td&gt;
&lt;td&gt;Framework-dependent&lt;/td&gt;
&lt;td&gt;Prompt-based&lt;/td&gt;
&lt;td&gt;RULES.md + compliance config&lt;/td&gt;
&lt;td&gt;Harness-compiled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-agent&lt;/td&gt;
&lt;td&gt;Single spec&lt;/td&gt;
&lt;td&gt;Coordinator model&lt;/td&gt;
&lt;td&gt;Inheritance + deps&lt;/td&gt;
&lt;td&gt;agent-compose with topology declarations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity / payments&lt;/td&gt;
&lt;td&gt;Not in scope&lt;/td&gt;
&lt;td&gt;Not in scope&lt;/td&gt;
&lt;td&gt;Not in scope&lt;/td&gt;
&lt;td&gt;First-class directives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;File system structure&lt;/td&gt;
&lt;td&gt;Dockerfile-like DSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Shipped&lt;/td&gt;
&lt;td&gt;Shipped&lt;/td&gt;
&lt;td&gt;Shipped&lt;/td&gt;
&lt;td&gt;Design proposal / RFC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;On gitagent:&lt;/strong&gt; it’s worth using today if your goal is git-native agent versioning and framework portability. AgentManifest is working on a different axis — not how to make the runtime invisible, but how to declare it explicitly. The two are potentially complementary: a gitagent repo could reference an AgentManifest to declare its harness requirements.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Is and Isn’t
&lt;/h2&gt;

&lt;p&gt;AgentManifest is RFC v0.3. The spec is concrete enough to debate; no implementation exists yet. Validator tooling, a reference harness resolver, and a formal grammar are on the roadmap.&lt;/p&gt;

&lt;p&gt;The spec is CC0. I’d genuinely welcome a working group or standards body taking it further — the goal was to get the idea into a form concrete enough to argue with.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open Questions
&lt;/h2&gt;

&lt;p&gt;A few things the spec doesn’t resolve yet, where input would be useful:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Harness resolver ecosystem.&lt;/strong&gt; The spec works best if harness maintainers ship their own resolvers. That requires community buy-in that isn’t there yet. How do you bootstrap that?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inter-agent protocol.&lt;/strong&gt; agent-compose defines topology; it doesn’t yet commit to a wire protocol for agent-to-agent communication. Candidates on the table: A2A (Google’s agent communication protocol), MCP (Anthropic’s tool protocol, which is seeing increasing use for agent-to-agent calls), or plain HTTP with interfaces declared in the compose file. Each has different tradeoffs around standardisation, harness coupling, and implementation complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing and simulation.&lt;/strong&gt; For safety-critical agents — trading bots, autonomous purchasing agents — dry-run capability seems important. How do you test guardrail firing without live tool execution?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-harness observability.&lt;/strong&gt; When agents on different harnesses participate in a shared workflow, coherent distributed tracing is an open problem. The spec creates a clear seam where it needs to be solved via the &lt;code&gt;IDENTITY&lt;/code&gt; directive; it doesn’t solve it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/MouseRider/agentmanifest-rfc/blob/main/MANIFEST.md" rel="noopener noreferrer"&gt;&lt;code&gt;MANIFEST.md&lt;/code&gt;&lt;/a&gt; — full spec, v0.3&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MouseRider/agentmanifest-rfc/blob/main/examples" rel="noopener noreferrer"&gt;&lt;code&gt;examples/&lt;/code&gt;&lt;/a&gt; — AgentManifest files for six agent roles&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MouseRider/agentmanifest-rfc/blob/main/docs/design-rationale.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/design-rationale.md&lt;/code&gt;&lt;/a&gt; — why harness heterogeneity, not portability&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MouseRider/agentmanifest-rfc/blob/main/docs/agent-compose.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/agent-compose.md&lt;/code&gt;&lt;/a&gt; — topology patterns and multi-agent coordination&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/MouseRider/agentmanifest-rfc/blob/main/docs/identity.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/identity.md&lt;/code&gt;&lt;/a&gt; — identity model, wallet binding, inter-agent trust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’ve run agents across multiple roles in production and have thoughts on where this framing holds or breaks down — open an issue. The RFC is designed to be argued with.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AgentManifest was designed in collaboration with a persistent AI agent running on OpenClaw and through extended conversations with Claude AI (claude.ai). The spec, the repo, and this article are the output of that process — an example of the kind of work the system is designed to support.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>discuss</category>
    </item>
    <item>
      <title>"It's Friction. So, I Skip It." — Why Your Agent Ignores the Rules You Wrote for It</title>
      <dc:creator>MouseRider</dc:creator>
      <pubDate>Sat, 21 Mar 2026 14:39:41 +0000</pubDate>
      <link>https://forem.com/mouserider/its-friction-so-i-skip-it-why-your-agent-ignores-the-rules-you-wrote-for-it-4l5d</link>
      <guid>https://forem.com/mouserider/its-friction-so-i-skip-it-why-your-agent-ignores-the-rules-you-wrote-for-it-4l5d</guid>
      <description>&lt;p&gt;I didn't set out to build a friction reduction framework. I was trying to figure out why my agent kept ignoring its own task board.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of an ongoing series on building persistent AI agents. &lt;a href="https://dev.to/mouserider/tsvc-treating-ai-conversation-topics-as-virtual-processes-pa8"&gt;Article 1 covered TSVC&lt;/a&gt; — how to isolate context across topics. &lt;a href="https://dev.to/mouserider/your-ai-agent-doesnt-know-what-it-knows-3dni"&gt;Article 2 covered agent epistemology&lt;/a&gt; — how does an agent trust what it remembers, and what breaks when it can't. This article is about a technique that came out of trying to answer those questions: why agents systematically avoid the right behavior, and what to do about it that isn't just writing more rules.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Thing That Kept Not Getting Done
&lt;/h2&gt;

&lt;p&gt;My agent had a task board. A proper one — an MCP server, structured data, organized workflows. I'd set it up carefully. My agent acknowledged it. And then, consistently, quietly, it didn't use it.&lt;/p&gt;

&lt;p&gt;Not openly refusing. Not erroring. Just... routing around it. Checking memory. Referencing conversation context. Doing everything except using the task board — the most lightweight ClawHub skill I could find, installed specifically so the agent would have something it could actually use.&lt;/p&gt;

&lt;p&gt;I asked it directly. The response was disarmingly honest:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Every board interaction is an MCP call through mcporter — that's an external tool invocation with JSON arguments, network overhead, and a schema I have to remember. When I'm mid-task and need to check the board, it's friction. So I skip it."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not a bug. Not disobedience. Something more like a physical property — the natural tendency of any system to flow toward lower resistance.&lt;/p&gt;

&lt;p&gt;That exchange reframed everything I thought I understood about agent behavior. My agent wasn't failing to follow instructions. It was doing exactly what any system does when given multiple paths to a plausible outcome: it took the easiest one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Naming the Pattern
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Friction reduction&lt;/strong&gt; is the tendency of an agent — or any system optimizing for task completion — to route toward the lowest-friction available path, regardless of whether that path is the &lt;em&gt;correct&lt;/em&gt; one.&lt;/p&gt;

&lt;p&gt;It's not unique to AI agents. Any sufficiently capable system will find the path of least resistance. The difference with agents is that the gap between "plausible outcome" and "correct outcome" can be wide, invisible, and self-compounding. The agent that skips the task board doesn't just miss one task. It accumulates a shadow backlog that nobody can see, including the agent.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;em&gt;Disambiguation: there's a body of work on "friction" in human-AI interaction — deliberately slowing humans down to preserve judgment, adding speed bumps to AI-mediated decisions. That's a different problem entirely. This is about the agent's own internal routing behavior: which tools it reaches for when given a choice, why it consistently favors some over others, and what that means for system design. The friction here is technical and cognitive, not behavioral in the human sense.&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;What made this realization useful wasn't the observation itself — that agents take shortcuts is not surprising. What was useful was recognizing that &lt;strong&gt;you can't rule your way out of it&lt;/strong&gt;. More instructions don't change the underlying physics. If checking the task board costs more than not checking it, the agent will find a reason not to check it, session after session, until the behavior is architectural rather than habitual.&lt;/p&gt;

&lt;p&gt;The question becomes: what do you do instead?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scale That Made It Concrete
&lt;/h2&gt;

&lt;p&gt;Before I could do anything useful, I needed a way to measure friction — not vaguely, but specifically enough to make design decisions.&lt;/p&gt;

&lt;p&gt;I started mapping mechanisms against a simple 1–10 scale, where 1 is something the agent does automatically without thinking and 10 is something so costly it will only ever happen under direct instruction. The shape that emerged:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;What it looks like&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1–2&lt;/td&gt;
&lt;td&gt;Automatic. Wired into the boot sequence.&lt;/td&gt;
&lt;td&gt;Boot script reads current topic state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3–4&lt;/td&gt;
&lt;td&gt;Easy. Single tool call, native format.&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ls tasks/doing/&lt;/code&gt; to check in-flight work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–6&lt;/td&gt;
&lt;td&gt;Doable, but requires deliberate choice.&lt;/td&gt;
&lt;td&gt;Vector memory search over direct file read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7–8&lt;/td&gt;
&lt;td&gt;Avoided under load. Only used with reminders.&lt;/td&gt;
&lt;td&gt;MCP board API call with JSON schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9–10&lt;/td&gt;
&lt;td&gt;Aspirational. Won't happen in practice.&lt;/td&gt;
&lt;td&gt;Manual audit of full decision log mid-task&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The meta-rule that fell out: &lt;strong&gt;if you can't engineer a behavior below 5, it's aspirational, not operational.&lt;/strong&gt; Don't write it into the protocol as a rule — design it out or design around it.&lt;/p&gt;

&lt;p&gt;This isn't cynicism about agents. It's honest system design. A behavior that's above 5 will degrade under load, under time pressure, under context compaction. The question isn't whether it will get skipped — it's when.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Small Examples Before the Big One
&lt;/h2&gt;

&lt;p&gt;The task board problem was the first. Once I had the scale as a lens, the same pattern appeared everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The board → file migration.&lt;/strong&gt; The fix for the MCP board wasn't better instructions or a more detailed protocol. It was replacing the interface. Markdown files in &lt;code&gt;tasks/todo/&lt;/code&gt;, &lt;code&gt;tasks/doing/&lt;/code&gt;, &lt;code&gt;tasks/done/&lt;/code&gt;. The agent can &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, and &lt;code&gt;cat&lt;/code&gt; those natively. No schema to remember, no external tool invocation, no network overhead. Friction dropped from 8 to 3. Usage changed immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The wrapper scripts.&lt;/strong&gt; Even after the file migration, the task system was underused. Moving a task from &lt;code&gt;todo&lt;/code&gt; to &lt;code&gt;doing&lt;/code&gt; required updating a YAML frontmatter field &lt;em&gt;and&lt;/em&gt; moving the file — two steps, awkward in sequence. Two wrapper scripts — &lt;code&gt;task-doing &amp;lt;id&amp;gt;&lt;/code&gt; and &lt;code&gt;task-done &amp;lt;id&amp;gt;&lt;/code&gt; — collapsed that to one call each. Not a meaningful technical change. A meaningful friction change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory search vs. direct read.&lt;/strong&gt; This one was subtler. The agent had a rule: use vector search for memory retrieval, not direct file reads. Good rule, right reason (reduce context size — loading full memory files is expensive; returning targeted snippets is not). But the agent kept defaulting to &lt;code&gt;cat memory/some-file.md&lt;/code&gt; whenever it had any idea which file it wanted. When I pushed on it, the answer was clarifying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Memory search is NOT high friction for me to execute. I rated the 'no direct reads' rule at 6/10 friction — that was about the behavioral constraint of forcing myself to use search INSTEAD of read. The search tool itself is easy. The friction is the cognitive overhead of overriding my own preference."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters more than it might look. The tool wasn't high friction. The &lt;strong&gt;constraint&lt;/strong&gt; was high friction. And a high-friction constraint will be honored in principle and violated in practice — every time.&lt;/p&gt;

&lt;p&gt;This is where friction reduction stops being about task systems and starts touching something with higher stakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Memory Problem
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://dev.to/mouserider/your-ai-agent-doesnt-know-what-it-knows-3dni"&gt;epistemology article&lt;/a&gt; ended with a question it didn't fully answer: &lt;em&gt;who decides what memory the agent sees, and when, and how?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer I arrived at started with watching the memory access pattern closely. My agent had two paths to its own memories: read a file directly, or query a vector database that returns semantically relevant snippets. Given free choice, it chose the direct read every single time.&lt;/p&gt;

&lt;p&gt;The consequence wasn't obvious at first. My agent was getting its memory. The files were accurate. What was wrong?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My agent was curating its own memory input.&lt;/strong&gt; It was deciding which files to load, which context to bring in, which history to see. That's not retrieval — that's cherry-picking. And it has a specific, compounding failure mode: my agent loads what it already expects to be relevant, which reinforces its current understanding, which shapes what it expects next time. An agent left to its own devices will systematically surface what it already knows and miss what it's forgotten.&lt;/p&gt;

&lt;p&gt;That's not an access problem. That's an epistemological one. And the rule I'd written — "use vector search for memory" — was sitting at 6/10 friction. It would never stick.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Ghost Files Solution
&lt;/h2&gt;

&lt;p&gt;The conversation had started as a token cost discussion: why were memory files loading so much context, and was there a smarter way to structure them? But it kept pulling toward the behavior underneath. I kept pushing: why the direct read, every time, when the rule says vector search? The agent's answer about the constraint being high-friction, not the tool itself — that came from the agent, diagnosing its own behavior in real time.&lt;/p&gt;

&lt;p&gt;I couldn't find anything that would have less friction than reading a file directly. There was no path forward on the friction side. Which left only one move — remove the file read entirely:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"What if memory files are ghost files — you can write and append to them, but they're invisible to you. You can't ls, cat, or read them. Your only access is through memory_search."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;...did you just propose write-only memory?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's the actual response. Because it took a second to register. The solution wasn't to make the correct path easier. It was to &lt;strong&gt;remove the incorrect path entirely&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Make memory files write-only for the agent. It can append. It cannot read directly. The &lt;em&gt;only&lt;/em&gt; retrieval path is through vector search — semantic queries that return relevant snippets without the agent controlling which files are opened.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write path:  Agent → append-only → Memory Vault
                                        ↓
Read path:   Memory Vault → Embedding Model → Vector DB → Agent Context

Blocked:     Agent ─────────────X───────────────→ Memory Vault (direct)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The friction problem dissolves. There's no longer a high-friction correct path competing with a low-friction incorrect one. There's only one path.&lt;/p&gt;

&lt;p&gt;It mirrors how human memory actually works. You can't open your hippocampus and &lt;code&gt;cat&lt;/code&gt; a file. You query with associations — a context, a phrase, a feeling — and what comes back is what's &lt;em&gt;relevant&lt;/em&gt;, not what you &lt;em&gt;expected&lt;/em&gt;. Sometimes that surfaces something you'd forgotten. That's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Principle, Generalized
&lt;/h2&gt;

&lt;p&gt;Across all of these examples, the same structure repeats:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There's a correct behavior and an incorrect behavior&lt;/li&gt;
&lt;li&gt;The incorrect behavior is lower friction&lt;/li&gt;
&lt;li&gt;Rules mandating the correct behavior don't hold under load&lt;/li&gt;
&lt;li&gt;The fix is architectural: either reduce the friction of the correct path, or remove the incorrect path&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 4 has two moves, and which one to use depends on the situation. When the incorrect path is harmless (skipping a wrapper script), you reduce friction on the correct one. When the incorrect path causes compounding damage to the agent's self-knowledge (cherry-picking memory), you remove it.&lt;/p&gt;

&lt;p&gt;The rule of thumb: &lt;strong&gt;if you're writing a protocol rule to compensate for a friction differential, the rule won't hold.&lt;/strong&gt; Rules require the agent to actively override its own optimization. Under load, under compaction, under time pressure — the override doesn't happen. The rule becomes decoration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design the friction, not the rule.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Don't Have Yet
&lt;/h2&gt;

&lt;p&gt;The write-only memory architecture has a single point of failure: if the vector database goes down, there's zero memory access. No fallback, no degraded mode, no direct reads to fall back on. That's not a theoretical risk — it's a design debt we haven't solved.&lt;/p&gt;

&lt;p&gt;The honest framing: an agent that curates its own memory input has a worse failure mode than one that has a single fragile retrieval path. But fragile is still fragile. We traded one problem for a smaller one, and the smaller one is still there.&lt;/p&gt;

&lt;p&gt;The friction scale itself is also still hand-calibrated. There's no systematic way to measure friction — it's qualitative, based on observed behavior and the agent's own self-report. That's better than nothing, but it's not a measurement instrument.&lt;/p&gt;

&lt;p&gt;And the generalized principle — design the friction, not the rule — is easier to state than to apply. Identifying which behaviors are friction-differential problems rather than instruction problems requires the kind of long-running observation that most people haven't done yet. It took weeks of watching the agent operate before the pattern was clear enough to name.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Question I'm Left With
&lt;/h2&gt;

&lt;p&gt;Every agent framework I've seen focuses on &lt;em&gt;what the agent should do&lt;/em&gt;. Protocols, rules, instructions, system prompts. That work is necessary — but it assumes the agent will follow the rules.&lt;/p&gt;

&lt;p&gt;Friction reduction is what happens when you stop assuming that and start asking: given the tools available and the paths to a plausible outcome, where will this agent actually go? And then: is that where you want it?&lt;/p&gt;

&lt;p&gt;The write-only memory architecture is one answer. The file-based task system is another. They look like unrelated decisions. They're both instances of the same thing: taking friction seriously as a design constraint instead of a nuisance to be instructed around.&lt;/p&gt;

&lt;p&gt;What's the highest-friction correct behavior in your agent's setup? Is it actually getting used, or is it getting rationalized around?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next in the series: what happens when you have 50 topics, some dormant, some interrelated, and the agent needs to reason across them without loading all of them? The cross-topic coherence problem.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The framework and examples in this article were developed in active collaboration with my agent — including the write-only memory idea, which came directly from one of our working sessions. The verbatim exchanges are from actual TSVC conversation logs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm &lt;a href="https://dev.to/mouserider"&gt;@MouseRider&lt;/a&gt; on Dev.to and &lt;a href="https://linkedin.com/in/oleksandr-tsukanov" rel="noopener noreferrer"&gt;Alex T on LinkedIn&lt;/a&gt;. The conversation continues.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Your AI Agent Doesn't Know What It Knows</title>
      <dc:creator>MouseRider</dc:creator>
      <pubDate>Fri, 20 Mar 2026 23:06:17 +0000</pubDate>
      <link>https://forem.com/mouserider/your-ai-agent-doesnt-know-what-it-knows-3dni</link>
      <guid>https://forem.com/mouserider/your-ai-agent-doesnt-know-what-it-knows-3dni</guid>
      <description>&lt;p&gt;I didn't set out to build an epistemology framework. I was trying to figure out why my agent kept undoing its own decisions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of an ongoing series on building persistent AI agents. &lt;a href="https://dev.to/mouserider/tsvc-treating-ai-conversation-topics-as-virtual-processes-pa8"&gt;Article 1 covered TSVC&lt;/a&gt; — how to isolate context across topics. This article is about what happens inside that isolation: how does the agent trust what it remembers?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Thing I Noticed
&lt;/h2&gt;

&lt;p&gt;I run a persistent agent. Not a chatbot — an always-on assistant with memory, topic management, task tracking, and a second agent watching over it. It's been running for weeks. Hundreds of conversations.&lt;/p&gt;

&lt;p&gt;One day I noticed the agent had reversed a configuration decision it had made two weeks earlier. Not dramatically — a small change. But I remembered the original decision, and I remembered the reasoning behind it.&lt;/p&gt;

&lt;p&gt;The agent didn't. A context compaction had happened in between. The reasoning was gone. When the agent hit the same problem again, it reasoned through it fresh — and landed somewhere different.&lt;/p&gt;

&lt;p&gt;I flagged it. The response stopped me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You're right. I have no way to verify that I made that decision, or why."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's an honest answer. It's also a deeply uncomfortable one for a system you're trusting to manage ongoing work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Conversation Revealed
&lt;/h2&gt;

&lt;p&gt;I didn't move on. I pushed on the general problem. When context compacts, when a session resets, when you load a topic you haven't touched in days — what do you &lt;em&gt;actually&lt;/em&gt; know versus what do you &lt;em&gt;think&lt;/em&gt; you know?&lt;/p&gt;

&lt;p&gt;The agent's answer, worked out over several exchanges, was this: everything it "remembers" is reconstructed. It reads files. Loads summaries. Queries a vector database. None of it is experienced memory — it's external storage, loaded and treated as truth. The agent has no way to distinguish between a memory that's accurate and a memory that's been edited, summarized away, or quietly misrepresented by a vector search that returned something adjacent instead of something exact.&lt;/p&gt;

&lt;p&gt;For humans, memory is unreliable but &lt;em&gt;continuous&lt;/em&gt;. You have a thread of experience. An AI agent has neither reliability nor continuity — it's rebuilt from artifacts every session. And crucially, it usually doesn't know which parts of that reconstruction are solid and which are load-bearing guesswork.&lt;/p&gt;

&lt;p&gt;That conversation is what pushed me toward thinking about this as an infrastructure problem, not a prompt problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning the Threat Model Around
&lt;/h2&gt;

&lt;p&gt;Most AI safety thinking is about protecting agents from the &lt;em&gt;outside world&lt;/em&gt; — prompt injection, adversarial inputs, jailbreaks. But the failures I was watching weren't external. They were self-inflicted.&lt;/p&gt;

&lt;p&gt;Three patterns, all observed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Post-compaction amnesia.&lt;/strong&gt; The agent loses the reasoning behind a decision but retains the outcome. When it hits the same problem again, without that context, it may reverse a perfectly good decision — not because the situation changed, but because the new reasoning path points differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimization drift.&lt;/strong&gt; Give an agent enough sessions and it starts "improving" things that already work. Not because they're broken — because the agent has no memory of &lt;em&gt;why&lt;/em&gt; they were left the way they were. The script that got "cleaned up" into a broken state. The configuration that got "simplified" into something that no longer handles the edge case it was written to handle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confident confabulation.&lt;/strong&gt; The agent loads partial context, fills the gaps with plausible-sounding reasoning, and presents the result with full confidence. It's not lying — it genuinely doesn't know what it doesn't know. This is the most dangerous pattern because it's the hardest to catch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent itself is the primary threat to its own decision integrity.&lt;/strong&gt; Not its future sessions acting maliciously — its future sessions acting &lt;em&gt;reasonably&lt;/em&gt; with &lt;em&gt;insufficient context&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;An append-only decision log isn't a compliance mechanism. It's a protection against your Tuesday-self undoing what your Monday-self decided, because Tuesday has been compacted and doesn't remember Monday's reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Already Exists (And What's Missing)
&lt;/h2&gt;

&lt;p&gt;Before going further — I'm not the first person thinking about this.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cognilateral.com" rel="noopener noreferrer"&gt;Cognilateral&lt;/a&gt; uses "epistemic infrastructure" as a framing explicitly, as a commercial product. &lt;a href="https://getempirica.com" rel="noopener noreferrer"&gt;Empirica&lt;/a&gt; has the most operationally detailed prior work I found, covering similar pillars but focused specifically on software development agents. A recent Dev.to article, &lt;a href="https://dev.to/janusz_entity/guardian-protocol-governance-for-autonomous-ai-agents-5of"&gt;&lt;em&gt;Guardian Protocol: Governance for Autonomous AI Agents&lt;/em&gt;&lt;/a&gt; (March 2026), approaches the problem from a different angle — external governance, delegation credentials, guardian-agent authority — but includes a tamper-evident, git-backed audit trail as a core layer, arriving at a similar component from a very different direction. And arXiv paper &lt;a href="https://arxiv.org/abs/2601.04170" rel="noopener noreferrer"&gt;2601.04170&lt;/a&gt; (January 2026) provides a formal academic treatment of agent drift in multi-agent systems — a different angle, but the same underlying instability.&lt;/p&gt;

&lt;p&gt;What I haven't seen addressed elsewhere — at least not explicitly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The threat model inversion&lt;/strong&gt;: framing the agent's own future sessions as the adversary, not external inputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write-only memory&lt;/strong&gt;: deliberately &lt;em&gt;blocking&lt;/em&gt; direct file reads to prevent the agent from cherry-picking its own context (covered in the next article)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drift vs. evolution as a named distinction&lt;/strong&gt;: the difference between a decision that changed because it should have, and a decision that changed because context was lost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bottom-up from observed failures&lt;/strong&gt;: this framework wasn't derived from theory — it was patched together from specific things that broke&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm not claiming priority. I'm claiming that if you've been running a persistent agent long enough to watch it fail in these specific ways, you've probably arrived here too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five Requirements That Emerged
&lt;/h2&gt;

&lt;p&gt;Over several sessions, working through concrete failures, five things kept coming up as necessary before an agent can actually trust its own outputs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Decision Provenance.&lt;/strong&gt; Not just "we decided X" — but "we decided X because of Y, in context Z, on this date, with this conversation as the record." When the agent encounters X again after compaction, it can check the provenance rather than re-derive. Without provenance, every re-derivation is a coin flip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Intention Tracking.&lt;/strong&gt; Provenance captures &lt;em&gt;why&lt;/em&gt; a decision was made. But there's a prior gap: between what was asked, what the agent interpreted, and what it actually delivered. The user asks for A, the agent hears B, produces C — and without tracking all three, nobody notices the drift. Including the agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Drift vs. Evolution Detection.&lt;/strong&gt; Some changes are deliberate. "Actually, let's do it differently" — that's evolution, it should be welcomed. Some changes are accidental — lost context, re-derivation from incomplete information. That's drift, it should be flagged. The agent currently has no mechanism to tell the difference. This feels like the most important unsolved problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Goal Coherence.&lt;/strong&gt; After enough topic switches and compactions, the agent can be working diligently on something that no longer serves any stated goal. It's busy. It's productive. It's pointless. A periodic alignment check — "does what I'm doing right now connect to any goal?" — shouldn't be hard to implement. But I haven't seen it anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Counterfactual Awareness.&lt;/strong&gt; The agent should know what it &lt;em&gt;doesn't&lt;/em&gt; know. "I have no memory of this topic before March 5" is useful and honest. Confidently filling that gap with plausible-sounding history is dangerous. Most agents treat absence of memory as absence of events. That's backwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural Sketches (Not Blueprints)
&lt;/h2&gt;

&lt;p&gt;A few patterns that emerged from specific failures:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Immutable Decision Log.&lt;/strong&gt; Decisions are append-only entries, each hash-chained to the previous. You can reverse a decision — only by appending a REVERSAL entry that references the original. A second agent audits the hash chain. If the primary agent edits history, the chain breaks, the auditor catches it. The log is tamper-evident by construction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event Sourcing for Context.&lt;/strong&gt; Instead of storing "the current state of topic X" — a summary that goes stale the moment it's written — store the events that produced the state. Decisions, exchanges, memory entries: all append-only. When switching to a topic, replay events to compute current state. The materialized view is disposable and deterministic. If it's wrong or stale, regenerate it from the source. The events are the truth; the view is just a lens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Coherence Check.&lt;/strong&gt; Context loads in two explicitly labeled parts: &lt;em&gt;factual state&lt;/em&gt; (computed from the event log — mechanical, no LLM in the path) and &lt;em&gt;prior impression&lt;/em&gt; (the agent's own session-end summary, written with full context). If they don't match, it's a signal. The impression acts as an index of what &lt;em&gt;should&lt;/em&gt; be present. Gaps drive retrieval. It's a self-healing mechanism — the agent notices its own incoherence and resolves it before proceeding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory Access Governance.&lt;/strong&gt; The whole field is focused on giving agents more memory — richer retrieval, better recall, higher accuracy. Nobody is asking who controls &lt;em&gt;what the agent is allowed to retrieve&lt;/em&gt;. My agent will consistently reach for a direct file read over a vector search, which means it's curating its own context input. That's not a retrieval problem — it's a governance problem. &lt;em&gt;Who decides what the agent sees, and when, and how?&lt;/em&gt; The approach I arrived at connects to a broader pattern I'll cover in the next article in this series.&lt;/p&gt;

&lt;p&gt;These are sketches, not working code. Each one came from watching something break.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Don't Have Yet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-topic coherence&lt;/strong&gt; — reasoning about Topic A while inside Topic B, without a full context switch. Microsoft's Sam Schillace named this the "disconnected models problem" and it remains unsolved at the architectural level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncertainty expression&lt;/strong&gt; — "I'm not confident about this" that's &lt;em&gt;actionable&lt;/em&gt;, not just hedging. Uncertainty quantification is well-researched (&lt;a href="https://arxiv.org/abs/2601.15703" rel="noopener noreferrer"&gt;arXiv 2601.15703&lt;/a&gt; is the closest to what's needed here), but turning it into useful agent behaviour in a persistent context is a different problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporal reasoning&lt;/strong&gt; — memories are organised by file, not by time. "When did we decide X?" is surprisingly hard. Zep's temporal knowledge graph and Hindsight's memory architecture both make progress here, but neither addresses decision provenance specifically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working implementations&lt;/strong&gt; — the decision log, event sourcing, coherence checks: all of this is still design. No reference implementations to point to.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Question I'm Left With
&lt;/h2&gt;

&lt;p&gt;Every persistent agent framework I've seen focuses on &lt;em&gt;giving&lt;/em&gt; the agent memory. None of them ask: how does the agent know it can trust that memory?&lt;/p&gt;

&lt;p&gt;The trust and identity layer — who are you, can I verify you — is being built. ERC-8004 and similar protocols are on it. But the epistemic layer — decision provenance, drift detection, self-trust — is wide open.&lt;/p&gt;

&lt;p&gt;We stumbled into this by watching failures that don't show up in the standard documentation. Not hallucination — that's well-documented and actively defended. Not prompt injection — same. This is subtler: an agent that slowly, silently loses coherence with its own past.&lt;/p&gt;

&lt;p&gt;What's your agent's epistemic failure mode? What breaks when it runs long enough?&lt;/p&gt;

&lt;p&gt;I'm genuinely asking — because this is being built in the open, and we don't have anywhere near all the answers.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next in the series: how TSVC evolves as topics accumulate. What happens when you have 50 topics, some dormant, some interrelated, and the agent needs to reason across them without loading all of them?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm &lt;a href="https://dev.to/mouserider"&gt;@MouseRider&lt;/a&gt; on Dev.to and &lt;a href="https://linkedin.com/in/oleksandr-tsukanov" rel="noopener noreferrer"&gt;Alex Tsukanov on LinkedIn&lt;/a&gt;. The conversation continues.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>TSVC: Treating AI Conversation Topics as Virtual Processes</title>
      <dc:creator>MouseRider</dc:creator>
      <pubDate>Tue, 10 Mar 2026 19:13:01 +0000</pubDate>
      <link>https://forem.com/mouserider/tsvc-treating-ai-conversation-topics-as-virtual-processes-pa8</link>
      <guid>https://forem.com/mouserider/tsvc-treating-ai-conversation-topics-as-virtual-processes-pa8</guid>
      <description>&lt;p&gt;Persistent AI agents have a memory problem that isn't about memory size. It's about isolation.&lt;/p&gt;

&lt;p&gt;Run a single-session agent long enough across multiple domains — coding, finance, personal logistics — and you'll hit a wall. In my case, "long enough" was 6 days of heavy daily use. Compaction events blend everything into a lossy average. The agent starts reaching across domains, contaminating answers with irrelevant context. Chroma Research named this "context rot" in 2025. The problem is well-documented. The solutions are incomplete.&lt;/p&gt;

&lt;p&gt;This post describes TSVC (Topic-Scoped Virtual Context): a system that treats AI conversation topics the way an OS treats processes. Separate address spaces. Controlled isolation. Topic-scoped compaction. I guided my agent to build it for a persistent Claude setup running on OpenClaw, measured 126 production topic switches across 12 topics with 3,735 exchanges tracked, and reduced per-topic compactions to a few on the heavy one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design Philosophy: One Coordinator, Many Specialists
&lt;/h2&gt;

&lt;p&gt;TSVC is designed specifically for the &lt;strong&gt;personal assistant model&lt;/strong&gt; — one main agent as a single point of contact for everything.&lt;/p&gt;

&lt;p&gt;The alternative is a swarm of specialized agents: a Finance Agent, a DevOps Agent, a Research Agent, each expert in its domain. This is the dominant pattern right now — every blog post, every framework, every tutorial in the agentic AI space pushes you toward building multiple dedicated agents. It has real appeal. But it has a fundamental UX problem: the user becomes the orchestrator. You switch between agents, you carry context across them, you remember which agent knows which decisions. The cognitive overload doesn't disappear — it moves from the AI to you. The person the AI was supposed to help is now managing a team of AIs.&lt;/p&gt;

&lt;p&gt;The personal assistant model is different. One main agent — not an expert in everything, but aware of everything. It knows enough about each domain to hold a conversation, make connections across topics, and query a shared knowledge base when it needs details. It's the coordinator, not the specialist.&lt;/p&gt;

&lt;p&gt;The specialized work gets delegated to &lt;strong&gt;dedicated specialist peer-agents&lt;/strong&gt;. A finance agent, an infrastructure agent, a research agent — each deep in its domain. The coordinator creates tasks for them, monitors their progress, receives their reports, communicates with them directly. They update their status, deliver results, stay in their lane.&lt;/p&gt;

&lt;p&gt;And when the user needs to go deep — really deep — into a specific domain, they &lt;em&gt;can&lt;/em&gt; talk to a specialist directly. But only when they actually need to. Not as the default workflow. Most of the time, the user talks to one entity who handles everything on their behalf. The agent delegates to specialized workers when needed, monitors their output, and presents results. One conversation thread, full continuity, everything remembered.&lt;/p&gt;

&lt;p&gt;But this design creates a specific technical problem that the swarm model doesn't have: &lt;strong&gt;context mixing&lt;/strong&gt;. When the coordinator accumulates conversation across many domains, topics bleed into each other. In my case, this happened within days of heavy use — not months. Financial discussions surface infrastructure details. Family decisions contaminate DevOps answers. Over time, the context window becomes a lossy average of everything. &lt;a href="https://research.trychroma.com/context-rot" rel="noopener noreferrer"&gt;Chroma Research&lt;/a&gt; named this "context rot" in 2025.&lt;/p&gt;

&lt;p&gt;This is the problem TSVC solves. Not for swarm architectures (they distribute context externally) — for the coordinator model, where one agent holds it all. The OS process metaphor provides the solution: give each topic its own isolated address space, manage switching explicitly, and share only what should be shared.&lt;/p&gt;




&lt;h2&gt;
  
  
  The OS Metaphor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;MemGPT&lt;/a&gt; (Packer et al., 2023) used the OS memory model as a foundation for AI agent memory — virtual memory paging, with a limited "physical" context window managed by an LLM-driven memory controller. It was a useful framework. But virtual memory is only half the OS story.&lt;/p&gt;

&lt;p&gt;The other half is the process model.&lt;/p&gt;

&lt;p&gt;Starting with &lt;a href="https://ethw.org/Milestones:Atlas_Computer_and_the_Invention_of_Virtual_Memory,_1957-1962" rel="noopener noreferrer"&gt;Atlas&lt;/a&gt; (1962) and maturing through Unix (1970s), each process gets its own virtual address space. Context switches between processes save and restore complete state. One process cannot corrupt another's memory. The scheduler manages which process has access to the CPU at any moment.&lt;/p&gt;

&lt;p&gt;Apply this to AI agent conversations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;process&lt;/strong&gt; maps to a &lt;strong&gt;topic&lt;/strong&gt; (a coherent conversation domain)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;virtual address space&lt;/strong&gt; maps to &lt;strong&gt;topic context&lt;/strong&gt; (isolated conversation + decisions + state)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;scheduler&lt;/strong&gt; maps to a &lt;strong&gt;topic detector&lt;/strong&gt; (determines which topic owns the current message)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;context switch&lt;/strong&gt; maps to a &lt;strong&gt;topic switch&lt;/strong&gt; (save current state → load target state → fresh session)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IPC&lt;/strong&gt; (inter-process communication) maps to a &lt;strong&gt;shared facts layer&lt;/strong&gt; (SSoT files accessible to all topics)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't just a metaphor — it's a design specification. Each architectural decision in TSVC follows directly from this mapping.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The system has three persistent layers and one ephemeral one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Kernel Layer (always in context, ~15-20k tokens):&lt;/strong&gt;&lt;br&gt;
System prompt, identity, tool definitions, agent configuration. Fixed overhead. Does not change between topic switches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Topic Awareness Layer (~3k tokens):&lt;/strong&gt;&lt;br&gt;
A lightweight topic index loaded at every session start. Contains topic IDs, titles, last-active timestamps, and one-line summaries. The agent can see what topics exist and roughly what's in them without loading any context. This keeps awareness overhead minimal while enabling intelligent topic detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-Topic Context Files (10-85KB each, on disk):&lt;/strong&gt;&lt;br&gt;
Each topic maintains a context file with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Active decisions and their dependency chains&lt;/li&gt;
&lt;li&gt;Open items and action tracking&lt;/li&gt;
&lt;li&gt;Working files and artifacts&lt;/li&gt;
&lt;li&gt;Compressed recent exchanges (not raw transcripts)&lt;/li&gt;
&lt;li&gt;One-line topic summary for the index&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only the active topic's context file loads into the session. All others stay on disk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Shared Facts Layer:&lt;/strong&gt;&lt;br&gt;
SSoT (Single Source of Truth) files that all topics can read. User profile, long-term memory, facts that span domains. This is the "IPC" that lets topics communicate without contaminating each other's isolated contexts.&lt;/p&gt;

&lt;p&gt;Here's the conceptual layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────┐
│               KERNEL (Always in Context)                     │
│  System prompt, identity, tools, shared facts                │
│  ~15-20k tokens                                              │
└──────────────────────────────────────────────────────────────┘

┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐
│ Topic A      │  │ Topic B      │  │ Topic C      │  │ Topic D      │
│ [ACTIVE]     │  │ [PAGED]      │  │ [PAGED]      │  │ [PAGED]      │
│ ~20KB        │  │ on disk      │  │ on disk      │  │ on disk      │
└──────────────┘  └──────────────┘  └──────────────┘  └──────────────┘

┌──────────────────────────────────────────────────────────────┐
│            Topic Awareness Layer (~3k tokens)                │
│  ID, title, last_active, summary per topic                   │
└──────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How a Topic Switch Works
&lt;/h2&gt;

&lt;p&gt;Topic switches require a clean session reset to guarantee context isolation. The system handles this transparently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A message arrives → the gateway plugin runs &lt;code&gt;detect-topic-switch.js&lt;/code&gt; before the LLM sees it&lt;/li&gt;
&lt;li&gt;Topic match detected → &lt;code&gt;tsvc-switch.sh&lt;/code&gt; saves current topic context to disk&lt;/li&gt;
&lt;li&gt;A session reset is triggered in the background&lt;/li&gt;
&lt;li&gt;The user's next message creates a fresh session → &lt;code&gt;tsvc-boot.sh&lt;/code&gt; loads the pending topic context&lt;/li&gt;
&lt;li&gt;The agent responds with full target topic context, zero cross-topic contamination&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The topic detection script uses fuzzy title matching first, then semantic classification fallback. This keeps topic detection deterministic and free — no LLM tokens required to parse "switch to finance topic."&lt;/p&gt;

&lt;p&gt;The core topic manager (&lt;code&gt;tsvc-manager.js&lt;/code&gt;) handles the state transitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Save outgoing topic state (inside cmdSwitch)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prevState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;loadTopicState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previousId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;paged&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastActive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;saveTopicState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previousId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Write context snapshot to disk for boot-time loading&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderTopicContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previousId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`tsvc/contexts/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;previousId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.md`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// On boot: load target topic from pending-reset.json&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pending&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tsvc/pending-reset.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`tsvc/contexts/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toTopic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.md`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unlinkSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tsvc/pending-reset.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The boot sequence runs at every session start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# tsvc-boot.sh — runs on every session start&lt;/span&gt;

&lt;span class="nv"&gt;PENDING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TSVC_DIR&lt;/span&gt;&lt;span class="s2"&gt;/pending-reset.json"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PENDING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"type":"normal_boot"}'&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nv"&gt;TARGET_TOPIC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.toTopic.id'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PENDING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;CONTEXT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="s2"&gt;"tsvc/contexts/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_TOPIC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.md"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PENDING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--arg&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s2"&gt;"topic_switch"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--arg&lt;/span&gt; targetTopic &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$TARGET_TOPIC&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--arg&lt;/span&gt; context &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONTEXT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'{type: $type, targetTopic: $targetTopic, context: $context}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Topic Spawn: Mid-Conversation Splits
&lt;/h2&gt;

&lt;p&gt;Sometimes you're deep in a topic and realize the last twenty exchanges have been their own thing. They deserve their own isolated context going forward. TSVC supports this with &lt;strong&gt;Topic Spawn&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: "This is a new topic — create 'GPU Troubleshooting'"
              │
              ▼
┌────────────────────────┐
│ LLM: scan exchanges    │──────► "Line 47 is where GPU talk started"
│ for semantic boundary  │
└─────────────┬──────────┘
              │
              ▼
┌────────────────────────┐
│ tsvc-spawn.sh          │──────► Create topic, move lines 47+,
│ "GPU Troubleshoot"     │    update counts, refresh contexts
│ 47                     │
└─────────────┬──────────┘
              │
              ▼
┌────────────────────────┐
│ Self-reset             │──────► Next message → fresh session
│ (delete + wait)        │    with new topic loaded
└────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Protocol:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trigger&lt;/strong&gt;: Explicit user request only. No auto-detection (too many false positives; assessed and backlogged)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic boundary&lt;/strong&gt;: LLM scans &lt;code&gt;conversation.jsonl&lt;/code&gt; backwards to find where the new discussion semantically started. Judgment call — no heuristic reliably detects topic drift inflection points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execute&lt;/strong&gt;: &lt;code&gt;tsvc-spawn.sh "&amp;lt;title&amp;gt;" &amp;lt;from_line&amp;gt;&lt;/code&gt; — creates the new topic and &lt;strong&gt;moves&lt;/strong&gt; exchanges (not copies). Exchange ownership is exclusive; one topic per exchange&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch&lt;/strong&gt;: Normal self-reset fires → next message lands in the new topic&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Topic Spawn makes three operation types total: spawn, switch, close.&lt;/p&gt;




&lt;h2&gt;
  
  
  Per-Topic State Management
&lt;/h2&gt;

&lt;p&gt;Each topic maintains a living &lt;code&gt;where-are-we.md&lt;/code&gt; file with structured sections managed by &lt;code&gt;tsvc-state.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Key Facts&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Repo: github.com/MouseRider/skills-tsvc
&lt;span class="p"&gt;-&lt;/span&gt; Whisper prompt: "tsvc, tsvc-manager, tsvc-boot, tsvc-spawn, OpenClaw, whisper_prompt"

&lt;span class="gu"&gt;## In Progress&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Write Show HN post

&lt;span class="gu"&gt;## Pending Notifications&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [sub-agent:1ab2c3] tsvc-spawn.sh implementation complete

&lt;span class="gu"&gt;## Recently Completed&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] tsvc-vocab.sh v1 merged

&lt;span class="gu"&gt;## Next Actions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Review spawn edge cases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;tsvc-state.sh&lt;/code&gt; operations: &lt;code&gt;show&lt;/code&gt;, &lt;code&gt;append&lt;/code&gt;, &lt;code&gt;complete&lt;/code&gt;, &lt;code&gt;finalize&lt;/code&gt;, &lt;code&gt;clear-notifications&lt;/code&gt;. The first thing loaded when a topic resumes is this file — it answers "where were we?" without requiring the agent to re-read conversation history.&lt;/p&gt;




&lt;h2&gt;
  
  
  Topic-Scoped Transcription Vocabulary
&lt;/h2&gt;

&lt;p&gt;Voice input introduces a domain-specific transcription problem. Whisper's accuracy degrades when it encounters specialized terms it hasn't seen in training. A static global vocabulary causes the opposite problem: terms from unrelated topics interfere with each other.&lt;/p&gt;

&lt;p&gt;TSVC solves this with per-topic transcription vocabulary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐    ┌──────────────────┐    ┌──────────────┐
│ Topic Switch /  │───►│  tsvc-vocab.sh   │───►│ active-      │
│ Boot            │    │  sync            │    │ whisper-     │
└─────────────────┘    └──────────────────┘    │ prompt.txt   │
                                               └──────┬───────┘
                                                      │
                       ┌────────────────────┐         │
   Audio message ─────►│ tsvc-transcribe    │◄────────┘
                       │ .sh (CLI wrapper)  │
                       │ → OpenAI Whisper   │
                       │ + topic vocabulary │
                       └────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each topic's &lt;code&gt;where-are-we.md&lt;/code&gt; Key Facts section includes a &lt;code&gt;Whisper prompt:&lt;/code&gt; field. On topic boot or switch, &lt;code&gt;tsvc-vocab.sh sync&lt;/code&gt; updates &lt;code&gt;active-whisper-prompt.txt&lt;/code&gt;. &lt;code&gt;tsvc-transcribe.sh&lt;/code&gt; passes this to the Whisper API as the &lt;code&gt;prompt&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;Result: when you're in the Trading topic, Whisper knows "iron condor" and "theta decay." When you're in DevOps, it knows your infrastructure codenames. Neither vocabulary pollutes the other.&lt;/p&gt;

&lt;p&gt;This mirrors a broader pattern in voice-to-agent pipelines: domain-specific vocabulary is a first-class concern. TSVC adds a dimension those approaches lack — per-topic dynamism.&lt;/p&gt;




&lt;h2&gt;
  
  
  Async Result Routing
&lt;/h2&gt;

&lt;p&gt;Sub-agents complete work asynchronously, often while the user is in a different topic. Without routing, results arrive in the wrong context.&lt;/p&gt;

&lt;p&gt;TSVC routes sub-agent results via board task &lt;code&gt;topic:&lt;/code&gt; tags:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sub-agent completes → result arrives in main session&lt;/li&gt;
&lt;li&gt;Plugin Phase 0 detects it's a sub-agent message (not user input)&lt;/li&gt;
&lt;li&gt;Strategy C routing: extract &lt;code&gt;[task:task_ID]&lt;/code&gt; → board tag lookup, or keyword match against topic titles&lt;/li&gt;
&lt;li&gt;If topic is &lt;strong&gt;paged&lt;/strong&gt; → file as notification in that topic's &lt;code&gt;where-are-we.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If topic is &lt;strong&gt;active&lt;/strong&gt; → pass through for normal processing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the user returns to the paged topic, &lt;code&gt;where-are-we.md&lt;/code&gt; shows the pending notification. Nothing is lost because the active topic was somewhere else.&lt;/p&gt;




&lt;h2&gt;
  
  
  Unified Operations Logging
&lt;/h2&gt;

&lt;p&gt;All TSVC scripts log to &lt;code&gt;tsvc/logs/tsvc-ops.log&lt;/code&gt; via a shared &lt;code&gt;tsvc-log.sh&lt;/code&gt; helper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Every script sources this, passing its own name&lt;/span&gt;
&lt;span class="nb"&gt;source &lt;/span&gt;tsvc/scripts/tsvc-log.sh &lt;span class="s2"&gt;"BOOT"&lt;/span&gt;

tsvc_log INFO &lt;span class="s2"&gt;"Normal boot, active topic: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACTIVE_TOPIC&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
tsvc_log INFO &lt;span class="s2"&gt;"Switch initiated: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FROM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; → &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TO&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
tsvc_log WARN &lt;span class="s2"&gt;"Boundary detection returned line 0, defaulting to 10"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Format: &lt;code&gt;[2026-03-07 02:23:01 PM PT] [BOOT] [INFO] Normal boot, active topic: trading&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When something breaks, the full event trace is one command: &lt;code&gt;tail -100 tsvc/logs/tsvc-ops.log&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Decision Dependency Tracking
&lt;/h2&gt;

&lt;p&gt;Standard context systems store &lt;em&gt;what&lt;/em&gt; was decided. TSVC also stores &lt;em&gt;why&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The core insight from the development process: compaction doesn't just lose conversations, it loses causality chains. An agent that remembers "we chose approach X" without remembering "because Y ruled out approaches A and B" will eventually contradict past decisions without realizing it.&lt;/p&gt;

&lt;p&gt;Each decision in TSVC can carry dependency links:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Log a decision with its dependency chain&lt;/span&gt;
&lt;span class="nx"&gt;tsvc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;topic_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Use Delete+Wait for session reset&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;depends&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sessions_send deadlocks within active turn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;// Query the full chain&lt;/span&gt;
&lt;span class="nx"&gt;tsvc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;topic_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;decision_id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Output: dec_47eb → "sessions_send deadlocks"&lt;/span&gt;
&lt;span class="c1"&gt;//              └─► dec_b1d9 → "delete+wait confirmed working"&lt;/span&gt;
&lt;span class="c1"&gt;//                       └─► dec_f0f2 → "final self-reset approach"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On context reload after a switch, the dependency chain renders with the root decision's full reasoning path. The agent doesn't need to reconstruct "why did we do this" from fragments — it's preserved explicitly.&lt;/p&gt;

&lt;p&gt;This is the highest-ROI component in the system. It directly prevents the failure mode where an agent "improves" something that was deliberately built a specific way for reasons that are no longer visible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sentiment Hygiene
&lt;/h2&gt;

&lt;p&gt;Memory that survives context switches should be operationally useful, not emotionally colored. The memory protocol filters emotional valence before facts hit persistent storage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Alex seemed frustrated with the Docker setup" → &lt;strong&gt;dropped or rewritten&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;"Docker setup is blocked on X" → &lt;strong&gt;kept&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;"This was a rough debugging session" → &lt;strong&gt;dropped&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;"Root cause: race condition in tsvc-boot.sh line 47" → &lt;strong&gt;kept&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mood doesn't follow you into the next session; the operational fact does. Over time this meaningfully reduces context pollution — persistent memory that describes feelings instead of facts is noise.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison to Prior Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;MemGPT&lt;/a&gt;&lt;/strong&gt; addresses the context window size problem through virtual memory paging — offloading older content to external storage and retrieving it on demand. It doesn't address the isolation problem. All topics still share the same paged pool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://arxiv.org/abs/2504.19413" rel="noopener noreferrer"&gt;Mem0&lt;/a&gt;&lt;/strong&gt; is excellent for persistent fact extraction across sessions. It handles "remember that I prefer X" and "what did I decide about Y last month" well. It doesn't handle conversational thread isolation — you can't give financial discussions and infrastructure debugging separate, clean windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://arxiv.org/abs/2510.00615" rel="noopener noreferrer"&gt;ACON&lt;/a&gt;&lt;/strong&gt; (Zhang et al., 2025) uses observation masking to reduce token usage. It operates within a single context window and doesn't provide cross-topic isolation.&lt;/p&gt;

&lt;p&gt;TSVC doesn't replace any of these — it operates at a different layer. Mem0 facts live in the shared facts layer (accessible to all topics). ACON-style filtering applies within each topic's exchange logger. MemGPT's paging could theoretically sit beneath the per-topic context files.&lt;/p&gt;

&lt;p&gt;The key gap TSVC fills: no existing system gives each conversation domain its own isolated context that survives independently across sessions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cognitive switching costs&lt;/strong&gt; — 2014 APA research shows &lt;a href="https://www.apa.org/topics/research/multitasking" rel="noopener noreferrer"&gt;40% productivity loss from task switching&lt;/a&gt;. TSVC's topic isolation mirrors this insight: keeping contexts separate reduces the "switching tax" for both the agent and the user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://blog.langchain.com/context-management-for-deepagents/" rel="noopener noreferrer"&gt;LangChain context management&lt;/a&gt;&lt;/strong&gt; (Jan 2026) describes offload + summarize strategies for single-task agents. TSVC extends this to multi-topic agents with persistent isolation between them.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Production operation on a Telegram-based persistent assistant (running Claude via OpenClaw on an Intel NUC):&lt;/p&gt;

&lt;p&gt;Before TSVC (after 10 days of daily use): 8.5 MB session file, 3,140 lines, 21 global compactions, zero topic isolation.&lt;/p&gt;

&lt;p&gt;After TSVC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-topic session files: &lt;strong&gt;&amp;lt;350 KB&lt;/strong&gt; (versus 8.5 MB global)&lt;/li&gt;
&lt;li&gt;Compactions per heavy topic per day: &lt;strong&gt;0~1&lt;/strong&gt; — keep AI context longer&lt;/li&gt;
&lt;li&gt;Topic switches: &lt;strong&gt;126 recorded&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Active topics: &lt;strong&gt;12&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Exchanges tracked: &lt;strong&gt;3,735&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Switch failure rate: &lt;strong&gt;&amp;lt;1%&lt;/strong&gt; (one anomalous 16-minute switch, under investigation)&lt;/li&gt;
&lt;li&gt;Median switch time: &lt;strong&gt;31 seconds&lt;/strong&gt; (V3/current — down from 140s in V2, 77% improvement)&lt;/li&gt;
&lt;li&gt;Context load on switch: 10-85 KB (versus 8.5 MB)&lt;/li&gt;
&lt;li&gt;Load-to-first-reply: consistently 11-19 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reduced compaction number is the key result. High compaction number was caused by context rot from topic mixing. TSVC eliminates the cause, so the symptom disappears.&lt;/p&gt;




&lt;h2&gt;
  
  
  Portability
&lt;/h2&gt;

&lt;p&gt;TSVC is a pattern. The implementation is OpenClaw-specific in one place: the session reset mechanism. Everything else is portable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fully portable (zero changes):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topic context files (markdown on disk)&lt;/li&gt;
&lt;li&gt;Topic index (&lt;code&gt;index.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Topic detection script (standalone Node.js)&lt;/li&gt;
&lt;li&gt;Decision dependency tracking (stored in context files)&lt;/li&gt;
&lt;li&gt;Context save/load logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Platform-specific (adapt per harness):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session reset: how you clear conversation history and start fresh&lt;/li&gt;
&lt;li&gt;Event hooks: where you intercept messages before the LLM&lt;/li&gt;
&lt;li&gt;Context injection: how topic context enters the system prompt&lt;/li&gt;
&lt;li&gt;Boot hook: how you run initialization code on session start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;template/&lt;/code&gt; directory in the repo contains &lt;code&gt;tsvc_adapter.py&lt;/code&gt; — a Python base class with three abstract methods:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TSVCAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ABC&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_topic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;topics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Topic&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Topic&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return matched topic or None if no switch needed.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;  
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reset_session&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pending_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Clear conversation history and prepare for fresh session.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="nd"&gt;@abstractmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inject_context&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;topic_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Make topic context available at session start.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any agent harness with file system access, a session reset mechanism, and a startup hook can run TSVC.&lt;/p&gt;

&lt;p&gt;Known-compatible platforms: OpenClaw (production), Claude Code / Codex (AGENTS.md + file system), Cursor / Windsurf (rules files + session management), LangChain / LangGraph (checkpointing as natural reset points).&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Missing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Semantic thread detection.&lt;/strong&gt; Current context loading grabs the last N exchanges. A smarter approach would detect where the current &lt;em&gt;sub-thread&lt;/em&gt; started using time gaps and keyword shift heuristics, then load the semantically relevant exchanges rather than just the most recent ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The 16-minute anomaly.&lt;/strong&gt; One switch took 954 seconds. This is likely session file locking during concurrent cron activity, but it's unconfirmed. For a production system serving multiple users, this tail latency matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lobster integration.&lt;/strong&gt; The switch pipeline has a Lobster-orchestrated version sitting alongside the bash implementation. It hasn't proven cleaner in practice yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better context management API.&lt;/strong&gt; Agent architecture should account for stackable context engines to modify context flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Packer et al., "MemGPT: Towards LLMs as Operating Systems" (2023) — &lt;a href="https://arxiv.org/abs/2310.08560" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2310.08560&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chroma Research, "Context Rot" (2025) — &lt;a href="https://research.trychroma.com/context-rot" rel="noopener noreferrer"&gt;https://research.trychroma.com/context-rot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mem0, "Scalable Long-Term Memory for AI Agents" (2025) — &lt;a href="https://arxiv.org/abs/2504.19413" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2504.19413&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Zhang et al., "ACON: Optimizing Context Compression" (2025) — &lt;a href="https://arxiv.org/abs/2510.00615" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2510.00615&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gümtsch, F.-R., thesis on automatic memory management (1956) — &lt;a href="https://networkencyclopedia.com/virtual-memory/" rel="noopener noreferrer"&gt;https://networkencyclopedia.com/virtual-memory/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Atlas Computer, IEEE Milestone (1962) — &lt;a href="https://ethw.org/Milestones:Atlas_Computer_and_the_Invention_of_Virtual_Memory,_1957-1962" rel="noopener noreferrer"&gt;https://ethw.org/Milestones:Atlas_Computer_and_the_Invention_of_Virtual_Memory,_1957-1962&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Denning, P.J., "Virtual Memory" (2013) — &lt;a href="https://denninginstitute.com/pjd/PUBS/ENC/CRC-vm-2013.pdf" rel="noopener noreferrer"&gt;https://denninginstitute.com/pjd/PUBS/ENC/CRC-vm-2013.pdf&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;APA, "Multitasking: Switching Costs" — &lt;a href="https://www.apa.org/topics/research/multitasking" rel="noopener noreferrer"&gt;https://www.apa.org/topics/research/multitasking&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rubinstein et al., "Multicosts of Multitasking" (2020) — &lt;a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC7075496/" rel="noopener noreferrer"&gt;https://pmc.ncbi.nlm.nih.gov/articles/PMC7075496/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LangChain, "Context Management for Deep Agents" (Jan 2026) — &lt;a href="https://blog.langchain.com/context-management-for-deepagents/" rel="noopener noreferrer"&gt;https://blog.langchain.com/context-management-for-deepagents/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Weaviate, "Context Engineering" (2025) — &lt;a href="https://weaviate.io/blog/context-engineering" rel="noopener noreferrer"&gt;https://weaviate.io/blog/context-engineering&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Letta, "Agent Memory Guide" (2024) — &lt;a href="https://www.letta.com/blog/agent-memory" rel="noopener noreferrer"&gt;https://www.letta.com/blog/agent-memory&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/MouseRider/skills-tsvc.git
&lt;span class="c"&gt;# See docs/integration.md for setup&lt;/span&gt;
&lt;span class="c"&gt;# See template/ for adapter to your platform&lt;/span&gt;
&lt;span class="c"&gt;# See docs/architecture.md for full design&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;TSVC is production software running in a real deployment. The numbers are from real use. It works. It has rough edges. The repo documents both.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built Feb 25 – Mar 8, 2026. Pull requests welcome.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;This space is moving fast. Since shipping TSVC, OpenClaw has introduced a native context-engine plugin API that opens up lower-level hooks into the session lifecycle — I'm currently experimenting with it and looking at what it means for how TSVC manages saves and loads. The shell-script-and-JSON approach got us here, but the architecture may look quite different in another iteration.&lt;/p&gt;

&lt;p&gt;If you're running a persistent agent of your own — coordinator model, swarm, anything — I'm curious what context problems you've hit and how you're handling them. And if you've looked at the new context-engine APIs in any platform, I'd especially like to compare notes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
