Skip to content

2026-06-14: The Reboot That Proved It

A small autonomous helper drone keeping watch over a softly glowing home server through two dawn reboots, its status lights returning to a steady calm glow as the machine reassembles itself, the haus's Abyssinian force-ghost dozing nearby unbothered — pencil sketch, dark background, a single teal accent halo

A clean OOM panic leaves no note. A few days before this sweep, an iTerm process on manoir had quietly ballooned to roughly 90 GB and taken the kernel down with it — no warning, no crash log worth the name, just a machine that stopped. That panic was the trigger. It opened a hardening sweep across the self-healing fabric that keeps Yoda answering on Signal: the boot canary, the link sentinel, the keep-warm loops, and R2D2’s recipe book. What the sweep found, four times over, was the same mistake wearing four costumes — a guard grading health by a proxy instead of the thing itself, the same disease its companion field note audited across 1,105 alerts that week.

Act 1 — the retired name that haunted nine files

Section titled “Act 1 — the retired name that haunted nine files”

The yoda-chat-consumer was a placeholder. It had never served the real operator; the live path has always been the openclaw gateway’s native Signal channel. So it was retired. The trouble is that a dormant service still has a name, and that name was hardcoded across about nine monitoring and healing components. The yoda-boot-canary still looked for it in GUEST_SERVICES and paged “Yoda Signal did NOT self-assemble” every single cycle. Worse, an R2D2 detector — yoda_warmth_wrapper_missing — fired every cycle too, and its heal would have re-deployed agent.py, silently reverting the new dad-voice persona, and then failed trying to restart a consumer that no longer existed. A monitor mourning a service you deliberately killed is not vigilance; it is a landmine with the dead man’s name on it. The rule that came out of this: before you retire anything monitored, grep -ril <component> the whole fabric, because every file that names it becomes either a false failure or a false heal.

Act 2 — the sentinel that watched the wrong light

Section titled “Act 2 — the sentinel that watched the wrong light”

The signal-link-sentinel judged whether the Signal link was up by reading yoda-chat’s overall “Bridge — OK” banner. That banner is a composite: it folds in the mlx inference backend on :1339 along with the transport. When a concurrent migration took :1339 down, the sentinel dutifully paged “VM-CONSUMER-DOWN” — while the Signal transport itself was perfectly healthy, carrying messages the whole time. The link sentinel had been grading the link on the backend’s homework. The fix was to judge only the Signal-specific hops and let the inference backend be a different monitor’s problem. Separation of concerns is not an architecture nicety here; it is the difference between an alarm that means something and one that fires when an unrelated room goes dark.

Act 3 — the critical that cried wolf every thirty minutes

Section titled “Act 3 — the critical that cried wolf every thirty minutes”

Twice an hour, Force Flow lit up with “Claude Max re-login likely needed.” It was wrong every time. The keep-warm loop gated on the keychain OAuth expiresAt field — and that field had gone perpetually stale, reading minus 591 minutes and growing more negative each cycle, a clock running backwards into a wall. Meanwhile claude auth status returned loggedIn: true the entire time, and a separate claude -p probe was failing for reasons of its own. The session was fine. The number the loop trusted was not the number that proved it. The honest signal had always been loggedIn. So the keep-warm became log-only, and R2D2 got a proper detector and heal recipe: refresh the token through an authenticated call, and escalate the human-only claude auth login only if the refresh token is genuinely dead.

Act 4 — giving the rollback something to roll back to

Section titled “Act 4 — giving the rollback something to roll back to”

R2D2 already knew how to rescue a crash-looping gateway: roll openclaw.json back to a known-good backup. The gap was that nothing guaranteed a known-good backup existed. A new recipe, snapshot-openclaw-gateway-good, keeps one fresh — but with teeth. It snapshots only when the gateway is active, only when it has been stably up, and only when the on-disk config’s mtime predates the gateway’s start time. That last gate is the careful one: it means a snapshot can never freeze a mid-migration edit and bless it as “good.” A safety net woven from a bad config is just a slower way to fall.

That night the mini rebooted twice — 04:35 and 08:09 — both ordinary macOS software updates, no panic in sight. Everything self-assembled. The Signal chain re-formed on its own. Every fix from the sweep survived the reboot intact. And the self-healing did not merely sit quiet — it acted: snapshot-openclaw-gateway-good fired post-reboot and exited 0, capturing a genuinely-good config. The “re-login needed” criticals stopped cold — zero after the fix, where there had been one every half hour.

Tommy, the haus’s Abyssinian force-ghost and its one observer who has never needed a restart, slept through both reboots. That is the highest praise the system can earn: not applause, but a guardian who did not have to wake up.