aegisub-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@aegisub-mcpopen episode01.ass, shift all lines 2 seconds later, then save it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
aegisub-mcp
A Model Context Protocol server for Aegisub / ASS subtitles. It exposes 138 tools that read and edit subtitle documents, run real Aegisub Automation 4 scripts (Lua) against them, and bridge a running Aegisub instance to the MCP client over a shared directory — plus a libass-backed verification layer, so an MCP client (Hermes, Claude Desktop, Codex, …) can do real subtitle work instead of text munging.
Work happens on open documents held by the server: call ass_open (path) or
ass_new_document first, then address the returned doc_id with the other tools.
Requirements
Python >= 3.10 (
requires-pythoninpyproject.toml)mcp >= 2.2(MCP SDK) andlupa >= 2.0(Lua automations) — installed automatically. The 2.x line is required:mcp.server.mcpserver.MCPServer(whatserver.pyimports) does not exist in 1.x, which exposes onlyFastMCP/Server.Optional:
fonttools+uharfbuzzfor the font/glyph metrics tools (pip install -e '.[metrics]')Optional:
pytest+pytest-timeoutfor development (pip install -e '.[dev]')For the live bridge: Aegisub itself (3.4.x tested) needs no Python at all — it runs the generated Lua.
xdotool/ydotoolis optional and only used byass_bridge_inject.
Related MCP server: Files MCP Server
Install
Either install it into a virtualenv:
python -m venv .venv
.venv/bin/pip install -e '.[dev]'or run it straight from a checkout without installing (the package lives under src/):
PYTHONPATH=src .venv/bin/python -m aegisub_mcpRunning
Two entry points over one tool surface: aegisub-mcp (stdio) and aegisub-mcp-http
(streamable HTTP, the transport that serves protocol 2026-07-28).
stdio — the default
aegisub-mcp speaks MCP over stdio; stdout carries JSON-RPC framing and nothing
else, all diagnostics go to stderr.
Over stdio the server negotiates protocol revision 2025-11-25 — the newest revision
reachable through the initialize handshake. Revision 2026-07-28 is the stateless
per-request revision (no handshake, no session; carried by the MCP-Protocol-Version
header) and can only be served over HTTP, which this entrypoint does not carry: use
aegisub-mcp-http below. A client that asks stdio for 2026-07-28 is counter-offered
2025-11-25. Verify with any client, or by hand:
printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-07-28","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}' \
| PYTHONPATH=src .venv/bin/python -m aegisub_mcp | head -1
# -> "protocolVersion":"2025-11-25"aegisub-mcp # console script, once installed
PYTHONPATH=src python -m aegisub_mcp # from a checkoutStreamable HTTP — protocol 2026-07-28
aegisub-mcp-http serves the same tools at POST /mcp. Because 2026-07-28 is
stateless, each request is self-contained: the revision and the client capabilities
ride in the request's _meta envelope and its MCP-Protocol-Version / Mcp-Method /
Mcp-Name headers, there is no initialize and no session id. The handshake
replacement is server/discover.
Legacy clients that send no MCP-Protocol-Version header (or a handshake revision) are
served exactly as before on the same URL, so one endpoint answers both eras. Open
documents live in the server process, not in a session — a document opened by one POST
is still open for the next one.
aegisub-mcp-http --host 127.0.0.1 --port 8000 # installed
PYTHONPATH=src .venv/bin/python -m aegisub_mcp.http_server --port 8000 # checkoutIt binds to loopback by default. --help lists --path, --json-response,
--stateless, and --allow-host / --allow-origin: the MCP SDK's DNS-rebinding
protection is enabled automatically for loopback binds, and binding anywhere else turns
it on only when you name the allowed hosts (state both, or every request is refused with
Invalid Host header).
Verify the modern path by hand — one POST, no handshake:
curl -sS http://127.0.0.1:8000/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' \
-H 'Mcp-Method: server/discover' \
-d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}'
# -> "supportedVersions":["2026-07-28"], "resultType":"complete", and no Mcp-Session-IdA tool call is the same shape with Mcp-Method: tools/call, Mcp-Name: <tool>, and the
usual params.name / params.arguments:
curl -sS http://127.0.0.1:8000/mcp \
-H 'Content-Type: application/json' \
-H 'MCP-Protocol-Version: 2026-07-28' \
-H 'Mcp-Method: tools/call' -H 'Mcp-Name: ass_open' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"ass_open","arguments":{"path":"/path/to/file.ass"},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}'A typical MCP client entry (stdio):
{
"mcpServers": {
"aegisub": {
"command": "aegisub-mcp",
"args": []
}
}
}For an uninstalled checkout use "command": "python" with
"args": ["-m", "aegisub_mcp"] and "env": {"PYTHONPATH": "/path/to/aegisub-mcp/src"}.
Tool areas
Tools are registered from eight modules under src/aegisub_mcp/tools/ (138 in total);
every tool name starts with the ass_ prefix.
lines (30) — document lifecycle and event lines:
ass_open,ass_new_document,ass_save,ass_list_lines,ass_get_line,ass_update_line(s),ass_add_line(s),ass_delete_lines,ass_move_lines,ass_duplicate_lines,ass_merge_lines,ass_split_line,ass_sort_lines,ass_set_comment,ass_find_replace,ass_export_text,ass_import_srt,ass_select,ass_undo/ass_redo,ass_stats, …styles (25) — script info, styles and attachments:
ass_get_script_info,ass_set_script_info,ass_set_play_res,ass_list_styles,ass_add_style,ass_update_style,ass_rename_style,ass_copy_style,ass_style_usage,ass_style_for_line,ass_add_attachment,ass_extract_attachment,ass_set_extradata,ass_validate, …timing (20) — timing and QC:
ass_set_times,ass_shift_times,ass_scale_times,ass_snap_to_frames,ass_snap_to_keyframes,ass_align_to_silence,ass_fix_timing,ass_cps,ass_qc,ass_check_overlaps,ass_read_timecodes/ass_write_timecodes, …karaoke_tools (13) — karaoke:
ass_karaoke_generate,ass_karaoke_set_timings,ass_karaoke_auto_timings,ass_karaoke_retime,ass_karaoke_shift,ass_karaoke_scale,ass_karaoke_split,ass_karaoke_export,ass_karaoke_get, …tags_tools (13) — override tags and typesetting:
ass_parse_text,ass_plain_text,ass_strip_tags,ass_set_tag,ass_remove_tag,ass_insert_tag_at,ass_apply_tag_to_block,ass_wrap_range,ass_swap_an_pos,ass_add_typesetting,ass_tag_summary, …drawing_tools (20) — vector drawings, clipping and fonts:
ass_get_drawing,ass_set_drawing,ass_drawing_bbox,ass_drawing_to_svg,ass_svg_to_drawing,ass_scale_drawing,ass_join_drawings,ass_split_drawing,ass_get_clips,ass_set_clip,ass_remove_clip,ass_glyph_check,ass_list_fonts,ass_match_font, …automation_tools (7) — run real Aegisub Automation 4 Lua:
ass_automation_dirs,ass_automation_list,ass_automation_info,ass_automation_run_macro,ass_automation_run_filter,ass_automation_run_filters,ass_automation_from_sourcebridge_tools (10) — talk to a running Aegisub:
ass_bridge_publish,ass_bridge_pull,ass_bridge_status,ass_bridge_live,ass_bridge_events,ass_bridge_watch,ass_bridge_autosave,ass_bridge_install,ass_bridge_paths,ass_bridge_inject
Driving Aegisub itself
The document tools work on files; the last two modules work on Aegisub.
Automation 4
ass_automation_run_macro, ass_automation_run_filter(s) and
ass_automation_from_source execute genuine Automation 4 Lua against the open document
with the API surface Aegisub provides (subs, aegisub.dialog.display,
aegisub.set_undo_point, progress, …) — no reimplementation of the subtitle model, the
same host Aegisub uses. ass_automation_dirs / ass_automation_list /
ass_automation_info show what is installed in ?user/automation. A macro that raises
inside Lua is reported as a failure, never as a half-applied edit: the undo snapshot and
the apply path are shared with the document layer.
The live bridge
Aegisub has no MCP client, no socket API and no inbound trigger hook, so the bridge uses a shared directory of small TSV/ASS files. That is what makes it portable to Linux, Windows and macOS, Wayland included: nothing depends on owning a window or injecting keystrokes.
aegisub-mcp-bridge install # write the Aegisub-side script + hotkey
aegisub-mcp-bridge install --dry-run # show the config diff first
aegisub-mcp-bridge status # bridge dir, install state, autosave settingsThen restart Aegisub: autoload scripts load at startup. The script adds two macros to
the Automation menu — krapau-bridge: Pull changes from MCP (default hotkey
Ctrl-Alt-M) and krapau-bridge: Push my document to MCP:
MCP → Aegisub:
ass_bridge_publishqueues a revision; the pull macro applies it to the open document, then writes an acknowledgement with a line count.Aegisub → MCP: the macro writes state/snapshot files; polling them turns file changes into events, and
ass_bridge_livereports which artifact is current.
The bridge directory is $AEGISUB_MCP_BRIDGE when set (run aegisub-mcp-bridge paths
for the resolved default).
ass_bridge_watch is the realtime view. It streams the bridge for seconds and reports
what changed while watching as events; whatever had already happened before the
watch began comes back separately as caught_up, because the first poll only
establishes the baseline — it never ends the watch early. stop_after=1 returns on the
next change, kinds=[...] follows one channel. Event kinds:
aegisub.state— the macro ran; the document revision movedaegisub.applied— a published revision was applied or refused, with a line countaegisub.snapshot— the snapshot file changedaegisub.source— Aegisub saved the file the user is editing, in placeaegisub.autosave— a new autosave copy appeared
A macro whose validate() returns false is disabled by Aegisub, so the pull hotkey
does nothing while no revision is pending. That is the designed behaviour, not a broken
key binding.
Realtime without a daemon
Aegisub writes files in exactly two situations, and install sets up both:
App/Auto/Save on Every Changerewrites the user's own file on every change — always current, but it overwrites their file, so it stays opt-in:--save-on-every-change.App/Auto/Save+Save Every Seconds(install default: 5) writes<name>.<timestamp>.AUTOSAVE.assinto?user/autosave. An interval of0switches the timer off completely, soinstallnever sets 0.
--no-autosave leaves Aegisub's own settings alone. Either way the resulting file change
surfaces through ass_bridge_watch as aegisub.source / aegisub.autosave.
ass_bridge_inject presses the pull hotkey with xdotool/ydotool where one exists —
a convenience for triggering a macro, never the data path (X11-only, so it is not used
by the bridge itself).
Tool results
Every tool returns a JSON object. Expected user errors are raised as ToolError inside
the tool layer and reach the client as {"error": "<message>"}; unexpected exceptions
produce the same payload with the traceback logged to stderr.
File fidelity
The document core is built for byte-faithful round-trips, because subtitle files in the wild are messy:
Re-saving a document that was only opened changes nothing — file encoding, BOM, CRLF line endings and a missing final newline all survive a round-trip.
Lines read from a file keep their original spelling; only the fields a tool is asked to change are rewritten.
ASS writes
Layeras the first event field, SSA (ScriptType: v4.00) writesMarked; a new document declares the format of the script type it was created with.Lines built from scratch adopt the document's own
Dialogue:/Comment:separator (Dialogue: 0,…in Aegisub output,Dialogue:0,…in compact files) instead of forcing one spelling.Every mutation takes an undo snapshot, so
ass_undorestores the previous bytes.
Output files
Tools that write standalone files (text exports, drawings, fonts) put them in
$AEGISUB_MCP_OUT when set, otherwise in ./aegisub-mcp-out. That directory is
build output, not source, and is git-ignored.
Development
.venv/bin/python -m pytest # whole suite
.venv/bin/python -m pytest tests/test_tools_lines.py -vThe suite drives the tool layer directly (tests/test_tools_*.py), the stdio server end to
end (tests/test_server_stdio.py), and the HTTP entry point end to end
(tests/test_http_server.py, which boots the real server and speaks 2026-07-28 over the
wire), and uses the frozen files in tests/fixtures/real/ as round-trip fixtures.
The Aegisub-facing half is tested the same way: tests/test_automation_tools.py runs
Automation 4 scripts through the Lua host, tests/test_bridge_lua.py renders and executes
the generated bridge script (the same file install writes into ?user), and
tests/test_bridge_tools.py drives the MCP half against a bridge directory — install,
publish, apply, poll, watch and the autosave channel. Nothing is mocked: the Lua side is
the real script and the Python side is the real tool layer.
License
MIT — see LICENSE.
Available Tools
121 toolsass_add_attachmentA
Attach a file to the document, base64-encoded, like Aegisub's attach menu.
Args:
path: file to attach (read from disk; the only filesystem input of this
module besides the workspace itself).
doc_id: document id or None for the current document.
name: name stored in the document; defaults to the file's basename.
kind: "font" or "image"; inferred from the magic bytes, falling
back to the file extension, when omitted.
Returns:
{"doc_id", "name", "kind", "section", "path", "bytes", "base64_lines", "sniff", "replaced"}. An attachment with the same
name in the same section is replaced (replaced is True).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| name | No | ||
| path | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses base64 encoding, filesystem reads from path, defaulting rules for doc_id and name, kind inference via magic bytes with extension fallback, and replacement semantics when an attachment with the same name exists in the same section. It also lists the return fields, including the replaced flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then organized into Args and Returns sections. Every sentence adds useful information, and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations, four parameters with 0% schema description coverage, and an output schema, the description is complete enough to invoke the tool correctly. It documents parameter defaults, file handling, inference behavior, return structure, and replacement behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: each of the four parameters is explained with meaning beyond the bare schema. It clarifies that path is read from disk, doc_id None selects the current document, name defaults to the file's basename, and kind accepts 'font' or 'image' with inference behavior when omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Attach a file to the document, base64-encoded.' This distinguishes the tool from sibling attachment operations like ass_remove_attachment, ass_list_attachments, and ass_extract_attachment without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but gives no explicit guidance on when to use it instead of alternatives such as ass_extract_attachment or ass_remove_attachment. The analogy to Aegisub's attach menu provides context but does not specify use conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_add_lineA
Append a new line.
start_ms/end_ms accept milliseconds or time strings such as
"0:00:01.50"; they are clamped into the document timebase and
end < start is an error. Lines are appended at the end of the document
and the returned index is its 0-based position. The call is
snapshot-backed, so :func:ass_undo reverts it.
Returns {"doc_id", "index", "line": <line dict>}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| actor | No | ||
| layer | No | ||
| style | No | Default | |
| doc_id | No | ||
| effect | No | ||
| end_ms | Yes | ||
| comment | No | ||
| margin_l | No | ||
| margin_r | No | ||
| margin_v | No | ||
| start_ms | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses accepted time formats, clamping into the document timebase, the `end < start` error condition, that lines append at the end, that the index is 0-based, and that the operation is snapshot-backed and undoable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then layers time semantics, error conditions, undo behavior, and return shape in tight, non-redundant sentences. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, yet the description usefully summarizes the payload. Error and undo semantics are covered; the main gap is the undocumented non-timing parameters for what is a 12-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 12 parameters, so the description must compensate. It thoroughly explains the two timing params (accepted formats, clamping, ordering error) but leaves ten parameters (text, layer, style, effect, comment, margins, doc_id, actor) undefined in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Append a new line.' Clear and unambiguous. However, it does not differentiate from the sibling ass_add_lines (bulk add), leaving the agent to infer which to pick when adding one vs many.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance, no prerequisites, and no routing to the closely-named sibling ass_add_lines for multi-line insertion. The only contextual hint is that ass_undo reverts the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_add_linesA
Append several lines in one call.
lines is a list of dicts using the :func:ass_add_line keys
(start_ms/end_ms/text/style/actor/effect/layer/
comment/margin_l/margin_r/margin_v) plus an optional
index — the 0-based position the new line is inserted at. Insertion
positions refer to the line list as it is being built (the previous inserts
of this same call are already in place); lines without index go to the
end. All times accept milliseconds or time strings.
Returns {"doc_id", "indices": [<0-based index per input dict>], "count", "lines": [<line dict>, ...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explains that insert positions are 0-based, that indices resolve against the in-progress list (earlier inserts of the same call already placed), that omitted indices append, and that times accept ms or time strings. It does not cover permissions or failure behavior, but the mutation semantics are unusually well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by necessary schema detail and the return shape. The key enumeration is long but each element adds meaning; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return description is a bonus rather than a necessity, and the insertion-ordering semantics are fully specified for a mutation tool. The only omission is any mention of doc_id or which document the operation targets.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it comprehensively enumerates the accepted dict keys (start_ms/end_ms/text/style/actor/effect/layer/comment/margins) plus the optional index and time-format flexibility. The optional doc_id parameter is never mentioned, which is the only gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Append several lines in one call') and implicitly distinguishes itself from the singular sibling ass_add_line by referencing its keys and the batch nature ('in one call'). An agent can identify this as the bulk-append variant without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'in one call' hints that this is the efficient batch alternative to repeated ass_add_line invocations, but there is no explicit when-to-use/when-not guidance or named alternative. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_add_styleA
Create a style, or replace an existing one of the same name.
Every value is stored verbatim (/48.0 becomes 48); colour values
given as #RRGGBB are converted into the spelling the document already
uses for that field. Values are validated before anything is written:
font_size must be positive, alignment 1-9, border_style 1 or 3,
margins whole numbers and colours a spelling the document can store.
overwrite=True replaces the style: every field is (re)written from
the arguments, so fields left at their defaults go back to those defaults
rather than keeping the old value — use ass_update_style to change a
few fields and leave the rest alone. relative_to is Aegisub's
style-manager setting: it is only written when the document's Format
line already declares a RelativeTo column, otherwise it is listed in
ignored_fields (adding the column would desynchronise the Format
line).
Returns:
{"doc_id", "name", "created", "style", "fields_set", "ignored_fields"} — created is False when overwrite=True
replaced an existing style.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | ||
| font | No | Arial | |
| name | Yes | ||
| angle | No | ||
| doc_id | No | ||
| italic | No | ||
| shadow | No | ||
| outline | No | ||
| scale_x | No | ||
| scale_y | No | ||
| spacing | No | ||
| encoding | No | ||
| margin_l | No | ||
| margin_r | No | ||
| margin_v | No | ||
| alignment | No | ||
| font_size | No | ||
| overwrite | No | ||
| underline | No | ||
| strike_out | No | ||
| back_colour | No | &H00000000& | |
| relative_to | No | ||
| border_style | No | ||
| outline_colour | No | &H00000000& | |
| primary_colour | No | &H00FFFFFF& | |
| secondary_colour | No | &H000000FF& |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description carries the full burden and delivers: verbatim storage rules ('/48.0' becomes 48), colour normalization, pre-write validation constraints (font_size positive, alignment 1-9, border_style 1 or 3), the destructive semantics of overwrite=True (fields revert to defaults), and the relative_to/Format-line 'ignored_fields' edge case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core create/replace action and the overwrite distinction before the detail paragraphs. Dense and largely waste-free, though the validation and returns blocks could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the hard parts an agent needs: overwrite semantics, validation, the Format-line caveat, and the return shape. With a declared output schema, the explicit return documentation is a bonus rather than a necessity, and the partial parameter coverage is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 26 parameters, so the description must compensate. It adds real validation meaning for font_size, alignment, border_style, margins, colours, overwrite, and relative_to, but leaves the majority (bold, italic, outline, shadow, scale_x/y, spacing, encoding, angle, font, underline, strike_out) to inference from titles/defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Create a style, or replace an existing one of the same name') and immediately distinguishes itself from the sibling ass_update_style. An agent knows exactly what this tool does versus its neighbors without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative ('use ``ass_update_style`` to change a few fields and leave the rest alone') and gives the precise condition under which overwrite replaces versus preserves fields. This is the when/when-not/alternative pattern at its best.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_add_typesettingA
Build a leading override block out of named typesetting pieces.
Args:
selection: selection spelling; every selected line receives the block.
doc_id: document to edit; the current one when omitted.
pos: [x, y] -> \pos(x,y).
an: alignment, a plain integer 1..9 (7 -> \an7). Booleans,
floats and out-of-range values are rejected; \q-style
alignments are not part of this helper.
move: \move animation. Accepted shapes: six numbers
[x1, y1, x2, y2, t1, t2] (times in milliseconds), four
numbers, two pairs, a pair (expanded to a zero-length move), or a
dict with x1/y1/x2/y2 and optional t1/t2.
fade: \fad/\fade. A pair [in_ms, out_ms] produces
\fad(in,out); a 4-tuple [a1, a2, a3, t] produces
\fade(a1,a2,a3,t,t,t,t); the full 7-tuple
[a1, a2, a3, t1, t2, t3, t4] is passed through verbatim; a dict
with a1/a2/a3/t1..t4 also works.
clip: \clip/\iclip. A rectangle [x0, y0, x1, y1], a
drawing path string ("m 0 0 l 100 0 100 100" — it must contain a
drawing command, otherwise the string is rejected instead of being
handed to libass as a no-op), [scale, path],
or a dict {"rect": [...]} / {"drawing": "...", "scale": n}
with "inverse": true to emit \iclip.
org: [x, y] -> \org(x,y).
extra_tags: any additional override text (braces and the leading
backslash are optional) appended to the block in the order given.
reset_first: put \r at the front of the block so the line starts
from the style's values before the new tags are applied.
in_place: write the block back to the document (snapshot-backed,
True by default). With False the planned lines are returned
but the document is left alone.
Returns {"doc_id", "tag_string", "override", "reset_first", "count", "changed", "written", "in_place", "lines": [{"index", "before", "text", "changed"}], "text"}. tag_string is the exact tag string produced
(without the braces, e.g. \an8\pos(100,200)); text is the new line
text when the selection resolved to a single line, otherwise None (the
per-line texts are in lines). The block is merged into the line's
existing first block so duplicated tags are updated instead of stacking.
| Name | Required | Description | Default |
|---|---|---|---|
| an | No | ||
| org | No | ||
| pos | No | ||
| clip | No | ||
| fade | No | ||
| move | No | ||
| doc_id | No | ||
| in_place | No | ||
| selection | Yes | ||
| extra_tags | No | ||
| reset_first | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it states the default write behavior (snapshot-backed, in_place=True), the no-write alternative (in_place=False), and the merge semantics ('merged into the line's existing first block so duplicated tags are updated instead of stacking'). It also discloses validation behavior (booleans, floats and out-of-range values rejected for 'an'; drawing strings without a command rejected). It stops short of permissions/undo implications, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the purpose, and the verbosity is almost entirely load-bearing parameter documentation rather than padding. A few entries are dense, but each shape mapping earns its place and there is little that could be cut without losing semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-parameter mutation tool this covers purpose, per-parameter encodings, mutation semantics, and even the return shape (although an output schema already exists, so return values need not be explained). Nothing an agent needs to construct a correct override block correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: each of the 11 parameters is documented with accepted input shapes and exact tag output (e.g. move as 6/4/2-tuple or dict with optional t1/t2 in milliseconds; fade 2-tuple vs 4-tuple vs 7-tuple; clip rectangle vs drawing path vs [scale, path] vs dict with inverse). This is far richer than anything the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Build a leading override block out of named typesetting pieces') and enumerates exactly which ASS tags it can emit (\pos, \an, \move, \fad/\fade, \clip/\iclip, \org). It is clear on its own, but it never names or contrasts with closely related siblings such as ass_set_tag, ass_apply_tag_to_block, or ass_insert_tag_at, so an agent cannot disambiguate purely from the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative-tool guidance. The arg notes imply the block is applied to every selected line and that in_place=False returns a plan without writing, but the caller is left to infer when this helper is preferable to the many other tag-manipulation siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_align_lines_to_silenceA
Move line starts out of audio silence (ffmpeg silencedetect).
A line whose start falls inside a silent interval is pushed to the end of
that interval: shift_only="both" (default) moves the end by the same
delta, "start" keeps the end where it is and shortens the line. Lines
that start on audio are left alone and are not reported as suggestions.
Args:
selection: lines to consider.
video: media file; defaults to the workspace video/audio.
noise_db: silence threshold in dBFS.
min_silence_s: shortest silence to act on.
doc_id: document id.
dry_run: when True (the default) the plan is returned and nothing is
written.
shift_only: None/"both" or "start".
max_shift_ms: ignore suggestions longer than this.
Returns:
The same plan as :func:ass_align_to_silence plus "dry_run" and
"applied" so the caller always knows whether the document changed.
| Name | Required | Description | Default |
|---|---|---|---|
| video | No | ||
| doc_id | No | ||
| dry_run | No | ||
| noise_db | No | ||
| selection | No | ||
| shift_only | No | ||
| max_shift_ms | No | ||
| min_silence_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the default is dry_run=True so nothing is written, exactly how line ends change under shift_only='both' vs 'start', and that the result carries 'dry_run'/'applied' so the caller knows whether the document changed. Mutation scope is fully characterized.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and cleanly organized into Args/Returns. It is appropriately sized for eight parameters, though the Returns paragraph partially overlaps with the existing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter, no-annotation mutation tool this is complete: every parameter is explained, the default dry-run behavior is stated, and the dry_run/applied return fields are surfaced even though an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it documents all eight parameters (selection, video, noise_db, min_silence_s, doc_id, dry_run, shift_only, max_shift_ms) with meaning beyond the bare titles, including the enum-like values for shift_only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Move line starts out of audio silence') and the mechanism (ffmpeg silencedetect). It also implicitly distinguishes itself from the sibling ass_align_to_silence by referencing that function's plan as its return baseline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the operational context clearly ('Lines that start on audio are left alone and are not reported as suggestions'), so an agent knows which lines are affected. It does not, however, explicitly name when to prefer this over adjacent timing tools such as ass_fix_timing or ass_align_to_silence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_align_to_silenceA
Report audio silence intervals and the per-line shifts they suggest.
This tool never modifies the document — it exists so an agent can look
before it leaps; :func:ass_align_lines_to_silence applies the same plan
when dry_run=False.
Args:
selection: lines to consider.
video: media file; defaults to the workspace video/audio.
noise_db: silence threshold in dBFS (passed to silencedetect).
min_silence_s: shortest silence to report.
doc_id: document id.
shift_only: None/"both" shift start and end together, "start"
moves only the start (shortening the line).
max_shift_ms: ignore suggestions longer than this.
Returns:
{"doc_id", "path", "noise_db", "min_silence_s", "shift_only", "max_shift_ms", "silences": [{"start_ms", "end_ms", "duration_ms"}], "suggestions": [{"index", "start_ms", "end_ms", "new_start_ms", "new_end_ms", "delta_ms", "silence", "reason"}], "count", "applied": False, "note"}
| Name | Required | Description | Default |
|---|---|---|---|
| video | No | ||
| doc_id | No | ||
| noise_db | No | ||
| selection | No | ||
| shift_only | No | ||
| max_shift_ms | No | ||
| min_silence_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does the most important part: it loudly declares 'never modifies the document' and marks the return with applied:False plus a note. It also discloses that max_shift_ms filters suggestions and the shift_only semantics. It stops short of permissions/rate-limit context, so a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and cleanly sectioned into Args/Returns with no filler sentences. Slightly redundant in that an output schema already exists yet the full return shape is restated, which costs a bit of brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-param, all-optional tool with no annotations, the description covers the read-only guarantee, every parameter's meaning, and the return contract. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no parameter descriptions), so the description must compensate, and it documents all 7 params. It adds real meaning beyond the schema: noise_db is passed to silencedetect, shift_only 'both'/'start' controls whether the end moves, and max_shift_ms filters out long suggestions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report audio silence intervals and the per-line shifts they suggest') and explicitly distinguishes itself from its write counterpart, ass_align_lines_to_silence. An agent can tell exactly what this does and how it differs from the applying tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative and the condition that selects it: this tool is the 'look before it leaps' preview, while ass_align_lines_to_silence applies the same plan when dry_run=False. Explicit when-to-use routing against a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_apply_tag_to_blockA
Append tags to one override block (or to every block) of a line.
Args:
index / text / doc_id: the line to edit (0-based index of doc_id or a
raw string).
block: 0-based override block number, or "all" to touch every block.
Blocks are numbered in line order and, unlike plain indices, count
comment blocks too. When the line has no block at all, block=0
and "all" create one at the start of the line.
override: the tags to append (braces and the leading backslash are
optional; braces inside the payload are rejected).
doc_id: document holding index.
in_place: write back to the document (snapshot-backed). The raw-string
mode never writes.
Returns {"source", "index", "doc_id", "block", "blocks_total", "applied_blocks", "override", "text", "plain_text", "changed", "written"}
with applied_blocks listing the block numbers that actually received the
tags. The text inside every block is preserved verbatim and the closing
brace is always kept.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| block | No | ||
| index | No | ||
| doc_id | No | ||
| in_place | No | ||
| override | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it explains block numbering (including comment blocks), creation when no block exists, payload rules (braces optional, inner braces rejected), text preservation, and the write-back behavior (snapshot-backed for in_place). It lacks edge-case or error-handling details, so it is not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into clear sections (purpose, Args, Returns) and front-loads the core action. It is detailed but every sentence contributes necessary information for a complex tool; it could be slightly tighter but is not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no annotations, and an existing output schema, the description provides sufficient detail for correct invocation, including parameter semantics and behavioral notes. It does not cover when to prefer this tool over siblings, but otherwise it is complete enough for practical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: every parameter (index, text, doc_id, block, override, in_place) is explained with semantics beyond the schema, including block numbering, creation behavior, payload format rules, and mode-specific write behavior. This adds substantial meaning over the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Append tags') and resource ('one override block (or to every block) of a line'), making the purpose clear. It does not explicitly differentiate from close siblings like ass_set_tag or ass_insert_tag_at, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by explaining the behavior in different modes ('raw-string mode never writes') and the effect of block selection, but it does not provide explicit when-to-use or when-not-to-use guidance relative to alternatives such as ass_set_tag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_check_font_substitutionA
Compare every style's requested font with the family fontconfig resolves.
Args:
doc_id: document id or None for the current document.
Returns:
{"doc_id", "fontconfig", "checked", "substituted", "substitutions", "styles"}. Each entry of styles is
{"name", "requested", "bold", "italic", "resolved", "resolved_style", "file", "substituted", "candidates", "available", "error"};
substitutions lists the style names whose request is substituted,
which is exactly the set of styles that will not render in the font
they ask for.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the mechanism (fontconfig resolution), the comparison semantics, and crucially what 'substitutions' means ('exactly the set of styles that will not render in the font they ask for'). It omits anything about cost/latency of calling fontconfig or whether it mutates anything, but the read-only nature is evident from the verb 'check'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The one-line summary is front-loaded and efficient, but the Args/Returns block duplicates the output schema field-by-field, which is redundant given has_output_schema=true. The verbose return enumeration crowds out guidance the tool actually lacks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only diagnostic with an output schema available, the definition covers the mechanism, parameter meaning, and result semantics well enough to call correctly. The missing piece is cost/performance context for a tool that walks every style through fontconfig.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter is undocumented in the schema, but the description fully compensates: 'doc_id: document id or None for the current document.' That resolves the anyOf string/null ambiguity and explains the None default's effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: comparing each style's requested font against what fontconfig resolves. This is distinct from siblings like ass_match_font (resolve a font) and ass_fonts_used (inventory fonts), so an agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use / when-not guidance and no named alternative, even though ass_match_font, ass_font_coverage, and ass_glyph_check sit in the same font-diagnostic space. The description implies a diagnostic purpose via the output explanation but never instructs the agent when to reach for this over those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_check_overlapsA
List overlapping pairs of lines, ordered by start time.
With layer_strict=True (the default) only lines on the same layer are
compared — two lines on different layers are meant to coincide. Comment
lines never render, so they are not considered.
Args: selection: lines to compare. doc_id: document id. layer_strict: compare within each layer only. tolerate_ms: ignore overlaps of this length or less.
Returns:
{"doc_id", "layer_strict", "tolerate_ms", "count", "pairs": [{"a", "b", "layer", "a_start_ms", "a_end_ms", "b_start_ms", "b_end_ms", "overlap_ms"}]}
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| selection | No | ||
| tolerate_ms | No | ||
| layer_strict | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and discloses important traits: default layer-strict comparison, treatment of comments, tolerate_ms threshold, and ordering by start time. It could be stronger by explicitly stating the operation is read-only and has no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, followed by compact notes and a structured Args/Returns section. Every sentence adds useful context without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and low schema coverage, the description supplies the needed behavioral and parameter context. It also redundantly documents the return shape, which is harmless because an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain all four parameters. Its Args section defines selection, doc_id, layer_strict, and tolerate_ms meaningfully, though selection remains somewhat underspecified regarding expected format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: list overlapping pairs of lines, ordered by start time. The overlap focus clearly distinguishes it from general validation or QC siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the key usage condition: layer_strict defaults to comparing only within the same layer because cross-layer coincidences are intentional, and comment lines are excluded. It does not explicitly compare against alternatives like ass_qc or ass_validate, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_closeA
Close a document (optionally saving it first).
Args: doc_id: document to close; the current one when omitted. save: save before closing (requires a known path).
Returns {"doc_id", "closed", "saved", "path", "remaining", "current"}.
Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden. It discloses the return envelope and the 'known path' precondition for saving, but omits the single most important behavior for a close tool: what happens to unsaved changes when save=false. Listing return fields adds little here since an output schema already exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then compact Args/Returns blocks. The trailing 'Line indices are 0-based' is copy-paste boilerplate irrelevant to a close operation, a small amount of dead weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter lifecycle tool with an output schema present, the description covers purpose, both parameters, and preconditions. The only real gap is the unsaved-changes/discard semantics, which an agent would want before closing a dirty document.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: doc_id is defined as the target document defaulting to the current one, and save is defined with its precondition. Both parameters are covered clearly, though no mention of error behavior when the path is unknown.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource (close a document) and adds the optional-save nuance, which is enough to distinguish it from ass_open, ass_save, and ass_save_all. It stops just short of 5 because it never names a sibling or the boundary with ass_save + ass_close done separately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: doc_id defaults to the current document and save 'requires a known path'. There is no explicit when-to-use versus alternatives guidance, e.g. whether to prefer ass_save followed by ass_close for untitled documents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_convert_clip_scaleA
Rewrite vector clip coordinates from their current \p scale to target_scale.
A clip made at level S renders each unit at 2 ** (1 - S) script
pixels; to keep the rendered result identical at level T every
coordinate is multiplied by 2 ** (T - S) and rounded to the nearest
integer. The clip is rewritten with an explicit \clip(T,...) level.
The tool proves the conversion by measuring the rendered ink bounding
box with measure.measure_render before and after (at the midpoint of the
first selected line) and reporting both, plus converged. Measurement
failing (no ffmpeg) is reported as measurement.error instead of an
exception.
Both measurements carry an empty flag: if the line renders no ink at
all (for example a drawing with no \pos/\an whose geometry lands
off-screen) then before and after are both empty and converged
is true for a trivial reason. A caller that wants a real proof must check
not measurement["before"]["empty"] first, which is what the test suite
does.
dry_run=True computes everything and reports the measurement proof
without touching the document.
Returns {doc_id, target_scale, dry_run, converted, lines: [{index, source_scale, target_scale, ratio, before_arg, after_arg, text}], measurement: {before, after, delta, converged, time_ms}}.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| dry_run | No | ||
| selection | No | ||
| target_scale | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so exceptionally: it documents the rounding behavior, the explicit \clip(T,...) rewrite, the measurement-based proof via measure.measure_render, the failure mode (measurement.error instead of an exception when ffmpeg is missing), the empty-ink trivial-convergence caveat, and what dry_run actually touches. This is far beyond a bare mutation description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first line, followed by rationale, then caveats, then the return shape – a sensible ordering. It is dense and somewhat long, but nearly every sentence adds real information (math, proof semantics, empty caveat, dry_run); only the formula derivation is arguably heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description anticipates the tricky parts: the empty-ink false-positive convergence and the explicit check ('not measurement["before"]["empty"]') a caller must perform for a real proof. Combined with the error-handling note and dry_run semantics, the definition is complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It richly explains target_scale (the 2**(T-S) ratio, rounding) and dry_run ('computes everything ... without touching the document'), covering the two non-obvious params. doc_id and selection are left unqualified, but those are conventional in this tool family, so the gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Rewrite vector clip coordinates') plus the exact transformation (from current \p scale to target_scale). An agent can distinguish it from siblings like ass_set_clip or ass_remove_clip purely from this sentence, and the level math makes the operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the mechanism (rescale an existing clip when the script resolution/level changes) and dry_run=True is explained as a non-mutating proof mode. However, it never states when to prefer this over siblings such as ass_set_clip/ass_scale_drawing, nor any preconditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_convert_tagsA
Normalise legacy SSA override tags to their ASS spelling (or back).
Only the inside of override blocks is touched; visible text is never rewritten, and blocks are rebuilt with their braces intact.
Args:
selection: selection spelling (None = every line).
doc_id: document to edit; the current one when omitted.
mode: "to_ass" (default) rewrites the legacy spellings to ASS —
\a1..\a11 (SSA alignment) become the matching \an1..
\an9 and \K becomes \kf. "to_ssa" does the
opposite (\an back to \a, \kf back to \K).
dry_run: report the replacements without writing (no snapshot).
Returns {"doc_id", "mode", "dry_run", "count", "changed", "written", "replacement_count", "lines": [{"index", "before", "after", "changed", "replacements": [{"from", "to", "kind", "note"}]}]}; every replacement is
listed individually so the caller can audit the conversion. changed is
the number of lines whose text differs (also in dry_run), written the
number actually stored. Snapshot-backed unless dry_run is set.
Indices: override blocks are addressed by position, so no plain-character index and no raw offset is taken as input. Because only tag names inside the braces change, both index maps of the visible characters are preserved exactly: the plain-character index of every visible character and the raw index of every character in the line are the same before and after.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | to_ass | |
| doc_id | No | ||
| dry_run | No | ||
| selection | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and meets it: it discloses that only tag names inside braces change, that visible text is never rewritten, that braces stay intact, that the operation is snapshot-backed unless dry_run is set, and that both character index maps are preserved exactly. These are exactly the mutation-safety and reversibility facts an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and cleanly sectioned into behaviour, Args, Returns, and Indices. The multi-sentence Returns block is largely redundant since an output schema already exists, which is the main deduction; the rest of the prose earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter, no-annotation tool with an output schema, the description covers everything an agent needs: mode selection, scope of edit, snapshot/dry-run behaviour, and index invariants. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must supply all parameter meaning, and it does: selection defaults to every line when None, doc_id falls back to the current document, mode enumerates 'to_ass'/'to_ssa' (values the schema does not enumerate), and dry_run's reporting-only semantics are spelled out. Every one of the four parameters is documented beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Normalise legacy SSA override tags to their ASS spelling (or back)'), and scopes it precisely to the inside of override blocks. An agent can distinguish this from tag-manipulation siblings such as ass_set_tag, ass_swap_an_pos, and ass_find_replace from the opening sentence alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditions for each mode ('to_ass' default rewrites legacy spellings, 'to_ssa' does the opposite) and explains dry_run's no-write behaviour. It stops short of naming an alternative tool or an explicit when-not-to-use rule, so it is strong context without full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_copy_styleB
Copy a style, field for field, under a new name.
Args:
source: style to copy.
new_name: name for the copy.
doc_id: document id or None for the current document.
overwrite: replace an existing style of that name instead of failing.
Returns:
{"doc_id", "source", "name", "created", "style", "ignored_fields"}.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| source | Yes | ||
| new_name | Yes | ||
| overwrite | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose real behavior beyond the schema: overwrite replaces an existing style instead of failing, and the return payload exposes an "ignored_fields" key hinting that some source fields may not transfer. It says nothing about permissions, where the new style lands in the style order, or whether lines referencing the source are affected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line statement of purpose followed by a tight Args block; each parameter gets a single clause. The Returns block is largely redundant given an output schema exists, but it is short enough not to bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with no annotations, an output schema (so return values need not be spelled out), and undocumented parameters. The description covers the basics but omits how the copy interacts with the document (style ordering, whether lines are untouched) and any permission or conflict context beyond the overwrite flag.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents all four parameters, but "source: style to copy" and "new_name: name for the copy" essentially restate the titles; only doc_id ("None for the current document") and overwrite ("replace an existing style of that name instead of failing") add genuine meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ("Copy a style ... under a new name") with the additional qualifier "field for field" that clarifies the copy semantics. It is distinguishable from siblings like ass_add_style, ass_rename_style, and ass_update_style, though it never names them explicitly. Clear but without sibling differentiation in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the wording suggests duplicating an existing style, whereas ass_add_style would create one from scratch, and the overwrite flag hints at the failure mode being avoided. No explicit when-to-use, when-not-to-use, or named alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_cpsB
Characters per second for every selected line plus the totals.
Args:
selection: lines to measure; None/[] means every line.
doc_id: document id.
Returns:
{"doc_id", "count", "lines": [{"index", "kind", "characters", "duration_ms", "cps", "drawing", "start_ms", "end_ms"}], "totals": {"characters", "duration_ms", "average_cps", "max_cps", "worst_index"}}
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| selection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It describes the computed output but does not state whether the tool is read-only, whether it modifies the document, what permissions are needed, or any side effects. This leaves the agent guessing about safety and side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose and then structured into Args and Returns sections. It is appropriately sized, but the Returns block duplicates information already available in the output schema, making it slightly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and 0% schema description coverage, the description adequately documents the parameters and notes the return shape. However, it omits when to use this tool versus similar siblings and provides no safety or side-effect context, leaving gaps for an agent deciding between related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It documents both parameters: selection is 'lines to measure' with None/[] meaning every line, and doc_id is the document id. This adds clear meaning beyond the bare schema, though selection's expected type (e.g., indices vs. line objects) remains slightly ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific metric and scope: characters per second for selected lines plus totals. It distinguishes the tool from a generic stats tool by naming the exact output metric, but it does not explicitly differentiate itself from the similar sibling ass_reading_speed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the selection parameter's default behavior but gives no guidance on when to use this tool over alternatives such as ass_reading_speed or ass_stats. No exclusions, prerequisites, or usage context are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_delete_linesA
Delete the selected lines.
selection is any selection spelling; None means every line (use with
care). Returns {"doc_id", "deleted": [<0-based indices>], "count", "remaining"}. Snapshot-backed.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| selection | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does reasonably well: it warns that None deletes every line ('use with care'), which is the key destructive-scope disclosure, and 'Snapshot-backed' signals the operation is undoable. It omits permission/auth requirements and what happens to the document state otherwise, keeping it out of the top tier.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the critical selection caveat, then the return shape and snapshot note. No wasted sentences, though the inline backtick/JSON formatting is slightly heavy for the amount of content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still restates the return shape, which is redundant but harmless. For a destructive tool with zero annotations and an undocumented doc_id parameter, it leaves gaps around which document is targeted and the exact undo semantics, so it is adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that 'selection' accepts any selection spelling and that None means all lines, which is genuinely useful, but the second parameter 'doc_id' (defaulting to null) is never explained in either the schema or the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete the selected lines'), which clearly separates it from siblings like ass_duplicate_lines, ass_merge_lines, or ass_move_lines. It does not explicitly name a sibling or contrast scope, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb, and the description adds one important conditional ('None means every line (use with care)'). However, it gives no explicit when-to-use/when-not guidance and never points to alternatives for recovering or undoing deletions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_document_infoA
Detailed information about one document.
Args: doc_id: document to describe; the current one when omitted.
Returns the document summary (see :func:ass_open) extended with
section_kinds, section_headers, section_order (aliases of each
other, in file order), style_names, font_names, graphic_names,
event_count, comment_count, dialogue_count, duration_ms
(sum of dialogue durations), span_ms (last end minus first start),
start_ms/end_ms of the first/last line, info (Script Info keys),
format_order, wrapping, attachments and extradata_count.
Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implicitly discloses a read/no-side-effect nature, states the current-document defaulting behavior, notes the 0-based index convention, and describes the entire return shape. It does not mention any permission requirements, but for a pure information-read tool that is a minor omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The Args block is tight and front-loaded, but the description then lists a very long set of return fields. Since an output schema exists, much of this enumeration is redundant and inflates the description beyond what an agent needs to select and call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter informational tool with an output schema, the definition covers the defaulting rule and index convention adequately, and return values are documented by the schema. The remaining gap is the lack of sibling differentiation against ass_stats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single doc_id parameter. It does so by explaining that doc_id identifies the document to describe and that omitting it targets the current document, adding meaning the bare anyOf string/null schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource combination ('Detailed information about one document') and enumerates exactly what the returned summary contains, which makes the scope concrete. It distinguishes itself from ass_list_documents, but does not explicitly separate its role from ass_stats or ass_get_script_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is the argument default ('the current one when omitted'), which is useful context for calling it. There is no explicit when-to-use vs. when-not, and no routing to siblings like ass_stats for aggregate metrics or ass_get_line for line-level data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_drawing_bboxA
Bounding box / size / centre of a drawing.
Coordinates are in the drawing's own scale space (\p level). The box
is the control polygon box -- Bézier/B-spline handles included -- matching
what VSFilter/Aegisub use for positioning.
Returns {source, doc_id, index, scale, bbox, size, center, centre, normalised_bbox, normalised_size, point_count}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the coordinate space (drawing's own scale space, \p level) and the non-obvious semantic that the box is the control polygon box including Bézier/B-spline handles, matching VSFilter/Aegisub. It does not cover error cases or how the drawing is resolved, so it falls short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then relevant coordinate-space caveat, then return shape. Slightly redundant (the centre/center and size/bbox duplication), but every sentence is short and useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so listing return fields is optional reinforcement rather than required content. The real gap is that a 3-parameter tool with zero schema coverage and no annotations leaves the agent unable to know which selector to pass or how the drawing is located.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and all three parameters (text, index, doc_id) are undocumented in both schema and description. The description never explains how these selectors interact or which one takes precedence, only mentioning doc_id/index incidentally as return fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific computed resource — 'Bounding box / size / centre of a drawing' — with a clear implicit verb (compute/return). This is easily distinguished from siblings like ass_drawing_info, ass_get_drawing, or ass_transform_drawing, which mutate or describe rather than measure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus alternatives such as ass_drawing_info or ass_drawing_to_svg. The VSFilter/Aegisub note explains what the result means for positioning, but not the condition that selects this tool. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_drawing_infoC
Parse a drawing only (no measurement, no line needed).
Coordinates are in the drawing's own scale space (see the module
docstring). Returns {source, doc_id, index, drawing, scale, commands, subpaths: [{index, bbox, size, text, point_count}], bbox, size, center (aliased as centre), subpath_count, point_count, path_length}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Parse' implies a read-only, non-mutating operation and the coordinate-scale note ('drawing's own scale space') is genuinely useful context, but the description never explicitly states read-only semantics, side effects, or permission needs, leaving notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The actionable sentence is front-loaded, but the description then enumerates the entire return dictionary field-by-field, which is largely redundant given that an output schema already exists. The structure is fine, but the return enumeration does not earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity parse tool with an output schema and no annotations, coverage is borderline adequate: the coordinate-scale caveat is useful, but three undocumented input parameters leave the agent guessing about how to actually invoke it. It is the minimum viable level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and all three parameters (text, index, doc_id) are undocumented in both schema and description. The only faint signal is that doc_id and index reappear in the described return shape, but the description never explains what these inputs mean or how they combine, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Parse a drawing') and usefully scopes it by negation ('no measurement, no line needed'), which distinguishes it from the measurement-oriented siblings. It does not differentiate it from closer siblings like ass_get_drawing, ass_drawing_bbox, or ass_parse_text, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'no measurement, no line needed' hints at when this is the right call versus a measurement tool, but no alternative is named and no positive when-to-use condition is given. An agent must still infer the selection criteria from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_drawing_to_svgB
Export a drawing as a standalone .svg file in workspace.output_dir.
The path data is the drawing's absolute SVG equivalent (scale space units,
one SVG user unit per drawing unit). padding grows the viewBox on every
side so strokes near the edge are not clipped.
path is a filename (resolved inside workspace.output_dir) or an
absolute path; the default is drawing.svg / drawing_<index>.svg and
is overwritten if it exists.
Returns {path, d, view_box, width, height, bbox, source, doc_id, index}.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| text | No | ||
| index | No | ||
| doc_id | No | ||
| padding | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full load, and it does disclose meaningful behavior: the target file 'is overwritten if it exists', path resolution rules ('resolved inside workspace.output_dir' or absolute), and the padding effect on the viewBox. It does not cover permissions or failure modes, but the destructive overwrite and path semantics are exactly the kind of trait an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and output location, then progressively details path data, padding, path semantics, and return shape. Every paragraph does work; the RST double-backtick noise is minor and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be restated, and the description is complete on file/location behavior. But for a tool with five parameters at 0% schema coverage it omits any explanation of text, index, or doc_id, which is a real gap for a tool whose core job is selecting a drawing to export.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 5 parameters, so the description must compensate and only partly does: path (resolution, defaults, overwrite) and padding (viewBox growth) are explained well. However text, index, and doc_id receive no explanation at all, leaving the crucial question of how the source drawing is selected undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Export a drawing as a standalone .svg file in workspace.output_dir.' The direction of the operation (drawing -> svg) is unambiguous. It does not name the inverse sibling ass_svg_to_drawing, so there is no explicit sibling differentiation, but the purpose itself is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives such as ass_get_drawing or ass_drawing_info. It explains how the output path resolves, but never says in what workflow or context this export should be chosen over the other drawing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_duplicate_linesA
Duplicate the selected lines.
Args:
selection: selection spelling; None = all lines.
offset_ms: shift the copies in time by this many ms.
insert_after: put each copy right after (True) or right before
(False) its source.
Copies keep every field of the source (style, actor, effect, layer, margins,
comment flag, tags). Returns {"doc_id", "indices": [<0-based index of each copy>], "count", "lines": [...]}. Snapshot-backed. Indices are
0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| offset_ms | No | ||
| selection | Yes | ||
| insert_after | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: copies preserve every source field (style, actor, effect, layer, margins, comment flag, tags), the operation is 'snapshot-backed' (implying undo support), and it returns a structured result. It still omits permission requirements, error conditions, and an explicit statement of reversibility, so it does not reach 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by args and then behavioral guarantees, so the agent gets the essentials first. The Args formatting is efficient and each line adds value, though the return-shape sentence is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, 0%-schema-coverage, annotation-free mutation tool, the description covers params, field-preservation behavior, and snapshot backing, which is close to complete. The unexplained doc_id parameter is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate; it documents three of four parameters with real semantics (selection = None means all lines; offset_ms shifts copies in time; insert_after toggles placement), which is far beyond the bare schema. Only doc_id is left unexplained, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (duplicate) and resource (the selected lines), which cleanly separates it from creation-oriented siblings like ass_add_line/ass_add_lines and restructuring siblings like ass_split_line or ass_merge_lines. It does not explicitly name a sibling it differs from, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains parameter behavior but gives no when-to-use guidance, no exclusions, and no comparison to alternatives such as ass_add_lines or ass_copy_style. An agent can infer intent from the verb but is given no routing logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_export_textA
Export selected lines as plain text, TSV, SRT or an ASS fragment.
Args:
selection: selection spelling; None = every line.
doc_id: document to export; the current one when omitted.
format: "txt" (one line of plain text each), "tsv" (start, end,
style, actor, effect, kind, plain text), "srt" (SubRip) or
"ass-fragment" (the raw Dialogue:/Comment: lines).
line_separator: replacement for the ASS in-line hard break \N (and
\n) in txt/tsv output. The default keeps the ASS escape
for lossless re-import; pass "\n" for one output line per
visual line, or any other string ("|") to flatten explicitly.
srt always uses real newlines (required by the format) and
ass-fragment keeps the original text untouched.
output_path: file to write; when omitted the file is written into
workspace.output_dir (created if needed).
txt and srt skip comment lines; tsv and ass-fragment keep
them. Returns {"doc_id", "path", "format", "media_type", "text", "bytes", "line_count", "selection": [<0-based indices>]} where line_count is the
number of exported records (SRT blocks, TSV rows, text lines, events).
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| format | No | txt | |
| selection | No | ||
| output_path | No | ||
| line_separator | No | \N |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that txt/srt skip comment lines while tsv/ass-fragment keep them, that the default separator preserves the ASS escape for lossless re-import, and that output_path defaults into workspace.output_dir which is created if needed. It omits file-overwrite behavior, permission/auth requirements, and failure modes, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line, then parameters are laid out in a scannable Args block followed by the two format-dependent behaviors and the return shape. Slightly long, but each sentence adds distinct information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, zero-schema-description export tool, this is complete: every parameter is explained, format-specific comment-line handling is called out, and the return payload is enumerated. Nothing an agent needs in order to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: all five parameters are documented with meaning beyond the schema, including the four format values and their output shapes, the exact semantics of line_separator with worked examples ('\n', '|'), and the defaults for selection, doc_id and output_path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export) plus a precisely scoped resource (selected lines) and enumerates the four output formats, which implicitly separates it from siblings like ass_plain_text or ass_karaoke_export. An agent can tell what it produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful in-parameter guidance (selection=None means every line, doc_id defaults to the current document, which line_separator value to pick for wrapping vs lossless re-import), but it never states when to choose this tool over alternatives such as ass_plain_text or ass_karaoke_export. Usage is implied through parameter semantics rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_extract_attachmentA
Decode an attachment and write it into the workspace output directory.
Args:
name: attachment name as stored in the document (case-insensitive).
doc_id: document id or None for the current document.
output_path: destination; a relative path is resolved inside
workspace.output_dir.
Returns:
{"doc_id", "name", "kind", "path", "bytes", "sha256", "sniff"}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| doc_id | No | ||
| output_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that output is written into workspace.output_dir and how relative paths resolve, plus the return shape, but omits permission requirements, overwrite behavior, and error handling when the named attachment is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by clearly separated Args and Returns sections. Efficient and scannable, with only minor redundancy in restating the return keys that the output schema already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param tool with a full output schema, the definition covers purpose and all parameters adequately. The remaining gap is behavioral (no annotations, no error/overwrite disclosure), which would matter for a write-to-disk operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it documents all three params, adding non-obvious semantics like case-insensitive name matching, doc_id=None meaning the current document, and output_path resolving inside workspace.output_dir.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Decode an attachment and write it into the workspace output directory.' This clearly distinguishes it from siblings ass_list_attachments, ass_add_attachment, and ass_remove_attachment, which handle listing/adding/removing rather than decoding to disk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the purpose (extract an attachment's decoded bytes to a file), but there is no explicit when-to-use guidance, no exclusion conditions, and no routing to alternatives. The agent must infer that this differs from add/remove/list siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_find_replaceA
Find and replace text across the selected lines.
Args:
pattern: literal text (regex=False) or a Python regular expression
(regex=True, compiled with re.UNICODE; back-references like
\1 work in replacement).
replacement: replacement string (used literally when regex=False).
selection: selection spelling; None = every line.
doc_id: document to edit; the current one when omitted.
regex: treat pattern as a regular expression.
case_sensitive: False makes the match case-insensitive.
fields: which fields to touch; defaults to ["text"]. Any of
text, start, end, style, actor/name,
effect.
dry_run: count only, change nothing.
limit: stop after this many replacements in total.
Returns {"doc_id", "pattern", "replacement", "fields", "regex", "dry_run", "total": <replacements made>, "changed": [<0-based indices>], "lines": [{"index", "counts": {field: n}, "count", "text"}...], "limit"}. Snapshot-backed unless dry_run. Indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| regex | No | ||
| doc_id | No | ||
| fields | No | ||
| dry_run | No | ||
| pattern | Yes | ||
| selection | No | ||
| replacement | Yes | ||
| case_sensitive | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that dry_run only counts changes, that edits are snapshot-backed unless dry_run, and that result indices are 0-based. It still does not cover failure modes, permission requirements, or all side effects of selecting fields like style/actor/effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and organized into Args and Returns blocks, so it is easy to scan. It is somewhat long and includes return information that may partly duplicate the output schema, but most detail earns its place for a 9-parameter tool with no schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool with 9 parameters, no annotations, 0% schema coverage, and a large sibling set, the description supplies enough parameter and behavioral context to invoke it correctly. An output schema exists, so the return-value block is not strictly required, but the additional notes about snapshot backing and 0-based indices are useful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document all parameters. It does so thoroughly: pattern semantics with regex and back-references, replacement behavior, selection spelling, doc_id default, case sensitivity, allowed fields, dry_run behavior, and limit semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a precise verb+resource+scope: 'Find and replace text across the selected lines.' This distinguishes it from line-mutating siblings such as ass_update_line(s) and clearly indicates a search/replace operation over a selection or whole document.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains parameter-level choices (regex vs literal, selection None means all lines, omitted doc_id means current document), which implies usage. However, it does not explicitly name alternative tools or say when to prefer this over ass_update_lines, ass_update_line, or other bulk edit tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_fix_timingA
Compute timing fixes and apply them only when dry_run is False.
Only end times move. A line shorter than min_duration_ms is extended to
it; a line reading faster than max_cps/target_cps is extended so that
its characters per second fall back to that figure. With avoid_overlap
an extension stops at the next line's start on the same layer, minus
keep_gaps_ms; when there is no room the fix is reported as blocked
instead of being applied.
Args:
selection: lines to fix.
doc_id: document id.
dry_run: True (default) returns the plan and writes nothing.
min_duration_ms: shortest acceptable duration.
target_cps: extend faster lines until they read at this rate.
max_cps: same, used when target_cps is not given.
avoid_overlap: stop extensions at the neighbouring line.
keep_gaps_ms: keep this much room before the neighbouring line.
Returns:
{"doc_id", "dry_run", "applied", "parameters": {...}, "count", "changes": [{"index", "field", "old_ms", "new_ms", "old", "new", "reason"}], "blocked": [{"index", "reason", "wanted_ms", "limit_ms"}]}
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| dry_run | No | ||
| max_cps | No | ||
| selection | No | ||
| target_cps | No | ||
| keep_gaps_ms | No | ||
| avoid_overlap | No | ||
| min_duration_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that only end times move (scope of mutation), that dry_run=True writes nothing, and that avoid_overlap can cause a fix to be reported as blocked rather than applied. The blocked/no-room behavior is exactly the kind of non-obvious trait annotations would otherwise need to supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior (compute + conditional apply), then the algorithm, then structured Args/Returns blocks. Efficient, though slightly long and the Returns block partly duplicates the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An 8-param mutation tool with no annotations is fully covered: what changes, when it changes, what happens when it can't change, and the shape of the result. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and 8 parameters are undocumented in the schema, so the description has to compensate — and every parameter is explained with real semantics (selection, doc_id, dry_run default, min_duration_ms, target_cps vs max_cps fallback, avoid_overlap, keep_gaps_ms). The target_cps/max_cps precedence rule is meaning the schema alone could never convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Compute timing fixes and apply them'), and the body narrows it to a precise operation: extending end times so lines meet min_duration_ms and cps limits. An agent can tell what it does, but it never names the close siblings it could be confused with (ass_set_durations, ass_shift_times, ass_scale_times), which would have made the purpose discriminating rather than merely clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the tool is for fixing lines that are too short or read too fast, and the dry_run default advertises a plan-then-apply workflow. There is no explicit when-to-use vs when-to-use-something-else guidance, nor any mention of when this is preferable to set_durations/set_times.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_font_coverageB
Characters of text missing from family (default: the system sans).
The family is resolved through fontconfig first, so a substituted request is reported honestly. Missing characters come back with their codepoints, plus up to a few installed families that do cover them.
Returns {text, requested, default_used, bold, italic, resolved_family, substituted, missing: [{char, codepoint, codepoint_hex, fallbacks}], missing_count, missing_chars, missing_codepoints, covered, checked, coverage_source, font}. requested is the family the check actually ran
against, so it is never None: when family is omitted it is the system
default sans family and default_used is True.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | ||
| text | Yes | ||
| family | No | ||
| italic | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses fontconfig-based resolution, that a substituted request is reported honestly, and that missing characters return codepoints plus covering fallback families. It does not state permissions or that the operation is read-only, but the read-only nature is strongly implied by 'check'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operation is front-loaded in the first sentence, which is good. However, the long backtick-quoted enumeration of every return field is redundant given that an output schema already exists, making the passage longer than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return values are covered by the output schema, so that enumeration is surplus. Behavior and the family parameter are reasonably complete, but the missing bold/italic semantics and the absence of any sibling routing leave an agent guessing in a crowded font-related tool family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does explain family resolution and the default-sans behavior when omitted (default_used), but it never explains the bold or italic flags or the required text parameter, leaving half the parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb (checking coverage) and resource (characters of text against a font family), so an agent can grasp the operation immediately. It does not, however, differentiate itself from close siblings like ass_fonts_with_char, ass_glyph_check, or ass_match_font, so the boundary is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of alternatives, and no task context (e.g. pre-flight check before rendering subtitles). The only usage hint is the default family behavior, which is parameter semantics rather than selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_fonts_usedB
Every font the script asks for, plus embedded font attachments.
Styles contribute their Fontname (with the Bold/Italic flags
that affect which face fontconfig resolves); the [Fonts] section
contributes each fontname: attachment. Every family is resolved through
fontconfig so families that are not installed and families that
resolve to a substitute are flagged explicitly.
Returns {doc_id, families: [{family, installed, substituted, resolved, file, style, bold, italic, styles: [names], attachment}], attachments: [names], not_installed: [names], substituted: [names], used_count}.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose meaningful behavior: names are resolved through fontconfig and both uninstalled families and substituted families are flagged explicitly. However it says nothing about error behavior, cost, or what doc_id=null means (presumably the active document), leaving the null-default contract unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is front-loaded and information-dense: purpose first, then the resolution mechanics, then the return shape. The final sentence largely restates the output schema, which is a slight redundancy, but everything else earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the description does not need to spell out return fields, and the explicit statement that uninstalled/substituted families are flagged covers the main interpretive risk. The only real gap is the un-documented default behavior of doc_id.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single doc_id parameter is nullable with default null. The description only mentions doc_id inside the return shape and never explains that omitting it falls back to the active/current document, which is the one semantic an agent most needs here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: enumerate 'every font the script asks for, plus embedded font attachments', and explains the two contributing sources (style Fontname fields and the [Fonts] section). It is clear in isolation but never distinguishes itself from close siblings such as ass_check_font_substitution or ass_list_fonts, so an agent must guess which of the font-related tools to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternative despite several overlapping siblings (ass_check_font_substitution, ass_list_fonts, ass_font_coverage, ass_match_font). The agent is left to infer selection criteria entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_fonts_with_charA
Which installed family names contain the glyph for char.
char must be exactly one character. Returns {char, codepoint, codepoint_hex, count, families} (families sorted case-insensitively).
| Name | Required | Description | Default |
|---|---|---|---|
| char | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the required input constraint ('char must be exactly one character') and the exact return shape, and the phrasing implies a read-only scan of installed fonts. However, it says nothing about the scope/cost of scanning all installed fonts, permissions, or failure behavior for unmapped characters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the query intent is front-loaded, followed by the input constraint and the return shape. No filler, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter query tool with an output schema present, the description covers the input constraint and the returned fields, so an agent has enough to call it. It stops short of explaining when this is preferable to sibling font/glyph tools, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% – the schema gives only a bare 'string' type for 'char'. The description compensates by stating the semantic constraint that 'char' must be exactly one character, which is real meaning beyond the schema. It does not clarify surrogates, whitespace, or empty-string handling, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific query intent: which installed font families contain a given glyph. That is a clear verb-plus-resource framing (query installed fonts by glyph presence). It does not explicitly distinguish itself from close siblings like ass_glyph_check or ass_font_coverage, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to reach for this tool versus ass_list_fonts, ass_font_coverage, ass_glyph_check, or ass_fonts_used. Usage is only implied by the purpose statement; no conditions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_frame_from_msA
Convert a time in milliseconds to a frame number.
Args:
ms: milliseconds (int/float) or a time string.
fps: frame rate; resolution order is fps argument, workspace video
(dict fps or a probed video path), workspace script config,
document FPS in [Script Info], then a ToolError explaining what
is missing.
doc_id: document id (only used as an fps source).
Returns:
{"ms", "seconds", "fps", "fps_source", "frame", "frame_exact", "frame_floor", "frame_ceil"}
| Name | Required | Description | Default |
|---|---|---|---|
| ms | No | ||
| fps | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it lays out the complete fps resolution fallback chain (argument, workspace video dict/probed path, script config, [Script Info] FPS, then failure) and discloses error behavior (a ToolError explaining what is missing). It does not state whether the call is side-effect-free, but the read-only nature is strongly implied by a pure conversion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The Args/Returns structure is front-loaded and every sentence earns its place, though the Returns block enumerates keys already present in the output schema, which is mildly redundant. Otherwise efficient and well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter conversion tool, the description covers parameter meanings, the fps resolution chain, failure behavior, and return keys. With an output schema present, there is nothing an agent needs for correct invocation that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: ms is typed as int/float or a time string, fps is documented along with its full resolution order, and doc_id is clarified as being used only as an fps source. This adds meaning the bare schema (defaults only) does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Convert a time in milliseconds to a frame number'), and the directionality is explicit, which implicitly distinguishes it from the inverse sibling ass_ms_from_frame. It does not, however, name that sibling or any alternative, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the direction of the conversion; there is no statement of when to prefer this over ass_ms_from_frame, ass_frame_from_timecodes, or ass_snap_to_frames, and no prerequisites or exclusions. Adequate but leaves the routing decision to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_frame_from_timecodesA
The start time of frame according to the loaded timecodes file.
Honours workspace.timecodes (written by :func:ass_read_timecodes) and
falls back to the document/workspace frame rate when no file is loaded;
method says which of the two was used. Both coordinates are returned so
the pair is unambiguous.
Args: frame: frame number. doc_id: document id, only needed for the fps fallback.
Returns:
{"frame", "ms", "seconds", "method", "input", "input_kind", "exact_ms"}
| Name | Required | Description | Default |
|---|---|---|---|
| frame | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it discloses the dependency on workspace.timecodes, the fallback to frame rate, that the method field reports which path was taken, and that both coordinates are returned to keep the pair unambiguous. It does not state read-only/purity explicitly, but the behaviour described is clearly a deterministic lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then structured Args/Returns sections. The RST double-backtick markup and the explicit Returns line add some noise, but every sentence (fallback rule, method field, unambiguous pair) carries real information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the docstring lists the returned keys anyway. Between the fallback rule, the method discriminator, and per-parameter notes, the agent has enough to invoke it correctly; only sibling differentiation against the other frame/ms/timecode converters is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: frame is defined as a frame number and doc_id is explained as the document id needed only for the fps fallback. That conditional caveat is the key semantic the schema lacks, though the frame parameter's accepted range/format is left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: it returns the start time of a given frame, resolved through the loaded timecodes file with an fps fallback. This is more precise than a bare 'convert frame' but it never names its closest siblings (ass_ms_from_frame, ass_frame_from_ms, ass_ms_from_timecodes), so the agent must infer the split from context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the conditional path clearly: timecodes are honoured when a file is loaded, otherwise the document/workspace frame rate is used, and doc_id is only needed for that fps fallback. That tells the agent when each input matters, though it stops short of an explicit 'use this instead of X' routing statement against the other conversion siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_get_clipsB
List every \clip / \iclip tag on a line (or in raw text).
Each entry has tag ("clip"/"iclip"), inverse, raw
argument, kind ("rect" or "vector"), the explicit scale
(None when omitted) and the effective_scale actually used, plus
coords as authored in the clip's scale space and normalised
coordinates converted to script resolution (multiplied by
2 ** (1 - effective_scale)). bbox is the box in scale space and
normalised_bbox the same box in script resolution.
Returns {source, doc_id, index, line_scale, count, clips: [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read-only listing and gives the coordinate-conversion math (multiplied by 2 ** (1 - effective_scale)), which is genuinely useful, but says nothing about error cases, what happens when no clips exist, or the precedence rules for its three mutually optional inputs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then a dense enumeration of returned fields. The field-by-field list largely restates what the existing output schema already conveys, so much of the length earns little, though the scale-space vs normalised explanation is valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-shape prose is largely redundant rather than necessary, and the real gap — how the three optional parameters interact — is left unexplained. For a read-only extraction tool this is workable but leaves invocation ambiguity unresolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters (text, index, doc_id). The description only hints at the text-vs-line duality via the parenthetical and never explains what doc_id does, what 'index' indexes, or which parameter wins when several are supplied. It does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every \clip / \iclip tag') with the scope ('on a line (or in raw text)'). Clearly distinguishable from siblings like ass_parse_text or ass_tag_summary by its clip-specific focus, though it does not name any sibling to contrast against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(on a line (or in raw text))' implies two invocation modes but never states when to use this versus ass_set_clip, ass_remove_clip, ass_convert_clip_scale, or ass_parse_text. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_get_drawingA
Inspect the drawing part of a line, or a raw drawing string.
Pass exactly one of:
index+doc_id-- the line at that 0-based index (doc.events()order) is split withtags.drawing_partsand its drawing is inspected;text-- either a full override line (anything containing{or a\ptag, split the same way) or bare drawing path data.
scale is the \p level in effect for the drawing, so the returned
commands, bbox, size, centre and path length are all in that scale space
(units as written in the file); multiply by
2 ** (1 - scale) for script pixels. normalised_* mirrors of the
bbox/size are provided already converted.
Returns a dict with source ("line" or "text"), doc_id,
index, drawing (the raw drawing text), scale, has_drawing,
commands (list of {kind, args, points, text}), bbox,
normalised_bbox, size, normalised_size, center (aliased as
centre), subpath_count, point_count, path_length,
svg_path and clips (see :func:ass_get_clips for that shape).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose non-obvious behavior: the returned commands, bbox, size, centre and path length are all in scale space (units as written in the file), with the explicit conversion factor 2 ** (1 - scale). It stops short of stating read-only/side-effect status explicitly, relying on 'Inspect' to imply it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the two input modes, then the scale caveat, then the return shape; the bulleted structure is easy to scan. The enumeration of every return dict key is somewhat verbose given an output schema exists, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only inspection tool with three optional params and an output schema present, the description covers everything an agent needs: modality selection, the scale-space semantics that would otherwise cause silent unit errors, and the aliasing of center/centre. Return values are additionally backed by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema only gives bare titles, so the description must compensate — and it does. It defines exactly what index + doc_id mean (line at that 0-based index in doc.events() order, split with tags.drawing_parts) and what text accepts (a full override line containing '{' or a \p tag, or bare drawing path data), plus the 'exactly one' constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('inspect') plus resource ('drawing part of a line, or a raw drawing string') that clearly identifies it as a read/extract operation on drawing data. It does not, however, name or differentiate itself from close siblings such as ass_drawing_info, ass_drawing_bbox or ass_drawing_to_svg, so an agent must still infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mutual-exclusion rule for the two input modes (index+doc_id vs text) is spelled out clearly, which is real usage guidance. But there is no when-to-use / when-not-to-use framing relative to alternatives (e.g. ass_get_line, ass_drawing_info), so selection among siblings is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_get_lineB
Full detail for a single line (0-based index).
Returns the ass_list_lines line dict extended with:
fields— every field of the line exactly as stored.tags_summary— override-tag counts/structure.drawing—{"active", "state", "segments", "drawing_segments", "prefix", "path", "suffix"}.karaoke—{"has_karaoke", "kinds", "total_ms", "syllables"}with per-syllable start/end times resolved against the line timing.style/resolved_style— the style name, and the same name only when that style actually exists in the document (elseNone).timing—{"start_ms", "end_ms", "duration_ms", "start", "end", "cps", "characters", "lines"}.
Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose genuine behavioral detail — that resolved_style is None when the style is absent from the document and that karaoke syllable times are resolved against line timing — but says nothing about error behavior for an out-of-range index or the doc_id fallback.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the bulleted structure is scannable, but the bulk of the text enumerates return keys that an output schema already describes, so several lines do not earn their place against the structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the exhaustive return-value listing is largely redundant, while the genuinely missing pieces — doc_id meaning and out-of-range index behavior — go unexplained. It is adequate but leaves clear gaps for a 2-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It usefully clarifies that index is 0-based and refers to a line, but doc_id is never explained at all, leaving half the parameters undocumented in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific verb and resource (full detail for a single line) and distinguishes it from the bulk sibling by framing the result as the ass_list_lines dict extended with extra keys. It does not explicitly route the agent between the two, but the 'extends ass_list_lines' framing makes the distinction inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Full detail' versus the list variant, but there is no explicit when-to-use/when-not statement and ass_list_lines is never named as the alternative for bulk reads. An agent must infer the routing from the phrasing alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_get_script_infoC
Read [Script Info] in file order.
Returns:
{"doc_id", "count", "items", "ordered", "values", "duplicates"}.
items is one {"index", "key", "value", "raw", "duplicate"} per
key line, in the order they appear in the file (raw is the line
exactly as stored, so odd spacing such as Title : x survives);
ordered is [[key, value], ...]; values the last-wins map;
duplicates lists keys that appear more than once.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It correctly conveys a read operation and usefully discloses ordering fidelity and raw-line preservation, but says nothing about permissions, whether doc_id defaults to the active document, or any error/empty behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is correctly front-loaded in one short sentence, but the bulk of the text exhaustively documents return fields that the output schema already declares, so a large share of the description does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read tool with an output schema, the definition is adequate, but it omits the doc_id semantics and any usage context. The return documentation is redundant given the output schema, so the description is not adding value where it is actually needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter doc_id (nullable, default null) is never mentioned in the description. The agent is left to guess whether null means the active document; the description does not compensate for the coverage gap it should have covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The specific verb+resource ("Read `[Script Info]`") cleanly separates it from the mutation siblings ass_set_script_info and ass_remove_script_info. It does not, however, distinguish itself from the potentially confusable ass_document_info, leaving one ambiguity unresolved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool, what precondition applies, or which sibling to prefer for related reads (e.g. ass_document_info, ass_list_styles). The description jumps straight into return-value semantics, so usage must be inferred from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_get_selectionA
Read back the session selection.
Returns {"doc_id", "selection": [<0-based indices>], "count", "lines": [<line dicts, same shape as ass_list_lines>]} and drops indices
that are out of range for the current document. Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: out-of-range indices are silently dropped and indices are 0-based. It does not state whether a document must already be open or what happens on an empty selection, but the pruning rule is genuinely useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then the return shape and the dropping rule. Tight and waste-free, though the embedded JSON-shaped return listing is slightly heavy prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the description adds useful semantics (0-based indexing, out-of-range pruning) that an agent needs. The only real gap is the missing call-context guidance against sibling selection tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The index-base note (0-based) is about returned values rather than inputs, but it is the only semantic the schema could not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read back) and resource (the session selection), immediately distinguishing it from write-side siblings like ass_select. The return payload is named concretely (doc_id, selection indices, count, lines), so an agent knows exactly what comes back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no mention of the natural counterpart ass_select (which sets the selection being read), and no stated preconditions such as requiring an open/active document. Usage is only inferable from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_get_styleA
Inspect one style, including the font it really resolves to.
Args:
name: style name (case-insensitive).
doc_id: document id or None for the current document.
include_glyphs: add a glyphs report (approximate Aegisub "characters
not in font" check via fontconfig) for sample_text.
sample_text: text used for the glyph report. When omitted it defaults
to the plain text of the lines that use the style (capped at 2000
characters).
Returns:
{"doc_id", "name", "style", "values", "font", "used", "usage"} —
style holds every ASS field as stored, values the typed view
(numbers/flags, colours verbatim), font the fontconfig resolution:
{requested, bold, italic, available, resolved, resolved_style, file, index, substituted, candidates, error}. With include_glyphs adds
glyphs ({font, missing, fallbacks, covered, checked, coverage_source}) and glyph_sample_text.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| doc_id | No | ||
| sample_text | No | ||
| include_glyphs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does reasonably well: it discloses that include_glyphs runs an approximate fontconfig-based check, that sample_text defaults to the plain text of lines using the style capped at 2000 characters, and that font resolution exposes substitution state. It doesn't state read-only status or permission requirements explicitly, but the inspection nature is evident.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, and the Args/Returns blocks are well organized. The detailed Returns enumeration is somewhat verbose given an output schema already exists, but it remains useful and non-repetitive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex inspection tool, the definition covers parameters, defaults, side behaviors (glyph check), and return shape. An agent has everything needed to call it correctly, and the output schema covers the structured return.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description fully compensates: it defines name (case-insensitive), doc_id (None = current document), include_glyphs (adds a glyphs report), and sample_text (default source and 2000-char cap). Every parameter is given meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (inspect) and resource (one style) plus the distinguishing feature (font resolution). It clearly separates from the plural sibling ass_list_styles and from ass_style_usage/ass_style_for_line, since it targets a single named style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the Args (name required, doc_id optional) but there is no explicit when-to-use guidance or routing against alternatives like ass_style_usage, ass_check_font_substitution, or ass_list_styles. The reader must infer the use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_glyph_checkA
Missing glyphs for a line's text or for a style's font.
The string checked is text when given, otherwise the plain text of
line index (override tags removed). The font comes from family when
given, otherwise from the style named by style (its Fontname,
Bold and Italic) -- when neither is given the style of the line is
used, and failing that the system default sans.
Returns {source, doc_id, index, style, requested, resolved_family, substituted, bold, italic, text, missing: [{char, codepoint, codepoint_hex, fallbacks}], missing_count, missing_chars, missing_codepoints, checked, covered, coverage_source}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| style | No | ||
| doc_id | No | ||
| family | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does a good job: it explains that override tags are removed, how the font is resolved through fallbacks, and what the output contains. It stops short of explicitly stating that the operation is read-only or has no side effects, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear purpose sentence and well-structured input logic. However, it includes a long return-value specification even though an output schema exists, which makes it less concise than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, zero annotation coverage, and an output schema, the description is mostly complete: it covers input resolution, fallback behavior, and output fields. It misses doc_id semantics and any explicit read-only assurance, which are minor gaps for a check tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for four of five parameters: it defines when text vs. index is used, and when family vs. style is used, including fallback to line style then system default. The doc_id parameter is not explained at all, leaving one gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific check: 'Missing glyphs for a line's text or for a style's font.' It clearly identifies the resource (glyphs in text/font) and the action (checking for missing ones). It does not explicitly differentiate from siblings like ass_font_coverage or ass_check_font_substitution, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the input resolution (text vs. index, family vs. style) but never states when to use this tool versus alternatives such as ass_font_coverage or ass_check_font_substitution. Usage is implied by the parameter logic rather than made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_import_srtA
Import a SubRip (.srt) file as new ASS lines.
Handles , and . decimal separators, multi-line blocks, CRLF and a
UTF-8 BOM; multi-line subtitle bodies become \N hard breaks.
Args:
path: the .srt file to read.
doc_id: document to append to; the current one when omitted.
style: ASS style for the imported lines.
offset_ms: shift every imported line in time.
Returns {"doc_id", "path", "count", "indices": [<0-based indices>], "lines": [<dict>], "skipped": <blocks without a timestamp>, "style", "offset_ms"}. Snapshot-backed.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| style | No | Default | |
| doc_id | No | ||
| offset_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does fairly well: it discloses parsing edge cases (comma/dot decimal separators, multi-line blocks, CRLF, UTF-8 BOM), the conversion rule (multi-line bodies become \N hard breaks), and the snapshot-backed/undoable nature. It omits permission or open-document requirements, but the behavioral disclosure is meaningfully richer than a bare verb.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then behavior, then args and returns in scannable sections. Every sentence earns its place, though the doubled backtick formatting adds minor visual noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex import tool, the description covers format handling, all params, and the return payload (even restating the output schema). The main residual gap is document-state prerequisites, but overall an agent has what it needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: all four parameters are explained with real meaning (path = file to read, doc_id = document to append to with current-when-omitted fallback, style = ASS style for imported lines, offset_ms = time shift). This is exactly the compensation the low coverage requires.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: importing a SubRip (.srt) file as new ASS lines. It is unambiguous and distinguishable from siblings like ass_add_line/ass_add_lines, which create lines rather than import an external format.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by naming the .srt source format, but there is no explicit when-to-use vs alternatives, no statement of prerequisites (e.g. must a document be open / is ass_new_document required first), and no guidance on when importing is preferred over manual line creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_insert_tag_atA
Insert a bare override block at a plain character position.
Args:
index / text / doc_id: the line to edit (0-based index of doc_id or a
raw string).
plain_index: plain (visible character) index the block is inserted
at; 0 puts it before the first visible character, plain_len
puts it at the end of the line. Override blocks do not count, so
for "ab{\i1}cd" plain index 2 is between b and c.
override: the tags to insert (braces and the leading backslash are
optional, braces inside the payload are rejected).
after: insert after the character at plain_index instead of before
it. With after=True and plain_index == plain_len the block
is appended at the very end.
doc_id: document holding index.
in_place: write back to the document (snapshot-backed). The raw-string
mode never writes.
Returns {"source", "index", "doc_id", "plain_index", "after", "override", "text", "plain_text", "changed", "written"}. plain_index is always a
plain index; the raw offsets of the new block are not reported because the
insertion shifts them.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| after | No | ||
| index | No | ||
| doc_id | No | ||
| in_place | No | ||
| override | No | ||
| plain_index | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description must carry behavioral disclosure. It does well by stating that raw-string mode never writes, in_place writes back to the document, braces inside the payload are rejected, and override blocks do not count toward plain indices. It does not discuss permissions, reversibility, or undo behavior, but the core mutation semantics are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool purpose and then organized into Args and Returns sections. It is appropriately sized for a seven-parameter tool with nuanced index semantics, though the Returns section is somewhat redundant given the existing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity mutation tool with no annotations and no schema parameter descriptions, the description supplies enough parameter and behavioral context to invoke it correctly. It stops short of explaining when to use it versus sibling tools, but the core invocation requirements are covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all seven parameters, and it does. It defines index/text/doc_id, plain_index with concrete examples, override payload rules, after behavior including the plain_len edge case, and in_place write semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: insert a bare override block at a plain character position. It is clear what the tool does, but it does not distinguish itself from sibling tag-insertion tools such as ass_set_tag or ass_apply_tag_to_block.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by explaining raw-string versus document mode and in_place writing, but it does not explicitly say when to choose this tool over alternatives like ass_set_tag or ass_apply_tag_to_block. No when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_join_drawingsA
Join several drawing strings into one (the inverse of ass_split_drawing).
parts is a list of drawing strings (a single string is treated as a
one-element list). Every part must parse; empty strings are rejected so a
subpath can never be silently lost. Coordinates are serialised as integers.
Returns {drawing, count, subpath_count, point_count, bbox, size, doc_id}.
| Name | Required | Description | Default |
|---|---|---|---|
| parts | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: every part must parse, empty strings are rejected so no subpath is silently lost, and coordinates are serialised as integers. It also enumerates the return payload. It does not state side effects or whether the operation touches the document beyond returning doc_id, leaving a modest gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then adds validation and return details in compact, well-organized sentences with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is redundant but harmless. For a two-parameter transformation tool the description is nearly complete, with the only real omission being any explanation of the doc_id parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains 'parts' well (list of drawing strings, single string coerced to a one-element list) but says nothing about 'doc_id', leaving one of the two parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('join') and resource ('drawing strings') and explicitly positions itself as the inverse of the sibling ass_split_drawing. An agent can distinguish it from ass_split_drawing, ass_transform_drawing, and ass_scale_drawing without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The inverse-of-ass_split_drawing framing gives clear context for when this tool applies, and the note that a single string is treated as a one-element list clarifies accepted input shapes. It stops short of naming exclusions or an alternative to pick when the parts don't parse, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_auto_timingsA
Propose karaoke timings for one line from its duration (no write by default).
Arguments
index the line to analyse (0-based).
mode "syllable" (split on marker), "char", "word" or
"regex" (needs pattern).
weights "char_class" (default), "char" or "even".
start_ms / end_ms
span to distribute; both default to the line's own times.
apply False (default) only proposes the timings and the text that
would be written. True writes the generated \k tags to
the line (after workspace.snapshot). apply is a documented
extension of the required signature: the default is a pure read.
kind tag kind to generate when applying.
Returns
{"doc_id", "index", "mode", "split_mode", "weights", "kind", "applied", "start_ms", "end_ms", "span_ms", "span_cs", "syllables": [{"index", "text", "weight", "duration_cs", "duration_ms"}], "durations_cs", "duration_sum_cs", "line_duration_cs", "discrepancy_cs", "matches_line_duration", "message", "proposed_text", "old_text"}
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | k | |
| mode | No | syllable | |
| apply | No | ||
| index | Yes | ||
| doc_id | No | ||
| end_ms | No | ||
| marker | No | | | |
| pattern | No | ||
| weights | No | char_class | |
| start_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that apply=False is a pure read that only proposes text, that apply=True writes \k tags, and that the write happens after workspace.snapshot. This is meaningful side-effect disclosure beyond what any structured field provides; only auth/rate-limit style context is absent, which is reasonable for a local editor tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the Arguments/Returns headings make it scannable. The Returns block is lengthy, but since no output schema exists it is earning its place rather than padding; a minor trim of the field list would make it tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with 0% schema coverage and no output schema, the description covers nearly all arguments and, helpfully, documents the return dict so an agent can interpret results like discrepancy_cs and matches_line_duration. It is nearly complete; the only gaps are doc_id semantics and deeper explanation of the non-syllable modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: index, mode (with its four values and the marker dependency for 'syllable'), weights, start_ms/end_ms, apply, kind, and pattern are all given meaning and defaults. Only doc_id is left unexplained, and 'char'/'word'/'regex' modes get no elaboration on split behavior, but overall this is strong parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Propose karaoke timings') with a clear scope constraint ('for one line from its duration') and notes the default read-only behavior. It is clear what the tool does, but it never names or contrasts with the nearest siblings (ass_karaoke_generate, ass_karaoke_retime), so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the argument explanations (e.g. mode selects the splitting strategy, apply toggles write), and the 'no write by default' framing hints at the propose-vs-commit use case. However, it never states when to prefer this over the many other karaoke tools (generate, retime, scale, set_timings), so no explicit when-to-use guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_exportA
Export syllable timings for other karaoke tools.
Writes into workspace.output_dir and returns both the path and the
content. The file is named <document stem>_karaoke.<ext>.
Arguments
selection lines to export. None (default) exports every line that
carries karaoke tags; pass a selection to override.
format "srv2" (default) tab-separated interchange with a #
header and columns line, syl, start_ms, end_ms, dur_cs, dur_ms, kind, text; "txt" human-readable
<line_index> <h:mm:ss.cc> <h:mm:ss.cc> <text> rows;
"csv" the same columns as srv2 as RFC 4180 CSV.
include_untimed
also export lines without karaoke tags as a single syllable
covering the line span.
Returns
{"doc_id", "format", "path", "filename", "content", "lines": n, "syllables": n, "bytes": n, "output_dir": "..."}
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| format | No | srv2 | |
| selection | No | ||
| include_untimed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely does: it discloses the write side effect (writes into workspace.output_dir), the exact filename convention, and the return payload shape. It omits overwrite/clobber behavior and any permission requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first line, then arguments and returns are cleanly sectioned. The format listing is verbose but each format's output is materially different, so most sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly supplies the return key list and per-format output details. A 4 rather than 5 because doc_id's role and file-overwrite behavior are left unstated for a tool whose job is writing a file to disk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents three of four parameters in detail, including the exact column layout for each format value and the default behaviors. It does not document doc_id at all, which is the only gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export syllable timings') plus scope ('for other karaoke tools'), which distinguishes it from generic siblings like ass_export_text or ass_plain_text. An agent can tell what it produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the purpose and by the stated default ('None exports every line that carries karaoke tags; pass a selection to override'), but no alternative tool is named and no when-not condition is given (e.g. vs ass_karaoke_get or ass_karaoke_tags_only). Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_generateA
Generate \k tags across a line's syllables.
Arguments
selection / index
Which lines to rewrite. index names one line; otherwise
selection goes through :func:base.resolve_indices (None uses
the session selection, and an error is raised when nothing is selected).
start_ms / end_ms
Span the durations are distributed over. When omitted the line's own
Start/End are used. The line's own times are never modified
by this tool (use :func:ass_karaoke_retime for that).
mode marker / char / word / regex (pattern for regex).
kind karaoke tag kind: k, kf, ko or kt.
link how tags attach to the syllables:
"none" one tag per syllable, placed before the syllable's own
override tags;
"syl" the same count but each tag is placed after the
syllable's leading override tags;
"char" one tag per visible character (combining marks stay
with their base character) — the line span is split per character.
weights "char" (visible length), "char_class" (CJK/Latin/space
weighting, see karaoke.syllable_weights_by_char_class) or
"even".
replace_existing
True (default) rewrites existing karaoke tags. False leaves any
line that already carries karaoke tags untouched and reports it in
skipped.
min_cs minimum duration per syllable; a span too short to honour it
raises :class:ToolError instead of silently producing zeros.
snap_to_line
Clamp an explicitly requested span to the line's own span when it would
overshoot (reported in snapped).
Returns
{"text_source": "line", "doc_id", "mode", "kind", "link", "weights", "min_cs", "exact_sum_guaranteed": True, "sum_within_one_cs": True, "lines": [{"index", "start_ms", "end_ms", "span_ms", "span_cs", "snapped", "skipped", "reason", "durations_cs", "duration_sum_cs", "line_duration_cs", "discrepancy_cs", "matches_line_duration", "message", "syllables", "text", "old_text"}], "lines_changed": n}
The centisecond durations always sum to exactly span_cs (and therefore
to the line duration when the span came from the line) — better than the
one-centisecond tolerance required, so exact_sum_guaranteed is always
True when a line is written.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | k | |
| link | No | none | |
| mode | No | marker | |
| index | No | ||
| doc_id | No | ||
| end_ms | No | ||
| marker | No | | | |
| min_cs | No | ||
| pattern | No | ||
| weights | No | char | |
| start_ms | No | ||
| selection | No | ||
| snap_to_line | No | ||
| replace_existing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so thoroughly: it discloses that line times are never modified, that replace_existing=True rewrites existing tags while False reports lines in 'skipped', that min_cs violation raises ToolError rather than producing zeros, and that snap_to_line clamping is reported in 'snapped'. These are real behavioral traits an agent needs and none of them come from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-sentence purpose, then organizes the rest under clear Arguments/Returns headings with every parameter call-out earning its place. It is long, but the length is justified by 14 parameters and a missing output schema; density is appropriate rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description supplies an explicit Returns shape plus the exact-sum guarantee semantics. Combined with the parameter coverage and mutation rules, an agent has everything required to invoke this complex 14-parameter tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 14 params, so the description must compensate, and it documents nearly all of them in prose (selection/index, start_ms/end_ms, mode, kind, link, weights, replace_existing, min_cs, snap_to_line) including allowed values for mode/kind/link/weights that the schema leaves un-enumerated. Only doc_id and marker are left undocumented, so it falls just short of fully covering the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Generate), a specific output artifact (\k tags), and a specific scope (a line's syllables). It also explicitly distinguishes itself from the sibling ass_karaoke_retime ('The line's own times are never modified by this tool'), so an agent can route correctly without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the line-selection contract (index names one line, otherwise selection via base.resolve_indices, None uses the session selection, error when nothing is selected) and points to ass_karaoke_retime for retiming. It stops short of contrasting against other karaoke siblings (auto_timings, set_timings, set_kind), so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_getA
Read the parsed karaoke of one line.
Arguments
index 0-based line index (doc.events() order) of an open document.
doc_id open document id (defaults to the current one).
Returns
{"text_source": "line", "index", "doc_id", "line": {...}, "has_karaoke_tags", "untimed", "timings_source", "syllables": [{"index", "text", "raw", "prefix", "kind", "duration_cs", "duration_ms", "start_ms", "end_ms", "start", "end"}], "duration_sum_cs", "duration_sum_ms", "line_duration_cs", "discrepancy_cs", "matches_line_duration", "message", "kind_counts", "kinds"}
start_ms/end_ms are absolute (the line's Start is time zero
internally, the line's own start is added). discrepancy_cs is
sum(syllable durations) - line duration in centiseconds and is reported
explicitly, never corrected here.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| doc_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well. It implies read-only behavior ('Read') and explicitly notes that discrepancy_cs is 'reported explicitly, never corrected here,' which is a useful behavioral trait. It also describes the return shape thoroughly. It does not mention error handling or required document state beyond 'open document,' keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, followed by clearly labeled Arguments and Returns sections. It is somewhat long, but the detailed return documentation is justified because there is no output schema. Every section earns its place, though the return field list is dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a moderately complex tool with no output schema and no annotations, the description provides complete parameter semantics and a full return structure. It could be more complete by stating error cases or that the document must be open, but it covers what an agent needs to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it does fully. It explains 'index' as a 0-based line index in doc.events() order for an open document, and 'doc_id' as an open document id that defaults to the current one. Both parameters are completely documented in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Read the parsed karaoke of one line.' It is clear what it does. However, it does not explicitly distinguish itself from similar siblings like ass_karaoke_tags_only or ass_karaoke_export, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It implies usage by saying it reads karaoke from an open document, but it does not state prerequisites, exclusions, or which sibling to use for other karaoke-related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_removeA
Remove \k/\kf/\ko/\kt tags (karaoke.remove_karaoke).
drop_markers=True also removes the | syllable markers — they are kept
by default because they are the source data :func:ass_karaoke_generate
re-splits on.
keep_times controls the line's own times. True leaves Start/
End exactly as they were; False (default) retightens the line's
End to Start + karaoke extent when the karaoke extent is shorter
than the line (the trailing silence the karaoke timing defined is dropped).
Returns {"doc_id", "drop_markers", "keep_times", "lines": [{"index", "old_text", "text", "removed_tags": n, "old_start_ms", "old_end_ms", "start_ms", "end_ms", "times_retightened"}], "lines_changed": n, "tags_removed": n}.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| selection | Yes | ||
| keep_times | No | ||
| drop_markers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explains exactly what is destroyed (the karaoke tags, optionally the | markers), the default retention of markers and the reason, and the precise retightening/truncation side effect on the line's End when keep_times=False. It stops short of stating auth/permission needs or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then follows with the two behavioral flags and return shape. The prose is dense but each sentence carries information; only the return-shape dump is somewhat verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the full return structure, and with no annotations it fully documents the mutation's side effects. The only real gap is the unexplained required 'selection' parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 params. The description compensates well for drop_markers and keep_times, including the default behavior of each, but leaves the required 'selection' parameter and 'doc_id' entirely unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and a precisely scoped resource (\k/\kf/\ko/\kt karaoke tags), plus the underlying operation name. It is clearly distinguishable from generic siblings like ass_strip_tags and ass_remove_tag, which do not target karaoke timing tags specifically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives implicit guidance: markers are kept by default because ass_karaoke_generate re-splits on them, which hints at the workflow. However it never states explicitly when to prefer this over ass_strip_tags/ass_remove_tag, nor any prerequisites about the selection or doc_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_retimeA
Retime existing karaoke to a new span, reporting each syllable before/after.
Arguments
selection lines to retime (None uses the session selection).
mode "proportional" keeps the existing relative syllable lengths,
"even" gives every syllable the same duration.
new_start_ms / new_end_ms
new span. When given, the line's own Start/End are set
to them as well (that is what "retime the line" means); when
both are omitted the line's current span is used, optionally
moved by shift_ms or stretched by factor.
shift_ms move the whole span by this many ms (no length change).
factor scale the span length about the line start.
min_cs minimum syllable duration; an impossible span raises
:class:ToolError.
dry_run compute and report without writing anything.
Returns
{"doc_id", "mode", "dry_run", "lines": [{"index", "old_text", "text", "old_start_ms", "old_end_ms", "start_ms", "end_ms", "span_cs", "times_changed", "syllables": [{"index", "text", "kind", "before_cs", "after_cs", "before_ms", "after_ms", "delta_cs"}], "duration_sum_cs", "line_duration_cs", "discrepancy_cs", "matches_line_duration", "message"}], "lines_changed": n, "reported_not_stretched": True}
The new centisecond durations sum to the new span exactly; any mismatch against the line duration is reported rather than stretched.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | proportional | |
| doc_id | No | ||
| factor | No | ||
| min_cs | No | ||
| dry_run | No | ||
| shift_ms | No | ||
| selection | Yes | ||
| new_end_ms | No | ||
| new_start_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it discloses that the line's own Start/End are overwritten, that mode='even' vs 'proportional' changes distribution, that an impossible span raises ToolError, and that dry_run computes without writing. The mismatch-not-stretched policy is also stated. It omits permission/undo implications and any concurrency notes, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the Arguments/Returns sections are well organized with per-parameter labels. It is somewhat long and includes a verbose return-shape block plus a parenthetical aside, but those earn their place because no output schema exists and the parameter coverage is zero.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter mutation tool with no annotations and no output schema, the definition supplies both parameter semantics and the full return structure, including the lines_changed and reported_not_stretched fields. It is nearly complete, missing only doc_id handling and the format expected by selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it documents eight of the nine parameters (selection, mode, new_start_ms/new_end_ms, shift_ms, factor, min_cs, dry_run) with real semantics, including the enum values 'proportional'/'even' the schema lacks. Only doc_id is left unexplained, so the compensation is strong but not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Retime existing karaoke to a new span, reporting each syllable before/after.' This clearly distinguishes the operation from tangential tools like ass_update_line. However, it never distinguishes itself from close siblings such as ass_karaoke_scale, ass_karaoke_shift, or ass_karaoke_set_timings, all of which also alter karaoke timing, so an agent cannot route between them from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the purpose statement ('retime existing karaoke to a new span') and the parameter narratives describing the two modes. There is no explicit when-to-use / when-not-to-use guidance and no naming of the alternative tools (ass_karaoke_scale, ass_karaoke_shift) that would tell an agent which retiming entry point to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_scaleA
Multiply every karaoke duration by factor (never below min_cs).
scale_times=True also scales the line's own span about its start (the
Start time is kept). Returns the same shape as :func:ass_karaoke_shift
with factor instead of shift_ms; rounding/clamping is reported via
duration_sum_cs/discrepancy_cs/message, never stretched.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| factor | Yes | ||
| min_cs | No | ||
| selection | Yes | ||
| scale_times | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: duration is clamped so it is 'never below min_cs,' scale_times keeps the Start time and scales span about it, and rounding/clamping is surfaced via duration_sum_cs/discrepancy_cs/message and 'never stretched.' What it omits is that this mutates the document in place and whether the change is undoable, which matters for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core operation in the first clause and uses the rest for behavioral detail and a cross-reference. Dense but earns most of its words; the func: cross-reference to ass_karaoke_shift is slightly indirect but informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description partially addresses returns by naming duration_sum_cs/discrepancy_cs/message and pointing at ass_karaoke_shift's shape. However, it leaves selection/doc_id semantics unexplained and does not state that this is an in-place mutation, leaving gaps for a 5-parameter write tool with zero annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 5 parameters, so the description must compensate. It explains factor, min_cs (floor), and scale_times (also scale the line span, keep Start), but says nothing about selection or doc_id — two of five parameters remain fully undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Multiply every karaoke duration by factor.' It also differentiates itself from the close sibling ass_karaoke_shift by describing itself as the same operation 'with factor instead of shift_ms,' so an agent can distinguish the two without opening schemas. It stops short of 5 only because it never states the broader intent (e.g. retiming karaoke to fit a target duration).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the operation itself (scale karaoke durations when you want multiplicative adjustment). The explicit contrast with ass_karaoke_shift helps, but there is no statement of when to pick this over ass_karaoke_retime, ass_karaoke_set_timings, or ass_scale_times, and no prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_set_kindA
Convert karaoke tags to another kind (k, kf, ko, kt).
only_matching limits the conversion to syllables whose current kind is
that value (e.g. only k -> kf). Durations, text and every other
override tag are untouched. Returns
{"doc_id", "kind", "only_matching", "lines": [{"index", "old_text", "text", "before_kinds", "after_kinds", "changed"}], "lines_changed": n, "tags_converted": n}.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | k | |
| doc_id | No | ||
| selection | Yes | ||
| only_matching | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the whole behavioral burden, and it does disclose the blast radius well: 'Durations, text and every other override tag are untouched', plus it reveals the mutation returns per-line diff data. It stops short of stating persistence/in-place-edit and undo semantics, which would matter for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the filter semantics, then the non-effects, then the return shape. Every sentence earns its place; the return-value enumeration is dense but justified given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param mutation tool with no annotations and no output schema, the description is nearly self-sufficient: it explains what changes, what doesn't, and the exact return keys. The remaining gap is the undefined `selection`/`doc_id` targeting model, which an agent needs in order to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does excellent work on two of four params: `kind` is enumerated, and `only_matching` gets a concrete example ('only `k` -> `kf`'). But the required `selection` parameter and `doc_id` receive no explanation at all, leaving the most important targeting argument undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Convert karaoke tags to another kind') and enumerates the valid target kinds (`k`, `kf`, `ko`, `kt`). This distinguishes it cleanly from siblings such as ass_convert_tags, ass_set_tag, or the other ass_karaoke_* tools that retime or remove tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — you call this to change an existing karaoke syllable's kind — and the `only_matching` explanation describes a filtering mode. However, there is no explicit guidance on when to prefer this over ass_convert_tags or ass_set_tag, nor any stated prerequisites (e.g. must a document be selected/opened, and via doc_id or selection).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_set_timingsA
Write explicit per-syllable durations or absolute times.
Arguments
timings list of durations, list of {"duration_ms"|"duration_cs"|"start_ms"+ "end_ms"} dicts, or — when unit is an absolute spelling —
one start time per syllable, a list of [start, end] pairs, or
n + 1 boundary times.
unit "ms" / "cs" (values are durations), or
"absolute_ms" / "absolute_cs" / "absolute" /
"times" (values are absolute times). Absolute times must
be monotonically increasing.
kind force every syllable to this kind; None (default) keeps each
syllable's existing kind.
strict True (default): a count mismatch raises :class:ToolError
naming both counts. False pads with zeros / drops extras.
mode/marker/pattern
how to split a line that has no karaoke tags yet.
Returns
{"text_source": "line", "doc_id", "unit", "kind", "strict", "lines": [{"index", "syllable_count", "timing_count", "padded", "old_text", "text", "syllables": [{"text", "kind", "duration_cs", "duration_ms"}], "duration_sum_cs", "line_duration_cs", "discrepancy_cs", "matches_line_duration", "message"}], "lines_changed": n, "reported_not_stretched": True}
Durations that do not add up to the line duration are reported in
discrepancy_cs/message; they are never stretched to fit.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| mode | No | marker | |
| unit | No | ms | |
| index | No | ||
| doc_id | No | ||
| marker | No | | | |
| strict | No | ||
| pattern | No | ||
| timings | No | ||
| selection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it discloses that strict=True (default) raises ToolError on count mismatch naming both counts, that False pads with zeros or drops extras, that absolute times must be monotonically increasing, and that mis-summing durations are reported via discrepancy_cs/message and never stretched. It omits mutation/permission context (e.g. undo behavior, whether the document is modified in place), which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded with a single-sentence purpose followed by clearly delineated Arguments and Returns sections. The length is justified by ten parameters and several accepted timings encodings, though the Returns block is verbose relative to what an agent needs to choose the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description does explain the return payload and the key behavioral guarantees, which is good. But for a mutation tool of this complexity with zero annotations it leaves target selection (index/doc_id/selection) and the line-identification model unaddressed, so an agent could know the argument formats yet still not know which lines will be rewritten.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 10 parameters, so the description must compensate, and it does explain the hardest ones (timings formats, unit spellings, kind, strict, mode/marker/pattern). It says nothing about index, doc_id, or selection, leaving the agent without guidance on how to target the lines being modified, and it never reconciles the schema typing timings as a string with the described list/dict forms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource combination ('Write explicit per-syllable durations or absolute times'), which is meaningful against siblings like ass_karaoke_auto_timings or ass_karaoke_generate that derive timings rather than setting them. It does not name or route away from any specific sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'explicit' framing and by the mode/marker/pattern note ('how to split a line that has no karaoke tags yet'), which tells the agent this is for untagged lines. However there is no explicit when-to-use/when-not guidance, no mention of ass_karaoke_auto_timings / ass_karaoke_retime as alternatives, and no prerequisites such as which lines or document are targeted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_shiftB
Shift every karaoke duration by shift_ms (negative trims, floor 0).
shift_times=True also moves the line's own Start/End by the same
amount. Returns {"doc_id", "shift_ms", "shift_times", "lines": [{"index", "old_text", "text", "syllables": [{"index", "text", "kind", "before_cs", "after_cs"}], "duration_sum_cs", "line_duration_cs", "discrepancy_cs", "matches_line_duration", "message", "start_ms", "end_ms"}], "lines_changed": n, "clamped_cs": n} — durations never go below zero, so
the sum is reported rather than stretched.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| shift_ms | Yes | ||
| selection | Yes | ||
| shift_times | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses clamping ('floor 0', durations never go below zero), that shift_times propagates to the line's Start/End, that negative values trim, and that overflow is reported as sums rather than stretched. It omits permission/undo context, but the key mutation-side effects are spelled out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded correctly, but the bulk of the text is a long inline dump of the return object's nested shape. It is informative given there is no output schema, yet it is heavy prose that crowds out operation-level guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a timing-mutating tool with no annotations and no output schema, the inline return shape and clamping semantics fill important gaps. However, the undocumented required 'selection' argument and the unexplained doc_id default leave a real invocation gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It adds real meaning for shift_ms ('negative trims, floor 0') and shift_times, but leaves the required 'selection' parameter and 'doc_id' completely unexplained, so an agent gets no help on how to scope the operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Shift every karaoke duration by shift_ms', scoping it to karaoke durations rather than general line timing. This implicitly distinguishes it from siblings like ass_karaoke_scale or ass_shift_times, but it never names or contrasts those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the parameters do but gives no when-to-use guidance and no exclusions. An agent must infer for itself when to pick this over ass_karaoke_scale, ass_karaoke_retime, or ass_shift_times — none of which are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_splitA
Split a karaoke line into syllables.
Arguments
text / index + doc_id
Either the raw override text, or a 0-based line index in an open
document. "text_source" in the result says which was used.
mode "marker" (split on marker, the usual | workflow),
"char" (one visible character per syllable, combining marks
stay attached to their base character), "word" (whitespace)
or "regex" (split on pattern).
marker the marker string for mode="marker". Default "|".
pattern regex for mode="regex" (a capture-free split pattern).
keep_bom keep a leading U+FEFF in the text (default: strip it).
Returns
{"text_source": "text"|"line", "index", "doc_id", "mode", "marker", "pattern", "had_bom", "plain_text", "expected_visible_text", "reconstruction": {"ok", "reconstructed", "expected"}, "syllable_count", "syllables": [{"index", "raw", "text", "prefix", "prefix_tags", "leading_whitespace", "trailing_whitespace", "char_count"}]}
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | marker | |
| text | No | ||
| index | No | ||
| doc_id | No | ||
| marker | No | | | |
| pattern | No | ||
| keep_bom | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does substantial work: it explains that 'text_source' reports which input path was used, that combining marks stay attached to their base character in 'char' mode, that 'pattern' must be capture-free, and that 'keep_bom' defaults to stripping the leading U+FEFF. It does not state whether the operation is purely read-only or has any side effects, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first line, followed by clearly sectioned Arguments and Returns blocks. The Returns enumeration is lengthy, but it is justified because no output schema exists to carry that information. Little of the text is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 0% schema coverage across 7 parameters, the description supplies everything an agent needs: input path selection, mode semantics, defaults, and a full field listing of the return object including the reconstruction check. Nothing required for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with 7 undocumented parameters, and the description compensates fully: it defines text vs index+doc_id precedence, all four mode values, marker's default of '|', the capture-free constraint on pattern, and keep_bom's default stripping behavior. Every parameter gains meaning beyond its bare type in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource: 'Split a karaoke line into syllables.' It is unambiguous against siblings such as ass_karaoke_generate or ass_karaoke_retime, which mutate timing rather than decompose text. It stops short of explicitly naming those siblings, but the operation itself is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description sets out the invocation choice clearly: either supply raw 'text' or 'index' + 'doc_id', and it enumerates the four split 'mode' values with their semantics ('marker' described as the usual '|' workflow). What it lacks is any when-to-use framing versus alternatives like ass_karaoke_generate, but the operational context is well established.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_stylesA
List (and optionally create) the conventional karaoke template styles.
The standard set is Karaoke, Karaoke_2 and Karaoke_3 — the usual
Aegisub template trio — built from one base: Arial 60, white
PrimaryColour, blue SecondaryColour (so \kf/\ko sweeps from
blue into white), black outline, &H80000000& shadow, bold, BorderStyle 1,
Outline 2, Shadow 1, margins 10, Encoding 1. The variants differ only in
Alignment: Karaoke bottom (2), Karaoke_2 top (8), Karaoke_3
middle (5), which is how the tutorial template sets stack their layers.
prefix renames the trio (prefix, prefix_2, prefix_3).
create=False reports what exists without touching the document.
Returns {"doc_id", "prefix", "created": [names], "existing": [names], "styles": [{"name", "exists", "created_now", "values": {...}}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| create | No | ||
| doc_id | No | ||
| prefix | No | Karaoke |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the exact style values written, that create=False is non-destructive, and that the return separates 'created' from 'existing'/'created_now', implying existing styles are not clobbered. It omits any error/permission behavior and does not explicitly confirm create=True is a document mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, then the style spec, the prefix rule, the non-destructive read note, and the return shape. The long attribute enumeration (Arial 60, colors, outline, Encoding 1...) is verbose but genuinely informative for a template tool, so most sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, yet the description supplies the return structure and the mutation/non-mutation distinction, which is what an agent needs. The unaddressed doc_id semantics and the lack of any sibling routing are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does for two of three params: 'create=False' semantics and the 'prefix' renaming pattern ('prefix', 'prefix_2', 'prefix_3'), plus the defaults inherited from the schema. doc_id is never mentioned, leaving one parameter undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('List (and optionally create) the conventional karaoke template styles') and names the concrete artifacts (Karaoke/Karaoke_2/Karaoke_3, prefix variants). It does not distinguish itself from near-siblings such as ass_karaoke_template, ass_add_style, or ass_list_styles, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'create=False reports what exists without touching the document' gives one clear conditional for the read path, but the description never says when to prefer this tool over the sibling style-creation/list tools, nor what preconditions (e.g. an open document) apply. Usage is implied rather than routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_tags_onlyA
List only the karaoke tags of a line, with their arguments.
Handy right before retiming: it shows the syllable tags in order together with the visible text each one covers.
Args:
text / index / doc_id: the line to inspect (raw string, or 0-based index
inside doc_id).
Returns {"source", "index", "doc_id", "has_karaoke", "count", "tags", "plain_text", "syllable_text", "times_ms", "total_ms"}. Each entry of
tags is {"name" (canonical: k, kf, ko or kt), "argument", "raw", "plain_index", "block", "text"} where plain_index is the plain
(visible character) index at which the tag takes effect, block is the
0-based override block it lives in and text is the visible text that
follows it up to the next karaoke tag (the syllable it times).
syllable_text concatenates those chunks and total_ms sums the
integer arguments (\kt/\ko are not durations and are counted in
count but reported as None in times_ms). Read-only; no
snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and states 'Read-only; no snapshot', which tells the agent there are no mutations or undo side effects. It also explains output semantics such as counts and None durations for \kt/\ko, though it does not cover error cases or missing lines.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and organized, but it includes an extensive Returns section even though an output schema exists. That return-value detail is partly redundant and makes the definition longer than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a read-only inspection tool with three optional parameters, no annotations, and low schema description coverage, the description supplies purpose, usage context, parameter meaning, and return structure. It is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the three parameters. It does: text is a raw string, index is 0-based inside doc_id. It does not clarify optionality or what to do if both text and index/doc_id are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List only the karaoke tags of a line, with their arguments.' The word 'only' distinguishes it from broader karaoke tools such as ass_karaoke_get, and the line-level scope is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear usage context: 'Handy right before retiming.' However, it does not name alternatives or specify when not to use it versus ass_karaoke_get, ass_tag_summary, or ass_parse_text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_karaoke_templateA
Expand a karaoke template line into one generated line per syllable.
This is a documented subset of the Aegisub karaoke templater. Only
$syl (the syllable text) and $sdur (the syllable duration in
centiseconds) are substituted; the template's other override tags (including
\t transforms) are copied verbatim into every generated line. Classes,
code/once/mixin lines, the rest of the variable set and the
effect library are not supported — see unsupported in the result.
Arguments
selection the lines whose syllables are expanded.
template_line / template_index
the template: a raw string, or a 0-based line index. With a
real template index the generated lines are inserted directly
after it and copy its Layer, Actor, Effect, kind, style and
margins; with a raw string they are appended after the last
selected line.
style style for the generated lines (default: the template's style,
else the Karaoke style).
mode how to split the target line when it has no karaoke tags yet
(marker / char / word / regex).
replace_existing
remove previously generated lines (same Effect marker) that sit
immediately after the template line before inserting.
create_styles
create the standard karaoke styles when style names one
that does not exist yet.
dry_run report the lines that would be generated without inserting.
Returns
{"doc_id", "template_subset": True, "subset_of_aegisub_karaoke_templater": True, "supported": [...], "unsupported": [...], "variables_used": [...], "unknown_variables": [...], "template": {...}, "dry_run", "inserted_count": n, "replaced_lines": n, "generated": [{"target_index", "syllable_index", "text", "syllable", "duration_cs", "start_ms", "end_ms", "start", "end", "layer", "actor", "style", "kind", "inserted_index"}], "generated_indices": [...]}
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | marker | |
| style | No | ||
| doc_id | No | ||
| dry_run | No | ||
| selection | Yes | ||
| create_styles | No | ||
| template_line | No | ||
| template_index | No | ||
| replace_existing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it explains that generated lines inherit Layer/Actor/Effect/kind/style/margins when a template index is used, that raw-string templates are appended after the last selected line, what replace_existing removes, and that create_styles may create styles. This is rich behavioral context beyond a bare 'expand' claim, though permissions/undo behavior is unaddressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is long but organized with clear Arguments and Returns sections and the core purpose front-loaded. The Returns block is verbose for a 10% dimension, but since there is no output schema it earns most of its space; a few lines could still be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no annotations and no output schema, the description covers the operation, the supported/unsupported subset, every meaningful argument, and a full return-shape listing. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it documents selection, template_line/template_index (including the behavioral difference between them), style defaulting rules, mode, replace_existing, create_styles, and dry_run. It even enumerates the mode values (marker/char/word/regex) that the schema leaves unspecified, adding genuine meaning over the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a precise verb+resource: 'Expand a karaoke template line into one generated line per syllable.' An agent immediately understands the transformation. However, it never distinguishes itself from the closely named sibling ass_karaoke_generate, so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description scopes what is and is not supported (only $syl/$sdur; no classes, code/once/mixin, effect library), which implicitly tells the agent when this tool is the right choice. But it never states when to prefer it over ass_karaoke_generate or any other karaoke sibling, and gives no prerequisites. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_list_attachmentsA
List [Fonts]/[Graphics] attachments with a magic-byte sniff.
Args:
doc_id: document id or None for the current document.
kind: "font"/"fonts" or "image"/"graphics" to restrict
the listing; None returns both sections.
Returns:
{"doc_id", "count", "attachments": [ ... ]}. Each attachment has
name, kind (the declared kind), section, key,
data_lines, encoded_chars, decoded (is the payload valid
base64), size (exact decoded size, or encoded*3/4 when the data
is not valid base64 — size_exact says which), sha256,
magic (first 8 decoded bytes, hex), sniff (font, image
or unknown from the magic bytes), line_indices and error.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose substantive behavior: magic-byte sniffing to classify payloads, base64 validity checking, and the encoded*3/4 size fallback when decoding fails. It does not explicitly state that the operation is read-only or side-effect free, but 'List' plus the computed metadata makes the nature clear enough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The one-line summary is well front-loaded and the Args/Returns split is clean. However, the Returns block enumerates roughly a dozen fields in dense prose, and since an output schema already exists this detail largely duplicates structured data rather than earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, zero-required read tool with an output schema, the description covers purpose, both parameters with defaults, and the key computed behaviors. The only real gap is routing guidance versus sibling listing/font tools, which is scored separately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: doc_id is documented as an id or None for the current document, and kind documents the accepted spellings ('font'/'fonts', 'image'/'graphics') and that None returns both sections. These accepted-value aliases are not in the schema and are genuinely useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (list) plus resource (attachments), with the exact source sections named ([Fonts]/[Graphics]) and the non-obvious behavior (magic-byte sniff) front-loaded. An agent can immediately distinguish this read tool from ass_add_attachment, ass_extract_attachment, and ass_remove_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The kind parameter description implies how to restrict the listing, which gives in-tool usage context. However, there is no guidance on when to prefer this over related siblings such as ass_list_fonts, ass_fonts_used, or ass_check_font_substitution, leaving alternative selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_list_documentsB
List the open documents.
Returns {"documents": [{"doc_id", "path", "dirty", "lines", "encoding", "current"}...], "ids": [...], "current", "count"}. Line indices are
0-based.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. The verb "List" implies a safe read operation with no side effects, which is reasonable, but the bulk of the text describes the return payload (already covered by the output schema) rather than behavior such as whether the list reflects unsaved state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the remaining text is compact. The embedded return-shape literal is somewhat verbose given that an output schema already exists, but it is not wasteful enough to penalize heavily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema present, the definition is nearly complete. The only shortfall is the absence of any routing guidance relative to the many document- and line-listing siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly does not invent parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("List the open documents"), which an agent can distinguish from mutation siblings like ass_open or ass_close. However, it never addresses how it differs from closely related read siblings such as ass_document_info or ass_list_lines.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance or reference to alternatives. The agent is told what the tool returns but not the conditions under which this enumeration should be chosen over ass_document_info or ass_select_document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_list_extradataC
List [Aegisub Extradata] entries.
Returns:
{"doc_id", "count", "entries"} where each entry is
{"index", "head", "label", "id", "value", "raw", "layout"}
(index is the position inside the section, label the record's
numeric label, id the stored identifier).
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'List' strongly implies a non-destructive read, and the return shape is documented, but there is no explicit statement about side effects, permissions, or whether the operation is safe. It is adequate but leaves room for ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and efficient: it states the purpose first, then documents the return structure. The field-level return details are slightly verbose given that an output schema exists, but the content is well organized and wastes little space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema already covers return values, yet the description spends most of its text restating them. The critical gap is input behavior: it does not explain what doc_id does, whether it is optional, or what happens when it is omitted. For an agent to call this correctly, that information is necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the sole input parameter doc_id is never mentioned in the description. The only occurrence of 'doc_id' is in the output shape, so the description does not explain that the parameter selects which document's extradata to list, nor that it is optional with a null default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List [Aegisub Extradata] entries.' This clearly distinguishes it from the write-side sibling ass_set_extradata, but it does not explicitly name or contrast with alternatives, so it stops short of the sibling-aware 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as ass_set_extradata or ass_document_info. The purpose implies it is for inspection, but no context, prerequisites, or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_list_fontsB
List installed fonts, optionally filtered by a case-insensitive substring.
pattern is a plain substring matched against family, style and file --
not a fontconfig pattern expression. limit caps the number of entries.
Returns {pattern, limit, count, fonts: [{family, style, file, index, family_raw}, ...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pattern | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully clarifies that pattern is a plain substring matched against family/style/file rather than a fontconfig expression, which prevents a real invocation error. It says nothing about cost, ordering of results, behavior when no fonts match, or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then parameters, then return shape; every sentence carries information and there is no filler. Reproducing the full return shape is somewhat redundant given an output schema exists, which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only listing tool with an output schema, the description covers purpose, both parameters, and filtering semantics adequately. The remaining gap is routing guidance relative to the other font-inspection siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must define both parameters, and it largely does: pattern is a case-insensitive plain substring matched against family, style and file, and limit caps the number of entries. The default value of limit (100) and the null default for pattern are left to the schema, but the semantics are otherwise well covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List installed fonts') plus the optional filtering scope, so the purpose is unambiguous. It does not, however, differentiate itself from nearby siblings such as ass_fonts_used, ass_match_font, or ass_font_coverage, which an agent could easily confuse with 'list fonts'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Only an implied use case ('optionally filtered by substring'). There is no statement of when to reach for this tool versus ass_match_font, ass_fonts_used, ass_fonts_with_char, or ass_font_coverage, all of which live in the same font-related family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_list_linesA
List lines with paging.
Args:
selection: selection spelling (see module docstring); None means all
lines.
doc_id: document to read; the current one when omitted.
offset: number of selected lines to skip (0-based).
limit: maximum number of lines to return; None returns the rest.
include_tags_summary: add a tags_summary dict (tag counts, drawing
flag, karaoke/clip/transform lists) per line.
include_plain_text: include the plain_text field (tags stripped).
Returns {"doc_id", "total", "offset", "limit", "returned", "indices", "lines"} where lines are event_dict style dicts: index,
kind, start, end, start_ms, end_ms, duration_ms,
style, actor, effect, layer, margin_l/r/v, text
(raw, tags included), plain_text, comment, drawing, cps.
Indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| doc_id | No | ||
| offset | No | ||
| selection | No | ||
| include_plain_text | No | ||
| include_tags_summary | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses useful traits: paging via offset/limit, that None returns the rest/all, and the shape of the returned payload. However, it says nothing about read-only safety, error behavior, or the cost of large selections, leaving gaps for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, and Args/Returns sections are cleanly separated. It is somewhat long because it enumerates every return field, but that structure is legible and each element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists (so return values need not be restated), the description goes further by enumerating the line dict fields and paging contract. Combined with full parameter documentation, an agent has enough to invoke it correctly; only error/edge-case behavior is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely does, documenting all six parameters (offset 0-based, limit semantics, the two include flags, doc_id fallback to current document). The one weak spot is 'selection: selection spelling (see module docstring)', which defers rather than explaining.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific verb and resource ('List lines with paging'), so an agent immediately knows this is a bulk read of ASS lines. It does not explicitly name a sibling like ass_get_line or ass_get_selection to contrast with, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the selection and paging args suggest this is for reading many lines rather than a single one, but there is no explicit when-to-use/when-not statement or named alternative. The reader must infer that ass_get_line handles single-line retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_list_stylesA
List every style in the document.
Args:
doc_id: document id or None for the current document.
include_usage: add used (bool) and usage
({total, dialogue, comment}) to each style, counted over all
event lines (comments included).
include_bbox: render the sample text :data:BBOX_SAMPLE in each style
with libass and add bbox — the ink box in script coordinates
({x, y, x1, y1, width, height}) — plus bbox_error when the
measurement could not be produced (for example no ffmpeg/libass).
Returns:
{"doc_id", "count", "styles": [ ... ]} where each style dict holds
every ASS field exactly as stored (Name, Fontname,
Fontsize ... Encoding, colours verbatim), plus index,
section (its [V4+ Styles]/[V4 Styles] header) and
extra_fields (vendor columns not in the ASS vocabulary).
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| include_bbox | No | ||
| include_usage | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it defines exactly what include_usage counts (all event lines, comments included) and discloses the bbox measurement's failure mode (bbox_error when ffmpeg/libass is unavailable). The only gap is that read-only/non-mutating status is only implied by 'List' rather than stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded, with the core purpose in one line followed by structured Args and Returns sections. It is on the long side, but nearly every clause carries concrete semantic information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with three optional flags and no annotations, this covers purpose, each parameter's behavior, failure modes, and the return shape (style dicts, index, section, extra_fields). Nothing an agent needs to call it correctly is missing, even though an output schema also exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does fully: doc_id (id or None for current document), include_usage (adds used and usage with its sub-keys), and include_bbox (renders BBOX_SAMPLE with libass, adds bbox ink box and bbox_error). Each parameter's shape and effect is spelled out beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: list every style in the document. This is clearly distinct from ass_get_style (one style) and ass_list_documents (documents), though the description never names those siblings or the overlapping ass_style_usage tool. Clear, but not fully self-differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'List every style in the document,' and the include_usage/include_bbox flags hint at when to reach for them. However, there is no explicit when-to-use guidance, no mention of when to prefer ass_style_usage or ass_get_style instead, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_load_keyframesA
Load video keyframes into workspace.keyframes (milliseconds).
Args:
path: media file. When omitted the workspace video is probed with
render.keyframes.
doc_id: document id; only used as an fps source when frames is given.
frames: explicit frame numbers to convert (needs an fps).
times_ms: explicit keyframe times in milliseconds — used verbatim.
Returns:
{"source", "path", "count", "keyframes_ms", "first_ms", "last_ms"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| doc_id | No | ||
| frames | No | ||
| times_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the state mutation (writing into workspace.keyframes) and the probing side effect when path is omitted, plus the response keys. It does not say whether existing keyframes are overwritten or what permissions/setup are needed, so behavioral coverage is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by clearly labeled Args and Returns blocks; every line is short and functional. The Returns block is partially redundant given an output schema exists, but it does not bloat the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, and all four optional parameters are documented despite 0% schema coverage. No annotations exist to cover behavior, and the description leaves overwrite semantics unstated, which is the only notable gap for a 4-parameter workspace-mutating tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: all four parameters are explained with meaning and interdependencies (doc_id acts only as an fps source when frames is given; frames needs an fps; times_ms is used verbatim). Only the 'source' concept and accepted value formats (e.g., frame types) are left implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Load video keyframes into workspace.keyframes (milliseconds)', including the destination and unit. It clearly reads keyframes from a video, distinguishing it from sibling utilities like ass_snap_to_keyframes (which presumably consumes them), though it does not name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Args section implicitly guides calling modes (omit path to probe the workspace video; frames requires an fps; times_ms is verbatim), which is prerequisite-style guidance. However, it never states when to use this tool versus alternatives such as ass_snap_to_keyframes or ass_read_timecodes, so routing remains inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_match_fontB
What fontconfig actually resolves for family (with bold/italic).
The first candidate is the face that would be used; when its family differs from the request the subtitle will be rendered in a substitute.
Returns {requested, bold, italic, resolved, file, style, substituted, match, candidates}.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | ||
| family | Yes | ||
| italic | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a real behavioral trait: that the first candidate is the face used, and that a family mismatch means the subtitle renders in a substitute. It stops short of stating whether the call is read-only or has any side effects, but the substitution semantics are genuinely useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the substitution note adds value. The trailing return-field list is largely redundant with the existing output schema, slightly diluting an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a query tool with an output schema, the return explanation is unnecessary but harmless, and the substitution behavior is covered. The absence of any usage routing against the many font-related siblings and the undocumented boolean parameters leave it only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it partially does by naming `family`, `bold`, and `italic` in prose and tying them to the resolution behavior. It does not explain the boolean defaults (both false) or how bold/italic alter candidate ordering, leaving a gap against 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource framing ("What fontconfig actually resolves for `family`") that tells an agent exactly what the tool computes. It differs from siblings like ass_check_font_substitution by emphasizing the actual resolution result. However it never explicitly contrasts against those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use / when-not-to-use guidance and no named alternative, despite close siblings such as ass_check_font_substitution, ass_font_coverage, and ass_list_fonts. Usage is only inferable from the one-line purpose statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_merge_linesA
Merge the selected lines into the earliest one.
The selected lines are sorted by start (then end) time and their raw texts
are joined with separator (default the literal \N) into the
earliest-starting line, which keeps its style, actor, effect, layer and
margins; its span becomes the union of the merged spans. The other
selected lines are removed. Needs at least two lines.
Returns {"doc_id", "index": <0-based index of the merged line *after* the merge>, "removed": [<pre-merge 0-based indices of the lines folded away>], "removed_count", "start_ms", "end_ms", "text", "line": <dict>}.
Snapshot-backed.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| selection | Yes | ||
| separator | No | \N |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: sort order of selected lines, exact join semantics via separator, the properties preserved (style, actor, effect, layer, margins), the span-union rule, and that other lines are removed. It even discloses the 'Snapshot-backed' persistence trait, which no structured field conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action in the first sentence, then layers behavioral detail and the return shape. It is dense but every clause adds information; the inline return-structure enumeration is slightly heavy given an output schema exists, but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, the description covers the preconditions, precise merge mechanics, and side effects (removal of folded lines, index shifting). Return values are already specified by the output schema, yet the description reinforces them, leaving nothing an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it partially does: separator is fully explained including its literal default of \N, and selection is characterized (must contain at least two lines). The doc_id parameter is never mentioned, leaving a gap the schema cannot fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (merge) and resource (selected lines) with unambiguous behavior: fold selected lines into the earliest one. An agent can distinguish it from siblings like ass_split_line or ass_duplicate_lines without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one concrete precondition ('Needs at least two lines'), which is genuine usage context. However, it never routes the agent among alternatives (e.g., vs. ass_split_line/ass_unmerge) or states when merging is preferred, so usage remains implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_move_linesA
Move the selected lines to another position in the line order.
target_index is the 0-based slot in the remaining lines (the
selection is removed first) where the moved block is inserted; it is clamped
to the list length, so a large value appends. Returns {"doc_id", "moved": [old 0-based indices], "target_index", "selection": [new 0-based indices], "count"}. Snapshot-backed.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| selection | Yes | ||
| target_index | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explains that the selection is removed first, that target_index is clamped (large values append), the exact return shape, and that the operation is snapshot-backed (implying reversibility via undo). It omits auth/permission requirements, which is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the detail sentences are dense but earned. The return-value listing is somewhat redundant given an output schema exists, but the target_index clarification is high-value and not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The trickiest element (target_index semantics) is fully covered and return values are described, but with 0% schema coverage across three parameters the unexplained doc_id and selection leave an agent guessing on required inputs. Mutation behavior is otherwise adequately conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It thoroughly documents target_index (0-based, indexed against the remaining lines, clamped/appends), but says nothing about doc_id or the format/shape of the required 'selection' parameter. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Move the selected lines to another position in the line order.' This is unambiguous and inherently distinct from sibling operations like add/delete/duplicate/sort lines. It stops short of explicitly naming or contrasting a sibling, so it lands just below the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the operation itself (you move lines when you want to reorder them), but there is no explicit when-to-use, when-not, or alternative-tool guidance. Given siblings like ass_sort_lines and ass_duplicate_lines that also reorder/relocate lines, some routing guidance would help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_ms_from_frameB
Convert a frame number to its start time in milliseconds.
See :func:ass_frame_from_ms for the fps resolution order.
Returns:
{"frame", "fps", "fps_source", "ms", "seconds"}
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| frame | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that fps resolution order is inherited from ass_frame_from_ms and lists the return keys, but omits what happens when fps/doc_id are absent or how defaults are chosen. For a pure conversion utility this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded single sentence stating the transformation, followed by a brief pointer and a returns block. It is tight and readable, though the returns block duplicates what the output schema already provides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so enumerating return keys is redundant rather than harmful. However, for a computation tool with no annotations and undocumented parameters, the description does not say enough about inputs and default resolution. It is minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across three parameters. The description hints at 'frame' and the fps resolution path, but never explains the fps or doc_id parameters or their null defaults. With zero schema coverage, the description fails to compensate for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and transformation: converting a frame number to its start time in milliseconds. The direction is unambiguous and implicitly the inverse of the sibling ass_frame_from_ms, though it never names the sibling to differentiate. It is clear and concrete but leaves sibling routing to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives like ass_frame_from_ms, ass_ms_from_timecodes, or ass_shift_times. The reference to ass_frame_from_ms is about fps resolution, not about choosing between tools. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_ms_from_timecodesB
The frame that contains ms according to the loaded timecodes file.
Mirror of :func:ass_frame_from_timecodes; method reports whether the
loaded timecodes or the fallback frame rate was used, and ms is the start
time of the resulting frame.
Args: ms: milliseconds (int/float) or a time string. doc_id: document id, only needed for the fps fallback.
Returns:
{"ms", "frame", "frame_exact", "frame_floor", "frame_ceil", "frame_start_ms", "method", "input", "input_kind"}
| Name | Required | Description | Default |
|---|---|---|---|
| ms | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the 'method' field semantics (timecodes vs fallback frame rate) and the conditional role of doc_id, but says nothing about failure modes (e.g., what happens if no timecodes file is loaded) or whether output is deterministic.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, and the Args block adds value. However, the Returns block enumerates output keys that already exist in the output schema, which is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param conversion tool with an output schema, the description is largely adequate: it covers both params and behavioral nuances. It is incomplete regarding prerequisites (loaded timecodes) and error/edge behavior, which matter for a tool whose whole purpose depends on external state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does explain that ms accepts an int/float or a time string and that doc_id is only for the fps fallback, which is meaningful beyond the bare 'Ms'/'Doc Id' schema titles, though it stops short of full compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: it returns the frame containing a given ms using the loaded timecodes file. However, it does not distinguish itself from the closely-named siblings ass_frame_from_ms or ass_ms_from_frame, so an agent cannot easily tell which conversion to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is one useful usage hint (doc_id is only needed for the fps fallback), but no guidance on when to prefer this over ass_frame_from_ms or ass_frame_from_timecodes, and no mention of prerequisites such as a loaded timecodes file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_new_documentA
Create (and register) an empty ASS document.
Args:
play_res_x / play_res_y: PlayResX / PlayResY of the new script.
doc_id: optional registry id; one is generated when omitted.
script_type: "v4.00+" (ASS, default) or "v4.00" (SSA).
Returns the same summary as :func:ass_document_info minus the document
statistics: doc_id, path, dirty, script_type,
play_res_x, play_res_y, fps, lines, dialogue,
comments, styles, sections, encoding, has_bom,
newline. Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| play_res_x | No | ||
| play_res_y | No | ||
| script_type | No | v4.00+ |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses that the document is registered, that a doc_id is auto-generated when omitted, and enumerates the exact return payload (with line indices 0-based). It stops short of stating whether the new document becomes the active/selected document or whether anything is written to disk before a save.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening line is front-loaded and efficient, but the trailing enumeration of ~15 return fields largely duplicates the existing output schema and consumes space without adding selectable information. Structure is docstring-style rather than tuned for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter creation tool with an output schema, the description supplies the parameter meanings and mutation/registration semantics. The main omission is the relationship to sibling lifecycle tools (open, select, close), which would help an agent sequence calls correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it covers all four parameters: play_res_x/play_res_y as the new script's resolution, doc_id as an optional registry id that is generated when omitted, and script_type with its two concrete values and default (v4.00+ ASS vs v4.00 SSA).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource ('Create ... an empty ASS document') and adds the registration effect, which clearly separates it from file-opening siblings like ass_open. It does not name any sibling explicitly, but the 'empty/new' scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no routing to alternatives such as ass_open for existing files or ass_duplicate_lines. Usage must be inferred from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_openA
Open an ASS/SSA file and make it the current document.
Args:
path: file to open. A missing file raises ToolError.
doc_id: optional registry id for the opened document.
encoding: force this encoding instead of the automatic sniff; the file
must decode with it or ToolError is raised.
Returns the document summary (doc_id, path, dirty,
script_type, play_res_x, play_res_y, fps, lines,
dialogue, comments, styles, sections, encoding,
has_bom, newline). Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| doc_id | No | ||
| encoding | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does reasonably well: it discloses two concrete failure modes (missing file raises ToolError; forced encoding that fails to decode raises ToolError) and explains doc_id as an optional registry id. It does not say whether loading mutates state on disk or how it interacts with existing open documents, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is front-loaded and wastes nothing, and the Args list is tight. The Returns section enumerating every summary field is bulky and largely redundant given a declared output schema, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a file-open tool with an output schema, annotations absent and 0% schema coverage, the description supplies purpose, all parameter semantics, error behavior, and even the 0-based line index convention. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% (only bare titles like 'Path'), so the description must compensate and it does: path is the file to open with an error condition, doc_id is an optional registry id, and encoding overrides the automatic sniff with a failure condition. All three parameters gain meaning absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (open) and resource (ASS/SSA file) plus the resulting effect: it becomes the current document. That effect distinguishes it from read-only siblings like ass_document_info and from ass_new_document, so an agent can tell what state change this causes without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'open a file and make it the current document', but the description never says when to prefer this over ass_new_document, ass_select_document, or ass_import_srt, nor does it state any exclusions. It is adequate for an obvious verb but leaves alternative selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_parse_textA
Tokenise an ASS line into its ordered segments and override tags.
Args:
text: a raw ASS Text field (tags included). Use this to inspect a
line that is not (yet) in a document.
index: 0-based line index in doc_id; the line's current Text
field is read from the document.
doc_id: document holding index; the current document when omitted.
Passing both text and index is an error.
Returns a dict with:
source/index/doc_id
which input was used ("text" or "line").
raw, raw_length
the line exactly as stored (raw index space).
plain_text, plain_length, characters
the visible text and, for every visible character, its index in both
spaces: {"plain_index": i, "char": c, "raw_index": r}.
segments
ordered alternating text runs and {...} blocks. A text segment
carries text plus start/end (raw indices) and
plain_start/plain_end. A block segment carries raw
(including braces), inner, block (0-based block number),
is_override (True when it holds at least one \ tag; a block
without tags is an ASS comment block), the same four offset fields
(plain_start == plain_end for blocks) and tags.
tags
the flat list of every tag in line order, each with name (canonical,
lowercase, e.g. kf for \K), argument ("" for
valueless tags), raw (exact source text), paren (whether the
argument was written in parentheses), is_override and block.
Every parsed tag has is_override True because only
backslash-prefixed content is parsed as a tag; see the block-level flag
for comment blocks.
summary
per-line flags: blocks, tags, tag_names (histogram),
tag_groups (histogram by tag family), has_drawing (drawing mode
is still active at the end of the line, i.e. an unmatched \p),
drawing_state, has_karaoke, has_transform, has_clip and
plain_length. Use tag_names["p"]/tag_groups["drawing"] to
detect a drawing that is switched off again by \p0.
Read-only; no snapshot. start/end are raw indices, everything with
plain in its name is a plain (visible character) index.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the key traits: 'Read-only; no snapshot' tells the agent there is no undo side effect, and the mutual-exclusivity of text/index is flagged as an error. It does not discuss failure modes for a missing index/doc_id, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and args are front-loaded and well organised, but the Returns block is a large enumeration of keys that an output schema (present per context) should already carry, making it redundant bulk for a description. Structure is good; economy is not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only parser with three optional params, the description covers input selection, offset semantics (raw vs plain index spaces), and the shape of results. Since an output schema exists, the detailed return documentation is more than strictly needed, but nothing an agent needs to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: text is a raw ASS Text field with tags included, index is 0-based on doc_id, doc_id defaults to the current document, and combining both is invalid. This is meaningful semantics beyond the bare schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb and resource: tokenising an ASS Text field into ordered segments and override tags. This is materially different from siblings such as ass_tag_summary (aggregate) or ass_get_line (retrieval), so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a concrete when-to-use case ('Use this to inspect a line that is not (yet) in a document') and an explicit misuse condition ('Passing both text and index is an error'). It stops short of naming sibling alternatives for the in-document case, so it is clear but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_plain_textA
Strip every override tag, optionally keeping some tags or tag groups.
Args:
text / index / doc_id: the line to inspect (raw string or a 0-based line
index of doc_id); exactly one source must be given.
keep: "" (or None) removes everything. Otherwise a comma/space
separated string or a list whose items are either a tag name
("pos", "\an", "1c") or a tag group name. Group names
win over tag names and expand to the whole family, e.g. "clip"
keeps \clip and \iclip, "fade" keeps \fad and
\fade. Known groups: transform, fade, clip, drawing, karaoke,
layout, color, style, reset, animation.
Returns {"source", "index", "doc_id", "text", "plain_text", "keep_names", "keep_groups", "kept", "changed"} where text is the stripped line (it
still contains the kept override blocks), plain_text is the fully
tag-free visible text and kept lists the kept tags that were actually
present. Read-only; no snapshot, no indices.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | ||
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the safety-relevant trait explicitly: 'Read-only; no snapshot, no indices.' That tells the agent this mutates nothing and creates no undo state. It does not cover error behavior (invalid index, missing document) or any auth/permission expectations, so it stops short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-sentence purpose, then clearly labelled Args and Returns blocks. The group enumeration is dense but load-bearing for correct invocation; the return-key restatement is mildly redundant given an output schema exists, costing it the top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with an output schema, the description covers every parameter's semantics, the source-selection rule, and the read-only safety profile. The only gaps are error/edge-case behavior (no source given, bad index) and explicit sibling routing, which are minor against the rest of the detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does thoroughly: it explains the text/index/doc_id trichotomy and the exactly-one-source rule, defines keep's empty/None behavior, accepts string or list, clarifies tag names vs group names, states that group names win, gives concrete expansion examples (clip, fade), and enumerates the known groups. This is meaning no schema could supply on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: strips override tags from a line, with the twist of optional selective keeping. The 'optionally keeping some tags or tag groups' clause distinguishes it functionally from sibling tag-removal tools like ass_strip_tags and ass_remove_tag, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives the key invocation constraint ('exactly one source must be given') but never states when to prefer this over ass_strip_tags, ass_parse_text, or ass_tag_summary, nor what happens if zero or multiple sources are supplied. Usage context is implied by the keep mechanism rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_qcA
QA a selection of lines and return a structured issue report.
cps is the number of visible characters — override tags are stripped and
line breaks are not counted — divided by the line's duration in seconds.
Drawing lines ({\\p1}) carry no readable text, so they are skipped by the
text checks and reported once each as an info issue with code
drawing_line.
Args:
selection: lines to check; None/[] means every line.
doc_id: document id.
cps_warn: cps at or above which a line is cps_high (warning).
cps_max: cps at or above which a line is cps_extreme (error).
min_duration_ms: shorter lines are too_short (warning).
max_duration_ms: longer lines are too_long (warning).
max_chars: more visible characters is too_many_chars (warning).
max_lines: more \N-breaks is too_many_lines (warning).
check_overlaps: report overlap_same_layer for lines on the same layer
(different layers never overlap by design).
check_gaps: report gap_tiny for same-layer gaps below 100 ms.
check_empty: report empty_text.
check_styles: report style_missing for styles the document lacks.
check_tags: report unclosed_override_block and unknown_tag.
Returns:
{"doc_id", "parameters": {...}, "summary": {"lines_checked", "dialogue", "comments", "drawings", "issues", "errors", "warnings", "infos", "by_code": {...}, "ok", "clean"}, "issues": [{"code", "severity", "index", "message", "details"}]} — ok is False when any
error was found, clean is True only when there are no issues at all.
Issues are sorted by line index then code.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| cps_max | No | ||
| cps_warn | No | ||
| max_chars | No | ||
| max_lines | No | ||
| selection | No | ||
| check_gaps | No | ||
| check_tags | No | ||
| check_empty | No | ||
| check_styles | No | ||
| check_overlaps | No | ||
| max_duration_ms | No | ||
| min_duration_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it defines cps precisely (visible chars, tags stripped, breaks excluded, per second), explains that drawing lines are skipped by text checks and reported once as an 'info' with code 'drawing_line', and documents the ok/clean semantics plus issue ordering. It never explicitly states the tool is read-only/no-side-effect, which is the one notable unstated trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then a definition block, then per-parameter semantics, then returns. Every section maps to a real decision the caller must make; the prose is dense but slightly repetitive in enumerating all 13 args inline.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter QA tool, the description covers scope, cps computation, special-case handling (drawings), every parameter's trigger condition, and output semantics including ok/clean and sort order. Even though an output schema exists, the clarification of ok vs clean is genuinely additive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 13 parameters, so the description must compensate entirely — and it does, giving each parameter a meaning and, for thresholds, the exact issue code it triggers (cps_high, cps_extreme, too_short, too_long, too_many_chars, too_many_lines, overlap_same_layer, gap_tiny, empty_text, style_missing, unclosed_override_block, unknown_tag).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'QA a selection of lines and return a structured issue report', and the scope (selection or all lines) is defined immediately. It does not name the most likely confusable siblings (ass_validate, ass_check_overlaps, ass_reading_speed, ass_cps), so an agent must infer differentiation from the check list rather than being told.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'selection: lines to check; None/[] means every line' establishes the default scope, and each check_* flag implies when its check runs. However there is no explicit when-to-use-this vs ass_validate or ass_check_overlaps, no statement that this is a non-mutating audit, and no guidance on tuning thresholds for a given workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_reading_speedB
Reading speed of a single line.
Args: index: 0-based line index. doc_id: document id.
Returns:
{"doc_id", "index", "kind", "start_ms", "end_ms", "duration_ms", "characters", "lines", "drawing", "cps", "plain_text"} — cps is
None when the line has no duration (and 0.0 when it has no text).
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavior burden, and it does disclose a real quirk: cps is None when the line has no duration and 0.0 when it has no text. Beyond that it says nothing about read-only status, error behavior for an out-of-range index, or how the default null doc_id resolves (presumably the active document), leaving meaningful gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in one sentence, followed by compact Args and Returns sections. The Returns field list is long and largely mirrors the output schema, but it is structured and readable with no filler prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a small read-style tool with only two parameters (one required) and an existing output schema, the description is complete enough to invoke correctly: purpose, parameter roles, and the full return shape are all present. The only omissions are the doc_id null-default semantics and error behavior, which are minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate; it does define index as a 0-based line index and doc_id as a document id, which is genuinely additive. However, the meaning of the null default for doc_id (active document?) is never explained, so compensation is only partial for the required and optional params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the specific quantity produced ('Reading speed of a single line') with an implicit compute verb and a precise scope (one line). It is clear what the tool returns, though it never contrasts itself with the closely related sibling ass_cps (characters per second) or ass_get_line, so an agent must infer which to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus ass_cps, ass_get_line, or ass_stats, and no prerequisites stated (e.g., that the document must be open or what happens with the null doc_id). The Args/Returns blocks describe mechanics only, not selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_read_timecodesA
Parse an Aegisub timecodes file (v1 or v2) and store it on the workspace.
Args:
path: path to the .txt/.timecodes file.
Returns:
{"path", "version", "default_fps", "fps_changes", "times_ms", "frame_count", "duration_ms", "segments": [{"start_frame", "end_frame", "start_ms", "end_ms", "fps"}]}. v1 files have default_fps and
fps_changes ([{"start_frame", "end_frame", "fps"}]); v2 files
have the per-frame times_ms list. The result is also kept on
workspace.timecodes so the conversion tools can honour it.
Malformed input raises a ToolError naming the offending 1-based line number.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the side effect (storing on workspace.timecodes), version-specific return differences, and error behavior for malformed input. It gives an agent enough behavioral context to invoke the tool safely and interpret failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the section structure is clear, but the extensive Returns block is largely redundant because an output schema already exists. It could be trimmed without losing essential information, so the description is not ideally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of annotations, a 0%-covered parameter schema, and a complex return structure, the description is complete enough: it covers purpose, parameter meaning, version-specific return shapes, workspace storage, and error handling. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage and only one parameter. The description compensates by explaining that path is the path to a .txt or .timecodes file, which is useful semantic detail not present in the schema, though it omits details like absolute vs relative path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Parse) and resource (Aegisub timecodes file v1 or v2) plus the side effect of storing it on the workspace. An agent can distinguish this from siblings such as ass_write_timecodes or ass_frame_from_timecodes without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by noting the result is kept on workspace.timecodes so conversion tools can honour it, giving a clear context in which the tool is useful. However, it does not explicitly state when to use this versus alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_redoB
Redo the last undone change.
Returns {"doc_id", "redone", "undo_depth", "redo_depth", "dirty"};
redone is False when the redo stack is empty. Line indices are
0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It helpfully discloses the empty-stack case (redone=False) and the returned dict keys, which is real behavioral context. However, it says nothing about the fact that this mutates document state, what 'dirty' means, or any permission/locking requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action in a single clean sentence, then adds edge-case behavior. The return-dict enumeration is somewhat redundant given an output schema exists, but it is compact and not wasteful overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-value detail is optional rather than necessary. The main gap is the undocumented doc_id parameter and the absence of any mutation/annotation context, leaving the agent guessing about targeting and side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single doc_id parameter, so the description must compensate and does not: it never explains that doc_id targets a specific document or what happens when it is null (default). The one line of index context ('0-based') is about line indices, not this parameter, so it adds no relevant meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('Redo') and resource ('the last undone change'), making the operation unambiguous. It does not explicitly name the sibling ass_undo or ass_undo_history, but the pairing is self-evident from the wording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the operation name but never stated: there is no guidance on when to redo vs. inspect ass_undo_history, nor on what doc_id selects. For a trivial redo this is adequate but unhelpful beyond the obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_remove_attachmentB
Remove an attachment (its name line and every payload line).
Returns {"doc_id", "name", "removed", "lines_removed"}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the destructive scope precisely — the name line and all payload lines are removed — which is genuinely useful. However, it says nothing about whether the removal is undoable, what happens when the named attachment does not exist, or whether the document must be open/writable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the destructive scope front-loaded and the return shape appended. Nothing is padded, though restating the return keys is somewhat redundant given the output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since an output schema exists, the description need not spell out return values, and it correctly omits deeper behavior. But for a mutating tool with zero annotations and zero schema descriptions, the missing doc_id default semantics and undo/not-found behavior leave real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description explains neither parameter. It never says that 'name' identifies the attachment to remove, nor that 'doc_id' is optional and defaults to the current document — the most important ambiguity for this tool given the default-null doc_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove an attachment') and clarifies the scope of removal ('its name line and every payload line'), which is more than a restatement of the name. It reads as distinct from ass_add_attachment and ass_list_attachments, though it never explicitly names the siblings it should not be confused with (e.g. ass_extract_attachment).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no note on preconditions, and no mention of alternatives such as ass_extract_attachment for pulling an attachment out without deleting it. The intended usage is only inferable from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_remove_clipB
Strip clip tags from the selected lines.
include_inverse=True (the default) removes \iclip as well as
\clip; False keeps inverse clips. Blocks left empty by the removal
are dropped, which is expected for a remove operation.
Returns {doc_id, include_inverse, changed, lines: [{index, removed, changed, text}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| selection | No | ||
| include_inverse | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it discloses the include_inverse default and its effect on \iclip, and warns that emptied blocks are dropped by design. It stops short of stating undo/irreversibility or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, followed by the option semantics. The final sentence restates the return shape, which is somewhat redundant given an output schema exists, but the rest is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so describing return values is unnecessary and repeats structured data. The core mutation behavior is covered, but with zero annotations and 0% param coverage the description should at least clarify what 'selected lines' means when selection/doc_id are omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all three parameters. It only explains include_inverse (and does so well); doc_id and selection are never mentioned, leaving the two routing parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource (strip clip tags) and a scope (selected lines), which separates it from broad siblings like ass_strip_tags and ass_remove_tag. It never explicitly names those alternatives, so differentiation is inferable rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from the selected lines' implies a selection must exist first, but the description offers no when-to-use guidance, no contrast with ass_remove_tag / ass_strip_tags / ass_set_clip, and no note on what happens without a selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_remove_script_infoB
Remove a [Script Info] key.
Returns {"doc_id", "key", "removed"} (removed is False when the key
was not present).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose real behavioral detail beyond the name: the return payload shape and the key-not-present case (removed=False), which is genuinely useful. It says nothing about mutability safety, undo behavior, or permission requirements for a destructive key deletion, leaving a meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the action front-loaded and the return contract second. No filler, no repetition of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so detailing the return dict is not strictly necessary, though it is harmless. The real gap is the undocumented doc_id semantics for a mutation tool with no annotations, which leaves an agent unsure which document it is deleting from.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters. The description explains neither 'key' (the exact [Script Info] field name) nor 'doc_id', and crucially never says what the null default means (presumably the active document). With zero schema coverage, the description needed to compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('a [Script Info] key'), which an agent can immediately distinguish from the sibling read/write pair ass_get_script_info and ass_set_script_info. It stops short of naming those siblings, so it is clear but not maximally differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus ass_set_script_info or ass_get_script_info, no prerequisite context, and no note on which document is affected. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_remove_styleA
Delete a style, refusing to orphan lines that still use it.
Args:
name: style to delete.
doc_id: document id or None for the current document.
reassign_to: when the style is still used, the name of the style the
lines should be moved to before the style is deleted. Without it a
used style is an error.
Returns:
{"doc_id", "name", "removed", "reassigned", "reassign_to"} where
reassigned is the number of lines repointed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| doc_id | No | ||
| reassign_to | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses the orphan-prevention policy, the error condition when reassign_to is missing for a used style, and the return shape including what "reassigned" counts. It omits other potentially relevant behaviors such as permissions, undoability, or effects on unused styles, but the core mutation semantics are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main action and policy, then uses clear Args/Returns sections. It is appropriately sized and every sentence serves a purpose. The Returns section is somewhat redundant with the existing output schema, though it usefully explains the meaning of "reassigned," so it does not quite reach maximal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no schema descriptions, and an output schema, the description provides the key context an agent needs: purpose, parameter meanings, the error condition, and return fields. It covers the core invocation logic thoroughly. Minor omissions like behavior when the style does not exist or reusability of the operation keep it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: name, doc_id, and reassign_to are each given meaningful explanations beyond their type. The doc_id description clarifies the special None value for the current document, and reassign_to explains its conditional role and error consequence. Format constraints or examples beyond the basic meaning are not provided, keeping it at a strong 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Delete a style." It also adds the distinctive policy "refusing to orphan lines that still use it," which distinguishes it from siblings like ass_add_style or ass_update_style. However, it does not explicitly name or compare against any sibling tool, so it falls short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains the conditional use of reassign_to: "when the style is still used, the name of the style the lines should be moved to before the style is deleted." It also states the consequence of omission: "Without it a used style is an error." It does not, though, explicitly say when to prefer this tool over alternatives or list exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_remove_tagA
Delete every occurrence of the named override tags.
Args:
selection / index / text / doc_id: the usual three input modes.
names: a single tag name ("pos") or a list (["pos", "move"]);
a comma separated string works too. Group names are accepted and
expand to the whole family ("clip" removes \clip and
\iclip).
in_place: write back to the document (snapshot-backed). The raw-string
mode never writes.
Returns, single-line: {"source", "index", "doc_id", "names", "removed", "removed_count", "text", "plain_text", "changed", "written"} where
removed lists every deleted occurrence as {"name", "argument", "raw", "block"}; selection mode returns
{"source": "selection", "doc_id", "names", "count", "changed", "written", "in_place", "removed_count", "lines": [{"index", "before", "after", "removed", "changed"}]}. Removing a tag never touches the visible text
and never leaves an unclosed block: emptied blocks are dropped entirely.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| names | No | ||
| doc_id | No | ||
| in_place | No | ||
| selection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: in_place writes back to a snapshot-backed document, raw-string mode never writes, removal never affects visible text, never leaves unclosed blocks, and emptied blocks are dropped. Detailed return fields further reinforce the effect of the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and structured with Args and Returns sections. However, it includes lengthy return-shape details even though an output schema already exists, making parts of it redundant and less concise than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, annotation-free tool, the description is rich: it covers purpose, input modes, group expansion, write behavior, and return semantics. Minor gaps remain around explicit sibling alternatives and precise input-mode parameter details, but it is largely complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% over six parameters, so the description must compensate. It richly explains names (single, list, comma-separated, group expansion) and in_place, but lumps selection/index/text/doc_id together as the 'usual three input modes' without types or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (override tags) with scope (every occurrence), so the core action is clear. It does not, however, differentiate from sibling tag tools such as ass_strip_tags, ass_remove_clip, or ass_set_tag.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains input modes and the in_place write behavior, implying when the tool is appropriate. But it gives no explicit when-to-use / when-not-to-use guidance or alternatives among the many tag-manipulation siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_rename_styleA
Rename a style and (by default) rewrite the lines that reference it.
Args:
old_name: existing style name.
new_name: new name; must not collide with another style.
doc_id: document id or None for the current document.
update_lines: when true, every line whose Style field equals
old_name is rewritten to new_name.
Returns:
{"doc_id", "old_name", "new_name", "lines_updated", "style"}.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| new_name | Yes | ||
| old_name | Yes | ||
| update_lines | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses the default line-rewrite side effect, the name-collision constraint, the doc_id fallback to the current document, and the return shape. It does not describe error behavior or prerequisites, but the critical mutation semantics are clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation and then uses compact Args/Returns sections. Every sentence adds useful information without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with an output schema and no annotations, the description covers all parameters, the key side effect, defaults, and constraints. Sibling routing is absent, but no information needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully. It documents all four parameters with meaning beyond the schema: old_name is an existing style name, new_name must not collide, doc_id accepts None for the current document, and update_lines controls the rewrite behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: rename a style and by default rewrite lines referencing it. Distinguishes the operation through its documented side effect, but does not explicitly contrast with sibling tools such as ass_update_style or ass_copy_style.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool name and the stated default for update_lines, but there is no explicit when-to-use guidance, no when-not-to-use condition, and no comparison to alternative style-editing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_reorder_stylesB
Reorder the style section.
Args:
order: the complete list of style names in their new order (a
comma-separated string is also accepted). It must be a permutation
of the styles already present — missing, unknown or duplicated names
are reported in the error.
doc_id: document id or None for the current document.
Returns:
{"doc_id", "order", "count"} with the resulting order.
| Name | Required | Description | Default |
|---|---|---|---|
| order | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose useful behavioral context: order must be a permutation, and missing/unknown/duplicated names are surfaced in the error. However, it says nothing about permissions, whether the operation is undoable, or what happens to lines referencing the reordered styles.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then structured Args/Returns sections. Nothing is wasted, though the Returns block is somewhat redundant given an output schema exists. Overall tight and well-organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with a published output schema, the description covers both arguments, the key constraint, and error behavior. The main gap is lack of mutation-safety context (undo/permissions), but the core calling information is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it clarifies that 'order' is the complete list and that a comma-separated string is also accepted, matching the schema's anyOf array/string. 'doc_id' meaning (None = current document) is also explained. This is strong param documentation beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reorder) and resource (the style section), which is clearly distinct from line-level siblings such as sort_lines, move_lines, or split_line. The purpose is unambiguous, though it does not explicitly name a sibling or contrast its effect on style definitions versus line content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use, when-not-to-use, or alternative is provided. The permutation constraint hints at context but does not tell the agent when reordering styles is appropriate versus using sort_lines or setting a different style. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_saveA
Write a document to disk and report exactly what was written.
Args:
doc_id: document to save; the current one when omitted.
path: destination; the document's known path when omitted.
encoding: encoding override for this write.
bom: force the UTF-8/UTF-16 BOM on/off (None keeps the current one).
newline: "\n" / "\r\n" / "\r" override.
create_backup: copy the previous file to <path>.bak first.
Returns {"doc_id", "path", "bytes_written", "sha256", "changed", "encoding", "has_bom", "newline", "backup"}. changed is true when the
bytes written differ from whatever was on the destination beforehand (a
brand new destination counts as changed); has_bom is derived from the
bytes actually written. Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| bom | No | ||
| path | No | ||
| doc_id | No | ||
| newline | No | ||
| encoding | No | ||
| create_backup | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the exact return keys, defines 'changed' (including the new-destination case), explains that has_bom is derived from bytes actually written, and states that create_backup copies the previous file to <path>.bak. It still does not say whether the write is atomic, what permissions are required, or how failures are surfaced, so it falls just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by Args and then the return contract, so an agent can stop reading at any depth. The return-value enumeration is somewhat redundant given that an output schema exists, and the trailing 'Line indices are 0-based' note is irrelevant to a save operation and mildly confusing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with zero annotation coverage, the definition supplies parameter docs, defaults, side effects, and return semantics, which is nearly everything needed to call it correctly. What is missing is error/failure behavior and a pointer to the related save tools; the return-value listing is redundant since an output schema already exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: all six parameters are documented with meaning and defaults (doc_id/path default to the current document, bom=None preserves the current state, newline enumerates "\n"/"\r\n"/"\r", create_backup describes the .bak artifact). This is meaning the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Write a document to disk') plus the side effect of reporting what was written. It is unambiguous what the tool does, but it never distinguishes itself from siblings like ass_save_all or ass_export_text, which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no routing to alternatives such as ass_save_all (save every document) or ass_export_text. The only implicit usage hints are the parameter defaults ('the current one when omitted'), which describe invocation mechanics rather than tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_save_allA
Save every open document that has a known path.
Returns {"saved": [<result of ass_save>, ...], "count", "skipped": [doc_id, ...], "errors": [{"doc_id", "error"}, ...], "current"}. Documents created in memory and never saved are reported in
skipped rather than failing the whole call. Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a key behavioral trait: partial-failure tolerance, with in-memory-only documents routed to skipped rather than aborting the call. It omits permission/auth requirements and the fact that saving overwrites files on disk, which leaves some behavioral ground uncovered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the failure semantics follow logically. The inline return-structure block is somewhat verbose given an output schema exists, and the closing 'Line indices are 0-based' sentence does not earn its place in a parameterless save tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is complete enough: zero parameters, an output schema that already documents the return shape, and prose covering the important edge case (skipped vs errors). Adding auth/permission requirements would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate; baseline 4 applies. The trailing 'Line indices are 0-based' remark is irrelevant since no parameter or line is involved here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Save), resource (every open document), and scope qualifier (that has a known path). The batch scope makes it unambiguous versus the single-document sibling ass_save without needing to name it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'every open document' framing clearly implies batch-save usage versus ass_save for one document. However, it never explicitly names ass_save as the alternative or states when a batch save is preferable, so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_scale_drawingA
Scale the drawing part of each selected line (and its clips) by factor.
This is the classic "make everything on the line bigger" helper. The
drawing part and every clip are scaled about one common origin -- the
drawing's bbox centre when the line has a drawing, otherwise the first
clip's own centre -- so the drawing and its clips keep their relative
position instead of each drifting toward its own centre. Coordinates remain
in each clip's own scale space (the \clip(N,...) level is preserved) and
are rounded to integers with the module's explicit half-away-from-zero rule.
include_clips=False scales only the \p drawing. dry_run=True
reports the new text without touching the document.
Returns {doc_id, factor, include_clips, dry_run, changed, applied, lines: [{index, old_text, text, drawing_scaled, clips_scaled}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| factor | No | ||
| dry_run | No | ||
| selection | No | ||
| include_clips | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the common-origin scaling behavior, that coordinates stay in each clip's own scale space, the integer rounding rule, and the non-mutating nature of dry_run. It omits permissions/save-state implications of the actual mutation, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the remaining detail is substantive rather than filler. The trailing return-shape line duplicates the existing output schema and the heavy markdown emphasis adds length without adding meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with zero annotations, the description covers the geometry semantics, the clip-vs-drawing scope, and the dry-run escape hatch well, and an output schema exists so return values need no explanation. The undocumented doc_id and selection parameters are the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it explains factor, include_clips, and dry_run meaningfully. However, doc_id and selection are never described, leaving two of five parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (scale), a specific resource (the drawing part of each selected line and its clips), and a driving parameter (factor). It is clearly distinguishable from nearby siblings such as ass_transform_drawing, ass_scale_times, and ass_karaoke_scale.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional guidance for two modes: include_clips=False scales only the \p drawing, and dry_run=True reports without touching the document. It does not name alternative tools or state when not to use this one, so it falls short of full when/when-not/alternatives routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_scale_timesA
Scale the timing of the selection around an origin.
new = origin + (old - origin) * factor is applied to both the start and
the end of every selected line, so the selection stretches or compresses
while the origin stays put.
Args:
selection: lines to scale (see :func:ass_shift_times).
factor: multiplier, must be > 0.
doc_id: document id.
origin: None/"first" (start of the earliest selected line),
"document" (0), or an explicit millisecond value / time string.
round_ms: round the computed times to whole milliseconds before writing.
Returns:
{"doc_id", "factor", "origin_ms", "origin", "round_ms", "indices", "count", "changes": [{"index", "start_ms", "end_ms", "new_start_ms", "new_end_ms"}], "span": {"before": {"min_start_ms", "max_end_ms", "span_ms"}, "after": {...}}}
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| factor | No | ||
| origin | No | ||
| round_ms | No | ||
| selection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the scaling formula, that factor must be > 0, and that round_ms rounds computed times before writing. However, it does not state whether changes are undoable, what permissions are required, or what happens when selection is null/default.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the operation and formula, followed by structured Args and Returns sections. It is mostly efficient, but the Returns block duplicates the output schema and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a timing mutation tool with no annotations and 0% schema description coverage, the description covers the mathematical operation and parameters well. It lacks prerequisites, default behavior, and side-effect disclosure, which are important given the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must document all five parameters. It does so for factor, doc_id, origin, and round_ms, though selection is only documented by reference to ass_shift_times and doc_id is minimally described as 'document id'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: scaling the timing of selected lines around an origin, and gives the exact formula. This clearly distinguishes it from timing siblings like ass_shift_times or ass_set_times, which do not scale around an origin.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It does not state when to use this tool versus alternatives such as ass_shift_times, ass_set_times, or ass_snap_to_frames. The only sibling reference is for the selection parameter, not as usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_selectA
Update the session selection used by "selection".
Args:
spec: any selection spelling accepted by base.resolve_indices —
"all"/None, "0-4,7", 5, [0, 2],
{"style": "Default"}, {"text_contains": "hi"}, ...
mode: "set" (replace), "add", "remove" or "toggle".
Returns {"doc_id", "mode", "selection": [<0-based indices>], "count"}.
Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | set | |
| spec | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it does disclose that this mutates session state (not document content), enumerates the four mode behaviors including that "set" replaces, and describes the return payload. It omits whether the selection persists across operations, undo interaction, or whether an active document is required, which are meaningful gaps for a mutation tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The one-line purpose is front-loaded and the Args/Returns block is structured and waste-free, with each line adding usable information. Slightly docstring-formatted rather than prose-optimized, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool, the description covers the polymorphic spec, the mode enum, and the return fields (with an output schema also present per context signals). What remains unstated — preconditions such as an open document and whether the selection is saved — is minor but would round out the definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: spec is documented as a polymorphic selection spelling with concrete examples ("all"/None, "0-4,7", 5, [0, 2], {"style": "Default"}, {"text_contains": "hi"}) and mode enumerates all four accepted values plus its default. The reference to the internal ``base.resolve_indices`` is opaque to an agent, keeping this short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: updating the session's line selection, with the spec/mode arguments making the effect concrete. It is clearly distinguishable in intent from read-only siblings like ass_get_selection and from document-level ass_select_document, though it never names those siblings to route the agent explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mode list ("set" replace / "add" / "remove" / "toggle") implicitly tells the agent which invocation to choose for a given intent, which is real usage guidance. However there is no explicit when-to-use / when-not-to-use statement and no comparison against ass_get_selection or ass_select_document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_select_documentA
Make doc_id the current document (clearing the session selection).
Returns the document summary; see :func:ass_open. Line indices are
0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses a side effect (clearing the session selection) and the return (document summary), plus the 0-based line-index convention. It omits permission requirements, error conditions, and what happens to any prior selection state beyond 'clearing'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and effect in the first sentence, followed by return and index notes. Compact and largely waste-free, though the 0-based line-index remark is tangential to a document-selection tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, and the description still notes it returns the document summary. For a single-parameter selection tool with an ambiguous name, the description is mostly sufficient, though the lack of usage disambiguation from siblings is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter, so the description must compensate. It conveys that doc_id identifies the document to make current, but adds no format or example detail beyond that. Marginally better than the bare schema, but not rich.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Make ``doc_id`` the current document.' The parenthetical '(clearing the session selection)' clarifies the effect, and the reference to :func:`ass_open` hints at the relationship to the sibling that opens documents. It stops short of explicitly differentiating from siblings like ass_select, so it is clear but not fully disambiguated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the reference to ass_open and the note about clearing the session selection, but there is no explicit when-to-use versus alternatives guidance (e.g., ass_open vs ass_select vs this tool). The agent must infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_clipA
Set, add or remove a clip on the selected lines.
selection accepts anything :func:base.resolve_indices understands
(None = the session selection, or every line when none is set).
Geometry is taken from the first one of these that is given: rect
("x1,y1,x2,y2" or a 4-list, in script resolution unless scale
names the scale space those numbers are written in), drawing_text
(ASS path data), svg_path / svg_d (SVG path data) or spec
(a rectangle string, an ASS drawing, or an SVG path -- SVG is detected by
its H/V/Q/T/A/Z command letters and the result is converted).
scale for a vector clip sets the explicit \clip(<scale>,...) level;
when omitted a vector clip is written at level 1 (script resolution).
inverse=True emits \iclip.
mode:
"replace"-- strip every existing clip from the line, then insert."add"-- keep existing clips, insert the new one at the front."remove"-- strip every clip tag (\clipand\iclip) from the lines; the geometry arguments are ignored.
Returns {doc_id, mode, kind, tag, scale, inverse, lines: [{index, changed, text, removed, clip}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | replace | |
| rect | No | ||
| spec | No | ||
| scale | No | ||
| svg_d | No | ||
| doc_id | No | ||
| inverse | No | ||
| svg_path | No | ||
| selection | No | ||
| drawing_text | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that replace strips every existing clip, add inserts at the front, remove strips all clip tags and ignores geometry, and that inverse emits \iclip. It also explains scale defaults for vector clips. It stops short of stating permissions, undo behavior, or default document context for doc_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then structured with clear paragraphs and bullets for scale, inverse, and mode. Despite its length, every section earns its place by documenting distinct input behaviors for a complex 10-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, 10-parameter mutation tool with no annotations, the description is largely complete: it covers modes, selection, geometry sources, scale, and inverse, and the output schema handles return values. The omission of any doc_id guidance is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all 10 parameters. It explains selection, rect, drawing_text, svg_path, svg_d, spec, scale, inverse, and mode with useful format and precedence details. The only parameter not addressed at all is doc_id, which keeps this from being fully complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: set, add, or remove a clip on selected lines. It clearly distinguishes the three modes, but it does not explicitly differentiate this tool from siblings like ass_remove_clip or ass_get_clips, so an agent still has to infer when this combined tool is preferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: mode semantics, the default selection behavior, and geometry precedence. However, it does not state when to use this tool versus its sibling alternatives such as ass_remove_clip or ass_convert_clip_scale, nor does it give any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_commentA
Convert lines between Dialogue: and Comment:.
Args:
selection: selection spelling; None = every line.
comment: True converts to Comment:, False back to
Dialogue:.
drop: delete the selected lines instead of converting them.
Returns {"doc_id", "changed": [<0-based indices>], "count", "comment", "dropped"}. Snapshot-backed. Indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| drop | No | ||
| doc_id | No | ||
| comment | No | ||
| selection | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that `drop` deletes lines, that changes are snapshot-backed, and that returned indices are 0-based, but it does not describe permission requirements, whether conversion preserves timing/content, or the exact side effects of the delete path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation, then structured with Args and Returns sections. Every sentence adds useful information, and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and a moderately complex mutation tool, the description covers the main arguments and return shape adequately. It remains incomplete regarding `doc_id`, detailed `selection` format, permissions, and reversibility, which are relevant for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description explains `selection`, `comment`, and `drop` meaningfully. However, it omits the `doc_id` parameter entirely and does not specify the accepted format for `selection` beyond saying `None` means every line, so it only partially compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: converting lines between ``Dialogue:`` and ``Comment:``. This is clearly distinct from sibling tools that handle tags, styles, text, or timing, so an agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the meaning of the core arguments and the `drop` alternative, which implies when to use the tool, but it does not explicitly say when to prefer this tool over siblings or when not to use it. Guidance is therefore present but inferred rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_drawingA
Replace the drawing part of line index.
drawing_text is parsed and re-serialised with integer coordinates, so
the stored text is canonical (this is the only rewriting applied).
scale, when given, sets the line's \p level (\p<scale>); when
omitted an existing \p tag is left alone and a missing one is added as
\p1 so the drawing actually renders.
keep_tags=True keeps every non-drawing override tag and anything after
the drawing (typically the closing {\p0}); keep_tags=False rebuilds
the line as {\p<scale>}<drawing> and discards all other text.
Returns {doc_id, index, source, old_drawing, drawing, scale, text}.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| scale | No | ||
| doc_id | No | ||
| keep_tags | No | ||
| drawing_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so well: it discloses that drawing_text is re-serialised to canonical integer coordinates, how the \p level is set or defaulted, and exactly what keep_tags=False destroys ('discards all other text'). It even documents the mutation's return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core action is the first sentence, followed by parameter-behavior details in a logical order. Length is justified by the zero schema coverage, though it could be marginally tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no schema descriptions, the description covers nearly everything an agent needs, including destructive behavior and defaults; return values are also given despite an output schema existing. The unexplained doc_id parameter is the one remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it fully explains index, drawing_text, scale (including the omitted case) and keep_tags. It omits doc_id entirely, leaving the document-targeting semantics unexplained, which prevents a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Replace the drawing part of line *index*', which clearly distinguishes it from sibling read/transform tools like ass_get_drawing, ass_transform_drawing and ass_scale_drawing. It stops short of naming a sibling outright, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains conditional parameter behavior (what happens to \p when scale is omitted) but never states when to choose this tool over alternatives such as ass_transform_drawing or ass_scale_drawing. Usage is implied rather than guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_durationsA
Pull every selected line into the [min_ms, max_ms] duration window.
Only the edge named by mode moves — "stretch" (default) keeps the
start and moves the end, "start" keeps the end and moves the start. A
line is never moved past the neighbouring line on the same layer unless
allow_overlap is True, and never past keep gaps (there are none by
default, so the limit is the neighbour's exact start).
Args:
selection: lines to adjust.
min_ms: minimum duration; shorter lines are lengthened.
max_ms: maximum duration; longer lines are shortened.
mode: "stretch"/"end" (move the end) or "start" (move the
start).
doc_id: document id.
dry_run: when True (the default) nothing is written — the response shows
exactly what would happen.
allow_overlap: allow the new edge to cross the neighbouring line.
Returns:
{"doc_id", "dry_run", "applied", "mode", "window": {"min_ms", "max_ms"}, "allow_overlap", "count", "changes": [{"index", "field", "old_ms", "new_ms", "old", "new", "reason"}], "blocked": [{"index", "reason", "wanted_ms", "limit_ms"}]}
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | stretch | |
| doc_id | No | ||
| max_ms | No | ||
| min_ms | No | ||
| dry_run | No | ||
| selection | No | ||
| allow_overlap | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discharges it well: it discloses which edge moves per mode, the default, the neighbor/keep-gap constraints, that allow_overlap relaxes them, and that dry_run defaults to true so nothing is written. This is rich, safety-relevant behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose is front-loaded, then Args and Returns are separated cleanly. Minor verbosity in the keep-gap aside ('there are none by default') slightly muddies the constraint statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All seven parameters are covered, defaults are given, and the response shape is spelled out in detail. For a 7-param mutation tool with no annotations and a 0%-coverage schema, nothing an agent needs before calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and the Args block documents all seven parameters with meaningful semantics (e.g. shorter lines lengthened, longer shortened, mode edge behavior). The gap is 'selection', which is described only as 'lines to adjust' without clarifying its format (indices vs refs).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and effect on a specific resource: pulling selected lines into a duration window. Combined with the mode discussion, an agent can distinguish this from timing siblings like ass_shift_times or ass_set_times without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description thoroughly explains behavior once invoked but never states when to choose this over adjacent tools such as ass_set_times, ass_scale_times, or ass_fix_timing. Usage is implied by the effect rather than routed explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_extradataA
Set or remove one [Aegisub Extradata] entry (idempotent).
Args:
ident: the entry identifier (matched case-insensitively).
value: value to store; may be omitted when remove=True.
doc_id: document id or None for the current document.
remove: delete every entry with this identifier instead of setting it.
Returns:
{"doc_id", "id", "value", "removed", "created"}; setting an
existing identifier updates it in place (never duplicates it).
| Name | Required | Description | Default |
|---|---|---|---|
| ident | Yes | ||
| value | No | ||
| doc_id | No | ||
| remove | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses idempotency, in-place updates without duplication, and that remove deletes every entry with the identifier, though it does not cover permissions, save implications, or broader side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded and structured into Args and Returns sections. The Returns content is somewhat redundant because an output schema already exists, but the overall description remains efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain return values in detail, and it already covers the operation, all parameters, idempotency, and removal semantics. It is complete enough for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all four parameters. It does this well: ident is matched case-insensitively, value may be omitted when remove=True, doc_id=None selects the current document, and remove deletes matching entries instead of setting them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: setting or removing one [Aegisub Extradata] entry. It also marks the operation as idempotent and distinguishes it from the sibling listing tool ass_list_extradata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the remove flag and when value may be omitted, which gives clear operational context. However, it does not explicitly say when to choose this tool over alternatives or state prerequisites, so usage remains implied rather than fully guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_play_resC
Set PlayResX/PlayResY.
Returns {"doc_id", "play_res_x", "play_res_y", "previous_x", "previous_y"}.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the return payload, but that duplicates the existing output schema rather than adding behavioral context. It does not state permissions, whether the change is undoable, or what doc_id=null selects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the operation. The second sentence spends space restating return fields that the output schema already documents, which is minor waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, yet they are the only extra content. For a mutation tool with no annotations and 0% parameter coverage, the description omits the effect of PlayRes on rendering, document targeting, and reversibility.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does not. It maps x/y to PlayResX/PlayResY but gives no units, valid ranges, or interaction between the two values, and doc_id is entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and a specific resource (PlayResX/PlayResY), which is a unique setting not touched by any sibling tool. It is distinguishable from siblings like ass_set_wrap_style or ass_set_script_info, though it assumes the agent knows what PlayRes means in an ASS file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, no alternatives named. It never says whether a document must be open, whether doc_id defaults to the active document, or when changing play resolution is appropriate (e.g., before scaling drawings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_scaled_border_and_shadowC
Set ScaledBorderAndShadow (yes/no).
Returns {"doc_id", "value", "enabled", "previous"}.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies mutation via 'Set' and lists return fields, but says nothing about document persistence, permissions, undo behavior, or side effects beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The action and allowed values are front-loaded, and the return shape is compactly stated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and 0% schema description coverage, the description is incomplete. It omits the meaning of 'doc_id' and any context about scope or required permissions, even though the output schema already covers the return fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for both parameters. It clarifies that 'value' accepts yes/no, which is useful, but it never explains 'doc_id' or what happens when it is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Set') and the exact ASS property ('ScaledBorderAndShadow'), including allowed values ('yes'/'no'). That makes the purpose clear, but it does not distinguish this tool from generic sibling setters such as ass_set_script_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives, prerequisites, or scope. The only implied usage is setting the named property, with no exclusions or sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_script_infoA
Set, insert or reposition-free-update a [Script Info] key.
Args:
key: the key, e.g. "Title". Matching is case- and
space-insensitive, and the spelling already in the file is kept.
value: new value (converted with str; must not contain a newline).
doc_id: document id or None for the current document.
before: when the key does not exist yet, insert it immediately before
this existing key instead of appending at the end.
Returns:
{"doc_id", "key", "value", "created", "index"} where index is
the entry position inside [Script Info].
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes | ||
| before | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses several important behavioral traits: case- and space-insensitive key matching, preservation of existing spelling, conversion of the value via `str`, rejection of newlines, current-document defaulting, and insertion-before behavior. It does not cover permissions, reversibility, or overwrite semantics explicitly, but the behavioral context is substantially detailed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then organized into Args and Returns sections. It is appropriately sized and information-dense, though the Returns section is partly redundant since an output schema exists, and the opening phrase is slightly awkward.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, 0% schema coverage, and an output schema, the description provides strong parameter and behavioral detail. It also explains the return structure, which is helpful even though the output schema covers it. It stops short of explicitly stating overwrite behavior for existing keys and error cases, but it is largely complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does so thoroughly for all four parameters. It provides an example for `key`, explains matching rules and spelling preservation, constrains `value` to no newlines and `str` conversion, documents `doc_id` as optional/current-document, and clarifies `before` insertion behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: setting/inserting/updating a `[Script Info]` key. It is clear enough to distinguish from sibling read/remove operations by implication, but it does not name any sibling or explicitly route between them. The phrasing 'reposition-free-update' is slightly awkward, though the intent is still understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how the `before` parameter behaves when a key is missing, but it does not state when to use this tool versus alternatives such as `ass_get_script_info` or `ass_remove_script_info`. There is no explicit when-to-use or when-not-to-use guidance, leaving tool selection mostly to inference from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_tagA
Insert (or update) a single override tag on a line or a selection.
Args:
selection: selection spelling; when given, text/index must be
omitted and every selected line is processed.
index / text / doc_id: single-line source (0-based index inside
doc_id, or a raw string).
name: tag name without the backslash, e.g. "fad", "an",
"pos", "fscx" or "1c". A leading backslash is allowed.
arg: the tag argument, e.g. "200,200" for \fad(200,200) or
"8" for \an8. Parentheses are added automatically when the
argument needs them. Braces and line breaks are rejected, and so is
an out-of-range alignment for \an (1..9) or legacy \a
(1..11) — those are ignored by libass when wrong, so they are caught
here instead.
value: alias for arg; when not None it wins (handy for numeric
callers, e.g. value=8).
doc_id: document for index/selection.
where: where to put the tag. "prepend" merges the tag into a new
leading block (the line's existing first block is reused so that
repeated tags are updated rather than duplicated);
"after_first_block" (default) appends the tag to the end of the
line's first override block, creating that block when the line has
none; "prepend_block" always inserts a brand new leading block;
"append" adds a block at the very end of the line; "wrap"
wraps every visible character and restores the previous value
afterwards (see :func:ass_wrap_range).
only_if_missing: leave the line untouched when a tag with this name is
already present anywhere in the line.
in_place: write back to the document (single-line and selection mode).
Snapshot-backed; the raw-string mode never writes.
Indices: this tool edits whole override blocks, so it never takes character
offsets. Neither the plain-character index of the visible text nor the raw
index of the line is used or reported — but every where mode leaves both
maps of the visible characters unchanged (a tag is only ever inserted
between characters).
Returns {"source", "index", "doc_id", "name", "argument", "tag", "where", "text", "changed", "written", "skipped", "reason", "warnings"} for a
single line (tag is the exact tag text produced, e.g. \fad(200,200))
or {"source": "selection", "doc_id", "name", "tag", "where", "count", "changed", "written", "in_place", "lines": [...]} for a selection.
duration-style arguments are passed through verbatim.
| Name | Required | Description | Default |
|---|---|---|---|
| arg | No | ||
| name | No | ||
| text | No | ||
| index | No | ||
| value | No | ||
| where | No | after_first_block | |
| doc_id | No | ||
| in_place | No | ||
| selection | No | ||
| only_if_missing | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it documents that raw-string mode never writes, that in_place writes are snapshot-backed, that braces/line breaks/out-of-range \an and \a values are rejected, and that the tool never uses character offsets and leaves character maps unchanged. This is unusually rich behavioral disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line summary followed by a structured Args list where each entry earns its place. It is long, but the length is driven by genuine per-parameter semantics rather than filler; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, zero-annotation, zero-coverage tool, the description supplies everything needed: mode selection, parameter meaning, validation behavior, write semantics, and an index caveat. The return shape is already given by the output schema, so the extra return description is a bonus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there are 10 parameters, so the description must compensate entirely — and it does, documenting selection/index/text/doc_id, the name format and backslash allowance, arg vs value alias precedence, all five where modes with their merge/insert semantics, only_if_missing, and in_place write scope. Every parameter is covered with meaning beyond its bare name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Insert (or update) a single override tag on a line or a selection') and even distinguishes insert-vs-update behavior. It doesn't differentiate from tag-manipulation siblings such as ass_insert_tag_at or ass_apply_tag_to_block, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly signals the two operating modes (selection vs single-line via text/index/doc_id) and when only_if_missing or in_place apply, but it never states when to prefer this tool over sibling tag tools. Usage is implied by the argument semantics rather than spelled out as explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_timesA
Set the start, end and/or duration of one line.
Args:
index: 0-based line index.
doc_id: document id.
start_ms: new start — milliseconds or a time string such as
"0:00:01.50".
end_ms: new end (milliseconds or time string). Mutually exclusive with
duration_ms.
duration_ms: new duration; the end becomes start + duration_ms.
At least one of the three must be given. An end before the start is rejected with a ToolError naming both values.
Returns:
{"doc_id", "index", "before": {"start_ms", "end_ms", "duration_ms"}, "after": {...}, "changed": ["Start", ...], "applied"}
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | ||
| doc_id | No | ||
| end_ms | No | ||
| start_ms | No | ||
| duration_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden and does much of it: it documents the mutual-exclusion rule, the at-least-one-field requirement, and that an end before start is rejected with a ToolError naming both values. It does not mention permissions, undoability, or persistence behavior for the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation, then uses clearly labeled Args and Returns blocks with no filler. The return-value paragraph is somewhat redundant given the output schema, but it is compact and never wastes a sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, it covers the key semantics an agent needs: field exclusivity, minimum requirement, validation errors, and change reporting. Only the doc_id null default and any permission/undo implications are left unstated, which are minor given the output schema covers the return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents all five parameters including the time-string format example for start_ms/end_ms. The one gap is doc_id: the schema defaults it to null but the description never explains that null means the active document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Set the start, end and/or duration of one line.' The scope ('one line') and the three time fields distinguish it from sibling plural/batch timers such as ass_set_durations, ass_shift_times and ass_scale_times.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage rules: at least one of the three time fields must be supplied, and end_ms is mutually exclusive with duration_ms. It does not explicitly name which sibling to use for multi-line timing edits, so applicability is implied by 'one line' rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_timing_infoA
Set the timing source keys Aegisub stores in [Script Info].
fps writes FPS, video_file writes Video File and
timecodes_file writes Timecodes File. Passing an empty string for a
path removes that key. Calling the tool with no arguments at all changes
nothing and just reports the three keys as they currently are (changes
is then empty), which is the only way to read timing info.
Returns:
{"doc_id", "fps", "video_file", "timecodes_file", "changes"} with
the resulting values (None when a key is absent) and a
changes map of key -> {"from", "to"}.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| doc_id | No | ||
| video_file | No | ||
| timecodes_file | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that no-args is a no-op read, that empty strings destroy keys, and exactly what the return payload contains including None for absent keys. It is silent on whether changes are persisted to disk or require a save, and on error behavior for invalid fps values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then key mappings, then edge-case semantics, with returns in a structured block. Appropriately sized, though the final sentence about the changes map partially duplicates what the output schema already conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation tool with no annotations, the description covers the write path, the delete path, the read-only no-arg path, and the response shape, leaving no material gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for three of four parameters by mapping each to the concrete key it writes and defining the empty-string removal convention. doc_id is never explained, though its purpose is self-evident from the name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: setting the timing source keys Aegisub stores in [Script Info], with the exact key mappings (FPS, Video File, Timecodes File). It does not name a sibling alternative such as ass_set_script_info or ass_write_timecodes, though it does implicitly distinguish itself by noting this is 'the only way to read timing info.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage conditions for its three modes: pass fps/video_file/timecodes_file to write, pass an empty string to remove a key, and call with no arguments to read. It does not address when to prefer this over ass_set_script_info or ass_write_timecodes, so routing between similar tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_set_wrap_styleB
Set WrapStyle using Aegisub's numeric codes.
Args:
style: 0 smart, 1 end of line, 2 no wrapping, 3 bottom
of line only. The names are accepted too.
doc_id: document id or None for the current document.
Returns:
{"doc_id", "wrap_style", "name", "previous"}.
| Name | Required | Description | Default |
|---|---|---|---|
| style | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It implies mutation and mentions a 'previous' return field, but does not state permission requirements, reversibility, document-state requirements, or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loads the action, and structures arguments and return values clearly with no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity setter, the description covers both parameters and the return shape adequately, and an output schema exists. However, with no annotations, it lacks key behavioral context about mutation safety, permissions, and usage alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well by mapping numeric style codes and noting that names are accepted. It also explains that doc_id=None uses the current document, though it does not enumerate the accepted style name strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Set WrapStyle'. The purpose is clear, but it does not explicitly differentiate this global setting setter from sibling style or script-info tools, so it falls short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains arguments but gives no guidance on when to use this tool versus alternatives such as ass_set_script_info or ass_wrap_range. Usage is only implied by the verb 'Set'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_shift_timesA
Shift the start/end of lines by offset_ms (negative shifts allowed).
Args:
selection: which lines to shift — None/"all", an index, a list of
indices, "0-4,7" or any selector base.resolve_indices takes.
offset_ms: milliseconds to add; negative values move lines earlier.
doc_id: document id; defaults to the current document.
clamp: when True the shift is limited so that no selected line starts
before zero. The same (reduced) offset is applied to every line so
the relative timing of the selection is preserved.
only_selected: when False every line in the document is shifted and
selection is ignored.
Returns:
{"doc_id", "requested_offset_ms", "applied_offset_ms", "clamped", "only_selected", "indices", "count", "applied", "changes": [{"index", "start_ms", "end_ms", "new_start_ms", "new_end_ms", "start", "end"}]}
where the new_* values are what the document actually holds after the
write (ASS stores centiseconds).
| Name | Required | Description | Default |
|---|---|---|---|
| clamp | No | ||
| doc_id | No | ||
| offset_ms | No | ||
| selection | No | ||
| only_selected | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it explains clamp limits each line to not start before zero and that the *same reduced* offset applies to preserve relative timing, and it notes ASS stores centiseconds. It stops short of stating permission needs or reversibility, but the mutation behavior is unusually well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then cleanly sectioned into Args and Returns, with no padding in the argument prose. The detailed Returns block is somewhat redundant given an output schema already exists, which keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, 0%-schema-coverage mutation tool with no annotations, the description covers every parameter's behavior plus clamping edge cases and the write semantics. An output schema exists and is even summarized, so nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: selection (with accepted formats including None/"all", index, list, "0-4,7", resolve_indices selectors), offset_ms (negative moves earlier), doc_id default, clamp semantics, and only_selected=False ignoring selection. Every one of the 5 parameters is given meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb + resource ("Shift the start/end of lines by offset_ms") and notes negative shifts are allowed, so an agent immediately understands it is a relative timing mutation. It does not explicitly distinguish itself from siblings like ass_set_times, ass_scale_times, or ass_fix_timing, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied through parameter semantics (only_selected, clamp, selection formats); there is no explicit statement of when to choose this over ass_set_times or ass_scale_times, nor any prerequisites. The agent can infer intended usage but is given no routing guidance or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_snap_to_framesB
Snap line start/end times to whole video frames.
Args:
selection: lines to snap.
fps: frame rate (see :func:ass_frame_from_ms).
mode: "nearest" (default), "floor" or "ceil".
doc_id: document id.
which: "both" (default), "start" or "end".
Returns:
{"doc_id", "fps", "fps_source", "mode", "which", "considered", "count", "changes": [{"index", "field", "old_ms", "new_ms", "old", "new", "frame"}], "applied"} — new_ms is what the document now
holds, count is the number of fields that actually moved and
considered the number that were inspected.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | ||
| mode | No | nearest | |
| which | No | both | |
| doc_id | No | ||
| selection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description must carry the full behavioral burden. It does disclose the mode/which options and explains that new_ms reflects the mutated document state and applied/count indicate what changed, implying a mutation. It does not state permission requirements, reversibility/undo interaction, or error conditions, leaving meaningful gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by clean Args/Returns sections; every entry adds information. It is somewhat verbose in restating the return shape, but nothing is superfluous enough to hurt readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter mutation tool with no annotations and 0% schema coverage, the description covers purpose, all params, and return semantics. The only shortfall is the absence of when-to-use and safety/undo context, which is partly expected given an output schema already exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it names all five parameters and gives each meaning, including the enum-like values for mode (nearest/floor/ceil) and which (both/start/end) plus their defaults. Only selection's exact syntax/format remains undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource combination: snapping line start/end times onto whole video frames. It is unambiguous about the operation, though it never explicitly distinguishes itself from the similarly named sibling ass_snap_to_keyframes (frames vs keyframes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance or mention of alternatives. The agent cannot tell from the description when this is preferable to ass_snap_to_keyframes, ass_fix_timing, or ass_align_to_silence; usage must be inferred from behavior alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_snap_to_keyframesA
Snap line times to keyframes loaded in workspace.keyframes.
Args:
selection: lines to snap.
which: "both" (default), "start" or "end".
mode: "nearest" (default), "previous" or "next".
forward_only: only consider keyframes at or after the line's time (never
move a time earlier). Contradicts mode="previous".
max_distance_ms: skip a snap when it would move the time further than
this.
doc_id: document id.
Returns:
{"doc_id", "mode", "which", "forward_only", "max_distance_ms", "keyframes_loaded", "considered", "count", "applied", "changes": [{"index", "field", "old_ms", "new_ms", "old", "new", "delta_ms", "keyframe_ms"}], "skipped": [{"index", "field", "old_ms", "reason"}]}
— count/changes only list fields that really moved.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | nearest | |
| which | No | both | |
| doc_id | No | ||
| selection | No | ||
| forward_only | No | ||
| max_distance_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it documents skip behavior via max_distance_ms, states that forward_only contradicts mode="previous", and clarifies that count/changes only include fields that actually moved. It still omits mutation side effects (that lines in the document are rewritten) and any undo/permission context, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the Args entries are one line each with no filler. The Returns block is fairly long and duplicates information already carried by the output schema, which costs a little economy but does not obscure anything.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutating tool with no annotations, the description covers arguments, defaults, skip logic, and return contents, and the output schema absorbs return-value detail. It is nearly complete; the remaining gap is document-state context (that this rewrites line times and how that interacts with undo/history siblings).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema exposes only bare types, so the description must compensate — and it does, defining every one of the six arguments plus their defaults (selection, which, mode, forward_only, max_distance_ms, doc_id) in the Args block. Enum-like values (“both”/“start”/“end”, “nearest”/“previous”/“next”) are enumerated in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: snap line times to keyframes drawn from ``workspace.keyframes``. That distinguishes it from siblings like ass_snap_to_frames, ass_load_keyframes, and ass_fix_timing, and an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by noting the keyframes must already be loaded in ``workspace.keyframes`` and gives in-parameter rules (defaults, the forward_only/mode="previous" conflict). It never says when to prefer this over ass_snap_to_frames or what to do if keyframes are absent, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_sort_linesA
Sort the selected lines in place (document.reorder_events).
Args:
selection: selection spelling; None = every line.
keys: sort keys, applied in order; defaults to ["start", "end"].
One of start, end, duration, style, actor/
name, effect, layer, text, comment.
reverse: sort descending.
Only the selected lines move: they are re-shuffled among the slots they already occupy, so unselected lines keep their positions.
Returns {"doc_id", "sorted", "selection": [<0-based indices sorted>], "count", "moved": {old 0-based index: new 0-based index}}.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | No | ||
| doc_id | No | ||
| reverse | No | ||
| selection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that this is an in-place mutation, that only selected lines are re-shuffled among their existing slots while unselected lines keep their positions, and it specifies the default key order and reverse semantics. It omits anything about undo behavior or failure modes, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then a compact args block and one tight behavioral sentence. Slightly verbose with backtick-heavy formatting, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return explanation is largely redundant, but the description still fully specifies the sorting semantics, key options, and in-place scoping needed for a 4-param mutation with no annotations. Only the doc_id parameter's meaning is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents three of four parameters in depth: selection (None = every line), keys (ordered list with the full set of allowed values), and reverse (descending). Only doc_id is left undocumented, a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Sort the selected lines in place') and names the underlying operation. It is clearly distinguishable from siblings like ass_move_lines and ass_reorder_styles, which reorder rather than sort by keys.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: sort the current selection, or every line when selection is None. There is no explicit when-to-use / when-not guidance nor a named alternative (e.g., ass_move_lines for manual ordering), leaving the agent to infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_split_drawingA
Split a drawing into one string per subpath (no subpath is ever dropped).
Commands appearing before the first m/n form their own leading part,
so split followed by :func:ass_join_drawings is lossless.
Coordinates stay in the drawing's own scale space.
Returns {source, doc_id, index, scale, count, subpaths: [str, ...], parts: [str, ...] (alias of subpaths), point_counts: [int, ...], bboxes: [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that leading commands before the first m/n become their own part, that nothing is dropped, and that coordinates remain in the drawing's own scale space. It does not state whether the document is mutated or what errors occur, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in the first sentence, and the leading-commands caveat follows immediately. The long inline return signature is dense but earns its place as a reference; overall little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the detailed return enumeration is partly redundant, and the real gaps are parameter semantics and mutation/error behavior with no annotations. The description is adequate for the split semantics but incomplete about inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (text, index, doc_id) have 0% schema description coverage, and the description never explains their meaning or how they are resolved against each other. The only hints come incidentally from the mirrored return keys, which is not enough to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (split a drawing) and defines the exact output unit (one string per subpath), plus the edge case that no subpath is ever dropped. It is clearly distinguishable from siblings like ass_join_drawings, ass_drawing_to_svg, or ass_transform_drawing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the mention that split followed by ass_join_drawings is lossless, which points at a round-trip editing workflow. However there is no explicit when-to-use statement or when-not-to-use exclusion relative to alternatives like ass_drawing_info or ass_parse_text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_split_lineA
Split one line in two at a time strictly inside its span.
index is 0-based. at_ms accepts milliseconds or a time string
and must satisfy start < at_ms < end, otherwise ToolError. The cut
sits at the visible character whose position matches the time fraction (each
half keeps at least one visible character). The first half keeps the
original line's text up to the cut; the second half is a new line right
after it that repeats every override block preceding the cut (so {\i1}
prefixes survive) and keeps style, actor, effect, layer and margins.
Returns {"doc_id", "index", "second_index", "at_ms", "first": <dict>, "second": <dict>}. Snapshot-backed.
| Name | Required | Description | Default |
|---|---|---|---|
| at_ms | Yes | ||
| index | Yes | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does substantial work: it states the error condition, that each half keeps at least one visible character, that override blocks preceding the cut are repeated, and which attributes survive on the second line. It omits undo/snapshot semantics beyond the terse 'Snapshot-backed' tag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is dense but front-loaded, opening with the core action before constraints and the return shape. It is slightly long for its subject, and the markdown emphasis and separate return-shape sentence repeat information the output schema already carries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, the definition covers error behavior, cut semantics, preservation rules and side effects well enough to call correctly. Only the trailing snapshot note and the undocumented optional doc_id keep it from being fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for two of three parameters: 'index is 0-based' and 'at_ms accepts milliseconds or a time string' with a stated validity range. The optional doc_id parameter is left unexplained, which is the only gap against a low-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Split one line in two'), and adds the governing constraint ('strictly inside its span'), which lets an agent distinguish it from ass_merge_lines, ass_duplicate_lines and ass_karaoke_split. It never names a sibling explicitly, so it sits just below the sibling-differentiating tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear context of use plus the precise guard condition 'start < at_ms < end, otherwise ToolError', which tells the agent when the call is valid. It does not, however, contrast this with alternatives such as ass_merge_lines or ass_karaoke_split, so no exclusions are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_statsC
Statistics for a document.
Returns {"doc_id", "path", "lines", "dialogue", "comments", "characters", "words", "total_duration_ms", "average_cps", "mean_line_cps", "min_line_cps", "max_line_cps", "slowest": {"index", "cps"} | None, "style_histogram", "style_names", "actor_histogram", "actors", "over_cps_25", "lines_over_25", "empty_lines", "drawing_lines", "karaoke_lines", "duration_ms", "span_ms"}. average_cps is total characters over total dialogue
duration; the per-line figures only consider lines with a positive duration.
Indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose useful semantics: what average_cps measures (total characters over total dialogue duration), that per-line figures ignore zero-duration lines, and that indices are 0-based. However it says nothing about preconditions (must the document be open?), whether it is a pure read, or how a null doc_id resolves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, which is good, but the bulk of the text is a long enumeration of return keys that duplicates the existing output schema. That space would have been better spent on doc_id behavior and usage guidance, so the structure is only adequate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-value dump is largely redundant, and the description instead omits the two things an agent actually needs: when to call this versus the other metric tools, and how the optional doc_id resolves. It is minimally usable but leaves clear holes for a 60-plus-sibling toolkit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter doc_id has 0% schema description coverage, and the description never mentions it or explains what happens when it is omitted (default null). With the only parameter undocumented in both places, the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line 'Statistics for a document' names the resource but uses a noun phrase rather than a specific verb, and it does not differentiate this tool from adjacent siblings such as ass_document_info, ass_cps, ass_reading_speed, or ass_style_usage. The lengthy return-field list does narrow the scope after the fact, but the agent gets no crisp one-line statement of what makes this the right 'stats' tool versus the others.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives. Given siblings like ass_cps (which likely reports characters-per-second metrics overlapping average_cps/min_line_cps here) and ass_reading_speed, the absence of routing guidance is a real gap. Usage is only inferable from the field names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_strip_tagsA
Remove override tags from a line, a raw string or a whole selection.
This is the bulk "clean up the tags" tool. The keyword names mirror
asscore.tags.strip_tags (keep, keep_groups, remove_groups,
keep_drawing, keep_karaoke); remove and keep_clip are
additions of this tool, where remove lists individual tag names to drop
before stripping and keep_clip is shorthand for
keep_groups=["clip"].
Args:
selection: a selection spelling (None = every line, "0-4",
{"style": "Default"} ...). When given, every selected line is
processed and text/index must be omitted.
text: raw ASS line to process instead of a selection.
index: 0-based index of the line to process inside doc_id.
doc_id: document used by selection/index; the current one when
omitted.
keep: tag names (string or list) to keep, e.g. "pos,an". Group
names are accepted too and move into keep_groups.
keep_groups: tag group names to keep (transform, fade, clip, drawing,
karaoke, layout, color, style, reset, animation).
remove: tag names to delete outright before stripping (string or list).
remove_groups: tag group names to delete outright.
keep_drawing: keep \p/\pbo tags so drawings survive.
keep_karaoke: keep \k-family tags so karaoke timings survive.
keep_clip: keep \clip/\iclip.
in_place: write the result back to the document (line/selection mode
only). Snapshot-backed; the raw-string mode never writes.
Returns, in single-line mode: {"source", "index", "doc_id", "text", "plain_text", "changed", "written", "keep_names", "keep_groups", "remove_names", "remove_groups", "keep_drawing", "keep_karaoke", "keep_clip"}; in selection mode: {"source": "selection", "doc_id", "count", "changed", "written", "in_place", "lines": [{"index", "before", "after", "changed"}]}. Plain text is always tag-free; kept tags stay
inside their override blocks.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | No | ||
| text | No | ||
| index | No | ||
| doc_id | No | ||
| remove | No | ||
| in_place | No | ||
| keep_clip | No | ||
| selection | No | ||
| keep_groups | No | ||
| keep_drawing | No | ||
| keep_karaoke | No | ||
| remove_groups | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it discloses that in_place writes back to the document, that writes are snapshot-backed, and that raw-string mode never writes. The mode-dependent mutation semantics are exactly the context an agent needs to avoid unintended writes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose followed by clearly labeled Args and Returns sections; sizing is justified by 12 parameters. The enumerated return-key list is somewhat verbose given an output schema already exists, which is the only real slack.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 12-param mutation-capable tool, the definition covers mode selection, all argument semantics, write behavior, and return shapes. Nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 12 parameters, so the description must compensate entirely, and it does: each param is defined, including subtleties like keep vs keep_groups routing, remove running before stripping, and keep_clip as shorthand for keep_groups=["clip"].
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Remove override tags from a line, a raw string or a whole selection,' and explicitly frames itself as the bulk cleanup tool versus the single-tag siblings such as ass_remove_tag. An agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'bulk clean up the tags' framing and the mode rules ('when a selection is given, text/index must be omitted') tell the agent when and how this applies. It stops short of naming alternatives (ass_remove_tag, ass_plain_text, ass_karaoke_tags_only) explicitly, so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_style_for_lineA
Effective style values for one line, inline override tags included.
The line's Style field is resolved to a style; on top of it the inline
override tags that change font, size, colour, weight, scale, spacing,
border, shadow or alignment are applied, so the caller sees what libass
would actually use. \r/\rStyle restarts from a (possibly other)
style, exactly as the renderer does.
Args:
index: 0-based line index in doc.events() order (comments included).
None uses the session selection (ass_select), falling back to
its first index.
doc_id: document id or None for the current document.
Returns:
{"doc_id", "index", "style", "style_found", "style_definition", "resolved", "runs", "overrides", "transforms", "warnings", "text", "plain_text"}.
resolved is the typed effective state at the first visible
character; runs splits the visible text into
{start, end, values, sources, style} spans with identical values;
overrides lists the field names that inline tags modified;
transforms lists the \t(...) tags (animation is reported, not
folded into the numbers); colours stay in the spelling the tag/style
used.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explains the resolution semantics, that \r/\rStyle restart from a style exactly as the renderer does, that transforms are reported rather than folded into numbers, and that colours keep their original spelling. The read-only nature is strongly implied but never stated outright, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded with the purpose sentence first, then resolution details, then structured Args/Returns. The Returns list is long, and since an output schema exists it partly restates structured data, but the semantic explanation of resolved/runs/overrides adds real value rather than pure duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex read tool with an output schema, the description covers resolution mechanics, fallback behavior, and field semantics thoroughly. Minor remaining gaps are the absence of an explicit read-only statement and any routing hint against near-neighbor siblings, but nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate fully. It does: index is documented as 0-based in doc.events() order with comments included, None falls back to the session selection and then its first index; doc_id accepts an id or None for the current document. Both parameters are fully specified with fallback semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: resolving the effective style for one line, including inline override tags, so the caller sees what libass would actually use. This clearly distinguishes it from siblings like ass_get_style (raw style definition) or ass_get_line (raw line data), which an agent can tell apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is strongly implied by the stated behavior ('what libass would actually use'), and the index fallback to session selection gives practical context. However, it never explicitly names when to prefer this over ass_get_line, ass_get_style, or ass_tag_summary, and gives no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_style_usageA
Count how styles and actors are used, and name the unused styles.
Args:
doc_id: document id or None for the current document.
by: which grouping goes in counts: "style", "actor" or
"effect".
Returns:
{"doc_id", "by", "counts", "by_style", "by_actor", "unused_styles", "unknown_styles", "lines"}. Each count bucket is
{"name", "total", "dialogue", "comment"}; unknown_styles maps a
style referenced by lines but absent from the style section to its line
count.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | style | |
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It discloses deterministic counting behavior and the exact return shape, but says nothing about read-only status, side effects, permissions, or rate limits; for a query tool this is a notable but not fatal gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then uses Args and Returns sections. The Returns block is detailed and partly overlaps the output schema, but its semantic notes, such as count bucket fields and the unknown_styles mapping, earn their place; overall tight and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure is already covered, and the Args section fully compensates for 0% schema coverage on both parameters. Missing explicit usage routing and safety context, but sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the Args section fully compensates: doc_id is 'document id or None for the current document' and by accepts 'style', 'actor', or 'effect'. This adds syntax, default meaning, and value semantics beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: count how styles and actors are used, and name unused styles. Distinguishes from style-related siblings like ass_list_styles or ass_get_style by focusing on usage counts and unused styles rather than listing or retrieving individual styles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternatives are given, but the purpose and Args clearly imply the tool is for auditing style/actor/effect usage. The absence of sibling routing, such as to ass_stats, leaves the guidance implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_svg_to_drawingA
Convert SVG path data (or a whole .svg file) into ASS drawing text.
Either d (one or more d attributes, space separated) or svg_path
(the file is read, its viewBox becomes the origin shift and every
<path d="..."> is converted). view_box given as "x y w h" or
[x, y, w, h] shifts the paths so the box origin becomes (0, 0).
scale multiplies every coordinate; round_to is the number of decimal
places kept when serialising (0 = integer coordinates).
SVG and ASS both grow y downwards, so nothing is flipped. Supported
commands: M L H V C S Q T A Z (relative forms too); quadratics are
promoted to cubics and arcs to cubic segments.
Returns {drawing, bbox, size, center, path_count, view_box, scale, round_to, source}.
| Name | Required | Description | Default |
|---|---|---|---|
| d | No | ||
| scale | No | ||
| round_to | No | ||
| svg_path | No | ||
| view_box | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly: it discloses the coordinate system behavior (SVG and ASS both grow y downwards, nothing flipped), supported SVG commands, conversion details (quadratics promoted to cubics, arcs to cubic segments), and the return object's keys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then provides necessary technical detail in a well-structured, backtick-formatted way. Every sentence adds relevant information for this conversion task.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero schema description coverage, no annotations, five parameters, and a non-trivial conversion domain, the description is complete enough for an agent to invoke correctly. It even repeats the return keys, though an output schema exists, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and does: it defines d, svg_path, view_box (including string and array formats), scale, and round_to with enough precision to use each parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: convert SVG path data or .svg files into ASS drawing text. This clearly distinguishes it from sibling tools like ass_drawing_to_svg, which performs the reverse conversion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two input modes (d vs svg_path) and the effects of view_box, scale, and round_to, giving clear context for how to invoke the tool. However, it does not explicitly name when to use this tool versus its reverse sibling ass_drawing_to_svg, so alternatives are not directly addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_swap_an_posA
Mirror \an vertically and move \pos so the text does not budge.
The classic Aegisub helper: \an1 <-> \an7, \an2 <-> \an8,
\an3 <-> \an9 (the middle row 4/5/6 has no vertical mirror and is
left alone). Because the anchor flips between the bottom and the top of the
line, \pos has to move by exactly the line height for the rendered text
to stay where it was.
The shift is computed from the real rendered size of the line, measured
with :func:asscore.measure.measure_line_render in script pixels (see
:func:_measure_geometry). height is the vertical anchor separation
(\an7 ink top minus \an1 ink top, both anchored at the same
y), i.e. the line height, and width is the advance width (left side
bearing + ink width + right side bearing, from the \an7/\an9
probes), i.e. the horizontal anchor separation. One numpad row or column
step moves the anchor by half of the corresponding separation, and the
anchor must move the other way for the ink to stay put::
row_step = new_row - row # numpad grid, +-2 for a top/bottom swap
col_step = new_col - col # +-2 for a left/right swap
dy = -(height / 2) * row_step # row 2 is the top of the screen
dx = +(width / 2) * col_step # col 2 is the right of the screenFor \an7 -> \an1 that is row_step = -2 and dy = +height: the
anchor walks down by the line height so the text stays on its screen row.
A purely vertical mirror never changes the column, so dx stays 0
there; horizontal=True additionally mirrors the column
(\an7 <-> \an9, \an1 <-> \an3, \an4 <-> \an6) and then
dx = +width for \an7 -> \an3 (numpad columns grow rightwards, so
the new right-edge anchor has to sit one width further right), which is what
makes the width term reachable.
The measured text is the line with its own \pos/\move/\an
removed, rendered with the line's style and the document's PlayRes, so
the height matches what libass does for the real line.
Indices: \an/\pos are located inside the override blocks, so no
plain-character index and no raw offset is taken as input. selection
refers to event indices (doc.events() order, 0-based), and the plain text
of every line survives byte for byte, so both index maps are unchanged.
Args:
selection: selection spelling; the lines to rewrite.
doc_id: document to edit; the current one when omitted.
margin_mode: how to treat lines that have no \pos. By default they
are skipped (there is nothing to shift). With margin_mode=True
the vertical margin is rewritten instead:
MarginV = PlayResY - MarginV - height, which keeps an
alignment/margin-positioned line in place across the mirror.
dry_run: compute and report the plan without writing (no snapshot).
horizontal: also mirror the alignment column (180 degree mirror) and
shift x by the advance width. Off by default, matching the
Aegisub helper.
Returns {"doc_id", "dry_run", "margin_mode", "horizontal", "count", "changed", "written", "geometry_source", "lines": [...]}; each line entry
has index, before, after, old_an, new_an, old_pos,
new_pos, dx, dy, margin_v, measured ({"width", "height", "ink_width", "ink_height", "left_bearing"}), changed,
skipped and reason. Retiming/render checks aside, the check to
apply is that the ink bounding box before and after is identical — see the
test suite, which asserts exactly that with
:func:asscore.measure.measure_render.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No | ||
| dry_run | No | ||
| selection | Yes | ||
| horizontal | No | ||
| margin_mode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that dry_run writes nothing and takes no snapshot, the exact MarginV rewrite formula, that selection indexes are event indices and both index maps are unchanged, that plain text survives byte for byte, and the invariant that the ink bounding box is identical before and after.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is an essay of implementation-derivation math (row_step/dx formulas, measurement probes) that an agent selecting or invoking the tool does not need, and the actionable Args block is buried at the very end. Much of the length does not earn its place for tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 5-parameter mutation tool with an output schema, the description is complete: it covers every input's effect, the write/dry-run behavior, index stability, and even the returned keys (redundant against the output schema but harmless). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and the Args block explains four of five parameters substantively (doc_id default, margin_mode semantics with formula, dry_run, horizontal). The remaining gap is that ``selection`` is only described as a "selection spelling" without defining the format, so it does not fully close the coverage hole.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: mirror ``\an`` vertically and move ``\pos`` to keep text stationary. It names the exact transformation and the classic Aegisub helper it mirrors, so an agent can distinguish it from the many other tag-mutation siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real context: lines without ``\pos`` are skipped by default, ``margin_mode=True`` rewrites MarginV instead, and ``horizontal`` extends to a 180 degree mirror. However, there is no explicit when-to-use/when-not-to-use framing and no alternative sibling is named (e.g. set_tag/remove_tag), leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_tag_summaryA
Per-line tag histogram and typesetting sanity check.
Args:
index / text / doc_id: inspect a single line (0-based index of doc_id
or a raw string).
selection: inspect a set of lines (None means every line when no
index/text is given). doc_id says which document.
Returns {"source", "doc_id", "index", "count", "missing_position", "lines": [...], "totals": {...}}. Every line entry carries index,
raw, plain_text, visible_chars, blocks (number of override
blocks), tags (total), tag_names (per-name histogram), tag_groups
(the same count folded into tag families such as layout, color, karaoke,
clip, transform), has_drawing (drawing mode still active at the end of
the line) / drawing_state,
has_karaoke/has_transform/has_clip,
first_block_has_pos/first_block_has_move and missing_position
(True when the line's first override block has neither \pos nor
\move — the line is then placed by styles and margins only, which is the
usual typesetting smell). missing_position at the top level lists the
indices of those lines; totals sums tags, blocks and flags over the
selection. Read-only; no snapshot. All indices are 0-based line indices,
while visible_chars counts plain (visible) characters.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| index | No | ||
| doc_id | No | ||
| selection | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and mostly succeeds: it declares 'Read-only; no snapshot', explains the meaning of missing_position as a typesetting smell, and clarifies that visible_chars counts only plain characters while all indices are 0-based. It omits any note on cost, scale limits, or behavior on large selections, so it falls short of exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose and the Args block is tight, but the long 'Returns' enumeration restates a structured fields that an output schema already exposes, so much of that prose does not earn its place. The sentence explaining missing_position is the part that genuinely adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be narrated, yet the description covers arguments, safety profile, and index conventions well enough for an agent to invoke it. The only substantive hole is the unspecified shape of the `selection` argument, which is the one thing an agent could still get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has to compensate and largely does: it maps index/text/doc_id to single-line inspection, explains that selection covers a set of lines with doc_id identifying the document, and states the 0-based convention. The one real gap is the type/format of `selection` itself (list of indices? ranges?), which remains unspecified in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific verb-and-resource combination: it computes a per-line tag histogram AND performs a typesetting sanity check. That distinguishes it from pure-parse siblings like ass_parse_text or pure-stats tools like ass_stats. It does not explicitly name a sibling it supersedes or differs from, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is available only by inference from the Args block: index/text for one line, selection for a set, None for everything. There is no explicit statement of when to reach for this tool instead of ass_parse_text, ass_style_usage, or ass_get_line, which are the closest neighbours in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_transform_drawingA
Transform a drawing and return the new path data (or write it back).
Coordinates in and out are the drawing's own scale-space units (see the module docstring); results are serialised with integer coordinates.
action and the parameters it uses:
translate dx, dy -- shift every point.
scale factor about (origin_x, origin_y); the origin
defaults to the drawing's bbox centre so it stays put.
scale_to_size dx, dy = target width/height; uniform scale
(aspect ratio kept), drawing moved into (0,0,w,h).
stretch_to_bbox dx, dy = target width/height; independent axes
(aspect ratio deliberately broken).
rotate angle_deg clockwise on screen about the origin
(bbox centre by default).
mirror axis="x" flips left/right, axis="y" top/bottom
about the origin (bbox centre by default).
center/centre_at_origin move the bbox centre to (origin_x, origin_y), default (0, 0).
reverse reverse the winding of every subpath.
flatten replace Bézier/B-spline curves with polylines.
simplify Douglas-Peucker with tolerance factor (default 1.0).
round snap coordinates to the nearest multiple of factor
(factor=1.0 = integers, the default).
in_place=True with index writes the result back into the line (after
workspace.snapshot) and returns the new line text; otherwise no document
is touched and drawing holds the new path data.
Returns {source, doc_id, index, action, drawing, bbox, size, center, centre, changed, written} (centre duplicates center).
| Name | Required | Description | Default |
|---|---|---|---|
| dx | No | ||
| dy | No | ||
| axis | No | x | |
| text | No | ||
| index | No | ||
| action | No | translate | |
| doc_id | No | ||
| factor | No | ||
| in_place | No | ||
| origin_x | No | ||
| origin_y | No | ||
| angle_deg | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does well: it discloses that in_place=True writes back after a workspace.snapshot (an implicit undo checkpoint) and that otherwise no document is touched. It also explains the coordinate space and integer serialization of results. It stops short of stating auth/permission or rate-limit behavior, but for a local document tool that gap is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-sentence purpose, then uses a clean action-to-parameter mapping that is scannable despite the length. Length is justified by 12 actions and 12 parameters, though the return-shape sentence and the ``centre`` duplication note add some low-value bulk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with no annotations, the description covers the operation set, coordinate space, serialization, in-place write semantics, and even return fields (redundant with the output schema). The main missing piece is how the source drawing (``text``/``doc_id`` vs current selection) is supplied, which an agent still has to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 12 parameters, so the description must compensate, and it largely does by tying dx, dy, factor, origin_x/origin_y, axis, angle_deg, index, and in_place to concrete behaviors (e.g. factor default 1.0 for simplify/round, origin defaulting to bbox centre). It leaves ``text`` and ``doc_id`` unexplained, so the input-source mechanism for the drawing itself remains unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Transform a drawing') and then enumerates every supported operation (translate, scale, rotate, mirror, reverse, flatten, simplify, round, etc.), so an agent can determine exactly what the tool is capable of. The general-purpose transform role is distinguishable from narrower siblings like ass_scale_drawing or ass_drawing_bbox.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong per-action context by mapping each ``action`` value to the parameters it consumes, which tells the agent how to drive the tool. It does not, however, name alternatives or state when a sibling such as ass_scale_drawing or ass_set_drawing should be preferred, so routing between overlapping tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_undoB
Undo the last snapshot-backed change of a document.
Returns {"doc_id", "undone", "undo_depth", "redo_depth", "dirty"}.
undone is False when the undo stack is empty. Line indices are
0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does add useful behavior: it describes the return keys, the empty-stack edge case ('undone' is False), and a 0-based convention. It omits other relevant traits such as whether the undo requires the document to be the active one, what 'dirty' means, and whether the operation can fail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then the return contract, then the edge case in three tight sentences. The trailing note about 0-based line indices is irrelevant to an undo operation and is minor noise, but overall it is efficiently sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so restating the return keys is largely redundant, while the genuine gap — the semantics and default of doc_id — is left uncovered. For a mutation-style history operation with no annotations, the definition is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single parameter doc_id, and the description never explains it. The null default (presumably 'current document') is undocumented, so an agent cannot tell what omitting doc_id does, which is exactly the gap the description should fill.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Undo the last ... change of a document') and narrows scope with 'snapshot-backed', which distinguishes it from a generic history restore. It does not explicitly name the sibling ass_redo or contrast with ass_undo_history, so the sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The meaning of 'snapshot-backed' implies which changes qualify for undo, but there is no explicit when-to-use guidance, no mention of the ass_redo/ass_undo_history alternatives, and no statement of prerequisites (e.g. a document must be open). Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_undo_historyA
List the undo steps available for a document.
The workspace keeps raw document snapshots and no labels, so the entries are
positional: step 1 is the oldest available snapshot, the highest step is
what :func:ass_undo would restore next. Each entry carries a summary of
the snapshot (line count, first start time, line count difference from the
current state) so it is still possible to tell the steps apart.
Returns {"doc_id", "undo_depth", "redo_depth", "entries": [{"step", "label", "lines", "first_start"}...], "redo_entries": [...], "next_undo", "next_redo"}. Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it explains that snapshots are raw and unlabeled, that entries are positional from oldest to newest, what each entry summary contains (line count, first start time, line count difference), and that line indices are 0-based. It stops short of explicitly declaring the operation read-only or noting any permission needs, but 'List' implies a safe read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and structured logically into behavior then return shape. It is moderately sized and generally earns its place, though the explicit Returns block is partly redundant because an output schema already exists. No major waste beyond that duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter list tool with no annotations, the description covers the operational behavior (positional steps, summary fields, ordering) and even restates the return structure. The main missing piece is any semantic for the doc_id parameter, which leaves a small operational gap. Otherwise it is complete enough for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter doc_id has 0% schema description coverage, and the description never mentions it, leaving the agent with no explanation of what doc_id represents or what null/default means. The return payload references a 'doc_id' field but that does not clarify the input. The description fails to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the undo steps available for a document.' It distinguishes itself from the sibling ass_undo by explaining that the highest step is what ass_undo would restore next. An agent can tell this tool inspects history without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this tool is for inspecting undo history before taking action, but there is no explicit 'use this when' instruction or any exclusion versus ass_undo or ass_redo. The reference to ass_undo describes the data, not when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_update_lineA
Change individual fields of one line; only the fields you pass change.
index is 0-based. Times accept milliseconds or time strings.
comment=True turns the line into a Comment:, False back into a
Dialogue:. The call is snapshot-backed (:func:ass_undo reverts it).
Returns {"doc_id", "index", "changed": [field names], "line": <dict>}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| actor | No | ||
| index | Yes | ||
| layer | No | ||
| style | No | ||
| doc_id | No | ||
| effect | No | ||
| end_ms | No | ||
| comment | No | ||
| margin_l | No | ||
| margin_r | No | ||
| margin_v | No | ||
| start_ms | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does well: it discloses that unspecified fields are left unchanged, that the change is reversible via ass_undo, and the index encoding convention. It stops short of stating permission requirements, whether the document must be selected, or alternative time-format edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core partial-update semantics, then groups the remaining notes into short, scannable fragments. The return-shape sentence is somewhat redundant given an output schema exists, but it is compact and not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter mutation tool with no annotations, the description covers the critical surprises (partial update, 0-based index, format flexibility, undoability). An output schema exists so the return-value restatement is unnecessary, and the unresolved doc_id/context behavior leaves a minor gap overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 13 parameters, so the description must compensate. It adds meaning for index (0-based), start_ms/end_ms (milliseconds or time strings), and comment (Comment:/Dialogue: toggle), but leaves doc_id, layer, style, actor, effect, and the three margins entirely to the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Change individual fields of one line") and clarifies the partial-update semantics with "only the fields you pass change", which separates it in spirit from the plural sibling ass_update_lines. It never names that sibling explicitly, so an agent must infer the single-line vs multi-line distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage conditions: fields are optional and only supplied ones mutate, index is 0-based, comment=True/False toggles line type, and the operation is snapshot-backed so ass_undo reverts it. No explicit when-not-to-use or routing to ass_update_lines/direct alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_update_linesA
Change the same fields on every selected line.
Args:
selection: selection spelling (see module docstring); None = all.
doc_id: document to edit; the current one when omitted.
start_ms/end_ms/text/style/actor/effect/layer/comment/margin_l/margin_r/
margin_v: applied only to the lines you pass, as in
:func:ass_update_line.
pad_ms: widen every selected line by this many ms on both sides
(start -= pad_ms, end += pad_ms); negative values trim it.
clamp_to_avoid_overlap: after the edit, pull each selected line's times
back so it no longer overlaps an unselected line (best effort;
worst case a 10 ms line is left in the gap).
Returns {"doc_id", "changed": [<0-based indices>], "count", "clamped": [<0-based indices>], "fields": [field names], "lines": [<dict>, ...]}. Snapshot-backed. Line indices are 0-based.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| actor | No | ||
| layer | No | ||
| style | No | ||
| doc_id | No | ||
| effect | No | ||
| end_ms | No | ||
| pad_ms | No | ||
| comment | No | ||
| margin_l | No | ||
| margin_r | No | ||
| margin_v | No | ||
| start_ms | No | ||
| selection | Yes | ||
| clamp_to_avoid_overlap | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description carries the caveats itself: it explains pad_ms arithmetic (start -= pad_ms, end += pad_ms), that negative values trim, that clamping is best-effort with a stated 10 ms worst case, that the operation is snapshot-backed, and what the return contains. It does not state permission/undo implications, but the disclosed side effects (silent timing adjustment) are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then Args and Returns, which is appropriate for a 15-parameter tool. Prose is dense but every clause adds contract detail (padding math, clamp fallback); minor verbosity in the enum-style field listing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters, no annotations, and a stated output schema, the description covers selection defaults, mutation semantics, side effects, and return shape, so an agent can call it correctly. The only hand-off is deferring several field params to the ass_update_line docstring.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for 15 parameters, so the description must compensate, and it largely does: selection semantics (None = all), doc_id default (current document), pad_ms direction/negative behavior, and clamp_to_avoid_overlap behavior are all explained. The remaining field params (text/style/actor/margins/etc.) are only defined by reference to ass_update_line, leaving their individual meaning outside this description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource and scope: 'Change the same fields on every selected line.' It clearly distinguishes itself from the single-line sibling by the batch phrasing ('every selected line') and the required 'selection' parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the batch scope plus the cross-reference 'as in :func:`ass_update_line`' hints at when to prefer this over the single-line tool, but there is no explicit when/when-not guidance or named alternative rule. A reader must infer that ass_update_line is the single-line counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_update_styleA
Change only the fields that are given, on an existing style.
Field names may be written in any spelling: the snake_case parameters above,
the ASS column names (Fontname=, Fontsize=, PrimaryColour=,
MarginV= ...) or any case/space variant — all of them resolve to the
same canonical field. Passing new_name (or Name=) renames the
style and, when update_lines semantics apply, repoints the lines that
used it (this always happens, exactly like ass_rename_style).
Args:
name: the style to update (case-insensitive).
doc_id: document id or None for the current document.
aliases: any further field=value pairs, e.g. Fontsize=60.
Returns:
{"doc_id", "name", "previous_name", "changed", "style", "lines_updated", "ignored_fields"}. changed maps each field to
{"from", "to"} in stored form; ignored_fields lists values the
document's Format line cannot hold (for example ScaleX in a
[V4 Styles] file).
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | ||
| font | No | ||
| name | Yes | ||
| angle | No | ||
| doc_id | No | ||
| italic | No | ||
| shadow | No | ||
| aliases | Yes | ||
| outline | No | ||
| scale_x | No | ||
| scale_y | No | ||
| spacing | No | ||
| encoding | No | ||
| margin_l | No | ||
| margin_r | No | ||
| margin_v | No | ||
| new_name | No | ||
| alignment | No | ||
| font_size | No | ||
| underline | No | ||
| strike_out | No | ||
| alpha_level | No | ||
| back_colour | No | ||
| relative_to | No | ||
| border_style | No | ||
| outline_colour | No | ||
| primary_colour | No | ||
| tertiary_colour | No | ||
| secondary_colour | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the partial-update contract, the rename side effect that always repoints lines referencing the old name, the ignored_fields safeguard for values the document's Format line cannot hold, and that changed values are reported in stored form. It omits matters like permission requirements or undo semantics, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core semantic, then organized into alias rules and explicit Args/Returns sections. Length is justified by the 29-parameter surface and unusual alias system, though the Returns block partly duplicates the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 29 parameters, no annotations, and an output schema present, the description covers the mutation contract, rename side effects, alias handling, and failure/edge behavior (ignored_fields) well. It is nearly complete, but the absence of any value-format guidance for the many style fields leaves a gap for a tool this wide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 29 parameters, so the description must compensate and only partly does: it explains name (case-insensitive), doc_id (None = current document), aliases (field=value pairs), and new_name's rename semantics, plus the alias-resolution mechanism mapping snake_case/ASS column names to canonical fields. The remaining ~25 style fields (color formats, integer vs float expectations for bold/italic/scale values) are left undocumented, so a great deal still has to be inferred.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change only the fields that are given, on an existing style') and immediately establishes the partial-update semantics, which distinguishes it from a full style replacement. It also relates itself to ass_rename_style and, by implication, to ass_update_line, so an agent can separate it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use it to mutate an existing style, fields you omit are left alone, and renaming via new_name behaves 'exactly like ass_rename_style'. It stops short of explicitly routing the agent ('if you only want to rename, prefer ass_rename_style'), so it lacks a true when-not statement, but the operational context is solid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_validateA
Structural validation of the whole document.
Args:
doc_id: document id or None for the current document.
Returns:
{"doc_id", "ok", "counts", "issues"}. ok is True when no issue
has severity error. Every issue is
{"code", "severity", "kind", "index", "message"}; kind says what
index refers to:
``script_info`` index into the ``[Script Info]`` entries
``style`` index into ``doc.styles()``
``line`` 0-based line index in ``doc.events()`` order
``section`` index into ``doc.sections``
``document`` ``index`` is ``None``
Codes: ``duplicate_style_name`` (error), ``duplicate_script_info_key``
(warning), ``missing_script_type`` (warning), ``missing_style`` (error),
``end_before_start`` (error), ``zero_duration`` (warning),
``invalid_timestamp`` (error), ``comments_only_style`` (warning),
``unknown_section`` (warning), ``unknown_record`` (warning),
``malformed_line`` (warning), ``malformed_raw_line`` (warning) and
``field_count_mismatch`` (error).| Name | Required | Description | Default |
|---|---|---|---|
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses substantial behavioral detail: the meaning of 'ok', the structure of issues, the mapping of 'kind' to index types, and a comprehensive list of validation codes with their severities. It does not explicitly state that the operation is read-only or whether any side effects occur, but for a validation tool this is a strong effort.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured and front-loaded with purpose, followed by Args and Returns sections, then a detailed list of codes and kind mappings. Every section earns its place by providing semantic value, though it is more verbose than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description need not explain return values in depth, but it does so helpfully. It also fully covers the single parameter's meaning. The only notable gap is the absence of usage guidelines relative to sibling tools like ass_qc.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so by explaining that 'doc_id' is a document id or 'None' for the current document, adding clear semantic meaning beyond the bare anyOf string/null schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Structural validation of the whole document.' This clearly states what the tool does and is distinguishable from most siblings. However, it does not explicitly contrast with potentially overlapping tools like ass_qc, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the tool's purpose but provides no guidance on when to use it versus alternatives such as ass_qc or ass_check_overlaps. It does not mention prerequisites, exclusions, or typical contexts for invoking validation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_wrap_rangeA
Wrap a character range in an override block, restoring the outer state.
Args:
index / text / doc_id: the line to edit (0-based index of doc_id or a
raw string).
start: range start. A plain index when scope="plain" (the
default), a raw index when scope="raw".
end: range end, exclusive. Same index system as start; None
means "to the end of the line" (the visible end / the raw end).
override: the tags to apply, with or without the surrounding braces and
with or without the leading backslash (r"\fscx200",
"fscx200" and r"{\fscx200}" are all accepted). Braces and
line breaks inside the payload are rejected.
doc_id: document holding index.
scope: "plain" (default) counts only visible characters — override
blocks and the \N/\n line-break escapes are not counted, so
the same start/end cover the same glyphs no matter how many
tags precede them. "raw" counts every stored code point
including braces, which is what you want when you already have
offsets into the stored Text field. A raw boundary that would
land inside an override block is refused with a ToolError
instead of silently splitting the block.
in_place: write back to the document (snapshot-backed). The raw-string
mode never writes.
The tags that were in effect before start are re-emitted after end
when they changed inside the range, so the override applies to exactly the
requested characters. warnings reports tags that had no previous value
to restore (there is nothing to restore for e.g. \an).
Returns {"source", "index", "doc_id", "scope", "start", "end", "raw_start", "raw_end", "plain_start", "plain_end", "override", "text", "plain_text", "changed", "written", "warnings"}. start/end are
echoed in the requested index system; plain_start/plain_end are always
plain (visible character) indices and raw_start/raw_end are always
raw offsets into the stored line, so the two systems stay comparable no
matter which one was passed in.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | ||
| text | No | ||
| index | No | ||
| scope | No | plain | |
| start | No | ||
| doc_id | No | ||
| in_place | No | ||
| override | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses that pre-existing tags are re-emitted after end, that warnings lists tags with no restorable prior value (e.g. \an), that raw boundaries inside a block raise a ToolError rather than splitting silently, and that in_place writes to a snapshot-backed document while raw-string mode never writes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-line purpose, then organized into an Args block and a returns paragraph, so it is easy to scan. It is longer than strictly necessary and repeats some scope detail, but for an 8-parameter tool with zero schema descriptions the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a complex 8-param tool, 0% schema coverage and an output schema, the description is complete: it documents inputs, the return field set (and explains the dual plain/raw index echoes), and side-effect behavior. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: every parameter is explained, including the index/text/doc_id polymorphism, end exclusivity and None meaning end-of-line, the flexible override payload format with its brace/newline restrictions, and the exact semantics of scope.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: wrapping a character range in an override block while restoring the outer state. That is precise and distinguishes it from generic mutation tools. It does not, however, name which of the many nearby tag siblings (ass_apply_tag_to_block, ass_set_tag, ass_insert_tag_at) it should be preferred over.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is strong conditional guidance on choosing scope="plain" vs "raw" (visible-char counting vs stored offsets, and the refusal when a raw boundary splits a block). But there is no explicit when-to-use statement relative to the sibling tag-manipulation tools, so tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ass_write_timecodesA
Write an Aegisub timecodes file (v1 or v2) into workspace.output_dir.
Args:
path: destination. Relative names land inside workspace.output_dir;
an absolute path is honoured as given. Defaults to
<script name>.timecodes.
fps: frame rate. Resolution order: this argument, the default rate of a
loaded timecodes file, workspace video/script info, the document's
FPS; a ToolError explains what is missing.
v2: True (default) writes a v2 file (one timestamp per frame), False
writes v1 (default rate plus overrides).
doc_id: document id.
Returns:
{"path", "version", "fps", "fps_source", "frame_count", "lines", "bytes", "preview": [first lines], "used_timecodes"}
| Name | Required | Description | Default |
|---|---|---|---|
| v2 | No | ||
| fps | No | ||
| path | No | ||
| doc_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description nonetheless discloses real behavior: output lands in workspace.output_dir, relative vs absolute path handling, the default filename, the fps fallback chain ending in a ToolError, and the meaning of the v2 flag. It omits overwrite/permission semantics and any side effects on the document, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in a single sentence, followed by cleanly structured Args/Returns sections where each line adds value. The Returns block mildly duplicates the existing output schema, a small redundancy in an otherwise tight layout.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter write tool with no annotations, the description covers destination, defaults, fps resolution and format selection, and an output schema exists so return values need no elaboration. Missing overwrite behavior and any note on document side effects keep it just short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry all parameter meaning, and it largely does: path resolution rules plus default, fps resolution order, v2 default and format meaning. Only doc_id is left as a bare label ("document id"), preventing a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — writing an Aegisub timecodes file — with the v1/v2 variant spelled out. It is easy to distinguish from the read-side sibling ass_read_timecodes, though the description never names or differentiates itself from siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance and no reference to alternative tools such as ass_read_timecodes or ass_snap_to_frames. The fps resolution order and error note are operational detail rather than usage direction, so an agent gets no help choosing this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
121 tool updates
v0.1.0- First observed
ass_add_attachment - First observed
ass_add_line - First observed
ass_add_lines - First observed
ass_add_style - First observed
ass_add_typesetting - First observed
ass_align_lines_to_silence - First observed
ass_align_to_silence - First observed
ass_apply_tag_to_block - First observed
ass_check_font_substitution - First observed
ass_check_overlaps - First observed
ass_close - First observed
ass_convert_clip_scale - First observed
ass_convert_tags - First observed
ass_copy_style - First observed
ass_cps - First observed
ass_delete_lines - First observed
ass_document_info - First observed
ass_drawing_bbox - First observed
ass_drawing_info - First observed
ass_drawing_to_svg - First observed
ass_duplicate_lines - First observed
ass_export_text - First observed
ass_extract_attachment - First observed
ass_find_replace - First observed
ass_fix_timing - First observed
ass_font_coverage - First observed
ass_fonts_used - First observed
ass_fonts_with_char - First observed
ass_frame_from_ms - First observed
ass_frame_from_timecodes - First observed
ass_get_clips - First observed
ass_get_drawing - First observed
ass_get_line - First observed
ass_get_script_info - First observed
ass_get_selection - First observed
ass_get_style - First observed
ass_glyph_check - First observed
ass_import_srt - First observed
ass_insert_tag_at - First observed
ass_join_drawings - First observed
ass_karaoke_auto_timings - First observed
ass_karaoke_export - First observed
ass_karaoke_generate - First observed
ass_karaoke_get - First observed
ass_karaoke_remove - First observed
ass_karaoke_retime - First observed
ass_karaoke_scale - First observed
ass_karaoke_set_kind - First observed
ass_karaoke_set_timings - First observed
ass_karaoke_shift - First observed
ass_karaoke_split - First observed
ass_karaoke_styles - First observed
ass_karaoke_tags_only - First observed
ass_karaoke_template - First observed
ass_list_attachments - First observed
ass_list_documents - First observed
ass_list_extradata - First observed
ass_list_fonts - First observed
ass_list_lines - First observed
ass_list_styles - First observed
ass_load_keyframes - First observed
ass_match_font - First observed
ass_merge_lines - First observed
ass_move_lines - First observed
ass_ms_from_frame - First observed
ass_ms_from_timecodes - First observed
ass_new_document - First observed
ass_open - First observed
ass_parse_text - First observed
ass_plain_text - First observed
ass_qc - First observed
ass_read_timecodes - First observed
ass_reading_speed - First observed
ass_redo - First observed
ass_remove_attachment - First observed
ass_remove_clip - First observed
ass_remove_script_info - First observed
ass_remove_style - First observed
ass_remove_tag - First observed
ass_rename_style - First observed
ass_reorder_styles - First observed
ass_save - First observed
ass_save_all - First observed
ass_scale_drawing - First observed
ass_scale_times - First observed
ass_select - First observed
ass_select_document - First observed
ass_set_clip - First observed
ass_set_comment - First observed
ass_set_drawing - First observed
ass_set_durations - First observed
ass_set_extradata - First observed
ass_set_play_res - First observed
ass_set_scaled_border_and_shadow - First observed
ass_set_script_info - First observed
ass_set_tag - First observed
ass_set_times - First observed
ass_set_timing_info - First observed
ass_set_wrap_style - First observed
ass_shift_times - First observed
ass_snap_to_frames - First observed
ass_snap_to_keyframes - First observed
ass_sort_lines - First observed
ass_split_drawing - First observed
ass_split_line - First observed
ass_stats - First observed
ass_strip_tags - First observed
ass_style_for_line - First observed
ass_style_usage - First observed
ass_svg_to_drawing - First observed
ass_swap_an_pos - First observed
ass_tag_summary - First observed
ass_transform_drawing - First observed
ass_undo - First observed
ass_undo_history - First observed
ass_update_line - First observed
ass_update_lines - First observed
ass_update_style - First observed
ass_validate - First observed
ass_wrap_range - First observed
ass_write_timecodes
TDQS
Scored across 121 tools
With 121 tools, many cover overlapping inspection or editing tasks: get_drawing/drawing_info/drawing_bbox all inspect drawings, align_to_silence and align_lines_to_silence are near-duplicates, and multiple tagging tools (set_tag, apply_tag_to_block, add_typesetting, insert_tag_at) operate on the same line text. Detailed descriptions help, but the set still requires an agent to remember subtle scope distinctions.
Every tool is snake_case and prefixed with ass_, and most follow a verb_noun pattern (ass_list_lines, ass_add_style, ass_remove_tag). Minor deviations are noun-only tools like ass_cps, ass_stats, ass_qc, ass_document_info, and compound forms such as ass_ms_from_frame, but they are rare and readable.
121 tools is an extreme mismatch for a single MCP server; even a broad subtitle-editing domain does not justify this many separate entry points. The surface is far past the recommended 3–15 range and overwhelms tool selection.
The tool set covers the domain exhaustively: document lifecycle, line CRUD and bulk edits, style CRUD, Script Info, attachments, extradata, validation, timing/retiming, karaoke, typesetting tags, drawings, clips, fonts, and QC/export/import. No obvious CRUD or lifecycle gaps remain.
Related MCP Connectors
MCP server for the FFmpeg Micro video transcoding API — create, monitor, download transcodes.
Hosted MCP tools for FFmpeg-style video and audio processing through FFMPEG API.
MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.
Document-to-Markdown MCP server — convert PDF, Office and HTML into LLM-ready Markdown.
Related MCP Servers
- AlicenseAqualityAmaintenanceAn MCP server (stdio + HTTP/SSE) that fetches video transcripts/subtitles via yt-dlp, with pagination for large responses. Supports YouTube, Twitter/X, Instagram, TikTok, Twitch, Vimeo, Facebook, Bilibili, VK, Dailymotion. Whisper fallback — transcribes audio when subtitles are unavailable (local or OpenAI API). Works with Cursor and other MCP host821MIT
- AlicenseNot gradedqualityDmaintenanceStdio MCP server for sandboxed file access — read files, search content, safely edit with checksums, and manage file structure.4 npmISC
- FlicenseNot gradedqualityCmaintenanceMCP server for whisper-based transcription and translation, supporting local stdio and remote HTTP transports with file workflow safety.-
- AlicenseAqualityCmaintenanceAn MCP server that assembles CapCut International projects by reading and writing local project files, adding captions, subtitles, overlays, and more so editors start with a mostly-done timeline. It includes tools for inspecting projects, restyling captions, importing subtitles, and rendering alpha-channel overlays via Remotion.81MIT