<?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>DEV Community: Moshe Avdiel</title>
    <description>The latest articles on DEV Community by Moshe Avdiel (@kiponos).</description>
    <link>https://dev.to/kiponos</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2975663%2F7c703462-585e-4d82-9a48-de31931d0415.png</url>
      <title>DEV Community: Moshe Avdiel</title>
      <link>https://dev.to/kiponos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kiponos"/>
    <language>en</language>
    <item>
      <title>I Have Sat Next to the Senses Wall While Agent Handoff Without Restart Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 04 Oct 2026 01:54:10 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-senses-wall-while-agent-handoff-without-restart-waited-for-a-restart-1l03</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-senses-wall-while-agent-handoff-without-restart-waited-for-a-restart-1l03</guid>
      <description>&lt;p&gt;I have sat next to the senses wall at 03:07 while Cursor was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;handoff&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;priority is a leaf, not a restart&lt;/strong&gt;. Cursor was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Cursor (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the turn budget and the open investigation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;a mid-turn interrupt the host treats as noise&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; agent handoff without restart as live posture on the senses wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: agent handoff without restart as live posture on the senses wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Cursor is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide agent handoff without restart as live posture on the senses wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;handoff&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The senses wall already &lt;em&gt;knew&lt;/em&gt;. Cursor did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The senses wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Cursor — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 03:07 ate the turn budget and the open investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Cursor tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per senses lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/multi-agent-collab-bus/handoff = live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/multi-agent-collab-bus" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/multi-agent-collab-bus&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (senses + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;multi-agent-collab-bus/&lt;/span&gt;
    &lt;span class="s"&gt;handoff&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;          &lt;span class="c1"&gt;# agent handoff without restart as live posture on the senses wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;senses/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;handoff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"multi-agent-collab-bus"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Cursor tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Cursor just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/multi-agent-collab-bus/handoff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent handoff without restart as live posture on the senses wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Cursor &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A mid-turn interrupt the host treats as noise&lt;/td&gt;
&lt;td&gt;Restart Cursor; lose the turn budget and the open investigation&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;handoff&lt;/code&gt; live; next Cursor tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old handoff&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;senses wall shows the new posture&lt;/td&gt;
&lt;td&gt;Cursor started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Cursor restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;handoff&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mirror phone already showing the new device leaf&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cursor tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per senses line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;handoff&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Cursor.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto mirror phone already showing the new device leaf.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Cursor reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 03:07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Cursor restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;handoff&lt;/code&gt;, prove Cursor recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about agent handoff without restart as live posture on the senses wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Cursor is the wrong restart target
&lt;/h2&gt;

&lt;p&gt;Cursor is good at calling tools. It is not a control plane. Killing it to flip &lt;code&gt;handoff&lt;/code&gt; teaches the on-call that judgment requires a process ID. The senses wall already disagrees.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the senses operator actually said
&lt;/h2&gt;

&lt;p&gt;At 03:07 someone said, out loud: &lt;strong&gt;priority is a leaf, not a restart&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Cursor process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/multi-agent-collab-bus &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/multi-agent-collab-bus/handoff=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;handoff&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Cursor tool at the same leaf. Do not ship a new server binary to flip agent handoff without restart as live posture on the senses wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;agent handoff without restart as live posture on the senses wall&lt;/strong&gt; requires restarting Cursor, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the senses wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/multi-agent-collab-bus&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Admin Dashboard Wall While One War-Room Headline Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sun, 04 Oct 2026 00:38:51 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-admin-dashboard-wall-while-one-war-room-headline-waited-for-a-restart-5g7j</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-admin-dashboard-wall-while-one-war-room-headline-waited-for-a-restart-5g7j</guid>
      <description>&lt;p&gt;I have sat next to the admin-dashboard wall at 11:41 while Grok Build was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;headline&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;the tile is not a rumor. it is the same tree&lt;/strong&gt;. Grok Build was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Grok Build (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the operator's last ten minutes of diagnosis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;status tile green while the agent host started earlier&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; one war-room headline as live posture on the admin-dashboard wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: one war-room headline as live posture on the admin-dashboard wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide one war-room headline as live posture on the admin-dashboard wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;headline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The admin-dashboard wall already &lt;em&gt;knew&lt;/em&gt;. Grok Build did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The admin-dashboard wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Grok Build — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 11:41 ate the operator's last ten minutes of diagnosis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Grok Build tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per admin dashboard lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/war-room-shared-truth/headline = live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/war-room-shared-truth" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/war-room-shared-truth&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (admin dashboard + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;war-room-shared-truth/&lt;/span&gt;
    &lt;span class="s"&gt;headline&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;          &lt;span class="c1"&gt;# one war-room headline as live posture on the admin-dashboard wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;admin-dashboard/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"war-room-shared-truth"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Grok Build tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Grok Build just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/war-room-shared-truth/headline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;one war-room headline as live posture on the admin-dashboard wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Grok Build &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Status tile green while the agent host started earlier&lt;/td&gt;
&lt;td&gt;Restart Grok Build; lose the operator's last ten minutes of diagnosis&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;headline&lt;/code&gt; live; next Grok Build tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old headline&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;admin-dashboard wall shows the new posture&lt;/td&gt;
&lt;td&gt;Grok Build started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Grok Build restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;headline&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Senses firing while the turn finishes blind&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok Build tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per admin dashboard line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;headline&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Grok Build.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto senses firing while the turn finishes blind.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Grok Build reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 11:41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Grok Build restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What the admin dashboard operator actually said
&lt;/h2&gt;

&lt;p&gt;At 11:41 someone said, out loud: &lt;strong&gt;the tile is not a rumor. it is the same tree&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Grok Build process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;headline&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;headline&lt;/code&gt; rarely moves alone on the admin-dashboard wall. Pair it with a timeout, a mute, or a pause so you do not fix one war-room headline as live posture on the admin-dashboard wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;headline&lt;/code&gt;, prove Grok Build recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about one war-room headline as live posture on the admin-dashboard wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/war-room-shared-truth &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/war-room-shared-truth/headline=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;headline&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Grok Build tool at the same leaf. Do not ship a new server binary to flip one war-room headline as live posture on the admin-dashboard wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;one war-room headline as live posture on the admin-dashboard wall&lt;/strong&gt; requires restarting Grok Build, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the admin-dashboard wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/war-room-shared-truth&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Mirror Phone Wall While Sre Degradation Pause Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sat, 03 Oct 2026 23:22:13 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-mirror-phone-wall-while-sre-degradation-pause-waited-for-a-restart-1bf3</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-mirror-phone-wall-while-sre-degradation-pause-waited-for-a-restart-1bf3</guid>
      <description>&lt;p&gt;I have sat next to the mirror-phone wall at 03:07 while Claude Code was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;incident-pause&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;the phone already knew the posture — the host did not&lt;/strong&gt;. Claude Code was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Claude Code (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose live device context and the current tool call&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;device leaf gone stale while the agent is mid-turn&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; SRE degradation pause as live posture on the mirror-phone wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: SRE degradation pause as live posture on the mirror-phone wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Claude Code is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide SRE degradation pause as live posture on the mirror-phone wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;incident-pause&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The mirror-phone wall already &lt;em&gt;knew&lt;/em&gt;. Claude Code did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The mirror-phone wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Claude Code — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 03:07 ate live device context and the current tool call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Claude Code tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per mirror phone lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/sre-agent-pause-mesh/incident-pause = paused
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/sre-agent-pause-mesh" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/sre-agent-pause-mesh&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (mirror phone + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;sre-agent-pause-mesh/&lt;/span&gt;
    &lt;span class="s"&gt;incident-pause&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;paused&lt;/span&gt;          &lt;span class="c1"&gt;# SRE degradation pause as live posture on the mirror-phone wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;mirror-phone/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;incident-pause&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;paused&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sre-agent-pause-mesh"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"incident-pause"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"incident-pause"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"paused"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"incident-pause"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Claude Code tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Claude Code just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/sre-agent-pause-mesh/incident-pause&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SRE degradation pause as live posture on the mirror-phone wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Claude Code &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device leaf gone stale while the agent is mid-turn&lt;/td&gt;
&lt;td&gt;Restart Claude Code; lose live device context and the current tool call&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;incident-pause&lt;/code&gt; live; next Claude Code tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old incident-pause&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mirror-phone wall shows the new posture&lt;/td&gt;
&lt;td&gt;Claude Code started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Claude Code restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;incident-pause&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin dashboard showing paused while the agent still writes&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per mirror phone line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;incident-pause&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Claude Code.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto admin dashboard showing paused while the agent still writes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Claude Code reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 03:07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Claude Code restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What the mirror phone operator actually said
&lt;/h2&gt;

&lt;p&gt;At 03:07 someone said, out loud: &lt;strong&gt;the phone already knew the posture — the host did not&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Claude Code process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;incident-pause&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;incident-pause&lt;/code&gt; rarely moves alone on the mirror-phone wall. Pair it with a timeout, a mute, or a pause so you do not fix SRE degradation pause as live posture on the mirror-phone wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;incident-pause&lt;/code&gt;, prove Claude Code recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about SRE degradation pause as live posture on the mirror-phone wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/sre-agent-pause-mesh &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/sre-agent-pause-mesh/incident-pause=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;incident-pause&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Claude Code tool at the same leaf. Do not ship a new server binary to flip SRE degradation pause as live posture on the mirror-phone wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;SRE degradation pause as live posture on the mirror-phone wall&lt;/strong&gt; requires restarting Claude Code, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the mirror-phone wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/sre-agent-pause-mesh&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Travel Wall While Mcp Tool Gates Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sat, 03 Oct 2026 22:10:27 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-travel-wall-while-mcp-tool-gates-waited-for-a-restart-199p</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-travel-wall-while-mcp-tool-gates-waited-for-a-restart-199p</guid>
      <description>&lt;p&gt;I have sat next to the travel-coordinator wall at 00:40 while Cursor was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;tools-allow&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;mute writes on the noisy room — keep reads&lt;/strong&gt;. Cursor was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Cursor (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the overbook thread the agent already paid for&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;group-chat flood during a GDS blip&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; MCP tool gates as live posture on the travel wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: MCP tool gates as live posture on the travel wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Cursor is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide MCP tool gates as live posture on the travel wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;tools-allow&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The travel-coordinator wall already &lt;em&gt;knew&lt;/em&gt;. Cursor did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The travel-coordinator wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Cursor — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 00:40 ate the overbook thread the agent already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Cursor tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per travel lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/mcp-tool-gate-live/tools-allow = search,read
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/mcp-tool-gate-live" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/mcp-tool-gate-live&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (travel + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;mcp-tool-gate-live/&lt;/span&gt;
    &lt;span class="s"&gt;tools-allow&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;search,read&lt;/span&gt;          &lt;span class="c1"&gt;# MCP tool gates as live posture on the travel wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;travel/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tools-allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;search,read&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mcp-tool-gate-live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tools-allow"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tools-allow"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"search,read"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tools-allow"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Cursor tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Cursor just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/mcp-tool-gate-live/tools-allow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search,read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search,read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MCP tool gates as live posture on the travel wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Cursor &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Group-chat flood during a gds blip&lt;/td&gt;
&lt;td&gt;Restart Cursor; lose the overbook thread the agent already paid for&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;tools-allow&lt;/code&gt; live; next Cursor tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old tools-allow&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;travel-coordinator wall shows the new posture&lt;/td&gt;
&lt;td&gt;Cursor started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Cursor restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;tools-allow&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopping admin still mutating stock mid-freeze&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cursor tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per travel line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;tools-allow&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Cursor.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto shopping admin still mutating stock mid-freeze.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Cursor reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 00:40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Cursor restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What the travel operator actually said
&lt;/h2&gt;

&lt;p&gt;At 00:40 someone said, out loud: &lt;strong&gt;mute writes on the noisy room — keep reads&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Cursor process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;tools-allow&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tools-allow&lt;/code&gt; rarely moves alone on the travel-coordinator wall. Pair it with a timeout, a mute, or a pause so you do not fix MCP tool gates as live posture on the travel wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;tools-allow&lt;/code&gt;, prove Cursor recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about MCP tool gates as live posture on the travel wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/mcp-tool-gate-live &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/mcp-tool-gate-live/tools-allow=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;tools-allow&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Cursor tool at the same leaf. Do not ship a new server binary to flip MCP tool gates as live posture on the travel wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;MCP tool gates as live posture on the travel wall&lt;/strong&gt; requires restarting Cursor, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the travel-coordinator wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/mcp-tool-gate-live&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Shopping Wall While Token Budgets Mid-Run Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sat, 03 Oct 2026 21:07:22 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-shopping-wall-while-token-budgets-mid-run-waited-for-a-restart-3ac</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-shopping-wall-while-token-budgets-mid-run-waited-for-a-restart-3ac</guid>
      <description>&lt;p&gt;I have sat next to the shopping-admin wall at 22:19 while Grok Build was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;max-tokens&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;disable inventory writes — keep search&lt;/strong&gt;. Grok Build was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Grok Build (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose cart forensics and the open SKU thread&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;flash-freeze on SKU writes&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; token budgets mid-run as live posture on the shopping wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: token budgets mid-run as live posture on the shopping wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide token budgets mid-run as live posture on the shopping wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;max-tokens&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The shopping-admin wall already &lt;em&gt;knew&lt;/em&gt;. Grok Build did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags cover this&lt;/td&gt;
&lt;td&gt;Flags are another product, another delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paste the new max-tokens into chat&lt;/td&gt;
&lt;td&gt;Two agents, two pastes, two lies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The shopping-admin wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Grok Build — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 22:19 ate cart forensics and the open SKU thread&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Grok Build tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per shopping lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/agent-budget-token-live/max-tokens = 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/agent-budget-token-live" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/agent-budget-token-live&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (shopping + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;agent-budget-token-live/&lt;/span&gt;
    &lt;span class="s"&gt;max-tokens&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;          &lt;span class="c1"&gt;# token budgets mid-run as live posture on the shopping wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;shopping/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;max-tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"agent-budget-token-live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"max-tokens"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"max-tokens"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"8000"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"max-tokens"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Grok Build tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Grok Build just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/agent-budget-token-live/max-tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token budgets mid-run as live posture on the shopping wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Grok Build &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flash-freeze on sku writes&lt;/td&gt;
&lt;td&gt;Restart Grok Build; lose cart forensics and the open SKU thread&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;max-tokens&lt;/code&gt; live; next Grok Build tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old max-tokens&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shopping-admin wall shows the new posture&lt;/td&gt;
&lt;td&gt;Grok Build started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Grok Build restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;max-tokens&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Travel coordinator still sending into a muted channel&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok Build tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per shopping line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;max-tokens&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Grok Build.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto travel coordinator still sending into a muted channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Grok Build reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 22:19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Grok Build restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;max-tokens&lt;/code&gt;, prove Grok Build recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about token budgets mid-run as live posture on the shopping wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Grok Build is the wrong restart target
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at calling tools. It is not a control plane. Killing it to flip &lt;code&gt;max-tokens&lt;/code&gt; teaches the on-call that judgment requires a process ID. The shopping-admin wall already disagrees.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the shopping operator actually said
&lt;/h2&gt;

&lt;p&gt;At 22:19 someone said, out loud: &lt;strong&gt;disable inventory writes — keep search&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Grok Build process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/agent-budget-token-live &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/agent-budget-token-live/max-tokens=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;max-tokens&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Grok Build tool at the same leaf. Do not ship a new server binary to flip token budgets mid-run as live posture on the shopping wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;token budgets mid-run as live posture on the shopping wall&lt;/strong&gt; requires restarting Grok Build, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the shopping-admin wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/agent-budget-token-live&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Senses Wall While Agent Handoff Without Restart Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sat, 03 Oct 2026 01:33:28 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-senses-wall-while-agent-handoff-without-restart-waited-for-a-restart-2ihn</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-senses-wall-while-agent-handoff-without-restart-waited-for-a-restart-2ihn</guid>
      <description>&lt;p&gt;I have sat next to the senses wall at 11:41 while Cursor was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;handoff&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;priority is a leaf, not a restart&lt;/strong&gt;. Cursor was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Cursor (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the turn budget and the open investigation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;a mid-turn interrupt the host treats as noise&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; agent handoff without restart as live posture on the senses wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: agent handoff without restart as live posture on the senses wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Cursor is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide agent handoff without restart as live posture on the senses wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;handoff&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The senses wall already &lt;em&gt;knew&lt;/em&gt;. Cursor did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Restart Cursor — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 11:41 ate the turn budget and the open investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags cover this&lt;/td&gt;
&lt;td&gt;Flags are another product, another delay&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Cursor tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per senses lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/multi-agent-collab-bus/handoff = live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/multi-agent-collab-bus" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/multi-agent-collab-bus&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (senses + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;multi-agent-collab-bus/&lt;/span&gt;
    &lt;span class="s"&gt;handoff&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;          &lt;span class="c1"&gt;# agent handoff without restart as live posture on the senses wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;senses/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;handoff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"multi-agent-collab-bus"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Cursor tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Cursor just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/multi-agent-collab-bus/handoff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent handoff without restart as live posture on the senses wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Cursor &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A mid-turn interrupt the host treats as noise&lt;/td&gt;
&lt;td&gt;Restart Cursor; lose the turn budget and the open investigation&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;handoff&lt;/code&gt; live; next Cursor tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old handoff&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;senses wall shows the new posture&lt;/td&gt;
&lt;td&gt;Cursor started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Cursor restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;handoff&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mirror phone already showing the new device leaf&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cursor tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per senses line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;handoff&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Cursor.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto mirror phone already showing the new device leaf.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Cursor reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 11:41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Cursor restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;handoff&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;handoff&lt;/code&gt; rarely moves alone on the senses wall. Pair it with a timeout, a mute, or a pause so you do not fix agent handoff without restart as live posture on the senses wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;handoff&lt;/code&gt;, prove Cursor recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about agent handoff without restart as live posture on the senses wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Cursor is the wrong restart target
&lt;/h2&gt;

&lt;p&gt;Cursor is good at calling tools. It is not a control plane. Killing it to flip &lt;code&gt;handoff&lt;/code&gt; teaches the on-call that judgment requires a process ID. The senses wall already disagrees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/multi-agent-collab-bus &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/multi-agent-collab-bus/handoff=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;handoff&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Cursor tool at the same leaf. Do not ship a new server binary to flip agent handoff without restart as live posture on the senses wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;agent handoff without restart as live posture on the senses wall&lt;/strong&gt; requires restarting Cursor, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the senses wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/multi-agent-collab-bus&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Admin Dashboard Wall While One War-Room Headline Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Sat, 03 Oct 2026 00:30:05 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-admin-dashboard-wall-while-one-war-room-headline-waited-for-a-restart-4fcn</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-admin-dashboard-wall-while-one-war-room-headline-waited-for-a-restart-4fcn</guid>
      <description>&lt;p&gt;I have sat next to the admin-dashboard wall at 11:41 while Grok Build was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;headline&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;the tile is not a rumor. it is the same tree&lt;/strong&gt;. Grok Build was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Grok Build (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the operator's last ten minutes of diagnosis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;status tile green while the agent host started earlier&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; one war-room headline as live posture on the admin-dashboard wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: one war-room headline as live posture on the admin-dashboard wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide one war-room headline as live posture on the admin-dashboard wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;headline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The admin-dashboard wall already &lt;em&gt;knew&lt;/em&gt;. Grok Build did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Restart Grok Build — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 11:41 ate the operator's last ten minutes of diagnosis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags cover this&lt;/td&gt;
&lt;td&gt;Flags are another product, another delay&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Grok Build tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per admin dashboard lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/war-room-shared-truth/headline = live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/war-room-shared-truth" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/war-room-shared-truth&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (admin dashboard + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;war-room-shared-truth/&lt;/span&gt;
    &lt;span class="s"&gt;headline&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;          &lt;span class="c1"&gt;# one war-room headline as live posture on the admin-dashboard wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;admin-dashboard/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"war-room-shared-truth"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Grok Build tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Grok Build just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/war-room-shared-truth/headline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;one war-room headline as live posture on the admin-dashboard wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Grok Build &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Status tile green while the agent host started earlier&lt;/td&gt;
&lt;td&gt;Restart Grok Build; lose the operator's last ten minutes of diagnosis&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;headline&lt;/code&gt; live; next Grok Build tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old headline&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;admin-dashboard wall shows the new posture&lt;/td&gt;
&lt;td&gt;Grok Build started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Grok Build restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;headline&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Senses firing while the turn finishes blind&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok Build tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per admin dashboard line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;headline&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Grok Build.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto senses firing while the turn finishes blind.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Grok Build reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 11:41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Grok Build restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Grok Build is the wrong restart target
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at calling tools. It is not a control plane. Killing it to flip &lt;code&gt;headline&lt;/code&gt; teaches the on-call that judgment requires a process ID. The admin-dashboard wall already disagrees.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the admin dashboard operator actually said
&lt;/h2&gt;

&lt;p&gt;At 11:41 someone said, out loud: &lt;strong&gt;the tile is not a rumor. it is the same tree&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Grok Build process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;headline&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;headline&lt;/code&gt; rarely moves alone on the admin-dashboard wall. Pair it with a timeout, a mute, or a pause so you do not fix one war-room headline as live posture on the admin-dashboard wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/war-room-shared-truth &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/war-room-shared-truth/headline=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;headline&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Grok Build tool at the same leaf. Do not ship a new server binary to flip one war-room headline as live posture on the admin-dashboard wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;one war-room headline as live posture on the admin-dashboard wall&lt;/strong&gt; requires restarting Grok Build, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the admin-dashboard wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/war-room-shared-truth&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Mirror Phone Wall While Sre Degradation Pause Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Fri, 02 Oct 2026 23:13:58 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-mirror-phone-wall-while-sre-degradation-pause-waited-for-a-restart-1gfp</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-mirror-phone-wall-while-sre-degradation-pause-waited-for-a-restart-1gfp</guid>
      <description>&lt;p&gt;I have sat next to the mirror-phone wall at 18:45 while Claude Code was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;incident-pause&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;the phone already knew the posture — the host did not&lt;/strong&gt;. Claude Code was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Claude Code (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose live device context and the current tool call&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;device leaf gone stale while the agent is mid-turn&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; SRE degradation pause as live posture on the mirror-phone wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: SRE degradation pause as live posture on the mirror-phone wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Claude Code is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide SRE degradation pause as live posture on the mirror-phone wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;incident-pause&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The mirror-phone wall already &lt;em&gt;knew&lt;/em&gt;. Claude Code did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags cover this&lt;/td&gt;
&lt;td&gt;Flags are another product, another delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paste the new incident-pause into chat&lt;/td&gt;
&lt;td&gt;Two agents, two pastes, two lies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Claude Code tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per mirror phone lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/sre-agent-pause-mesh/incident-pause = paused
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/sre-agent-pause-mesh" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/sre-agent-pause-mesh&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (mirror phone + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;sre-agent-pause-mesh/&lt;/span&gt;
    &lt;span class="s"&gt;incident-pause&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;paused&lt;/span&gt;          &lt;span class="c1"&gt;# SRE degradation pause as live posture on the mirror-phone wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;mirror-phone/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;incident-pause&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;paused&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sre-agent-pause-mesh"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"incident-pause"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"incident-pause"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"paused"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"incident-pause"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Claude Code tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Claude Code just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/sre-agent-pause-mesh/incident-pause&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;paused&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SRE degradation pause as live posture on the mirror-phone wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Claude Code &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device leaf gone stale while the agent is mid-turn&lt;/td&gt;
&lt;td&gt;Restart Claude Code; lose live device context and the current tool call&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;incident-pause&lt;/code&gt; live; next Claude Code tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old incident-pause&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mirror-phone wall shows the new posture&lt;/td&gt;
&lt;td&gt;Claude Code started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Claude Code restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;incident-pause&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Admin dashboard showing paused while the agent still writes&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per mirror phone line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;incident-pause&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Claude Code.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto admin dashboard showing paused while the agent still writes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Claude Code reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 18:45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Claude Code restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What the mirror phone operator actually said
&lt;/h2&gt;

&lt;p&gt;At 18:45 someone said, out loud: &lt;strong&gt;the phone already knew the posture — the host did not&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Claude Code process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;incident-pause&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;incident-pause&lt;/code&gt; rarely moves alone on the mirror-phone wall. Pair it with a timeout, a mute, or a pause so you do not fix SRE degradation pause as live posture on the mirror-phone wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;incident-pause&lt;/code&gt;, prove Claude Code recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about SRE degradation pause as live posture on the mirror-phone wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/sre-agent-pause-mesh &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/sre-agent-pause-mesh/incident-pause=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;incident-pause&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Claude Code tool at the same leaf. Do not ship a new server binary to flip SRE degradation pause as live posture on the mirror-phone wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;SRE degradation pause as live posture on the mirror-phone wall&lt;/strong&gt; requires restarting Claude Code, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the mirror-phone wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/sre-agent-pause-mesh&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Travel Wall While Mcp Tool Gates Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Fri, 02 Oct 2026 22:15:19 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-travel-wall-while-mcp-tool-gates-waited-for-a-restart-23p4</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-travel-wall-while-mcp-tool-gates-waited-for-a-restart-23p4</guid>
      <description>&lt;p&gt;I have sat next to the travel-coordinator wall at 03:07 while Cursor was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;tools-allow&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;mute writes on the noisy room — keep reads&lt;/strong&gt;. Cursor was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Cursor (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the overbook thread the agent already paid for&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;group-chat flood during a GDS blip&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; MCP tool gates as live posture on the travel wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: MCP tool gates as live posture on the travel wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Cursor is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide MCP tool gates as live posture on the travel wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;tools-allow&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The travel-coordinator wall already &lt;em&gt;knew&lt;/em&gt;. Cursor did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Paste the new tools-allow into chat&lt;/td&gt;
&lt;td&gt;Two agents, two pastes, two lies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The travel-coordinator wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Cursor — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 03:07 ate the overbook thread the agent already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The skill file is the source of truth&lt;/td&gt;
&lt;td&gt;Skills instruct. They do not fan out&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Cursor tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per travel lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/mcp-tool-gate-live/tools-allow = search,read
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/mcp-tool-gate-live" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/mcp-tool-gate-live&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (travel + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;mcp-tool-gate-live/&lt;/span&gt;
    &lt;span class="s"&gt;tools-allow&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;search,read&lt;/span&gt;          &lt;span class="c1"&gt;# MCP tool gates as live posture on the travel wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;travel/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;tools-allow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;search,read&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mcp-tool-gate-live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tools-allow"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tools-allow"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"search,read"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tools-allow"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Cursor tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Cursor just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/mcp-tool-gate-live/tools-allow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search,read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search,read&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MCP tool gates as live posture on the travel wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Cursor &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Group-chat flood during a gds blip&lt;/td&gt;
&lt;td&gt;Restart Cursor; lose the overbook thread the agent already paid for&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;tools-allow&lt;/code&gt; live; next Cursor tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old tools-allow&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;travel-coordinator wall shows the new posture&lt;/td&gt;
&lt;td&gt;Cursor started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Cursor restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;tools-allow&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopping admin still mutating stock mid-freeze&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cursor tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per travel line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;tools-allow&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Cursor.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto shopping admin still mutating stock mid-freeze.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Cursor reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 03:07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Cursor restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;tools-allow&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tools-allow&lt;/code&gt; rarely moves alone on the travel-coordinator wall. Pair it with a timeout, a mute, or a pause so you do not fix MCP tool gates as live posture on the travel wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;tools-allow&lt;/code&gt;, prove Cursor recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about MCP tool gates as live posture on the travel wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Cursor is the wrong restart target
&lt;/h2&gt;

&lt;p&gt;Cursor is good at calling tools. It is not a control plane. Killing it to flip &lt;code&gt;tools-allow&lt;/code&gt; teaches the on-call that judgment requires a process ID. The travel-coordinator wall already disagrees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/mcp-tool-gate-live &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/mcp-tool-gate-live/tools-allow=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;tools-allow&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Cursor tool at the same leaf. Do not ship a new server binary to flip MCP tool gates as live posture on the travel wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;MCP tool gates as live posture on the travel wall&lt;/strong&gt; requires restarting Cursor, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the travel-coordinator wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/mcp-tool-gate-live&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Shopping Wall While Token Budgets Mid-Run Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Fri, 02 Oct 2026 21:06:54 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-shopping-wall-while-token-budgets-mid-run-waited-for-a-restart-a9j</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-shopping-wall-while-token-budgets-mid-run-waited-for-a-restart-a9j</guid>
      <description>&lt;p&gt;I have sat next to the shopping-admin wall at 11:41 while Grok Build was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;max-tokens&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;disable inventory writes — keep search&lt;/strong&gt;. Grok Build was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Grok Build (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose cart forensics and the open SKU thread&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;flash-freeze on SKU writes&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; token budgets mid-run as live posture on the shopping wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: token budgets mid-run as live posture on the shopping wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide token budgets mid-run as live posture on the shopping wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;max-tokens&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The shopping-admin wall already &lt;em&gt;knew&lt;/em&gt;. Grok Build did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags cover this&lt;/td&gt;
&lt;td&gt;Flags are another product, another delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paste the new max-tokens into chat&lt;/td&gt;
&lt;td&gt;Two agents, two pastes, two lies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The shopping-admin wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Grok Build — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 11:41 ate cart forensics and the open SKU thread&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Grok Build tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per shopping lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/agent-budget-token-live/max-tokens = 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/agent-budget-token-live" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/agent-budget-token-live&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (shopping + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;agent-budget-token-live/&lt;/span&gt;
    &lt;span class="s"&gt;max-tokens&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;          &lt;span class="c1"&gt;# token budgets mid-run as live posture on the shopping wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;shopping/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;max-tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"agent-budget-token-live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"max-tokens"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"max-tokens"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"8000"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"max-tokens"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Grok Build tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Grok Build just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/agent-budget-token-live/max-tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token budgets mid-run as live posture on the shopping wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Grok Build &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flash-freeze on sku writes&lt;/td&gt;
&lt;td&gt;Restart Grok Build; lose cart forensics and the open SKU thread&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;max-tokens&lt;/code&gt; live; next Grok Build tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old max-tokens&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shopping-admin wall shows the new posture&lt;/td&gt;
&lt;td&gt;Grok Build started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Grok Build restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;max-tokens&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Travel coordinator still sending into a muted channel&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok Build tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per shopping line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;max-tokens&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Grok Build.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto travel coordinator still sending into a muted channel.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Grok Build reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 11:41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Grok Build restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;max-tokens&lt;/code&gt;, prove Grok Build recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about token budgets mid-run as live posture on the shopping wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Grok Build is the wrong restart target
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at calling tools. It is not a control plane. Killing it to flip &lt;code&gt;max-tokens&lt;/code&gt; teaches the on-call that judgment requires a process ID. The shopping-admin wall already disagrees.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the shopping operator actually said
&lt;/h2&gt;

&lt;p&gt;At 11:41 someone said, out loud: &lt;strong&gt;disable inventory writes — keep search&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Grok Build process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/agent-budget-token-live &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/agent-budget-token-live/max-tokens=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;max-tokens&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Grok Build tool at the same leaf. Do not ship a new server binary to flip token budgets mid-run as live posture on the shopping wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;token budgets mid-run as live posture on the shopping wall&lt;/strong&gt; requires restarting Grok Build, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the shopping-admin wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/agent-budget-token-live&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Senses Wall While Agent Handoff Without Restart Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Fri, 02 Oct 2026 00:54:52 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-senses-wall-while-agent-handoff-without-restart-waited-for-a-restart-14c4</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-senses-wall-while-agent-handoff-without-restart-waited-for-a-restart-14c4</guid>
      <description>&lt;p&gt;I have sat next to the senses wall at 00:40 while Cursor was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;handoff&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;priority is a leaf, not a restart&lt;/strong&gt;. Cursor was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Cursor (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the turn budget and the open investigation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;a mid-turn interrupt the host treats as noise&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; agent handoff without restart as live posture on the senses wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: agent handoff without restart as live posture on the senses wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Cursor is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide agent handoff without restart as live posture on the senses wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;handoff&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The senses wall already &lt;em&gt;knew&lt;/em&gt;. Cursor did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Put the SDK in the SPA&lt;/td&gt;
&lt;td&gt;Connect tokens do not belong in a browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags cover this&lt;/td&gt;
&lt;td&gt;Flags are another product, another delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paste the new handoff into chat&lt;/td&gt;
&lt;td&gt;Two agents, two pastes, two lies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The senses wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Cursor tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per senses lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/multi-agent-collab-bus/handoff = live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/multi-agent-collab-bus" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/multi-agent-collab-bus&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (senses + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;multi-agent-collab-bus/&lt;/span&gt;
    &lt;span class="s"&gt;handoff&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;          &lt;span class="c1"&gt;# agent handoff without restart as live posture on the senses wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;senses/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;handoff&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"multi-agent-collab-bus"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"handoff"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Cursor tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Cursor just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/multi-agent-collab-bus/handoff&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent handoff without restart as live posture on the senses wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Cursor &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A mid-turn interrupt the host treats as noise&lt;/td&gt;
&lt;td&gt;Restart Cursor; lose the turn budget and the open investigation&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;handoff&lt;/code&gt; live; next Cursor tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old handoff&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;senses wall shows the new posture&lt;/td&gt;
&lt;td&gt;Cursor started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Cursor restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;handoff&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mirror phone already showing the new device leaf&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cursor tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per senses line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;handoff&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Cursor.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto mirror phone already showing the new device leaf.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Cursor reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 00:40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Cursor restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Cursor is the wrong restart target
&lt;/h2&gt;

&lt;p&gt;Cursor is good at calling tools. It is not a control plane. Killing it to flip &lt;code&gt;handoff&lt;/code&gt; teaches the on-call that judgment requires a process ID. The senses wall already disagrees.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the senses operator actually said
&lt;/h2&gt;

&lt;p&gt;At 00:40 someone said, out loud: &lt;strong&gt;priority is a leaf, not a restart&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Cursor process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;handoff&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;handoff&lt;/code&gt; rarely moves alone on the senses wall. Pair it with a timeout, a mute, or a pause so you do not fix agent handoff without restart as live posture on the senses wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/multi-agent-collab-bus &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/multi-agent-collab-bus/handoff=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;handoff&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Cursor tool at the same leaf. Do not ship a new server binary to flip agent handoff without restart as live posture on the senses wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;agent handoff without restart as live posture on the senses wall&lt;/strong&gt; requires restarting Cursor, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the senses wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/multi-agent-collab-bus&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Have Sat Next to the Admin Dashboard Wall While One War-Room Headline Waited for a Restart</title>
      <dc:creator>Moshe Avdiel</dc:creator>
      <pubDate>Fri, 02 Oct 2026 00:00:37 +0000</pubDate>
      <link>https://dev.to/kiponos/i-have-sat-next-to-the-admin-dashboard-wall-while-one-war-room-headline-waited-for-a-restart-1kjj</link>
      <guid>https://dev.to/kiponos/i-have-sat-next-to-the-admin-dashboard-wall-while-one-war-room-headline-waited-for-a-restart-1kjj</guid>
      <description>&lt;p&gt;I have sat next to the admin-dashboard wall at 02:14 while Grok Build was &lt;em&gt;this close&lt;/em&gt; to doing the wrong thing.&lt;/p&gt;

&lt;p&gt;Not a model failure. A &lt;strong&gt;posture&lt;/strong&gt; failure.&lt;/p&gt;

&lt;p&gt;The host had started with &lt;code&gt;headline&lt;/code&gt; frozen in env / argv / a skill file. Someone on the floor said, out loud, &lt;strong&gt;the tile is not a rumor. it is the same tree&lt;/strong&gt;. Grok Build was still holding the old process. The only “safe” move anyone trusted was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill Grok Build (or its MCP server)&lt;/li&gt;
&lt;li&gt;Edit a file&lt;/li&gt;
&lt;li&gt;Restart the host&lt;/li&gt;
&lt;li&gt;Lose the operator's last ten minutes of diagnosis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. &lt;strong&gt;status tile green while the agent host started earlier&lt;/strong&gt; does not wait for ceremonies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Aha:&lt;/strong&gt; one war-room headline as live posture on the admin-dashboard wall is not a binary you reboot. It is a &lt;strong&gt;function that should read live posture&lt;/strong&gt; from &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;Kiponos.io&lt;/a&gt; on every call. The host stays up. The leaf moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: one war-room headline as live posture on the admin-dashboard wall lived in the process, not in the turn
&lt;/h2&gt;

&lt;p&gt;Grok Build is good at &lt;em&gt;calling&lt;/em&gt; tools. It is not born with a &lt;strong&gt;shared, instant, restart-free control plane&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So teams hide one war-room headline as live posture on the admin-dashboard wall in the only places agent frameworks actually ship:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the gate hid&lt;/th&gt;
&lt;th&gt;What you restart&lt;/th&gt;
&lt;th&gt;What you lose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server env / argv&lt;/td&gt;
&lt;td&gt;The MCP process&lt;/td&gt;
&lt;td&gt;Open tool sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill file on disk&lt;/td&gt;
&lt;td&gt;The agent turn, sometimes the host&lt;/td&gt;
&lt;td&gt;Context the model already paid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host-local JSON&lt;/td&gt;
&lt;td&gt;Whatever still has the file open&lt;/td&gt;
&lt;td&gt;Agreement between two agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard-coded &lt;code&gt;if&lt;/code&gt; on &lt;code&gt;headline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;A release&lt;/td&gt;
&lt;td&gt;The incident clock&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The admin-dashboard wall already &lt;em&gt;knew&lt;/em&gt;. Grok Build did not, because it had started earlier.&lt;/p&gt;

&lt;p&gt;That is the missing piece: &lt;strong&gt;the framework gave you tools. It did not give you a live hub.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What teams believe
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Belief&lt;/th&gt;
&lt;th&gt;Production&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Feature flags cover this&lt;/td&gt;
&lt;td&gt;Flags are another product, another delay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paste the new headline into chat&lt;/td&gt;
&lt;td&gt;Two agents, two pastes, two lies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;We'll catch it next turn&lt;/td&gt;
&lt;td&gt;The admin-dashboard wall already knew this turn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restart Grok Build — it is cheap&lt;/td&gt;
&lt;td&gt;Cheap until 02:14 ate the operator's last ten minutes of diagnosis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Aha: local get, live write, host stays up
&lt;/h2&gt;

&lt;p&gt;Kiponos holds a nested tree. Java and Python SDKs keep the latest values &lt;strong&gt;in memory&lt;/strong&gt;, patched over WebSocket deltas. The hot path inside a Grok Build tool is a &lt;strong&gt;local get&lt;/strong&gt; — no HTTP RTT per admin dashboard lookup.&lt;/p&gt;

&lt;p&gt;Hub leaf for this essay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;examples/war-room-shared-truth/headline = live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runnable proof: &lt;a href="https://github.com/kiponos-io/kiponos-io/tree/master/examples/java/war-room-shared-truth" rel="noopener noreferrer"&gt;&lt;code&gt;examples/java/war-room-shared-truth&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Public SDKs: &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Python&lt;/strong&gt;, plus React/Angular &lt;strong&gt;server&lt;/strong&gt; peers (&lt;code&gt;createFromEnv&lt;/code&gt;). Never put Connect tokens in the SPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config tree (admin dashboard + peers)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;examples/&lt;/span&gt;
  &lt;span class="s"&gt;war-room-shared-truth/&lt;/span&gt;
    &lt;span class="s"&gt;headline&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;          &lt;span class="c1"&gt;# one war-room headline as live posture on the admin-dashboard wall&lt;/span&gt;
&lt;span class="s"&gt;apps/&lt;/span&gt;
  &lt;span class="s"&gt;admin-dashboard/&lt;/span&gt;
    &lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;live&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration — Java hot path
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Kiponos&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Kiponos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createForCurrentTeam&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootFolder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"examples"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;folderOrCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"war-room-shared-truth"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"live"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"headline"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Grok Build tool: refuse the dangerous call when posture moved&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same leaf from a Python tool (Grok Build just &lt;em&gt;calls&lt;/em&gt; it):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;kiponos&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;

&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Kiponos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quiet&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;posture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/war-room-shared-truth/headline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;posture&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;one war-room headline as live posture on the admin-dashboard wall gated live — host not restarted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Grok Build &lt;strong&gt;process&lt;/strong&gt; does not recycle. The &lt;strong&gt;next&lt;/strong&gt; tool call already sees the dashboard edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Without Kiponos&lt;/th&gt;
&lt;th&gt;With Kiponos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Status tile green while the agent host started earlier&lt;/td&gt;
&lt;td&gt;Restart Grok Build; lose the operator's last ten minutes of diagnosis&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;headline&lt;/code&gt; live; next Grok Build tool call already obeys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peer host still on old headline&lt;/td&gt;
&lt;td&gt;Paste the value into the other chat&lt;/td&gt;
&lt;td&gt;One hub leaf; both processes &lt;code&gt;get()&lt;/code&gt; locally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;admin-dashboard wall shows the new posture&lt;/td&gt;
&lt;td&gt;Grok Build started earlier so it writes anyway&lt;/td&gt;
&lt;td&gt;Dashboard and tool share the same memory tree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident over, resume&lt;/td&gt;
&lt;td&gt;Another Grok Build restart&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;headline&lt;/code&gt; back; session continues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Senses firing while the turn finishes blind&lt;/td&gt;
&lt;td&gt;Two ceremonies, two lost threads&lt;/td&gt;
&lt;td&gt;Same tree, two products, no paste&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Performance (this path, not a generic table)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Grok Build tool &lt;code&gt;get()&lt;/code&gt; is an in-process map lookup after bootstrap.&lt;/li&gt;
&lt;li&gt;One WebSocket per process lifetime — not per admin dashboard line.&lt;/li&gt;
&lt;li&gt;A dashboard edit is a &lt;strong&gt;delta&lt;/strong&gt; of &lt;code&gt;headline&lt;/code&gt;, not a config-file reload.&lt;/li&gt;
&lt;li&gt;You do not pay model tokens to “please restart Grok Build.”&lt;/li&gt;
&lt;li&gt;A second host converges without a third paste onto senses firing while the turn finishes blind.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Compare to alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Honest fit&lt;/th&gt;
&lt;th&gt;Why it still restarts&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Env file + Grok Build reboot&lt;/td&gt;
&lt;td&gt;Simple at 09:00&lt;/td&gt;
&lt;td&gt;The freeze is at 02:14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skill markdown as policy&lt;/td&gt;
&lt;td&gt;Good instructions&lt;/td&gt;
&lt;td&gt;Not a live bus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis poll inside the tool&lt;/td&gt;
&lt;td&gt;Shared, but RTT on the hot path&lt;/td&gt;
&lt;td&gt;You invented a hub with worse UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature-flag SaaS&lt;/td&gt;
&lt;td&gt;Product experiments&lt;/td&gt;
&lt;td&gt;Rarely session-safe for Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@RefreshScope&lt;/code&gt; / actuator&lt;/td&gt;
&lt;td&gt;JVM apps&lt;/td&gt;
&lt;td&gt;Does not restart Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When not to use Kiponos
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tool schema itself changed (new argument)&lt;/td&gt;
&lt;td&gt;That &lt;em&gt;is&lt;/em&gt; a code/Grok Build restart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret rotation of Connect tokens&lt;/td&gt;
&lt;td&gt;Credentials are not live knobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-off local script, no peers&lt;/td&gt;
&lt;td&gt;A hub is overkill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser-only “SDK in the SPA”&lt;/td&gt;
&lt;td&gt;Forbidden — tokens leak or defaults lie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What the admin dashboard operator actually said
&lt;/h2&gt;

&lt;p&gt;At 02:14 someone said, out loud: &lt;strong&gt;the tile is not a rumor. it is the same tree&lt;/strong&gt;. That sentence is the whole product. If it cannot land in the running Grok Build process in seconds, you do not have posture. You have a wiki.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair &lt;code&gt;headline&lt;/code&gt; with a sister dial
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;headline&lt;/code&gt; rarely moves alone on the admin-dashboard wall. Pair it with a timeout, a mute, or a pause so you do not fix one war-room headline as live posture on the admin-dashboard wall by inventing a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearsal beats slides
&lt;/h2&gt;

&lt;p&gt;In staging: set a painful &lt;code&gt;headline&lt;/code&gt;, prove Grok Build recovers without a host kill, prove clamps reject nonsense, prove last-known-good when the hub is firewalled. That drill ends half the architecture arguments about one war-room headline as live posture on the admin-dashboard wall.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started (15 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;TeamPro on &lt;a href="https://kiponos.io" rel="noopener noreferrer"&gt;kiponos.io&lt;/a&gt; → Connect → &lt;code&gt;KIPONOS_ID&lt;/code&gt; / &lt;code&gt;KIPONOS_ACCESS&lt;/code&gt; / profile &lt;code&gt;['my-app']['v1.0.0']['dev']['base']&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd examples/java/war-room-shared-truth &amp;amp;&amp;amp; cp kiponos.local.env.example kiponos.local.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;./gradlew test run&lt;/code&gt; — prints &lt;code&gt;examples/war-room-shared-truth/headline=...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In the dashboard, change &lt;code&gt;headline&lt;/code&gt;. Keep the process up. No rebuild.&lt;/li&gt;
&lt;li&gt;Point your Grok Build tool at the same leaf. Do not ship a new server binary to flip one war-room headline as live posture on the admin-dashboard wall.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/devto-getting-started-developer-guide.md" rel="noopener noreferrer"&gt;Developer Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/kiponos/getting-started-with-kiponosio-p5k"&gt;Product tour&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io/blob/master/docs/GETTING-STARTED.md" rel="noopener noreferrer"&gt;GETTING-STARTED.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kiponos-io/kiponos-io" rel="noopener noreferrer"&gt;github.com/kiponos-io/kiponos-io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The moral
&lt;/h2&gt;

&lt;p&gt;If flipping &lt;strong&gt;one war-room headline as live posture on the admin-dashboard wall&lt;/strong&gt; requires restarting Grok Build, you do not have a gate. You have a hope with a process ID.&lt;/p&gt;

&lt;p&gt;Agent frameworks already know how to call tools. &lt;strong&gt;Kiponos is the live hub they do not ship&lt;/strong&gt; — so the admin-dashboard wall can change its mind without killing the session.&lt;/p&gt;

&lt;p&gt;How to try: &lt;code&gt;examples/java/war-room-shared-truth&lt;/code&gt; and &lt;code&gt;./gradlew test&lt;/code&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
