Update Tool Coverage
Keeps dev-docs/tools-coverage.md in
sync with the upstream contracts and our implementation:
- Upstream — the documented tool list at
https://code.claude.com/docs/en/tools-reference.
- Us —
TOOL_INPUT_MODELS / TOOL_OUTPUT_PARSERS in
claude_code_log/factories/tool_factory.py.
- Codex — the installed version's generated app-server
ThreadItem
schema, plus the rollout adapters in providers/codex.py,
providers/codex_tools.py, and providers/codex_javascript.py.
The doc grades each documented tool Full (typed input + typed output),
Input only (typed input, generic output), or Generic (no registry
entry → params-table + raw-<pre> fallback), and separately lists tools we
support that upstream no longer documents (renames like Task→Agent,
supersessions like MultiEdit, legacy aliases, undocumented features).
Claude Code procedure
Fetch the upstream tool names. WebFetch the reference and ask only
for the tool-table names (the page is ~80 KB; a targeted prompt keeps it
manageable):
WebFetch https://code.claude.com/docs/en/tools-reference —
"List the exact tool names in the main tools table, one per line.
Names only, no descriptions."
Note any tool the page marks deprecated/renamed — that's a candidate for
the second table.
Compute the truth mechanically. Feed those names to the bundled
helper (run from the repo root; uv run is required so pydantic
resolves — bare python3 fails with ModuleNotFoundError: pydantic):
printf 'Agent Artifact AskUserQuestion ... Write' \
| uv run python .claude/skills/update-tools-coverage/check_coverage.py
It prints each tool's support level, the totals, the "we register but
upstream doesn't document" set, and — if the doc exists — a drift
report (missing / mismatched / stale rows). If it says in sync [OK] and
the upstream name set is unchanged, there is nothing to do.
Reconcile the doc. Apply the helper's output to
dev-docs/tools-coverage.md:
- Move rows between the two tables as tools enter/leave the upstream list —
never delete a row for a tool we still register. A tool leaving the
reference moves to the "no longer documented" table (it's history a
transcript viewer must still render); it does not lose support.
- Fix any support-level the drift report flags.
- Update the totals line and the snapshot date in the intro
(
snapshot YYYY-MM-DD).
- The Notes column is hand-maintained — carry notes forward; only the
support level is machine-derived.
Re-run the helper to confirm in sync [OK].
Codex procedure
Codex function/MCP/plugin names are open-ended, so do not try to create a
closed upstream function-name list. Check two separate tables instead:
Generate the public semantic item schema for the installed Codex version:
codex --version
codex app-server generate-json-schema --out /tmp/codex-app-server-schema
Read definitions.ThreadItem.oneOf in
/tmp/codex-app-server-schema/codex_app_server_protocol.v2.schemas.json.
Reconcile added/removed variants with "Codex provider coverage / Public
item families" and update its version, date, and totals.
Run the local drift checker after editing:
uv run python .claude/skills/update-tools-coverage/check_codex_coverage.py \
/tmp/codex-app-server-schema/codex_app_server_protocol.v2.schemas.json
Reconcile concrete call mappings with _canonicalize() in
providers/codex_tools.py, result/batch reconstruction in
providers/codex.py, and the test/test_codex_* contracts.
Reconcile the static-JavaScript list with the whitelisted transfer
functions in providers/codex_javascript.py. Never describe legacy-regex
support as production fallback: it is retained only as an explicit test
comparison baseline.
The generated schema is version-specific and the rollout format is not a
public wire contract. State both facts in the documentation snapshot.
Guardrails
- Generic is a feature, not a gap. Unknown /
mcp__* / plugin tools
should fall back to generic rendering. Only type a tool when it's common
or carries structure worth surfacing — see
implementing-a-tool-renderer.md
(or the tool-renderer skill) to actually add one.
- Undocumented ≠ obsolete. The reference table isn't a full census of
what lands in a JSONL file (e.g.
TeamCreate/TeamDelete are typed both
sides but never appeared upstream). Keep those under "no longer /never
documented" with a note, not removed.
- Dead models.
GlobOutput / GrepOutput exist in models.py but no
parser constructs them, so Glob/Grep are Input only. If a future
change wires up a parser, they graduate to Full automatically — the helper
will show the flip.
1---2name: update-tools-coverage3description: Refresh dev-docs/tools-coverage.md against the upstream Claude Code tools reference and the Codex app-server item schema. Use when checkpointing tool-renderer/provider coverage, after adding/removing a renderer or Codex adapter, or when either upstream taxonomy may have changed.4---567# Update Tool Coverage89Keeps [`dev-docs/tools-coverage.md`](../../../dev-docs/tools-coverage.md) in10sync with the upstream contracts and our implementation:11121. **Upstream** — the documented tool list at13 <https://code.claude.com/docs/en/tools-reference>.142. **Us** — `TOOL_INPUT_MODELS` / `TOOL_OUTPUT_PARSERS` in15 [`claude_code_log/factories/tool_factory.py`](../../../claude_code_log/factories/tool_factory.py).163. **Codex** — the installed version's generated app-server `ThreadItem`17 schema, plus the rollout adapters in `providers/codex.py`,18 `providers/codex_tools.py`, and `providers/codex_javascript.py`.1920The doc grades each documented tool **Full** (typed input + typed output),21**Input only** (typed input, generic output), or **Generic** (no registry22entry → params-table + raw-`<pre>` fallback), and separately lists tools we23support that upstream no longer documents (renames like `Task`→`Agent`,24supersessions like `MultiEdit`, legacy aliases, undocumented features).2526## Claude Code procedure27281. **Fetch the upstream tool names.** WebFetch the reference and ask only29 for the tool-table names (the page is ~80 KB; a targeted prompt keeps it30 manageable):3132 > WebFetch `https://code.claude.com/docs/en/tools-reference` —33 > "List the exact tool names in the main tools table, one per line.34 > Names only, no descriptions."3536 Note any tool the page marks deprecated/renamed — that's a candidate for37 the second table.38392. **Compute the truth mechanically.** Feed those names to the bundled40 helper (run from the repo root; `uv run` is required so `pydantic`41 resolves — bare `python3` fails with `ModuleNotFoundError: pydantic`):4243 ```bash44 printf 'Agent Artifact AskUserQuestion ... Write' \45 | uv run python .claude/skills/update-tools-coverage/check_coverage.py46 ```4748 It prints each tool's support level, the totals, the "we register but49 upstream doesn't document" set, and — if the doc exists — a **drift50 report** (missing / mismatched / stale rows). If it says `in sync [OK]` and51 the upstream name set is unchanged, there is nothing to do.52533. **Reconcile the doc.** Apply the helper's output to54 `dev-docs/tools-coverage.md`:55 - Move rows between the two tables as tools enter/leave the upstream list —56 **never delete** a row for a tool we still register. A tool leaving the57 reference moves to the "no longer documented" table (it's history a58 transcript viewer must still render); it does not lose support.59 - Fix any support-level the drift report flags.60 - Update the **totals line** and the **snapshot date** in the intro61 (`snapshot YYYY-MM-DD`).62 - The **Notes column is hand-maintained** — carry notes forward; only the63 support level is machine-derived.64654. **Re-run the helper** to confirm `in sync [OK]`.6667## Codex procedure6869Codex function/MCP/plugin names are open-ended, so do not try to create a70closed upstream function-name list. Check two separate tables instead:71721. Generate the public semantic item schema for the installed Codex version:7374 ```bash75 codex --version76 codex app-server generate-json-schema --out /tmp/codex-app-server-schema77 ```78792. Read `definitions.ThreadItem.oneOf` in80 `/tmp/codex-app-server-schema/codex_app_server_protocol.v2.schemas.json`.81 Reconcile added/removed variants with "Codex provider coverage / Public82 item families" and update its version, date, and totals.83 Run the local drift checker after editing:8485 ```bash86 uv run python .claude/skills/update-tools-coverage/check_codex_coverage.py \87 /tmp/codex-app-server-schema/codex_app_server_protocol.v2.schemas.json88 ```89903. Reconcile concrete call mappings with `_canonicalize()` in91 `providers/codex_tools.py`, result/batch reconstruction in92 `providers/codex.py`, and the `test/test_codex_*` contracts.934. Reconcile the static-JavaScript list with the whitelisted transfer94 functions in `providers/codex_javascript.py`. Never describe legacy-regex95 support as production fallback: it is retained only as an explicit test96 comparison baseline.9798The generated schema is version-specific and the rollout format is not a99public wire contract. State both facts in the documentation snapshot.100101## Guardrails102103- **Generic is a feature, not a gap.** Unknown / `mcp__*` / plugin tools104 *should* fall back to generic rendering. Only type a tool when it's common105 or carries structure worth surfacing — see106 [`implementing-a-tool-renderer.md`](../../../dev-docs/implementing-a-tool-renderer.md)107 (or the `tool-renderer` skill) to actually add one.108- **Undocumented ≠ obsolete.** The reference table isn't a full census of109 what lands in a JSONL file (e.g. `TeamCreate`/`TeamDelete` are typed both110 sides but never appeared upstream). Keep those under "no longer /never111 documented" with a note, not removed.112- **Dead models.** `GlobOutput` / `GrepOutput` exist in `models.py` but no113 parser constructs them, so `Glob`/`Grep` are **Input only**. If a future114 change wires up a parser, they graduate to Full automatically — the helper115 will show the flip.