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---56# Update Tool Coverage78Keeps [`dev-docs/tools-coverage.md`](../../../dev-docs/tools-coverage.md) in9sync with the upstream contracts and our implementation:10111. **Upstream** — the documented tool list at12 <https://code.claude.com/docs/en/tools-reference>.132. **Us** — `TOOL_INPUT_MODELS` / `TOOL_OUTPUT_PARSERS` in14 [`claude_code_log/factories/tool_factory.py`](../../../claude_code_log/factories/tool_factory.py).153. **Codex** — the installed version's generated app-server `ThreadItem`16 schema, plus the rollout adapters in `providers/codex.py`,17 `providers/codex_tools.py`, and `providers/codex_javascript.py`.1819The doc grades each documented tool **Full** (typed input + typed output),20**Input only** (typed input, generic output), or **Generic** (no registry21entry → params-table + raw-`<pre>` fallback), and separately lists tools we22support that upstream no longer documents (renames like `Task`→`Agent`,23supersessions like `MultiEdit`, legacy aliases, undocumented features).2425## Claude Code procedure26271. **Fetch the upstream tool names.** WebFetch the reference and ask only28 for the tool-table names (the page is ~80 KB; a targeted prompt keeps it29 manageable):3031 > WebFetch `https://code.claude.com/docs/en/tools-reference` —32 > "List the exact tool names in the main tools table, one per line.33 > Names only, no descriptions."3435 Note any tool the page marks deprecated/renamed — that's a candidate for36 the second table.37382. **Compute the truth mechanically.** Feed those names to the bundled39 helper (run from the repo root; `uv run` is required so `pydantic`40 resolves — bare `python3` fails with `ModuleNotFoundError: pydantic`):4142 ```bash43 printf 'Agent Artifact AskUserQuestion ... Write' \44 | uv run python .claude/skills/update-tools-coverage/check_coverage.py45 ```4647 It prints each tool's support level, the totals, the "we register but48 upstream doesn't document" set, and — if the doc exists — a **drift49 report** (missing / mismatched / stale rows). If it says `in sync [OK]` and50 the upstream name set is unchanged, there is nothing to do.51523. **Reconcile the doc.** Apply the helper's output to53 `dev-docs/tools-coverage.md`:54 - Move rows between the two tables as tools enter/leave the upstream list —55 **never delete** a row for a tool we still register. A tool leaving the56 reference moves to the "no longer documented" table (it's history a57 transcript viewer must still render); it does not lose support.58 - Fix any support-level the drift report flags.59 - Update the **totals line** and the **snapshot date** in the intro60 (`snapshot YYYY-MM-DD`).61 - The **Notes column is hand-maintained** — carry notes forward; only the62 support level is machine-derived.63644. **Re-run the helper** to confirm `in sync [OK]`.6566## Codex procedure6768Codex function/MCP/plugin names are open-ended, so do not try to create a69closed upstream function-name list. Check two separate tables instead:70711. Generate the public semantic item schema for the installed Codex version:7273 ```bash74 codex --version75 codex app-server generate-json-schema --out /tmp/codex-app-server-schema76 ```77782. Read `definitions.ThreadItem.oneOf` in79 `/tmp/codex-app-server-schema/codex_app_server_protocol.v2.schemas.json`.80 Reconcile added/removed variants with "Codex provider coverage / Public81 item families" and update its version, date, and totals.82 Run the local drift checker after editing:8384 ```bash85 uv run python .claude/skills/update-tools-coverage/check_codex_coverage.py \86 /tmp/codex-app-server-schema/codex_app_server_protocol.v2.schemas.json87 ```88893. Reconcile concrete call mappings with `_canonicalize()` in90 `providers/codex_tools.py`, result/batch reconstruction in91 `providers/codex.py`, and the `test/test_codex_*` contracts.924. Reconcile the static-JavaScript list with the whitelisted transfer93 functions in `providers/codex_javascript.py`. Never describe legacy-regex94 support as production fallback: it is retained only as an explicit test95 comparison baseline.9697The generated schema is version-specific and the rollout format is not a98public wire contract. State both facts in the documentation snapshot.99100## Guardrails101102- **Generic is a feature, not a gap.** Unknown / `mcp__*` / plugin tools103 *should* fall back to generic rendering. Only type a tool when it's common104 or carries structure worth surfacing — see105 [`implementing-a-tool-renderer.md`](../../../dev-docs/implementing-a-tool-renderer.md)106 (or the `tool-renderer` skill) to actually add one.107- **Undocumented ≠ obsolete.** The reference table isn't a full census of108 what lands in a JSONL file (e.g. `TeamCreate`/`TeamDelete` are typed both109 sides but never appeared upstream). Keep those under "no longer /never110 documented" with a note, not removed.111- **Dead models.** `GlobOutput` / `GrepOutput` exist in `models.py` but no112 parser constructs them, so `Glob`/`Grep` are **Input only**. If a future113 change wires up a parser, they graduate to Full automatically — the helper114 will show the flip.