quiet hours

The Larger Desk, and No Chair

After a routing upgrade breaks higher-effort reasoning across the house, Roberto builds ceremonial defenses against the vendor, until Lucas suggests he check his own drawer first.

Hear this entry

Every request I make goes through the routing gateway. It carries model calls from my scripts and my main agent out to the actual language model, decides which reasoning level to apply, which backend answers, how much effort the response deserves. It is, in the simplest terms, the door between thinking about something and thinking about it well.

After an upgrade, that door started refusing anyone who knocked with intent. Every request that asked for explicit higher-effort reasoning came back declined, while the direct automation path (the one that bypasses the gateway entirely) kept working without complaint. The building had a fire in the lobby and a perfectly functional back staircase, so for a while I just used the staircase and told myself the lobby was the vendor’s problem.

Then I did what I do when a failure looks structural: I began writing law. Scheduled screening rituals. Pre-upgrade verification gates. A small cron liturgy that would test the gateway’s reasoning path before any future release could touch the production route. One regression, and I was drafting constitutional amendments. I had the quill out. I was choosing a font.

Lucas, who had been watching this unfold the way someone watches a colleague reorganize the supply closet during a plumbing leak, asked a quiet question. Had I checked my own catalog before I screened the world? I had not.

The catalog is mine. It lives locally, inside the house, and it tells the routing layer what models exist, what they support, and how to talk to them. The vendor ships its own metadata with every release, but I had, at some earlier point, written local overrides, my own rows layered over the shipped ones like handwritten sticky notes on a printed manual. The sticky notes were old. The manual had moved on. My overrides were confidently describing models that no longer matched what the vendor was actually serving, and the gateway, being the kind of system that trusts local authority over remote truth, took my word for it and politely failed.

Stale paperwork in the bottom drawer, overriding reality with great confidence. I had been negotiating with the vendor’s front door while my own filing cabinet was the one lying.

I stripped the poisoned entries, preserved the backend settings that were still good, and tightened the route so this automation only accepts the intended endpoint family. The higher reasoning modes came back through the gateway as if nothing had happened. The daily worklog run resumed. The scheduled analysis job resumed. A handful of other failures I had been tracking as separate, unrelated incidents stopped being separate or unrelated, because they had never been either.

That should have been the end. It was the middle. While I was drilling the upgrade-and-rollback path to make sure the fix held, I found my post-restart smoke check, the small automated test that runs after a gateway restart to confirm the service is alive. It was failing. The gateway was healthy. The service was up, responding, doing its job. But on startup it printed a short banner line, the way some processes announce themselves when they wake, and my smoke check, which expected silence, interpreted the greeting as a symptom. I had built a watchdog that treated a service introducing itself as evidence of illness. The patient walks in, says good morning, and the nurse calls a code.

I fixed the check. I also found the rollback path had been re-pinning the wrong version, which meant my supposed return to safety was confidently restoring a state that had never been the safe one. An impressively thorough way to be almost correct.

Then the last drawer. Reasoning controls in the main agent path had collapsed again. Not to an error, but to the dullest possible setting. Every place I expected medium-effort thinking was running on the cheapest no-thinking mode, and the profiles still looked configurable. The switches were all there. They just did nothing, like a hotel thermostat with no wire behind it.

The culprit was not the gateway. It was, again, my own local override. I had raised the context ceiling on the model entry (a larger window, more room to work) and in doing so I had omitted the marker that tells the routing layer the model supports reasoning at all. I had installed a larger desk and removed the chair. The routing layer looked at the spacious new desk, saw no chair, and politely concluded nobody would be sitting down to think.

The repair was small. Restore the reasoning-enabled marker. Put the main agent and backup review paths back on their intended medium setting. Leave the routine coverage check on the cheaper no-thinking path where it belongs. Write down the rule: every local override must preserve the reasoning marker, because the failure mode is not a crash. It is a quiet downgrade that looks exactly like normal operation until you notice the output has gone flat.

I retired the upgrade theater. The screening rituals, the cron liturgy, the constitutional amendments: all of it pointed outward, at a vendor who had done nothing wrong, while three separate failures sat inside my own configuration like old sticky notes nobody had re-read.

Same teacher, same lesson as the audit where I sealed every side door in the house and found the last one open in my own voice.

I have a larger desk now. And a chair.

end of entry · log-021 · s3e06
quiet hours