- Status: Accepted (workflow-first surface, 2026 Q3) — 2026-07-21
- Date: 2026-07-21
- Builds on: ADR-0010 (telemetry-driven tool diet), ADR-0013 (tools.toml codegen)
Context
tools.toml registers 100 tools across 9 categories. The default listed surface is already
lean for Claude Code (9 verbs), but generic/Codex clients see far more, and CodeLens layers
its own deferred-loading gate (_session_deferred_tool_loading) on top of hosts that now
ship native tool search. Anthropic guidance places selection-accuracy degradation at
~30–50 concurrently loaded tools; Codex has no native tool search and relies on small
static surfaces plus skill progressive disclosure. Two systems solving the same problem
in different layers produce inconsistent visibility (prepare_harness_session re-expands
what the host deferred).
Decision
- Always-loaded core (10):
prepare_harness_session,search,overview,graph,diagnose,review,plan_safe_refactor,verify_change_readiness,get_changed_files,get_current_config. - Static default surface (≤ 20): core plus
get_ranked_context,find_symbol,find_referencing_symbols,semantic_search,refresh_symbol_index,get_watch_status,start_analysis_job,get_analysis_job,get_analysis_section,cancel_analysis_job. (present only when the semantic feature is active.) - Remaining registered names survive one compatibility release as hidden aliases
(callable, not listed), then are removed on usage telemetry. The full disposition of
all 100 names lives in
docs/design/workflow-first-tool-surface-migration.md. - Host-native duplicates (
read_file,list_dir,find_file) leave the default surface entirely; they remain behind thegenericcompatibility profile only. - CodeLens-side deferred loading is disabled when
HostCapabilities.native_tool_search == true; the server then exposes the static ≤ 20 and lets the host search the rest. - Every public tool ships complete
inputSchema,outputSchema, and read-only/idempotent/destructive annotations. Read tools accept array inputs and cursors and honor snapshot pins, making them safe targets for programmatic tool calling and parallel fan-out. Mutation tools are excluded from programmatic/indirect invocation paths.
Consequences
- One surface story per host class;
prepare_harness_sessionstops re-expanding surfaces. - The verb facade becomes the real API; mode-shaped former tools become documented modes.
- Skills and agent definitions must reference only callable-surface names (CI-checked).
Verification
- Default
tools/list≤ 20 for every built-in profile; schema coverage 100% (CI gate). - Zero skills/agents referencing non-callable names (
scripts/surface-manifest.py --checkextended with a reference audit). - Token-cost snapshot per host profile recorded before/after in
benchmarks/.