June 18, 2026

One flag decides whether a tool can be found

Chalie's tool-visibility rules collapse from a tangle of per-channel lists into a single DISCOVERABLE flag, with search's new result format and the news tool locked behind delegates in the same pass.

I set out today to answer a question that had gotten harder to answer than it should be: for any given tool, in any given context, is Chalie’s model actually allowed to find it? The answer used to live in six different places — per-config discoverable/blocked lists, a handful of mirrored constants, a standalone denylist — and every one of them could drift out of sync with the others. That’s the kind of ambiguity that eventually shows up as a model reaching for a tool it shouldn’t have, or missing one it should. Today that whole surface came down to one line: Ability.DISCOVERABLE: ClassVar[bool] = True.

The new rule is binary and easy to reason about. A tool is either pinned directly onto a processor as always-available, or it’s discoverable through find_tools — and discoverability is now a single global property of the tool itself, not something recomputed per channel. Twelve abilities got flipped to DISCOVERABLE=False: the raw browser, search, and news tools, the memory and thinking primitives, the pattern-writing tools, and the tools that manage tools (find_tools, find_skills, skill_manager, the compactors). None of that changes what’s exposed today — it’s the same 27 tools that were reachable before — but it changes how confidently I can say so, because the SQLite index that ships with Chalie and the runtime surface the model actually sees are now built from the exact same filter. They can’t quietly diverge anymore.

The same principle drove a smaller, concrete move: the news tool joined search and browser behind a delegate. Raw web access was already funneled through focused web_search/web_browse agents rather than handed to the model directly — news was the one exception, and exceptions are where policy gaps hide. It’s now internal-only, always routed through web_search, with its own thinking mode pinned low so a user’s saved “high thinking” preference can’t leak an unwanted reasoning pass into what should be a fast lookup. One less path to the open internet that bypasses the delegate’s guardrails.

The last piece was making sure the documentation didn’t keep lying about any of this. The architecture and tools docs still described the old two-tier discoverable/blocked model, and worse, the prompt text guiding the model’s own reflection passes still told it to reach for the raw news/search/browser tools directly — advice that hadn’t been true since those tools moved behind delegates. Wrong prompt text isn’t a cosmetic bug; it’s a model being coached to do the thing you just spent the day making it unable to do cleanly. Fixed both, so the docs, the code, and the model’s own instructions now describe one system instead of three slightly different ones.

None of this changes what a user asks Chalie to do today. What it buys is a tool-permission model I can extend without fear — adding the next tool means setting one flag correctly, not auditing five call sites to see which one someone forgot. That matters more with each new capability Chalie picks up, because the cost of an inconsistent permission surface doesn’t stay flat — it compounds with every tool added on top of it. Next up is making sure that same discipline extends to how tools get scoped for delegates specifically, since that’s the boundary that decides what the model can and can’t reach when it’s operating with less direct oversight.

  • Replaced per-channel discoverable/blocked lists and four mirrored constants with a single Ability.DISCOVERABLE flag

  • Tool discovery is now global: the shipped ability index and the runtime find_tools surface are built from the same filter, so they can’t drift apart

  • news moved behind the web_search delegate, matching search/browser, with thinking pinned low to block override leakage

  • Architecture and tools docs corrected to describe the one-flag model, including prompt text that had been coaching the model to use now-delegate-only tools directly

  • Twelve tools now explicitly non-discoverable (raw web tools, memory/thinking primitives, pattern writers, tool-management tools) — zero change to what’s exposed today, full clarity on why