Skip to content

fix(tool-search): never defer Omnio's own product tools - #68

Merged
ppazosp merged 1 commit into
mainfrom
ppp/omnio-tool-search-core
Aug 7, 2026
Merged

fix(tool-search): never defer Omnio's own product tools#68
ppazosp merged 1 commit into
mainfrom
ppp/omnio-tool-search-core

Conversation

@ppazosp

@ppazosp ppazosp commented Aug 7, 2026

Copy link
Copy Markdown

Problem

The tiered-disclosure change (upstream 0986ac393) activates the tool_search bridge whenever any deferrable tool exists. Omnia's six plugin tools are deferrable, so they all end up behind tool_search / tool_describe / tool_call.

That breaks a contract the rest of the system already relies on: the agent's operating docs (SOUL.md, AGENTS.md) and the shipped skills name those tools directly. A deferred tool reads to the model as unavailable, so it substitutes a weaker built-in rather than searching for the one it was told to use.

Observed live, in production: the agent wanted web_read, reported it as "not directly available — it's a deferred tool under omnio-web", and fell back to web_extract.

Change

Extend only the never-defer set tool_search consults, via a dedicated _OMNIO_ALWAYS_LOAD_TOOLS frozenset unioned into _core_tool_names().

_HERMES_CORE_TOOLS is deliberately left untouched — it doubles as the tools: payload for the hermes-cli / cron / telegram toolsets, so widening it would change what those surfaces load. The two concerns share a name today but not a purpose; this keeps them separate.

Scope

Two files, +83/-2. No behaviour change for any non-Omnio surface: the always-load set is empty of anything those toolsets consult.

Testing

tests/tools/test_tool_search.py 57 passed (5 new)
tests/hermes_cli/test_tools_config.py 131 passed
tests/cron/test_scheduler.py 239 passed
tests/test_model_tools.py 32 passed
ruff check clean

The three non-tool_search files are the other consumers of _core_tool_names / _HERMES_CORE_TOOLS, run to confirm the toolset payloads are unmoved.

Backward compatibility

Backward compatible.

Mixed-version pairing checked: Omnia ships via Vercel, the Hermes fork ships via sprite reprovision, independently. This change lives entirely inside the sandbox's Hermes — it alters which tools are presented to the model in a single turn, and touches no wire format, no persisted state, and no schema.

  • New Hermes / old Omnia — the six tools load eagerly instead of deferred. Old Omnia neither knows nor cares which disclosure tier a tool sat in.
  • Old Hermes / new Omnia — unchanged from today; the tools stay deferred and the agent keeps substituting. That is the bug, not a break.
  • Persisted replay — no tool-call transcript changes shape. A tool_search-mediated call and a direct call serialise identically.

Rollout is a plain reprovision, no ordering constraint against Omnia.

🤖 Generated with Claude Code

The tiered-disclosure change (upstream 0986ac3) activates the
tool_search bridge whenever ANY deferrable tool exists, so Omnia's six
plugin tools all end up behind tool_search/tool_describe/tool_call. The
agent's operating docs and skills name those tools directly, so a
deferred one reads as unavailable and the model substitutes a weaker
built-in — observed live: it wanted web_read, found it deferred, and
used web_extract instead.

Extend only the never-defer set tool_search consults, via a dedicated
_OMNIO_ALWAYS_LOAD_TOOLS constant unioned into _core_tool_names().
_HERMES_CORE_TOOLS is left untouched because it doubles as the tools:
payload for the hermes-cli/cron/telegram toolsets.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwVLayGYn4ZdvF5oE6TYPA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant