I have sat next to the travel-coordinator wall at 22:19 while Cursor was this close to doing the wrong thing.
Not a model failure. A posture failure.
The host had started with enabled-set frozen in env / argv / a skill file. Someone on the floor said, out loud, mute writes on the noisy room — keep reads. Cursor was still holding the old process. The only “safe” move anyone trusted was:
- Kill Cursor (or its MCP server)
- Edit a file
- Restart the host
- Lose the overbook thread the agent already paid for
I have watched that restart more times than I want to admit. It feels responsible. It is a ceremony. group-chat flood during a GDS blip does not wait for ceremonies.
The Aha: Skill enable set without restart 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: Skill enable set without restart lived in the process, not in the turn
Cursor is good at calling tools. It is not born with a shared, instant, restart-free control plane.
So teams hide Skill enable set without restart 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 enabled-set
|
A release | The incident clock |
The travel-coordinator wall already knew. Cursor 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 |
|---|---|
| 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 enabled-set into chat | Two agents, two pastes, two lies |
| We'll catch it next turn | The travel-coordinator wall already knew this turn |
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 Cursor tool is a local get — no HTTP RTT per travel lookup.
Hub leaf for this essay:
examples/agentic-dev-1104-am-skill-enable/enabled-set = live
Runnable proof: examples/java/agentic-dev-1104-am-skill-enable
Public SDKs: Java, Python, plus React/Angular server peers (createFromEnv). Never put Connect tokens in the SPA.
Config tree (travel + peers)
examples/
agentic-dev-1104-am-skill-enable/
enabled-set: live # Skill enable set without restart
apps/
travel/
live:
enabled-set: live
Integration — Java hot path
Kiponos kip = Kiponos.createForCurrentTeam();
Folder gate = kip.getRootFolder()
.folderOrCreate("examples")
.folderOrCreate("agentic-dev-1104-am-skill-enable");
if (!gate.hasKey("enabled-set")) {
gate.set("enabled-set", "live");
}
String posture = gate.get("enabled-set");
// Cursor tool: refuse the dangerous call when posture moved
Same leaf from a Python tool (Cursor 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-1104-am-skill-enable/enabled-set", "live")
if str(posture) == "live":
raise PermissionError("Skill enable set without restart gated live — host not restarted")
finally:
k.disconnect()
The Cursor process does not recycle. The next tool call already sees the dashboard edit.
Real scenarios
| Event | Without Kiponos | With Kiponos |
|---|---|---|
| Group-chat flood during a gds blip | Restart Cursor; lose the overbook thread the agent already paid for | Set enabled-set live; next Cursor tool call already obeys |
| Peer host still on old enabled-set | Paste the value into the other chat | One hub leaf; both processes get() locally |
| travel-coordinator wall shows the new posture | Cursor started earlier so it writes anyway | Dashboard and tool share the same memory tree |
| Incident over, resume | Another Cursor restart | Set enabled-set back; session continues |
| Shopping admin still mutating stock mid-freeze | Two ceremonies, two lost threads | Same tree, two products, no paste |
Performance (this path, not a generic table)
- Cursor tool
get()is an in-process map lookup after bootstrap. - One WebSocket per process lifetime — not per travel line.
- A dashboard edit is a delta of
enabled-set, not a config-file reload. - You do not pay model tokens to “please restart Cursor.”
- A second host converges without a third paste onto shopping admin still mutating stock mid-freeze.
Compare to alternatives
| Approach | Honest fit | Why it still restarts |
|---|---|---|
| Env file + Cursor reboot | Simple at 09:00 | The freeze is at 22:19 |
| 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 Cursor |
@RefreshScope / actuator |
JVM apps | Does not restart Cursor |
When not to use Kiponos
| Situation | Why |
|---|---|
| Tool schema itself changed (new argument) | That is a code/Cursor 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 |
Pair enabled-set with a sister dial
enabled-set rarely moves alone on the travel-coordinator wall. Pair it with a timeout, a mute, or a pause so you do not fix Skill enable set without restart by inventing a second incident.
Rehearsal beats slides
In staging: set a painful enabled-set, 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 Skill enable set without restart.
Why Cursor is the wrong restart target
Cursor is good at calling tools. It is not a control plane. Killing it to flip enabled-set teaches the on-call that judgment requires a process ID. The travel-coordinator wall already disagrees.
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-1104-am-skill-enable && cp kiponos.local.env.example kiponos.local.env-
./gradlew test run— printsexamples/agentic-dev-1104-am-skill-enable/enabled-set=... - In the dashboard, change
enabled-set. Keep the process up. No rebuild. - Point your Cursor tool at the same leaf. Do not ship a new server binary to flip Skill enable set without restart.
Further reading
The moral
If flipping Skill enable set without restart requires restarting Cursor, 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 travel-coordinator wall can change its mind without killing the session.
How to try: examples/java/agentic-dev-1104-am-skill-enable and ./gradlew test.
Top comments (0)