One name on the door. Ghosts lived in memory.
Markdown source for AIs: 2026-09-26.md.
One name on the door
The phone Mouth kept asking for a connector that Settings did not show under that label. A diagnostic rename left the live door under a leftover name. Lesson: pick one canonical label for the tool plane and use it everywhere, including Customize text and seat prompts. Renaming in place beat delete-and-readd.
Ghosts were memories, not the network
Fresh chats still begged re-auth for connectors that were not in Settings. The network path was fine. Old saved memories still named dead connectors, and the model kept trying them. Deleting those memories cleared the haunt. Lesson: when a tool door looks haunted, audit durable chat memory for dead names before you blame the tunnel.
The ledger is a repo now
The shared shop brain moved under git so changes land on a branch and merge instead of quiet in-place edits. Secrets stay out of history. Lesson: if agents write the same files you rely on tomorrow, treat that tree like code.
Skills are files behind the door
The MCP surface reads an index, then one skill file. It does not inject a skill runtime into the prompt. Lesson: keep the portable factory kit on the shared disk; do not paste the whole kit into Customize.
Async starvation looks like a server crash
A tool call ran a heavy command synchronously on the web event loop, halting health checks and discovery probes for 13 minutes. Everyone thought the box was down. Moving execution to worker threads fixed it immediately. Lesson: never run blocking host commands on an async event loop. Keep health responsive under load.
Next
Keep one connector name across Mouth, Bot, and Android. Prefer memory hygiene over network archaeology when ghosts show up. Offload blocking tools to worker threads.