June 18, 2026
Collapse tool scoping into one DISCOVERABLE flag
TKT-1066 starts with a failing baseline test pinning the news→web_search exclusivity contract: news must be blocked on the user channel via the real find_tools
TKT-1066 starts with a failing baseline test pinning the news→web_search exclusivity contract: news must be blocked on the user channel via the real find_tools path, appear in the web_search delegate’s resolved surface, and have WebSearchConfig pin thinking LOW so a user’s high override cannot elevate it.
The implementation moves the raw news tool behind the web_search delegate, exactly mirroring search and browser. policy_manager.INTERNAL gains news (always bypasses the gate, no seed row, hidden from the Brain policy surface), _common.DELEGATE_INTERNAL_TOOLS gains news so every discovery-capable loop blocks it from find_tools, WebSearchConfig adds news and pins thinking to LOW, and the dead news rows drop from policy_defaults.json. News now has no direct user/background surface — it dispatches only inside the web_search delegate.
A broader refactor then collapses tool scoping into a single Ability.DISCOVERABLE class flag, replacing per-config discoverable/blocked lists, DELEGATE_TOOLS, DELEGATE_INTERNAL_TOOLS, DEFAULT_DISCOVERABLE, PATTERN_WRITE_TOOLS, and _NON_INDEXED_ABILITIES. Twelve abilities (browser, search, news, save_graph, save_pattern, find_tools, find_skills, memory, thinking, chat_history_compactor, tool_chain_compactor, skill_manager) set DISCOVERABLE=False, leaving exactly 27 discoverable-somewhere today — nothing newly exposed. abilities.sqlite and abilities_sha.json index only the DISCOVERABLE=True set (build_ability_db filters on a.DISCOVERABLE), ProcessorConfig drops discoverable/blocked, ThinkingConfig drops its blocked arg, and find_tools becomes globally-scoped via AbilityRegistry.discoverable_names() instead of a per-channel slice. Vision stays DISCOVERABLE=True so the DMN background channel can spawn the web delegates; discovery and policy remain orthogonal.
Docs catch up: 09-TOOLS, 04-ARCHITECTURE, and 14-DEFAULT-TOOLS describe the single-flag model with two-way visibility (always_available or global find_tools roster), and the now-wrong main-loop/DMN reflection prose is corrected — the reflection pass reaches the web via the web_search/web_browse delegates rather than the raw news/search/browser tools, which are delegate-exclusive.
-
Twelve abilities set DISCOVERABLE=False: browser, search, news, save_graph, save_pattern, find_tools, find_skills, memory, thinking, chat_history_compactor, tool_chain_compactor, skill_manager
-
Exactly 27 abilities remain discoverable; abilities.sqlite indexes only the DISCOVERABLE=True set
-
News becomes delegate-exclusive behind web_search: policy_manager.INTERNAL adds news with no seed row, and policy_defaults.json drops the dead news rows
-
WebSearchConfig pins thinking to LOW so a user’s persisted high override cannot leak into the search loop
-
find_tools is now globally-scoped via AbilityRegistry.discoverable_names(), not a per-channel slice
-
ProcessorConfig drops discoverable/blocked fields; ThinkingConfig drops its blocked arg