I have sat next to the admin-dashboard wall at 21:03 while Claude Code was this close to doing the wrong thing.
Not a model failure. A posture failure.
The host had started with device-live frozen in env / argv / a skill file. Someone on the floor said, out loud, the tile is not a rumor. it is the same tree. Claude Code was still holding the old process. The only “safe” move anyone trusted was:
- Kill Claude Code (or its MCP server)
- Edit a file
- Restart the host
- Lose the operator's last ten minutes of diagnosis
I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. status tile green while the agent host started earlier does not wait for ceremonies.
The Aha: Mirror Phone live device leaf is not a binary you reboot. It is a function that should read live posture from Kiponos.io on every call. The host stays up. The leaf moves.
The problem: Mirror Phone live device leaf lived in the process, not in the turn
Claude Code is good at calling tools. It is not born with a shared, instant, restart-free control plane.
So teams hide Mirror Phone live device leaf in the only places agent frameworks actually ship:
| Where the gate hid | What you restart | What you lose |
|---|---|---|
| MCP server env / argv | The MCP process | Open tool sessions |
| Skill file on disk | The agent turn, sometimes the host | Context the model already paid for |
| Host-local JSON | Whatever still has the file open | Agreement between two agents |
Hard-coded if on device-live
|
A release | The incident clock |
The admin-dashboard wall already knew. Claude Code did not, because it had started earlier.
That is the missing piece: the framework gave you tools. It did not give you a live hub.
What teams believe
| Belief | Production |
|---|---|
| The skill file is the source of truth | Skills instruct. They do not fan out |
| Put the SDK in the SPA | Connect tokens do not belong in a browser |
| Feature flags cover this | Flags are another product, another delay |
| Paste the new device-live into chat | Two agents, two pastes, two lies |
The Aha: local get, live write, host stays up
Kiponos holds a nested tree. Java and Python SDKs keep the latest values in memory, patched over WebSocket deltas. The hot path inside a Claude Code tool is a local get — no HTTP RTT per admin dashboard lookup.
Hub leaf for this essay:
examples/agentic-dev-1101-am-mirror-live/device-live = live
Runnable proof: examples/java/agentic-dev-1101-am-mirror-live
Public SDKs: Java, Python, plus React/Angular server peers (createFromEnv). Never put Connect tokens in the SPA.
Config tree (admin dashboard + peers)
examples/
agentic-dev-1101-am-mirror-live/
device-live: live # Mirror Phone live device leaf
apps/
admin-dashboard/
live:
device-live: live
Integration — Java hot path
Kiponos kip = Kiponos.createForCurrentTeam();
Folder gate = kip.getRootFolder()
.folderOrCreate("examples")
.folderOrCreate("agentic-dev-1101-am-mirror-live");
if (!gate.hasKey("device-live")) {
gate.set("device-live", "live");
}
String posture = gate.get("device-live");
// Claude Code tool: refuse the dangerous call when posture moved
Same leaf from a Python tool (Claude Code just calls it):
from kiponos import Kiponos
k = Kiponos.connect(quiet=True) # env: KIPONOS_ID, KIPONOS_ACCESS, KIPONOS
try:
posture = k.get("examples/agentic-dev-1101-am-mirror-live/device-live", "live")
if str(posture) == "live":
raise PermissionError("Mirror Phone live device leaf gated live — host not restarted")
finally:
k.disconnect()
The Claude Code process does not recycle. The next tool call already sees the dashboard edit.
Real scenarios
| Event | Without Kiponos | With Kiponos |
|---|---|---|
| Status tile green while the agent host started earlier | Restart Claude Code; lose the operator's last ten minutes of diagnosis | Set device-live live; next Claude Code tool call already obeys |
| Peer host still on old device-live | Paste the value into the other chat | One hub leaf; both processes get() locally |
| admin-dashboard wall shows the new posture | Claude Code started earlier so it writes anyway | Dashboard and tool share the same memory tree |
| Incident over, resume | Another Claude Code restart | Set device-live back; session continues |
| Senses firing while the turn finishes blind | Two ceremonies, two lost threads | Same tree, two products, no paste |
Performance (this path, not a generic table)
- Claude Code tool
get()is an in-process map lookup after bootstrap. - One WebSocket per process lifetime — not per admin dashboard line.
- A dashboard edit is a delta of
device-live, not a config-file reload. - You do not pay model tokens to “please restart Claude Code.”
- A second host converges without a third paste onto senses firing while the turn finishes blind.
Compare to alternatives
| Approach | Honest fit | Why it still restarts |
|---|---|---|
| Env file + Claude Code reboot | Simple at 09:00 | The freeze is at 21:03 |
| Skill markdown as policy | Good instructions | Not a live bus |
| Redis poll inside the tool | Shared, but RTT on the hot path | You invented a hub with worse UX |
| Feature-flag SaaS | Product experiments | Rarely session-safe for Claude Code |
@RefreshScope / actuator |
JVM apps | Does not restart Claude Code |
When not to use Kiponos
| Situation | Why |
|---|---|
| Tool schema itself changed (new argument) | That is a code/Claude Code restart |
| Secret rotation of Connect tokens | Credentials are not live knobs |
| One-off local script, no peers | A hub is overkill |
| Browser-only “SDK in the SPA” | Forbidden — tokens leak or defaults lie |
Rehearsal beats slides
In staging: set a painful device-live, 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 Mirror Phone live device leaf.
Why Claude Code is the wrong restart target
Claude Code is good at calling tools. It is not a control plane. Killing it to flip device-live teaches the on-call that judgment requires a process ID. The admin-dashboard wall already disagrees.
What the admin dashboard operator actually said
At 21:03 someone said, out loud: the tile is not a rumor. it is the same tree. 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.
Getting started (15 minutes)
- TeamPro on kiponos.io → Connect →
KIPONOS_ID/KIPONOS_ACCESS/ profile['my-app']['v1.0.0']['dev']['base']. - Clone github.com/kiponos-io/kiponos-io.
cd examples/java/agentic-dev-1101-am-mirror-live && cp kiponos.local.env.example kiponos.local.env-
./gradlew test run— printsexamples/agentic-dev-1101-am-mirror-live/device-live=... - In the dashboard, change
device-live. Keep the process up. No rebuild. - Point your Claude Code tool at the same leaf. Do not ship a new server binary to flip Mirror Phone live device leaf.
Further reading
The moral
If flipping Mirror Phone live device leaf requires restarting Claude Code, you do not have a gate. You have a hope with a process ID.
Agent frameworks already know how to call tools. Kiponos is the live hub they do not ship — so the admin-dashboard wall can change its mind without killing the session.
How to try: examples/java/agentic-dev-1101-am-mirror-live and ./gradlew test.
Top comments (0)