AnkusDrive
Drives FreeCAD through its Python API, providing CLI and MCP tools to create documents, build sketches, extrude solids, mesh parts, run FEM simulations (CalculiX/Elmer), read back stress/displacement fields, and manage design-control workflows.
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., "@AnkusDrivedesign a 40x30x10mm mounting bracket and run a static FEM check"
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.
AnkusDrive
A CLI + MCP server that drives FreeCAD through its Python API so LLMs (and humans at a terminal) can design mechanical parts and run FEM simulations without clicking through the GUI.
Why
FreeCAD exposes almost everything it does through a Python API — create documents, build sketches, extrude solids, mesh them, run CalculiX/Elmer FEM solves, read back stress/displacement fields. But that API lives inside FreeCAD's embedded Python (freecadcmd), which is awkward to call from anywhere else. AnkusDrive wraps it behind two surfaces:
CLI — one-shot commands (
ankusdrive run script.py,ankusdrive box --w 10 --d 20 --h 5 -o part.FCStd) for scripts, CI, and quick iteration.MCP server — 280+ structured tools (
new_document,add_primitive,boolean_op,pad,add_gear,fem_new_analysis,fem_run,fem_results) so an LLM agent can model, inspect, and simulate iteratively. Beyond core CAD/FEM this now spans a broad simulation surface (thermal, CFD/CHT, EM, acoustics, FSI, injection molding, granular/DEM, optics, multibody) and a design-control layer (item/part numbers, recipes, variant families, lifecycle/revision, ECO change orders, versioned interfaces).Multi-agent orchestration — a host-side reference layer that lets a team of agents partition one product into components, build them in parallel, and merge the pieces back together with the joints actually fitting (see Multi-agent design).
Related MCP server: FreeCAD MCP
Target environment
FreeCAD 1.1.x. The
freecadcmdbinary is auto-discovered per-OS (macOS.appbundle, Linux/usr/binetc., WindowsC:\Program Files\FreeCAD 1.1\bin\freecadcmd.exe— version-globbed); override via$ANKUSDRIVE_FREECADCMDor rely on PATH. Runankusdrive doctorto see exactly what resolved.Bundled Python,
ccx(CalculiX), andgmshalready ship inside every FreeCAD install — the macOS.app, the Linux package, and the Windowsbin\— so core CAD + structural FEM work on all three with no extra install.Host-side rendering needs
Pillowandnumpy; both are installed by AnkusDrive as regular pip deps.One optional exception: drawing PDF/SVG export (
export_drawing) renders inside FreeCAD's bundled Python, so it needsreportlab+svglibinstalled there — see Drawing export (PDF/SVG). DXF export and everything else leave FreeCAD's Python untouched.
Setup
AnkusDrive is a pip-installable package; FreeCAD itself is the only thing you
install separately. The host-side dependencies (mcp, Pillow, numpy) come
along with the install. freecadcmd is launched as a subprocess and uses its
own bundled Python — AnkusDrive doesn't touch it.
# 1. Install FreeCAD 1.1.x from https://www.freecad.org/
# (macOS: drag to /Applications; Linux: distro package or AppImage;
# Windows: run the installer — default C:\Program Files\FreeCAD 1.1)
# 2. Install AnkusDrive. Pick one:
pipx install ankusdrive # from PyPI — isolated app, `ankusdrive` on PATH
pip install ankusdrive # or into an env you manage yourself
# unreleased main, or for development from a clone:
pipx install git+https://github.com/gchen19/AnkusDrive.git
git clone https://github.com/gchen19/AnkusDrive.git && cd AnkusDrive
python3 -m venv .venv && .venv/bin/pip install -e . # `.venv/bin/ankusdrive`
# 3. Smoke-test that the worker can reach FreeCAD, and see the full setup report
ankusdrive ping # → ping=pong freecad=1.1.1
ankusdrive doctor # per-item FreeCAD + solver checklist with the exact fix eachOn Windows, don't follow the block above by hand — there is one scripted path that does all of it including the MCP registration: Windows quickstart (PowerShell).
AnkusDrive is published on PyPI at
pypi.org/project/ankusdrive; the
distribution roadmap beyond it (marketplace listings, hosted transport) is
tracked in epic #303; the
original phase plan is kept as a design record at
docs/archive/PUBLISHING_PLAN.md.
Windows quickstart (PowerShell)
Windows is a first-class target (core CAD + CalculiX FEM run natively against a stock
FreeCAD 1.1 install), and the whole core install is one script — venv, pinned
dependencies, doctor, and the MCP registration line with resolved absolute paths:
# 1. Install FreeCAD 1.1.x from https://www.freecad.org/ (default C:\Program Files\FreeCAD 1.1).
# Nothing needs to go on PATH — AnkusDrive globs the versioned install dir itself.
# 2. Clone and run the core installer. Windows PowerShell 5.1 is enough; no admin needed.
git clone https://github.com/gchen19/AnkusDrive.git
cd AnkusDrive
powershell -ExecutionPolicy Bypass -File scripts\install-core.ps1That creates .venv, installs AnkusDrive with the pins that matter (notably mcp<2 —
mcp 2.x installs cleanly and then breaks ankusdrive mcp), verifies the resolved
mcp/numpy/Pillow, runs ankusdrive doctor + ankusdrive ping, completes a real MCP
stdio handshake, and finally prints your registration block. Useful switches:
-Python 'C:\Program Files\Python313\python.exe' to pick an interpreter,
-Extras mbd,fluids for the pip-wheel solver families, -Persist to write the FreeCAD
path into %APPDATA%\ankusdrive\config.toml (MCP hosts launch with a minimal
environment, so a $env: set in your terminal will not reach them).
3. Register it with your MCP host. The script prints these with your real paths
filled in — a GUI host doesn't inherit your shell PATH, so the absolute path matters:
# Claude Code
claude mcp add ankusdrive -- C:\Users\you\AnkusDrive\.venv\Scripts\ankusdrive.exe mcp
# Claude Desktop: %APPDATA%\Claude\claude_desktop_config.json
# { "mcpServers": { "ankusdrive": {
# "command": "C:\\Users\\you\\AnkusDrive\\.venv\\Scripts\\ankusdrive.exe",
# "args": ["mcp"] } } }Then restart the host; you should see the ankusdrive__* tools appear.
Supported Python: 3.10 – 3.14 (3.14 verified end-to-end on Windows 11 —
pip install, MCP stdio handshake, and ankusdrive ping → freecad=1.1.1). The script
checks your interpreter before pip runs, so a too-new CPython says so instead of
failing inside the resolver.
Optional solvers (SU2, Elmer, PrusaSlicer, WSL-backed OpenFOAM) come afterwards via
scripts\install-solvers.ps1. Full per-solver reality, the test suite, and the WSL2
route: docs/WINDOWS.md.
Ubuntu 24.04+ / containers (apt has no FreeCAD)
FreeCAD was dropped from Ubuntu 24.04's universe repo, so apt install freecad finds no candidate there, and upstream's snap/flatpak both fail in a
container or sandboxed agent environment (no snapd session, no FUSE). The path
that works everywhere is the official AppImage, extracted:
scripts/install-freecad-appimage.sh # or: scripts/install-solvers.sh freecadIt downloads the pinned release AppImage, checks its SHA-256, unpacks it with
--appimage-extract (a userspace squashfs unpack — no FUSE, no root, no
snapd, which is why it works in a container), symlinks freecadcmd, freecad,
ccx and gmsh into /usr/local/bin, and then live-verifies the result with
ankusdrive ping plus a real CalculiX solve (ankusdrive fem cantilever). Without a
writable /opt it installs to ~/.local/opt/freecad instead; --prefix /
--bindir override both, --appimage FILE reuses a download you already have.
The symlink step is optional: AnkusDrive also probes
/opt/freecad/squashfs-root/usr/bin (and ~/.local/opt/freecad*/…) directly, so
a hand-extracted AppImage in either prefix is auto-discovered. ccx and gmsh
ride along inside the AppImage, so structural FEM works off this one download.
Telling AnkusDrive where FreeCAD lives
AnkusDrive auto-discovers freecadcmd in this order: $ANKUSDRIVE_FREECADCMD,
then shutil.which(...) on PATH (trying freecadcmd, FreeCADCmd, and
freecad.cmd), then a per-OS list of standard install locations:
OS | Auto-discovered locations (newest version wins) |
macOS |
|
Linux |
|
Windows |
|
So a stock installer on any of the three needs no configuration. For a non-default install, point AnkusDrive at the binary directly:
export ANKUSDRIVE_FREECADCMD=/path/to/freecadcmd # macOS/Linux$env:ANKUSDRIVE_FREECADCMD = "D:\Apps\FreeCAD\bin\freecadcmd.exe" # Windowsankusdrive doctor prints which of the three layers (env / PATH / auto) actually
resolved FreeCAD, plus every candidate it checked — the fastest way to debug a
"FreeCAD not found" on a new box.
Drawing export (PDF/SVG)
export_drawing builds 2-D mechanical drawings (multi-view PDF/SVG/DXF with
dimensions) entirely headless. DXF uses FreeCAD's own writer and needs
nothing extra. PDF and SVG are composed and rasterised with reportlab +
svglib, and because that runs inside the worker — FreeCAD's bundled Python,
not the host venv — the two packages must be installed into FreeCAD's Python:
# Resolve FreeCAD's bundled Python from freecadcmd itself (portable across the
# macOS .app, a Linux distro package, and an extracted AppImage). freecadcmd
# prints a startup banner after the script output, so match a marker line
# rather than taking the last line:
printf 'import sys; print("DPREFIX="+sys.prefix)\n' > /tmp/_fcprefix.py
FREECAD_PREFIX="$(freecadcmd /tmp/_fcprefix.py 2>/dev/null | sed -n 's/^DPREFIX=//p')"
FREECAD_PY="$FREECAD_PREFIX/bin/python" # some builds: $FREECAD_PREFIX/bin/python3
# Pin svglib<1.6 — newer svglib pulls rlPyCairo -> pycairo, a native build we
# don't use (our drawings are line art, no gradients).
"$FREECAD_PY" -m pip install reportlab "svglib<1.6"
# Verify:
"$FREECAD_PY" -c "import reportlab, svglib; print('drawing export ready')"Without this, export_drawing still produces .dxf; .pdf/.svg raise a clear
ModuleNotFoundError. FreeCAD already bundles Pillow (reportlab needs it), so
no separate install is required.
Wiring it into an MCP host
The MCP server speaks stdio. Point your host at the ankusdrive binary and
let it run the mcp subcommand.
Claude Desktop — add to ~/Library/Application Support/Claude/claude_desktop_config.json
(macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"ankusdrive": {
"command": "ankusdrive",
"args": ["mcp"]
}
}
}If ankusdrive isn't on the host process's PATH, use an absolute path —
e.g. /Users/<you>/.local/bin/ankusdrive (pipx default) or
/absolute/path/to/AnkusDrive/.venv/bin/ankusdrive (clone+venv).
Claude Desktop, one click — download ankusdrive-<version>.mcpb from the
latest release and open it.
Claude Desktop sets up its Python environment with uv, so no pipx step is needed
— FreeCAD 1.1 still is. The install dialog has one optional field, the FreeCAD
command path, for a FreeCAD that auto-discovery cannot find.
Claude Code — register once:
claude mcp add ankusdrive -- ankusdrive mcpOther hosts (Cursor, Continue, custom MCP clients) — same shape: stdio
transport, command = ankusdrive, args = ["mcp"].
After restarting the host, you should see 280+ ankusdrive__* tools become
available. If startup hangs or the host reports a closed connection, run
ankusdrive ping directly — that exercises the same worker boot path with
cleaner error messages.
Simulation solvers & review-video demos
The base install (FreeCAD + pip install ankusdrive) covers geometry, the analytic
oracles, and the MCP surface. The heavy simulation families each shell out to an
external solver, discovered at runtime by ankusdrive/solvers.py
($ANKUSDRIVE_<SOLVER>_PATH → PATH → standard install dirs). A family whose solver is
absent degrades to a clean {ok: false, reason, install} dict instead of crashing — check
what currently resolves with ankusdrive doctor (cross-platform, no server boot needed),
the solve_capabilities MCP tool, or the install script's list. The install script
installs the pip-wheel solvers and provisions the native ones —
scripts/install-solvers.sh on Linux/macOS (apt/conda + source builds), and
scripts/install-solvers.ps1 on Windows (pip extras +
portable SU2/Elmer/PrusaSlicer downloads; CalculiX auto-detected from FreeCAD's bundle).
Persistent config: every ANKUSDRIVE_* path can instead live in
~/.config/ankusdrive/config.toml (%APPDATA%\ankusdrive\config.toml on Windows;
ANKUSDRIVE_CONFIG overrides): freecadcmd = "..." at top level, one lowercased key per
solver var under [solvers] (su2_path, elmer_path, openfoam_bashrc, ...). Env vars
still win when set; the file is the layer that survives an MCP host's minimal launch
environment. ankusdrive doctor reports the file and which layer resolved each value.
Platform note: the solver discovery layer is fully cross-platform (per-OS install
dirs, Windows PATHEXT/.exe, env overrides), so ankusdrive doctor gives an honest report
on macOS/Linux/Windows. The pip-wheel families (MBD, topology, optics, fluids) install
identically everywhere. The native-binary families differ by OS — CalculiX ships inside
every FreeCAD install; SU2 and PrusaSlicer have good Windows/macOS binaries; Elmer has a
portable Windows zip but no macOS binaries; the
OpenFOAM-backed families (CFD, FSI, injection molding) still rely on a Linux shell +
linker glue and are Linux/WSL/Docker for now. See
docs/WINDOWS.md and docs/MACOS.md for the full
per-solver reality and setup on each OS.
The review-video demos under scratch/ turn a solver result into a GIF a human
can watch — the real exported geometry in motion with the matching oracle overlaid on
the frame (written to artifacts/). Each needs its family's solver plus matplotlib, and
the CFD one needs meshio (on top of the base numpy/Pillow):
pip install matplotlib meshio # frame rendering + reading OpenFOAM's VTK outputReview-video demo ( | Solver it drives | Install |
| PyBullet (pip wheel) |
|
| PyBullet (pip wheel) |
|
| CalculiX |
|
| Elmer |
|
| OpenFOAM + | OpenFOAM via apt/conda, then |
All of them also use FreeCAD for the geometry/meshing, so run each with the same
interpreter that launches the worker — e.g. .venv/bin/python3 scratch/cfd_field_video.py.
Optics
Two optics engines sit behind the MCP surface, in two licensing/runtime lanes:
Lane | Tools | Engine | Install |
Sequential — lens design + optimization |
| optiland / rayoptics (MIT/BSD, in-process) |
|
Non-sequential — tracing through STL solids |
| KrakenOS (GPL-3.0, out-of-process only) |
|
The sequential engines import in-process, so install the optics extra into the same
interpreter that launches the worker (like the other wheels). The non-sequential engine
is GPL-3.0 and is therefore never imported by AnkusDrive — it runs in a separate
subprocess (ankusdrive/optics_gpl_runner.py), the same
arm's-length boundary used for the GPL Elmer/OpenFOAM binaries. The worker locates a
Python that can import KrakenOS automatically (from where the wheel is installed); override
with ANKUSDRIVE_OPTICS_GPL_PYTHON=/path/to/python. Because of that isolation the GPL extra
is opt-in: the no-argument install-solvers.sh run installs only the permissive
extras and prints how to add optics_gpl. Rendered examples for both lanes (lens layout,
spot diagram, optimization, prism TIR, and a ball-lens spherical-aberration study) live in
examples/optics_gallery/ — regenerate with
.venv/bin/python examples/optics_gallery.py (and …_3d.py, optics_ball_lens.py), or
bootstrap everything in one shot (installs both lanes, then renders every figure):
scripts/install-solvers.sh --optics-galleryArchitecture sketch
┌────────────┐ ┌────────────┐ ┌──────────────────────┐
│ MCP host │ ───► │ AnkusDrive │ ───► │ freecadcmd worker │
│ (Claude) │ │ (Python) │ IPC │ (long-lived Python) │
└────────────┘ └────────────┘ └──────────────────────┘
▲ ▲ │
│ │ ▼
└── CLI user ────────┘ .FCStd / .inp / .vtkKey decision: long-lived worker with JSON-over-stdin/stdout, not subprocess-per-call. FreeCAD startup is ~1–2s; re-paying that per tool call is unacceptable for an interactive agent. The worker is a small Python loop launched under freecadcmd, reading commands, dispatching to handlers, returning structured results (including object IDs so follow-up calls can reference created geometry).
FreeCAD API surface we care about
Notes gathered from the scripting docs and the FEM Python tutorial:
Core (App):
App.newDocument(name)/App.ActiveDocument/doc.recompute()/doc.save(path)doc.addObject("Part::Box", "name")— typed object creation; properties set after (box.Height = 5)doc.supportedTypes()for introspection;obj.TypeId,obj.isDerivedFrom("Part::Feature")
Modeling:
Part—makeBox,makeCylinder,makeSphere, booleancut/common/fuse, fillets, lofts (OpenCASCADE under the hood)Draft— 2D primitives,move, arraysSketcher+PartDesign— parametric sketch-driven solids (most "real" mechanical design happens here)FreeCAD.Vector,Placementfor positioning
FEM (ObjectsFem + femtools):
ObjectsFem.makeAnalysis(doc, "Analysis")— containermakeSolverCalculixCcxTools/makeSolverElmer— solver objects with tunables (GeometricalNonlinearity,ThermoMechSteadyState, …)makeMaterialSolid— assignYoungsModulus,PoissonRatio,DensityConstraints:
makeConstraintFixed,makeConstraintForce,makeConstraintPressure,makeConstraintDisplacement, contact/tie/spring, thermalMesh:
makeMeshGmsh+femmesh.gmshtools.GmshTools(...).create_mesh()(or Netgen)Run:
femtools.ccxtools.FemToolsCcx().run()Results: iterate
analysis.GroupforFem::FemResultObject; read.DisplacementVectors, stress fields
Headless invocation:
freecadcmd script.py— runs script then exitsfreecadcmdwith no args — interactive Python REPL (what the worker will drive)--console,-M <moddir>,-P <pypath>,--pass <args>,FreeCAD.ConfigGet(...)for env infoFreeCADGuiis not available headless — keep design logic inApp/Part/Femonly
How an agent reaches FreeCAD: three layers
AnkusDrive exposes FreeCAD through three layers, each with a different audience and a different cost-of-use. Knowing which layer a feature lives in tells you how to invoke it.
Layer 1 — typed MCP tools (the agent surface)
280+ first-class MCP tools span the core mechanical-design surface, a broad engineering-analysis / simulation surface, and a design-control (PLM) layer. They have validated parameters, structured returns, and stable handles for chaining. This is the happy path — what an agent uses for things people do every day.
Domain | What's covered |
Document lifecycle |
|
Geometry primitives |
|
Selection (stable refs) |
|
PartDesign |
|
Direct modeling & feature ops |
|
Parametric components |
|
Metrology & inspection |
|
Generic property access |
|
Functional intent & invariants |
|
Performance contracts |
|
Design-space studies (DOE) |
|
Optimize to a spec |
|
Assembly & interfaces |
|
Drawings (TechDraw, headless) |
|
Inspection (first-article) |
|
Release packages (vendor / RFQ) |
|
Off-the-shelf parts (buyability) |
|
Visual feedback |
|
FEM (FreeCAD/CalculiX/Elmer) |
|
Engineering oracles & hand-calcs | machine elements ( |
Simulation families (external solvers, async) | screens + full solves that shell out to OpenFOAM/Elmer/CalculiX/openEMS/YADE/KrakenOS, most via a submit→poll job pattern: thermal/CHT ( |
Async jobs |
|
Materials & fluids |
|
Sheet metal |
|
Manufacturing & Design-for-X |
|
CNC (machinability + machining time) |
|
Tolerance ↔ cost |
|
Design control / PLM | items & part numbers ( |
Operations |
|
All tools return JSON; geometry-creating tools return a handle (e.g.
pad_1) that subsequent calls reference. The heavy simulation families return
a {ok: false, reason, install} dict (rather than crashing) when their solver
isn't installed — see Simulation solvers.
Layer 2 — generic property reflection
For the long tail of "I just need to tweak this one property" without a dedicated tool:
get_object(handle)— dump every entry inobj.PropertiesListwith Quantities → float (mm/deg), Vectors → list, Placements → dict.set_property(handle, name, value)— set any single property by name.
Use this when a typed tool exists for the object kind but doesn't expose the
exact property you need (e.g. Refine on a Pad, Sections ordering on a
Loft, internal tunables on a CCX solver).
Layer 3 — run_script (the universal escape hatch)
For features that have no first-class MCP tool at all — e.g. Path workbench (CAM toolpaths), Surface workbench, Arch/BIM, Spreadsheet, TechDraw dimensions, contact/spring FEM constraints, B-spline sketcher operations, expression-engine bindings, anything in a workbench AnkusDrive doesn't wrap.
run_script(code='''
import Path
job = Path.Job.Create("Job", [_resolve("pad_1")])
__result__ = {"job_name": job.Name}
''')Inside the script, the worker pre-injects: App / FreeCAD, Part,
ObjectsFem, plus _register(prefix, obj) / _resolve(handle) /
_handles so scripts can register new objects into the same handle
registry that typed tools use. Set __result__ = ... to a JSON-serializable
value to return data; print statements go to /dev/null.
The escape hatch costs more (the agent has to write FreeCAD Python) but makes the entire FreeCAD API reachable. The Phase 2 plan's "After Phase 2" section calls out which run_script patterns deserve promotion to typed tools — that's how the surface grows over time.
What the CLI is (and isn't)
The CLI is not the agent surface — it's a human-debugging + transport tool. Seven subcommands:
Command | Purpose |
| Health check — boot a worker, prove FreeCAD is reachable |
| Single-shot primitive → .FCStd (manual smoke tests) |
| Headless format conversion |
| Execute arbitrary FreeCAD Python in a live worker (set |
| Start the MCP server over stdio — this is how an MCP host launches AnkusDrive |
| Run the built-in canned demo |
Agents do not invoke the CLI. They speak MCP via stdio after the host has
launched ankusdrive mcp. The CLI's job is (a) to start that server and
(b) to give a human a way to poke at the worker without writing an MCP
client.
Decision rule
Need | Use |
Standard CAD/FEM operation | First-class MCP tool (Layer 1) |
Tool exists but I need property X |
|
Workbench / API not wrapped at all |
|
Smoke test from a shell, or stand up MCP | CLI |
Multi-agent design
The roadmap above is about deepening what one agent can do. The
orchestration/ layer is about many agents sharing the
work: split a product into components and subassemblies, build those in
parallel (each agent cold, seeing only its own contract slice), then merge the
whole back up with the joints actually fitting. The design is written up in
docs/MULTI_AGENT.md; it targets partition + merge,
not shared co-editing of one live document (a single worker = one
App.ActiveDocument, so concurrent mutation is a non-goal for now).
Concurrent agents on one MCP server — workspaces. FastMCP runs sync tools in
a thread pool, so a host can have several tool calls in flight at once. The
server keeps a pool of named workspaces, each its own freecadcmd process
with its own App.ActiveDocument and handle registry. Each concurrent agent
claims its own workspace with use_workspace(name) at the start of its session;
handles and documents do not cross workspaces. A client that never calls
use_workspace sees the historical single-worker behavior byte-for-byte
(everything routes to the default workspace). Worker.call() is internally
serialized so two threads can never interleave the stdin/stdout protocol on one
process. The pool is capped (ANKUSDRIVE_MAX_WORKSPACES, default 4) and idle
workspaces are reaped (ANKUSDRIVE_WORKSPACE_IDLE_S, default 900s) so abandoned
sessions don't leak processes; list_workspaces / close_workspace manage it.
The split of responsibilities is deliberate:
AnkusDrive ships the thin, tool-agnostic primitives that make a merge verifiable —
publish_interface(declare a component's mating frames),merge_assembly(combine component files into one assembly), and the gates that decide whether a merge is sound:interface_align_check(do published frames line up?),interference_check(do solids collide?),envelope_check(does it fit its bounding budget?), plus anassembly_lock/assembly_lock_checkcontract lockfile. These are real MCP tools usable by any host.orchestration/is the host-side reference coordinator — explicitly not part of theankusdrivepackage. Given a free-text brief itdecomposes it into a validated manifest, fans out one builder agent per component,merge_assemblys them, reads the gates, and on failure renegotiates — re-dispatching only the components implicated by the failing gate — up to a round budget. It runs against a real Anthropic client or a scripted stub (ScriptedClient) for free dry runs; the merge and gates are real worker calls either way. Any host (Claude, another tool, a human) can use it, replace it, or ignore it — the only contract that matters is the manifest + the component files on disk.
How well partition+merge holds up is measured by a dedicated eval ladder
(tests/test_multiagent_m1.py / _m2.py, runnable in CI) with hard-oracle
merge gates and a single-agent baseline — see
tests/MULTI_AGENT_EVAL.md. Early experiments have
partition performing at or above the single-agent baseline on the harder toys.
Designs, not just parts — the design-control layer
Multi-agent orchestration partitions one product across a team. A separate
axis makes a design (not just a part) something you can parameterize, vary,
and evolve under control — the mechanisms a PLM/PDM workflow expects, mapped
onto AnkusDrive's deterministic, headless, git-diffable grain. The keystone
insight: the build recipe is the feature tree; the parameters are its inputs;
regeneration is re-running the recipe — so AnkusDrive gets parametric regen and
family tables without a live in-file expression engine. The full scoping and
rationale is in docs/DESIGN_HIERARCHY.md; the
agent-facing judgment lives in the design-modularly
skill.
Parametric hierarchy — recipes (
recipe,recipe_validate) are named, declared-input build templates (AnkusDrive's PowerCopy/UDF and its intra-part parametric model); a relations DAG drives driven dimensions from master parameters by formula (pitch_d = module * teeth, arithmetic only — no iterative solve, no double-driving); feature templates (feature_instantiate) graft reusable features onto reference geometry by name; the typedunitslayer rejects dimensionally-wrong inputs at the door ("5 N"for a length is an error, not a silent mis-scale).Variant families —
family_materializeexpands a row × column design table into a set of variants deterministically, running the recipe per row and allocating part numbers in table order.Identity & lifecycle — items (
items_new) give a part a stable part-number identity decoupled from its file path; a lifecycle state machine (lifecycle_transition: in_work → in_review → released → obsolete) enforces released-immutability, and a Form/Fit/Function predicate decides revision bump vs. new part number on a change.Change control — ECOs (
eco_create) are first-class change records;where_used/change_impactcompute blast radius over the dependency graph before you commit;baseline_create/baseline_verifypin reproducible snapshots.Versioned interfaces — an interface-type registry (
get_interface,nema17_face@1-style named/versioned types) plus a Liskovsubstitutability_checkgate enforce Form/Fit/Function compatibility as code, so a swapped part is verified to actually mate.Projects —
scaffold_project+project_validate/project_check_referencespromote the multi-agent directory convention to a first-classproject.json(manifest-of-manifests) with a master/skeleton single-source-of-truth slot and reference-integrity guards.
Like the merge gates, these are thin, deterministic, mostly FreeCAD-free primitives — the logic layers import and test without launching a worker.
Status
Phase 3 closed 2026-05-10 (v0.3.0). The core mechanical-design surface from Phase 2 (2026-04-25) is intact; Phase 3 layered intent-encoding APIs on top of it. Since then the tool surface has grown from ~100 to 280+ tools across several waves: a command-tier expansion (parametric components + direct feature ops + metrology), the multi-agent orchestration layer, a broad engineering-analysis + external-solver simulation surface (thermal/CFD/CHT/ EM/acoustics/FSI/molding/granular/optics/multibody), and a design-control (PLM) layer (items, recipes, variant families, lifecycle, ECO/change, versioned interfaces, projects).
Worker + transport — long-lived
freecadcmdworker, newline-JSON over stdio with stdio hygiene (FreeCAD C++ chatter redirected off the protocol fd).CLI —
ping,version,box,cylinder,export,run,mcp,fem cantilever, plus top-level--version.MCP server — FastMCP over stdio, 280+ typed tools across document lifecycle, primitives, selection (face/edge tags), full PartDesign (sketcher + pad/pocket/revolve/hole/loft/sweep/helix/fillet/chamfer/pattern/mirror/thickness/draft), direct-modeling feature ops, parametric components, metrology/inspection, generic property reflection, mass properties, assembly + interface gates, TechDraw (incl. headless PDF/SVG/DXF export, dimensions, gates), multi-view + photoreal rendering, FEM (static + modal + buckling + thermal + nonlinear + result-probe), the engineering-analysis oracles and external-solver simulation families (sync + async
*_submit/job_*), the materials/fluids corpora, Design-for-X / manufacturing checks, the design-control (PLM) layer, and transactions.Command tiers 1–3 — 21 new tools: parametric components (
add_gear,add_rack,add_sprocket,add_pulley,add_spring,add_fastener,add_bearing,add_thread), direct feature ops (fillet_edges,chamfer_edges,shell_solid,add_rib,engrave_text,oring_groove,transform,scale_shape,copy_shape), and metrology/inspection (measure_distance,measure_angle,bounding_box,check_shape,section_view,min_clearance).Multi-agent orchestration — AnkusDrive ships the thin merge primitives + gates (
publish_interface,merge_assembly,interface_align_check,envelope_check,assembly_lock/_check); the host-side reference coordinator (orchestration/) decomposes a brief, fans out per-component builders, merges, gates, and renegotiates. See Multi-agent design anddocs/MULTI_AGENT.md.Phase 3 intent-encoding additions —
direction='into_body'|'away_from_body'andthrough='wall'|'body'on pocket/hole (ray-cast wall depth handles hollow shells correctly);intended_for='print'|'machine'|'drawing'on hole drives ModelThread;verify_featurediffs actual-vs-expected volume change to catch silent failures; visibility hygiene at save hides consumed inputs;register_handle+run_scriptauto_register close the escape-hatch one-way trapdoor;list_thread_optionssurfaces the coupled ThreadType/ThreadSize enums dynamically; revolve has an OCCT pre-check that flags axis-coincident edges with an actionable error.Selection layer —
list_faces/list_edges/query_faces/resolve_*produce stable geometric tags that survive edits; FEM constraints take tags directly.Rendering — host-side software rasterizer (
ankusdrive/render.py) with per-pixel z-buffer (render_view/render_viewsreturn PNGs as MCPImageContent), plus photorealrender_photorealvia the FreeCAD Render addon + an external renderer (POV-Ray / LuxCore / Appleseed / Cycles / OSPRay / PBRT). Support matrix, install, and limitations:docs/RENDERING.md.Simulation surface — engineering-analysis oracles (machine elements, structural, durability, thermal, tolerance/GD&T) plus external-solver families that shell out to OpenFOAM / Elmer / CalculiX / openEMS / YADE / KrakenOS, discovered at runtime by
ankusdrive/solvers.pyand degrading cleanly when absent. Long solves use an async submit→poll job pattern (*_submit+job_status/job_result/job_list). Catalog and result schemas:docs/SIMULATION_TOOLS.md; proof harness:docs/SIMULATION_EXAMPLES.md. Materials/fluids back these viamaterial_*andfluid_props(mechanical-property / molding / CoolProp corpora).Design-control (PLM) layer — recipes + a relations DAG (parametric regen), feature templates, variant families from a design table, item/part-number identity, a lifecycle/revision state machine, ECO change records with where-used/impact + baselines, a versioned interface registry + Liskov substitutability gate, and project containers with reference-integrity guards. Scoping + rationale:
docs/DESIGN_HIERARCHY.md. See Designs, not just parts.Tests — ~980 test functions across ~90 files (worker / MCP / CLI / render / determinism / edit stability / negative paths / perf / multi-agent / simulation families / molding / PLM layer), runnable via
tests/run_all.sh(Linux/macOS) ortests/run_all.ps1(Windows — single-interpreter, skips the Linux-only solver families; seedocs/WINDOWS.md). Reliability harness (Layer A classification, B diff-detection, C agent-loop closure) is gated behindRUN_RELIABILITY=1; seetests/RELIABILITY.md.
See docs/ROADMAP.md for the Phase 1/2 per-slice record — a
changelog of how the surface above was built, frozen at the close of Phase 2. Open
work (FEM contact/spring/tie refinements, fully async fem_run, feature_tree
introspection, deeper external-solver integrations) lives on the
issue tracker, not in that file.
The committed showcase — every GIF, render, drawing and exported solid the docs point
at, with the script that regenerates each one — is indexed in
artifacts/README.md.
Open questions
Error model: FreeCAD raises plain Python exceptions from C++; worker catches and serializes them, but stack context across the JSON boundary is still lossy.
Async / concurrency: multi-doc shipped (
list_documents/set_active_document/close_document), and the long-running external solvers run off the channel via the*_submit+job_*pattern, but the in-workerfem_runitself is still synchronous and blocks the MCP channel for the duration of a CalculiX/Elmer solve.macOS Gatekeeper / sandboxing:
freecadcmdlaunched from a non-interactive context may hit quarantine issues. This has never been confirmed either way — tracked in #310, which will either document the fix or delete this caveat.
License
Licensed under the Apache License, Version 2.0. Contributions submitted to this project are licensed under the same terms (Apache 2.0 §5: inbound = outbound), which means contributors retain copyright but grant the project — and everyone downstream — a perpetual, irrevocable license to use their work, including a patent grant. The intent is to keep the project welcoming to contributors while ensuring nobody can later re-proprietize what they contributed.
The code is Apache-2.0; the name is not. Apache-2.0 §6 grants no trademark
rights, so the AnkusDrive word mark and the brand assets in
logo/
are covered separately — see
TRADEMARKS.md
for what you may do without asking (referring to the project, compatibility
claims, redistribution, packaging, and forking all qualify) and
NOTICE for the
attribution a redistributor must carry.
References
Available Tools
281 toolsacoustic_fem_submitA
Acoustic FEM via Elmer HelmholtzSolve (SIMULATION_NEXT Tier B1),
asynchronous — the higher-order twin of acoustic_screen, gated against its
exact closed forms. Requires ElmerSolver; when absent this returns {ok:false,
reason, install} rather than raising.
kind='duct': a closed duct driven p=1 at x=0, rigid at x=L, at f = kL·c/(2πL)
(keep kl off the quarter-wave resonances) — the rigid-end pressure has the
exact oracle 1/cos(kL), so p_end_ratio ≈ 1 machine-tight. kind='cavity': a
rigid lx_m × ly_m cavity excited by a corner Wave Flux source, swept ±span_pct%
around the exact (mode_nx, mode_ny) eigenfrequency in n_steps Scanning steps;
the in-phase corner-probe response flips sign through resonance, and the 1/A
zero-crossing gives f_solved_hz with mode_ratio ≈ 1 (<0.1%). Also accepts
a prepared case_dir.
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for duct {ok, p_end_re, p_end_exact, p_end_ratio (≈1), p_mean_ratio, frequency_hz, case_dir} | cavity {ok, f_solved_hz, f_exact_hz, mode_ratio (≈1), mode, case_dir}.
| Name | Required | Description | Default |
|---|---|---|---|
| kl | No | ||
| nx | No | ||
| ny | No | ||
| sif | No | case.sif | |
| kind | No | duct | |
| lx_m | No | ||
| ly_m | No | ||
| c_m_s | No | ||
| mode_nx | No | ||
| mode_ny | No | ||
| n_steps | No | ||
| case_dir | No | ||
| length_m | No | ||
| span_pct | No | ||
| n_elements | 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 so well: asynchronous execution, the degradation dict on missing ElmerSolver, `{job_id, status, cache_hit}`, and the need to poll `job_result` for final outputs. It describes validation against exact oracles and expected ratios, which is unusually transparent for a simulation submit 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 and key behavior are front-loaded, but the description is long and dense, mixing physics explanations, oracle details, and return fields. While much of the detail is relevant for a complex simulation tool, it is not maximally concise or easy to parse at a glance.
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?
It gives strong context on async behavior, dependency failure, return fields, and kind-specific validation, and there is no output schema to rely on. However, with 15 parameters and 0% schema description coverage, the lack of parameter explanations leaves an agent guessing about several inputs, so the overall definition is not complete enough.
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 there are 15 parameters, but the description only explains a subset (`kind`, `kl`, `lx_m`, `ly_m`, `span_pct`, `n_steps`, `mode_nx`, `mode_ny`, `case_dir`). Important parameters such as `sif`, `nx`, `ny`, `c_m_s`, `length_m`, and `n_elements` are not described, so the text does not come close to compensating 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 names a specific verb and resource (Acoustic FEM via Elmer HelmholtzSolve), marks it asynchronous, and explicitly distinguishes it as the higher-order twin of `acoustic_screen` gated against exact closed forms. An agent can identify the tool's scope and its relationship to the sibling 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 the dependency (`Requires ElmerSolver`), the fallback behavior when absent, and explains the two `kind` modes with their physical setups. It also names `acoustic_screen` as the related lower-order alternative, though it does not give explicit when-to-use-this-vs-that guidance beyond 'higher-order twin'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
acoustic_radiation_submitA
Exterior-acoustics boundary-element solve on Bempp, asynchronous (OFF the MCP
channel) — the real-field twin of the analytic monopole_sphere /
rigid_sphere_scattering oracles. Bempp is MIT but needs meshio>=4 (clashing
with solidspy's meshio==3 in the shared venv), so it is run ONLY out-of-process
via ankusdrive/bempp_runner.py under a dedicated .venv-bempp; degrades to
{ok:false, reason, install} when no bempp venv resolves.
problem='radiation' (default): a pulsating (monopole) sphere of radius a_m,
uniform surface velocity u_amp at freq_hz, into air (rho,c), mesh size
h (fraction of a). The result's radiated_power_w / farfield_pressure_x_r
vs the monopole_sphere oracle (ratio≈1) IS the gate. problem='scattering': a
rigid sphere insonified by a unit plane wave; sweep ka_list, report the
far-field form function at theta_deg angles (h_per_wl elements/wavelength) —
gated against the rigid_sphere_scattering Mie oracle. problem='mesh_solve': a
radiation solve on a REAL FreeCAD model (handle), tessellated to a surface
mesh here and fed to the BEM engine (scale_to_m mm→m, linear_deflection
mesh tolerance).
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, ka, radiated_power_w, farfield_pressure_x_r, surface_pressure_abs_mean, n_elements, wall_s} (radiation/mesh_solve) or {results:[{ka, form_function_abs{}, backscatter_abs, n_elements}]} (scattering).
| Name | Required | Description | Default |
|---|---|---|---|
| c | No | ||
| h | No | ||
| a_m | No | ||
| r_m | No | ||
| rho | No | ||
| model | No | ||
| u_amp | No | ||
| freq_hz | No | ||
| ka_list | No | ||
| problem | No | radiation | |
| timeout | No | ||
| h_per_wl | No | ||
| theta_deg | No | ||
| scale_to_m | No | ||
| linear_deflection | 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 delivers: the solve runs out-of-process in a dedicated .venv-bempp because of a meshio version clash, it is asynchronous/off-channel, it degrades to {ok:false, reason, install} when no bempp venv resolves, and results come back as {job_id, status, cache_hit} to be polled via job_result. These are exactly the operational traits an agent must know before invoking.
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?
Long but densely packed with no filler; the environment/isolation caveat and the mode definitions are front-loaded before the return-format note. The heavy parenthetical nesting and backtick-heavy inline code make it slightly harder to scan, 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?
No output schema exists, and the description fully compensates by enumerating the return shapes for each mode ({ok, ka, radiated_power_w, farfield_pressure_x_r, surface_pressure_abs_mean, n_elements, wall_s} and the scattering results array). For a 15-parameter async tool this is complete enough to invoke and to interpret results.
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 the meaning of most parameters (a_m, u_amp, freq_hz, rho, c, h as fraction of a, ka_list, theta_deg, h_per_wl in elements/wavelength, model handle, scale_to_m mm→m, linear_deflection mesh tolerance, problem). Only r_m and timeout are left unaddressed, so one documented gap remains in an otherwise strong compensation for the coverage deficit.
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 ('Exterior-acoustics boundary-element solve on Bempp, asynchronous') and immediately positions it against named siblings: the analytic monopole_sphere / rigid_sphere_scattering oracles. The three problem modes ('radiation', 'scattering', 'mesh_solve') are each defined concretely, so an agent can tell exactly what the tool does and how it differs from acoustic_fem_submit and the analytic oracles.
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 for each mode and explains that radiation/mesh_solve are gated against the monopole oracle and scattering against the Mie oracle, which effectively routes the agent between modes. It does not, however, state when to prefer this expensive BEM path over the cheap analytic oracles, nor any exclusions beyond the implicit venv-availability degradation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
acoustic_screenA
Closed-form acoustics screen (NO solver). kind: 'cavity_modes' (lx/ly/lz_mm
-> the lowest n_modes rigid-cavity eigenfrequencies f=(c/2)·√(Σ(n/L)²) with
[nx,ny,nz] indices — exact, and the future oracle for the planned Elmer
HelmholtzSolve FEM) | 'helmholtz' (neck_area_mm2 + neck_length_mm +
cavity_volume_mm3 -> resonance with flanged end correction — ±10 %) |
'mass_law' (frequency_hz + surface_density_kg_m2 -> limp-wall TL =
20·log₁₀(f·m″)−47 dB — ±3 dB) | 'duct_cutoff' (duct_width_mm or
duct_diameter_mm -> first cross-mode; plane waves only below — exact). Sound
speed from air at t_ambient_c unless c_m_s given. Fidelity is labeled per kind;
escalate to the Elmer acoustic_fem_submit solve (Tier B1) when the margin is
within ~2× the band.
Returns {kind, c_m_s, fidelity, band_pct, band_db, valid_range_ok, warnings, escalate_to} plus per kind: {modes:[{f_hz,n}], f_fundamental_hz} | {f_resonance_hz, neck_radius_mm, l_eff_mm} | {tl_db, fm_product} | {f_cutoff_hz, geometry}.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| c_m_s | No | ||
| lx_mm | No | ||
| ly_mm | No | ||
| lz_mm | No | ||
| n_modes | No | ||
| t_ambient_c | No | ||
| frequency_hz | No | ||
| duct_width_mm | No | ||
| neck_area_mm2 | No | ||
| neck_length_mm | No | ||
| duct_diameter_mm | No | ||
| cavity_volume_mm3 | No | ||
| surface_density_kg_m2 | 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 discloses the closed-form nature, per-kind fidelity bands (±10%, ±3 dB, exact), and the 'escalate_to' behavior. It stops short of stating cost/read-only traits or runtime limits, but accuracy and escalation behavior are clearly 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-loads the core purpose and the '(NO solver)' constraint, then uses a pipe-delimited kind enumeration that earns its density. It is information-dense but well structured; the embedded formulas are borderline heavy but serve the agent.
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 there is no output schema, the description specifies the full return shape ({kind, c_m_s, fidelity, band_pct, band_db, valid_range_ok, warnings, escalate_to} plus per-kind payloads), covers all four modes, and gives escalation routing. 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 coverage is 0%, so the description must compensate, and it does for the mode-specific inputs (lx/ly/lz_mm, neck_area_mm2, neck_length_mm, cavity_volume_mm3, frequency_hz, surface_density_kg_m2, duct_width_mm/duct_diameter_mm, c_m_s, t_ambient_c). The n_modes parameter is only implied via 'the lowest n_modes', so it is not fully specified, keeping this below 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 ('Closed-form acoustics screen') and immediately disambiguates the scope with '(NO solver)', then enumerates the exact 'kind' modes each with its formula. An agent can tell this apart from the Elmer FEM solve 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?
Names the alternative (the Elmer `acoustic_fem_submit` solve) and gives an explicit triggering condition: 'escalate ... when the margin is within ~2× the band.' Each kind's required inputs and validity envelope are stated, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_annotationA
Add a free text annotation to a drawing page at page position (x, y) in mm (origin bottom-left, +Y up, matching TechDraw view placement). Returns {handle, name, text}.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| name | No | Note | |
| page | Yes | ||
| text | Yes |
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 the coordinate convention (mm, origin bottom-left, +Y up, matching TechDraw view placement) and the return shape, but says nothing about persistence requirements (e.g. whether a transaction or save is needed) or whether the annotation is attached to the page or a specific view.
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: placement semantics are front-loaded and the return value is stated compactly. No filler or redundant restatement of the tool 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?
For a 5-parameter mutation tool with no annotations and no output schema, the description covers placement and return shape but omits the semantics of the defaulted parameters and any persistence or transaction expectations. Adequate but with clear 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%, so the description must compensate. It explains the trickiest parameters (x, y) with a full coordinate-frame definition, but leaves 'name', 'page', and 'text' — including the required 'page' identifier and the default 'Note' name — completely undefined. 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?
States a specific verb ('Add') and resource ('free text annotation to a drawing page'), which is clearly more precise than a tautology. It does not, however, distinguish itself from close siblings such as add_feature_note, add_dimension, add_gdt_callout, or balloon_drawing, so an agent must infer the boundary between free-text notes and structured callouts.
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 context of 'drawing page' implies the usage phase (post-drawing creation), and the coordinate note implies placement during page layout. But there is no explicit when-to-use instruction and no mention of alternatives or prerequisites (e.g. whether a drawing page must already exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_bearingA
Add a deep-groove ball bearing as an assembly envelope solid: an annular ring (outer-diameter cylinder minus bore cylinder) of the given width, axis along +Z. Balls/races are not modeled — this is the fit envelope a coordinator needs to size the shaft, the housing bore, and the shoulder spacing.
Specify dimensions ONE of two ways:
designation: a standard metric series code, looked up in a built-in table. Known: "608", "623", "624", "625", "626", "688", "6000", "6200", "6800", "6900". (e.g. "608" -> bore 8, OD 22, width 7 mm.)
bore + outer_diameter + width: explicit dims in mm (all three required). Explicit values override a designation's table values when both are given.
bore: inner-bore diameter mm (sizes the shaft). outer_diameter: OD mm (sizes the housing bore). width: axial length mm (shoulder spacing). placement: optional [x, y, z] mm translation of the bearing's near face.
seals: open (default) | RS | 2RS | RZ | 2RZ | Z | 2Z. It changes no geometry — the envelope is identical — but it IS part of the orderable identity: 608, 608-2Z and 608-2RS are three different purchases with different drag, speed limits and prices. It is folded into the canonical designation stamped on the part ("608-2RS").
A bearing built from raw bore/OD/width with NO designation is a dimensional envelope, not a purchasable part, and is deliberately left undesignated rather than given a made-up catalog number.
Raises ValueError if the designation is unknown and dims are incomplete, or if outer_diameter <= bore.
Returns {handle, name, designation, bore, outer_diameter, width, volume,
orderable, catalog}. handle starts "bearing_". designation is None when built
from explicit dims; orderable is the designation card, whose own designation
carries the seal suffix; catalog is the off-the-shelf verdict (stocked or not,
None for an undesignated envelope).
| Name | Required | Description | Default |
|---|---|---|---|
| bore | No | ||
| name | No | Bearing | |
| seals | No | open | |
| width | No | ||
| placement | No | ||
| designation | No | ||
| outer_diameter | 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. It discloses error behavior (ValueError on unknown designation or OD <= bore), the seal-suffix identity semantics, coordinate frame (axis +Z, near-face origin), and the precise return shape including the orderable/catalog distinction. This is far beyond a minimal statement.
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?
Information-dense and front-loaded, with the envelope definition first and mechanics after. Slightly long, but every sentence earns its place by answering a real design question; only marginally less tight than an ideal.
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 assembly-feature tool with no annotations and no output schema, the description leaves nothing an agent needs to call it correctly: input modes, defaults, error cases, coordinate frame, seal identity, and full return-field semantics are all present.
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 fully compensates: it defines bore/outer_diameter/width in engineering terms ('sizes the shaft', 'sizes the housing bore', 'shoulder spacing'), documents placement as a near-face xyz translation, and enumerates the seals enum values and their meaning. Every one of the 7 params is given engineering context.
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 ('Add a deep-groove ball bearing as an assembly envelope solid') and immediately scopes what it is and is not ('an annular ring ... Balls/races are not modeled'). It distinguishes itself from siblings like add_gear/add_sprocket by clarifying this is a fit envelope, not a purchasable modeled component.
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 two mutually exclusive input paths (designation vs. bore+OD+width) with the rule for what happens when both are given ('Explicit values override'). It also states when an envelope is deliberately unnamed ('a dimensional envelope, not a purchasable part'). Nothing is left ambiguous about how or when to size the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_dimensionA
Add dimension(s) to a drawing page.
Modes (pick one):
auto=True: overall horizontal + vertical extent dimensions for every part-view (or only those named in
views, by name or projection code).view + edge=: dimension the true length of a model edge, projected into that view. The printed value is the real measured length, not the foreshortened projection.
view + kind='diameter'|'radius' + edge=: a ⌀/R dimension of a hole or arc.
view + kind='angle' + face=: the half-angle (or, by default, the 2× included angle) of a conical face — the curved angle a machinist sets for a chamfer cone / countersink / taper (issue #108). Pass half_angle=True to call out the half-angle instead.
view + from_point/to_point ([x,y,z] model points): dimension between two 3D points. view: a view handle, object name, or projection code ('Front', 'Top', ...). kind: 'aligned' (default) | 'horizontal' | 'vertical' | 'diameter' | 'radius' | 'angle'. tolerance: optional, rendered next to the value (a machinist needs it to make the part to size): {"sym": 0.1} for ±0.1, {"plus": .., "minus": ..} for an asymmetric tolerance, or {"fit": "H7"} / {"fit": "H7/g6"} to look up ISO 286 hole-side limits at the dimension's basic size. Returns {dimensions: [{handle, name, type, value}, ...]} — value is the true measured size of each dimension created.
| Name | Required | Description | Default |
|---|---|---|---|
| auto | No | ||
| edge | No | ||
| face | No | ||
| kind | No | aligned | |
| page | Yes | ||
| view | No | ||
| views | No | ||
| to_point | No | ||
| tolerance | No | ||
| from_point | No | ||
| half_angle | 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 disclose non-obvious behavior: auto-mode semantics (overall extent across every part-view or a named subset), tolerance fit lookups against ISO 286, forehortening semantics for edge mode, and default vs half-angle behavior. Gaps remain: it does not say whether adding a dimension mutates the drawing page (it does, but 'add' implies it), whether duplicate dimensions are rejected, or permission requirements for this 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?
The description is front-loaded with the one-line purpose, then structured as a numbered mode list, followed by parameter and return notes. Every line for tolerance and modes earns its place, but the paragraph is dense and could be slightly tighter; no filler is present.
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 11-parameter, output-schema-less mutation tool with zero annotation coverage, the description covers modes, parameters, and return values sufficiently for correct invocation. It stops short of stating the side effects on the page (does it modify the drawing file, need a saved document, cause pagination?) and does not explain how `edge`/`face` tags should be obtained, which would be a useful pointer to list_edges/resolve_edge.
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 defines semantics for auto, views, view, edge, face, kind (with all six allowed values and the aligned default), half_angle, tolerance (with three concrete shapes and an ISO 286 example), from_point/to_point as [x,y,z] model points, and even the returned value field. This is far more than the schema conveys.
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 (Add) and resource (dimension(s)) to a drawing page, and then enumerates five distinct modes with clearly distinguished triggering parameters. An agent can tell exactly which invocation shape maps to which outcome. It stands apart from siblings like add_annotation or add_gdt_callout by focusing on measured dimensional callouts.
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?
Explicit when-to-use guidance is provided via the five modes, each listing the exact parameter combination that selects it ('auto=True', 'view + edge', 'view + kind=diameter|radius + edge', 'view + kind=angle + face', 'view + from_point/to_point'). The default kind is documented, and the half_angle flag's effect is explained. The agent has clear routing without having to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_fastenerA
Add a standard ISO metric fastener (screw / bolt / nut / washer) as a solid.
kind: one of "socket_head_cap_screw", "hex_bolt", "hex_nut", "washer".
socket_head_cap_screw: cylindrical head with a cosmetic hex socket + plain shank (threads not modeled).
hex_bolt: hex head (across-flats) + plain shank.
hex_nut: hex prism with an axial clearance hole.
washer: flat annular ring. size: ISO designation, one of "M3","M4","M5","M6","M8","M10","M12". length: shank length in mm. REQUIRED for socket_head_cap_screw and hex_bolt; ignored for nut/washer. grade: optional material / property class AS ORDERED — ISO 898-1 for steel screws ("8.8", "12.9"), ISO 898-2 for nuts ("8", "10"), ISO 3506 for stainless ("A2", "A4-80"). It changes no geometry. What it changes is the ORDERABLE designation stamped on the part: with it you get "ISO 4762 M4×12 A2", which a buyer can quote; without it the designation comes back complete=False saying nobody has chosen between class 8.8 steel and A2 stainless yet. An unrecognised grade is a loud error, never a guess. placement: optional [x, y, z] mm translation of the fastener origin (head top sits at z=0, shank runs in -z for screws/bolts). name: optional object name (default derived from kind).
All dimensions are in mm. Threads are cosmetic (the shank is a plain cylinder of the major diameter).
Returns {handle, name, kind, size, major_diameter, pitch, volume,
designation, orderable} plus, by kind:
screws/bolts add {length, head_diameter, head_height, model_thread:false};
nut adds {head_diameter (wrench across-flats), head_height};
washer adds {head_diameter (outer diameter), head_height (thickness)}.
Mating numbers: drill a through-hole of major_diameter (+ clearance) for the
shank; head_diameter sizes a counterbore. designation is the canonical
orderable identity ("ISO 4762 M4×12 A2") and orderable its full card.
catalog is the off-the-shelf verdict computed at creation time — code
stocked, or not_stocked naming the lengths either side. A length nobody
stocks is a FINDING, not a refusal: the solid is still built, so you can decide
whether to move the stack-up or accept a special.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| name | No | ||
| size | Yes | ||
| grade | No | ||
| length | No | ||
| placement | 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 discharges it: threads are cosmetic (plain cylinder of major diameter), grade changes no geometry but affects the orderable designation, an unrecognised grade is a loud error and never a guess, and an unstocked length is a FINDING rather than a refusal (solid still built). These are exactly the non-obvious traits 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?
Purpose is front-loaded and the kind list is cleanly bulleted, with almost no filler. It is long, but the density is warranted for a geometrically complex parametric tool; a couple of meta-remarks (e.g. the orderable/grade explanation) run slightly long.
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 6-parameter tool with no output schema and no annotations, the description supplies everything needed: units, threading caveat, minimum hole/counterbore mating numbers, and a full return-shape breakdown (handle, designation, orderable, catalog, per-kind fields). Nothing essential 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: kind is enumerated with per-kind geometry notes, size is an explicit ISO list (M3–M12), length's requiredness is conditioned by kind, grade defines the three ISO standard families, and placement defines the origin convention (head top at z=0, shank in -z). Each parameter gains 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?
Opens with a specific verb+resource ('Add a standard ISO metric fastener ... as a solid') and immediately enumerates the four supported kinds, letting an agent distinguish this from siblings like add_bearing or add_gear without opening the schema. The scope and output artifact are 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?
Gives clear conditional guidance: length is REQUIRED for socket_head_cap_screw/hex_bolt and ignored for nut/washer, and grade is optional. It contextualizes the catalog/orderable verdict as a decision aid (move the stack-up vs accept a special), but does not explicitly route the agent to siblings such as standard_part_designate or catalog_search when off-the-shelf matching is the goal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_feature_noteA
Attach an explicit manufacturing NOTE that satisfies a curved/periodic
feature the drawing_gate enumerates (issue #108) — the 'per CAD model / profile
table' coverage for geometry a single number can't capture (a freeform/BSpline
wall's profile, a tooth pattern's full parameter set) or a documented cone angle.
feature is the enumerated feature id (e.g. 'FREEFORM1', 'PAT1', 'CONE1', from
drawing_gate's enumerated_features); text defaults to a sensible callout.
The gate reads the note back as coverage. Returns {handle, name, feature, text}.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| kind | No | feature | |
| name | No | FeatureNote | |
| page | Yes | ||
| text | No | ||
| feature | Yes |
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 that the gate reads the note back as coverage, that text defaults to a sensible callout, and that it returns a structured object {handle, name, feature, text}. It does not state permission requirements or whether the note can be removed, but it goes well beyond a minimal 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 description is a single dense sentence plus two short sentences. It is somewhat front-loaded with the main action, but the middle sentence contains nested parentheticals and jargon ('per CAD model / profile table', 'BSpline wall's profile') that make it harder to scan. It is not wasteful, but it is not tightly 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?
There is no output schema, and the description does provide the return shape and the interaction with drawing_gate's gate check. However, for a 7-parameter mutation tool with 0% parameter coverage, the description leaves most parameters unexplained and does not cover permissions or failure behavior. It is adequate but has clear 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% (all seven parameters lack descriptions), so the description must compensate. It explains that `feature` is the enumerated feature id from drawing_gate's enumerated_features and gives examples, and that `text` defaults to a sensible callout. It does not explain `page`, `x`, `y`, `kind`, or `name`, leaving five of seven parameters undocumented, 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?
The description states a specific action ('Attach an explicit manufacturing NOTE') and ties it to a concrete purpose (satisfying a curved/periodic feature that drawing_gate enumerates). It clearly distinguishes itself from siblings like add_annotation, add_dimension, and add_gdt_callout by focusing on gate-driven feature coverage. It's slightly dense and assumes familiarity with the drawing_gate workflow, but the verb+resource+goal are present.
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 when to use it (when a curved/periodic feature needs 'per CAD model / profile table' coverage or a documented cone angle) and references drawing_gate's enumerated_features. However, it never explicitly says when NOT to use it versus add_annotation or annotate_face, nor does it name those alternatives. The condition is implied but not stated as an exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_gdt_calloutA
Place a GD&T feature control frame on a drawing page.
Declaring geometric tolerance ON THE DRAWING (rather than only checking a measurement with gdt_check) is what makes it inspectable: the frame renders as a real compartmented symbol, and inspection_plan / fai_report read it back as a characteristic with its own balloon and measurement method.
control: an ASME Y14.5 geometric characteristic — the same vocabulary gdt_check
accepts: flatness, straightness, circularity, cylindricity, profile_line,
profile_surface, perpendicularity, parallelism, angularity, position,
concentricity, runout, total_runout.
zone: tolerance zone in mm (rendered with a Ø for the diametral controls —
position, concentricity, circularity, cylindricity).
datums: the ordered datum reference frame, e.g. ["A", "B", "C"]. A control with
datums is CMM work; a datum-free form control is surface-plate work, and the
inspection plan picks the instrument accordingly.
feature: optionally the enumerated feature id (drawing_gate's
enumerated_features) the frame controls.
mmc_bonus: material-condition bonus tolerance carried into inspection, mm.
modifier: free text printed in the tolerance compartment (e.g. "Ⓜ").
x / y: page position in mm (origin bottom-left, +Y up, like add_annotation).
Returns {handle, name, control, zone, datums, text}.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| name | No | Fcf | |
| page | Yes | ||
| view | No | ||
| zone | Yes | ||
| datums | No | ||
| control | Yes | ||
| feature | No | ||
| modifier | No | ||
| mmc_bonus | 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 behavioral burden. It does disclose real traits beyond a bare description — the frame renders as a compartmented symbol and is consumed by downstream inspection tools — but it never states that this mutates the drawing document, whether a page must already exist (make_drawing_page), or any reversibility/permission constraints.
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 a paragraph justifying the tool's value, then a clean per-parameter breakdown. Slightly verbose in the second paragraph, but every clause carries information an agent would otherwise have to guess.
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 11 parameters, no annotations, and no output schema, the description does most of the heavy lifting — covering most parameters and even stating the inline return shape ({handle, name, control, zone, datums, text}). It falls short only on the required `page`/`view`/`name` semantics and the preconditions for the target drawing page.
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 8 of 11 parameters with genuine added meaning: the control vocabulary with 13 enumerated ASME Y14.5 values, zone units and Ø rendering rules, datum ordering with inspection implications, feature linkage to drawing_gate's enumerated_features, mmc_bonus, modifier examples, and x/y page-origin conventions. It leaves the required `page` plus `name` and `view` undocumented, which is a notable gap for a required parameter.
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: 'Place a GD&T feature control frame on a drawing page.' It also names the two downstream consumers (inspection_plan / fai_report) and the related-but-different sibling gdt_check, so an agent can distinguish it from add_annotation, add_dimension, and gdt_check at a glance.
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 frames when to use this versus gdt_check: declaring tolerance ON THE DRAWING 'rather than only checking a measurement with gdt_check' is what makes the characteristic inspectable and readable by inspection_plan/fai_report. It also explains that datum content selects the inspection method (CMM vs surface-plate), which is actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_gearA
Add an involute spur gear (FreeCAD's core involute generator), extruded to a solid.
teeth: tooth count (>= 3). module: mm (pitch diameter = module * teeth). height: extrusion thickness mm. pressure_angle: deg (default 20). external: True for an external gear; False for an internal/ring tooth profile. placement: optional [x, y, z] mm translation. Returns {handle, name, volume, pitch_radius, tip_radius, root_radius, teeth, module, external}. Two external gears MESH when their axes are spaced (pitch_radius_a + pitch_radius_b) apart; phase one by half a tooth to avoid tooth-on-tooth interference.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Gear | |
| teeth | Yes | ||
| height | No | ||
| module | Yes | ||
| external | No | ||
| placement | No | ||
| pressure_angle | 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 enumerates the returned fields ({handle, name, volume, pitch_radius, tip_radius, root_radius, ...}), states the external/internal distinction, and gives the meshing/phase advice needed to avoid tooth interference. It does not explicitly state that this mutates document state or note any permissions, 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?
Front-loaded with the core purpose, then parameters, return shape, and finally the meshing tip – a logical ordering with no wasted preamble. The density is high but most sentences earn their place, though the return-shape block is somewhat terse.
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 no annotations, the description compensates by inlining the return structure and the meshing relationship, plus per-parameter meaning. It is nearly complete; only an explicit note on document-mutation side effects or prerequisites would round it out.
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% (all parameters have titles only), so the description must compensate and it does for every parameter: teeth (count, >= 3), module (mm, pitch diameter = module * teeth), height (extrusion thickness mm), pressure_angle (deg, default 20), external (True external / False ring profile), and placement ([x, y, z] mm translation). This is exactly the missing semantic layer the schema lacks.
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 ('Add') and resource ('involute spur gear'), and clarifies the implementation ('FreeCAD's core involute generator') plus the output form ('extruded to a solid'). An agent can immediately distinguish this from sibling gear-adjacent tools like add_rack, add_sprocket, and add_pulley.
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 meshing geometry (axes spaced pitch_radius_a + pitch_radius_b, phase by half a tooth), which is useful context, but it never states when to choose this tool over alternatives such as add_rack or add_sprocket. Usage is implied by the gear-type phrasing rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_partA
Add a part to an assembly via App::Link.
source is one of: {"handle": ""} — link an in-doc body {"path": "/path/to/part.FCStd"} — link first body / subassembly {"path": "/path/to/part.FCStd", "object": "X"} — link named object placement: [x, y, z] or {position: [...], axis: [...], angle_deg: ...}. mate: place by aligning this part's published interface frame to an already-placed parent's, instead of (or after) a raw placement: {"child_iface": "", "parent": "<link-name|handle>", "parent_iface": ""}. Frames come from publish_interface.
| Name | Required | Description | Default |
|---|---|---|---|
| mate | No | ||
| name | No | Part | |
| source | Yes | ||
| assembly | Yes | ||
| placement | 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. It discloses accepted input shapes and the mate-vs-raw-placement relationship, but says nothing about side effects: whether the assembly must be active/open, whether external files are loaded, or what happens on a failed link. It adds format behavior but not mutation/effect 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?
The purpose statement is front-loaded and the remaining lines are laid out as compact format definitions with no filler. It is dense but every sentence, including the publish_interface cross-reference, 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 5-param nested tool with no output schema and no annotations, the description supplies the input-format knowledge an agent needs for the two hard composite parameters. What is missing is side-effect/permission context and the meaning of `assembly`, but the core calling information is present.
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 nested objects are present, yet the description documents three of the five parameters in detail (source variants, placement forms, mate keys), which is meaningful compensation. `assembly` and `name` (defaults to 'Part') remain undocumented, 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?
The first line states a specific verb and resource ('Add a part to an assembly') and names the mechanism (App::Link), which separates it from generic add_primitive/merge_assembly. It does not explicitly contrast itself against those siblings, but the purpose 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?
The description gives genuine usage guidance for `mate` ('place by aligning this part's published interface frame ... instead of (or after) a raw placement'), which is a real conditional. However it never states when to choose add_part over merge_assembly, copy_shape, or add_primitive, so the routing guidance is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_primitiveA
Add a primitive to the active document.
kind: 'box' (uses w, d, h), 'cylinder' (uses r, h), or 'sphere' (uses r).
placement: optional [x, y, z] mm translation.
name: optional human-facing name. It sets the object's LABEL — what
list_objects, bom_extract and the drawing/manifest layers display — and
leaves the internal FreeCAD Name alone, since handles and register_handle
key off Name and it must stay unique and stable. Omit it and the label
stays the type default ('Box' / 'Cylinder' / 'Sphere'), which BOM and
designation checks read as an unnamed generic solid.
Returns {handle, name, label, volume}: name is FreeCAD's internal id and
label is the display name (equal to name when you passed none). The
handle (e.g. 'box_1') is how you reference this object in subsequent
boolean_op calls.
| Name | Required | Description | Default |
|---|---|---|---|
| d | No | ||
| h | No | ||
| r | No | ||
| w | No | ||
| kind | Yes | ||
| name | No | ||
| placement | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does substantial work: it discloses that name sets the LABEL while leaving FreeCAD's internal Name alone, that Name must stay unique and stable for handles/register_handle, that omitting name yields a type default read by BOM and designation checks, and it documents the return tuple {handle, name, label, volume}. Missing a note on failure modes (e.g. no active document) or coordinate-frame semantics for placement, so 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?
Front-loaded with the core action, then structured per-parameter blocks and a returns line; each sentence carries information. The name paragraph is somewhat dense but every clause is load-bearing (label vs Name, uniqueness, defaults, downstream readers).
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-parameter mutation tool with no annotations and no output schema, the description covers kinds, dimensions, placement, naming semantics, and the return shape, plus the downstream handle contract. It leaves out error conditions and whether an active/selected document prerequisite can fail, keeping 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 coverage is 0%, so the description must compensate and does: it maps w/d/h to 'box', r/h to 'cylinder', r to 'sphere', specifies placement as optional [x, y, z] mm, and explains the label-vs-Name distinction for the name parameter. This goes well 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?
States a specific verb and resource ('Add a primitive to the active document') and immediately enumerates the supported kinds ('box', 'cylinder', 'sphere'), which differentiates it from specialized siblings like add_gear, add_rack, or hole. An agent can identify the tool's scope without inspecting 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?
Gives clear operational context: it operates on the active document, the three valid kinds and their dimension sets, optional placement in mm, and the consequences of omitting name. It does not explicitly name alternatives (e.g. 'for a geared part use add_gear instead') or state when not to use a generic primitive, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_projection_groupB
Add a multi-view projection group of body to a drawing page.
views: list of FreeCAD view codes ('Front', 'Top', 'Right', 'Left',
'Bottom', 'Rear', 'FrontTopLeft', etc.). Default: ['Front', 'Top', 'Right'].
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| name | No | ProjGroup | |
| page | Yes | ||
| views | 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 behavioral burden. It implies a mutation via 'Add' but does not state side effects, required object preconditions, permissions, or whether the page is modified; the default views list is parameter detail rather than behavioral 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?
Two front-loaded sentences with zero waste. The views example codes and default are useful and appropriately placed after the core action.
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 no annotations or output schema, the description covers purpose and views defaults but omits the name parameter and does not explain body/page reference expectations. It is minimally sufficient for an agent with FreeCAD context but has clear 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%, so the description must compensate. It thoroughly documents the views parameter with FreeCAD view codes and default value, but leaves the name parameter entirely undocumented and only names body/page without adding reference semantics or type details.
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 (Add) and resource (multi-view projection group), with target body and drawing page named. It does not explicitly distinguish itself from sibling drawing tools like add_section_view or add_dimension, 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?
No when-to-use, when-not-to-use, prerequisites, or alternative routing. Usage is only implied by the phrase 'to a drawing page,' which is not actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_pulleyA
Add a timing-belt (or V) pulley as a static solid. Axis is +Z; toothed belt face spans z in [0, width].
teeth: tooth count (>= 6). belt_pitch: belt tooth pitch mm/tooth (e.g. 2.0 for GT2, 3.0 for GT3/HTD-3M); pitch diameter PD = belt_pitch * teeth / pi. width: belt-face length mm. flanged: True adds two thin guide discs (radius PD/2 + 2*belt_pitch) at each end to retain the belt. height: optional mm; OVERRIDES width when given (default height = width). placement: optional [x, y, z] mm translation of the axis base. name: object label.
Returns {handle, name, volume, pitch_diameter, belt_pitch, teeth, width, flanged}. pitch_diameter (mm) is the mating number: the centre distance to a mating pulley plus the required belt length derive from the two pitch diameters and the same belt_pitch.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Pulley | |
| teeth | Yes | ||
| width | Yes | ||
| height | No | ||
| flanged | No | ||
| placement | No | ||
| belt_pitch | Yes |
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 states the axis (+Z), the toothed belt face extent ([0, width]), the effect of flanged (adds two guide discs), the height-overrides-width rule, and the return fields. It also gives the pitch-diameter formula and its mating significance, which are behavioral details not inferable from the 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 appropriately sized for a 7-parameter CAD creation tool and is front-loaded with the core purpose. Each sentence earns its place by adding parameter meaning, geometric behavior, or return-value context, with no redundant restatement of structured fields.
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 output schema, the description is complete: it covers purpose, all parameter semantics, geometric behavior, constraints, and return shape. An agent has enough information to invoke the tool correctly without opening other documentation.
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 every parameter. It defines units and meaning for teeth, belt_pitch, width, height, flanged, placement, and name, including constraints (teeth >= 6), examples (2.0 for GT2, 3.0 for GT3/HTD-3M), and the pitch-diameter formula.
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 creation action and resource: 'Add a timing-belt (or V) pulley as a static solid.' It immediately distinguishes the tool from generic primitive creation and from other drive-component siblings like add_gear, add_sprocket, and add_rack by defining the exact mechanical part and its geometry.
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 provides clear usage context: it is for timing-belt or V pulleys modeled as static solids, with examples such as GT2 and GT3/HTD-3M belt pitches. It does not explicitly state when to choose this over sibling tools like add_gear or add_sprocket, but the context is strong enough to route usage correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_rackA
Add a linear gear rack (a spur gear's straight counterpart) as a solid.
A rack is a gear of infinite radius: straight-flanked teeth on a rail. Standard full-depth tooth form (addendum = module, dedendum = 1.25module, tooth height = 2.25module, flanks at pressure_angle from vertical).
teeth: number of teeth (>= 1). module: mm (sets tooth size; circular pitch = module * pi). height: extrusion thickness mm along +Y (the rack's face width; default 6). width: mm, rail base-band thickness below the tooth root line (default 10). pressure_angle: deg, flank angle from vertical (default 20; 0 < pa < 45). placement: optional [x, y, z] mm translation of the rack origin. name: object label (default "Rack").
The profile lies in the XZ plane: root line at z=0, base band from z=-width to z=0, teeth from z=0 to z=2.25*module, extruded along +Y by height.
Returns {handle, name, volume (mm^3), pitch (mm/tooth = modulepi),
module, teeth, tooth_height (2.25module mm), length (teethmodulepi mm)}.
A spur gear MESHES with this rack when their pitch values match
(gear module*pi == rack pitch); length sizes the rail for the travel.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Rack | |
| teeth | Yes | ||
| width | No | ||
| height | No | ||
| module | Yes | ||
| placement | No | ||
| pressure_angle | 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 discloses substantial detail: standard tooth form formulas, extrusion direction along +Y, profile plane, defaults, and return fields. It still does not cover document-state side effects or error behavior, 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 tool's purpose and then structured into geometry, parameter, and return sections. Despite its length, every sentence provides useful design or invocation information without repetition.
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 7 parameters, no annotations, no output schema, and 0% schema description coverage, the description is complete enough: it documents all parameters, return fields, meshing relationship, and geometric conventions. No essential invocation detail is missing for this primitive-creation 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 fully compensates by explaining every parameter: teeth (>=1), module (mm and circular pitch), height (extrusion thickness along +Y, default 6), width (rail base-band thickness, default 10), pressure_angle (deg, default 20, 0<pa<45), placement ([x,y,z] mm), and name (default 'Rack').
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: 'Add a linear gear rack (a spur gear's straight counterpart) as a solid.' It explains the geometry and relationship to spur gears, which helps distinguish it from sibling tools like add_gear and add_sprocket.
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 provides clear contextual usage: a spur gear meshes with this rack when their pitch values match, and length sizes the rail for travel. However, it does not explicitly say when to choose add_rack over add_gear or other siblings, nor does it state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_ribA
Add a reinforcing rib/web inside a PartDesign Body by thickening an OPEN sketch profile into a wall that fuses with the body's surrounding material.
Args: body: handle of the PartDesign Body (from make_body) to add the rib to. sketch: handle of a sketch holding an OPEN spine (a single line, arc, or connected polyline) that defines where the rib runs. Must NOT be a closed loop. The sketch's attachment plane sets the rib's orientation. thickness: rib wall thickness in mm (> 0). midplane: if True (default) the wall is centered on the spine, growing thickness/2 to each side; if False it grows from one side. reversed: flip the extrusion sense (use if the rib lands on the wrong side of its sketch plane). name: object label.
Returns a dict: {handle (starts 'rib_'), name, volume (the whole Body's Shape.Volume in mm^3 after the rib — strictly greater than before the rib, since a rib only adds material), thickness}.
Fallback behaviour the caller should know: FreeCAD's native PartDesign::Rib type is unavailable in AnkusDrive's headless runtime, so the rib is built as an equivalent midplane PartDesign::Pad — the open spine is offset by +/-thickness/2 into a closed footprint and padded across the body so it reaches the surrounding walls. For the usual straight or smoothly-curved spine this matches a Rib; very intricate spines may differ from the native tool. Raises ValueError if the profile is closed/empty/degenerate or thickness <= 0, and RuntimeError if the rib adds no material (spine does not span between walls).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| name | No | Rib | |
| sketch | Yes | ||
| midplane | No | ||
| reversed | No | ||
| thickness | Yes |
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: it discloses the fallback implementation (native Rib unavailable, built as Pad), the material-adding guarantee (volume strictly greater), and precise raise conditions. This is exactly the behavioral context an agent needs beyond the name.
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, then Args, Returns, and fallback sections. Well organized and nearly every sentence earns its place, though the length is substantial and the fallback paragraph could be marginally 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?
No output schema exists, but the description spells out the return dict (handle prefix 'rib_', name, volume, thickness) and every failure mode. For a complex PartDesign feature tool, 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 coverage is 0%, so the description must compensate, and it documents all six parameters with real meaning: body source, open-spine requirement, thickness units (>0), midplane semantics (thickness/2 each side), reversed flip sense, and name as label. The sketch attachment-plane note adds orientation semantics not 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?
States a specific verb+resource ('Add a reinforcing rib/web inside a PartDesign Body') and the mechanism (thickening an open sketch profile into a wall that fuses with surrounding material). This clearly distinguishes it from siblings like pad, sweep, or loft.
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 rich context: the sketch must be an OPEN spine and not a closed loop, reversed is for landing on the wrong side, and the ValueError/RuntimeError conditions define failure boundaries. It stops short of explicitly naming alternative tools (e.g., pad/sweep) or stating when to prefer them, keeping it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_section_viewA
Add a cross-section view when the part has internal features the outline / hidden-line views convey ambiguously — a counterbore, a blind hole/bore, or a pocket. The need is judged automatically from the real solid (the same feature enumeration the manufacturability gate uses); the cut runs lengthwise through such a feature so its bore profile and depth read directly, and the view is placed in clear space beside the existing views.
auto (default True): add the section ONLY if the part actually has hidden internal geometry; otherwise return {added: False, recommended: False}. Set auto=False to force a section regardless. process: 'auto' (default) | 'prismatic' | 'turned' — how features are enumerated.
Returns {added, recommended, reasons, feature_ids, view?, normal?, origin?}.
(drawing_gate also reports section_recommended so you can decide in advance.)
| Name | Required | Description | Default |
|---|---|---|---|
| auto | No | ||
| name | No | Section | |
| page | Yes | ||
| symbol | No | A | |
| process | No | auto |
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 richly: it discloses automatic feature judgment from the real solid, the cut orientation ('runs lengthwise through such a feature'), placement ('in clear space beside the existing views'), default auto behavior, and the return shape ({added, recommended, reasons, feature_ids, view?, normal?, origin?}).
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 condition, then the auto semantics, then process and return shape in compact parentheticals. Every sentence contributes useful information about when the tool acts and what it returns, with no 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 complex CAD automation tool with no annotations, no output schema, and 0% schema description coverage, the description is largely complete: it covers intent, automatic decision logic, override, feature enumeration modes, and return fields. It leaves minor gaps on name, symbol, and page semantics, but those are low-risk naming/placement parameters.
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 should compensate. It explains auto (default True, controls forced vs. conditional addition) and process ('auto' | 'prismatic' | 'turned' — how features are enumerated), but says nothing about page, name (default 'Section'), or symbol (default 'A'). It adds meaningful semantics for two of five 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 ('Add a cross-section view') and scopes it precisely: 'when the part has internal features the outline / hidden-line views convey ambiguously — a counterbore, a blind hole/bore, or a pocket.' An agent can tell this is an automated section-view creation tool distinct from a plain manual section_view call.
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 explicit when-to-use conditions and when-not behavior ('auto ... add the section ONLY if the part actually has hidden internal geometry; otherwise return {added: False, recommended: False}') plus an override ('Set auto=False to force a section'). It also references drawing_gate for advance decision support. It does not explicitly name the sibling section_view as an alternative, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sketch_constraintB
Add a constraint to a sketch.
type: Coincident, Horizontal, Vertical, Distance, DistanceX, DistanceY, Radius, Diameter, Equal, Parallel, Perpendicular, Tangent, Block, Symmetric, Angle. refs: list of [geom_idx, vertex_role] pairs. vertex_role: 0=edge, 1=start, 2=end, 3=center. value: numeric value (mm or radians) for dimensional constraints.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | Yes | ||
| type | Yes | ||
| value | No | ||
| sketch | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does not state what happens on invalid constraints, whether the sketch must be open, or any side effects, reversibility, or error behavior. It only describes parameter formats.
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?
Concise, front-loaded with the purpose, and organized with clear labeled sections for type, refs, and value. Every sentence adds useful information without 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 constraint-adding tool with four parameters and no output schema, the description adequately covers parameter semantics but omits usage context and behavioral details. It lacks prerequisites, expected outcomes, and error handling. It is minimally sufficient for an agent that already understands the modeling context.
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 well: it enumerates all valid type values, explains the refs structure as [geom_idx, vertex_role] pairs with role codes, and specifies that value uses mm or radians. It could further clarify how many refs each constraint type requires, but this is substantially more than the raw 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?
States a specific verb and resource: 'Add a constraint to a sketch.' The purpose is clear enough to distinguish from geometry-adding siblings like add_sketch_geometry. However, it does not explicitly contrast itself with other sketch-related siblings such as close_sketch or add_sketch_external.
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 no guidance on when to use this tool versus alternatives, nor prerequisites such as requiring an open sketch. It only implies usage through the description of constraint types. No exclusions or context are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sketch_externalA
Project an external edge/face/vertex into a sketch as construction geometry.
ref: {handle, edge: tag|'EdgeN'} (or face/vertex variant; or {handle, tag} where tag is e_/f_ prefixed). The projected element gets a negative geom index so subsequent constraints can reference it. Use this to make a sketch that stays anchored to upstream geometry (e.g. a hole 5mm from a tagged edge that survives pad-length edits).
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | ||
| sketch | Yes |
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 non-obvious behavioral trait: the projected element gets a negative geom index so subsequent constraints can reference it. However, it does not state permission/auth requirements, whether the projection is reversible, or what happens if the referenced geometry changes or is deleted.
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 necessary ref-format detail and a usage example. The ref paragraph is dense but earns its place given 0% schema coverage. No redundant 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 two-parameter projection tool with no annotations and no output schema, the description covers purpose, ref syntax, behavioral effect, and usage. The sketch parameter itself is left implicit, but it is self-evident from context.
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: it spells out the ref shapes ({handle, edge: tag|'EdgeN'}, face/vertex variants, and {handle, tag} with e_/f_ prefixed tags). This is far more than the schema's bare object type 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?
States a specific verb (project), resource (external edge/face/vertex) and destination (into a sketch as construction geometry). This clearly distinguishes it from sibling add_sketch_geometry, which adds sketch-native geometry rather than projecting upstream edges.
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 a clear when-to-use rationale and a concrete example ('a hole 5mm from a tagged edge that survives pad-length edits'), which tells the agent this is for anchoring sketches to upstream geometry. It stops short of naming an explicit alternative or exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_sketch_geometryA
Append geometric primitives to a sketch.
items is a list of dicts:
{type: 'line', start: [x,y], end: [x,y], construction?: bool}
{type: 'circle', center: [x,y], radius: float}
{type: 'arc', center: [x,y], radius, start_angle, end_angle} (radians)
{type: 'point', pos: [x,y]} Returns {indices: [...]} — Sketcher-assigned indices for use in constraints.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| sketch | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the full behavioral burden. It discloses that the operation is an append (a mutation) and that it returns Sketcher-assigned indices, but omits prerequisites such as requiring an active sketch/document, transaction requirements, failure modes, and 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?
Purpose is front-loaded in one sentence; the item formats are presented as a compact bullet list; the return note is a single terse line. No sentence 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 CAD tool with 0% schema coverage and no annotations, the description covers the critical items payload and return value, but leaves the sketch parameter undefined and omits required context such as active document/sketch state and transaction handling.
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 items parameter is an untyped array. The description compensates by specifying the full shape of each item type (line, circle, arc, point) with coordinates and fields, though it does not explain the sketch parameter.
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 begins with a specific verb and resource: append geometric primitives to a sketch, and enumerates the supported primitive types. It clearly distinguishes from siblings like add_sketch_constraint and add_sketch_external, which add different sketch elements.
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 implies usage for adding geometry before constraints and gives the return indices for that purpose, but does not explicitly state when to use this versus alternatives such as add_sketch_external or close_sketch. No prerequisites (active sketch, transaction) 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.
add_springA
Add a helical compression spring: a round wire swept along a cylindrical helix.
All lengths in mm; angles n/a. wire_diameter: wire (stock) diameter d, mm. outer_diameter: spring outer diameter OD, mm (must be > wire_diameter). free_length: uncompressed overall length along the axis, mm. coils: number of turns (active coils), may be fractional. kind: 'compression' (only supported mode in v1; end coils are not squared yet). placement: optional [x, y, z] mm translation of the spring's base.
Geometry: mean coil diameter D = outer_diameter - wire_diameter; coil pitch = free_length / coils. Spring rate is computed for STEEL (shear modulus G = 79.3 GPa) as k = Gd^4 / (8D^3*coils), reported in N/mm.
Returns {handle, name, volume (mm^3), mean_diameter (mm), free_length (mm), coils, kind, solid_height (mm, = coils*wire_diameter, the fully-compressed block height), spring_rate_n_per_mm (N/mm)}. Use free_length, solid_height and spring_rate_n_per_mm to spec the spring into a mechanism (available travel = free_length - solid_height; force = spring_rate_n_per_mm * deflection).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | compression | |
| name | No | Spring | |
| coils | Yes | ||
| placement | No | ||
| free_length | Yes | ||
| wire_diameter | Yes | ||
| outer_diameter | Yes |
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: material assumption (STEEL, G=79.3 GPa), spring-rate formula, return fields, and limitations such as unsquared end coils. It does not discuss document state, permissions, or side effects, 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?
The description is front-loaded with purpose, then organized into parameter meanings, geometry formula, and returned values. Despite its length, each section adds needed engineering context for a 7-parameter CAD insertion 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 no annotations, so the description must carry both usage and return-value context. It does so by listing the exact return fields, their units, and how to use them in a mechanism, making the definition 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 for almost every parameter: units, definitions, constraints (OD > wire_diameter), placement format, and fractional coils are explained. The 'name' parameter is not described, leaving one 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?
The description states a precise verb and resource: 'Add a helical compression spring: a round wire swept along a cylindrical helix.' It also specifies the supported mode ('compression' only in v1) and distinguishes the result from generic helix or other add_* mechanical components.
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 constraints such as 'kind: compression (only supported mode in v1)' and notes that end coils are not squared, but it does not explicitly say when to choose this tool over siblings like spring_check, helix, or add_gear. 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.
add_sprocketA
Add a roller-chain sprocket (ISO 606 / ANSI), built as a static solid plate.
teeth: tooth count (>= 3). chain_pitch: chain link pitch in mm (e.g. 12.7 for #40 / ANSI 40 chain). roller_diameter: chain roller diameter in mm. height: plate thickness in mm (default 6.0). placement: optional [x, y, z] mm translation.
Build: a disc of tip radius ~= pitch_radius + chain_pitch*0.3 with teeth
roller seats (circular pockets, radius roller_diameter/2 * 1.05) cut on the
pitch circle, one per tooth. This is a fit/visualisation approximation of the
true ISO 606 tooth form, not a load-rated profile.
Returns {handle, name, volume, pitch_diameter, chain_pitch, teeth, tip_radius,
bore}. pitch_diameter (mm) = chain_pitch / sin(pi/teeth) and chain_pitch are
the MATING numbers: a chain of the same chain_pitch wraps the sprocket, and the
centre distance between two sprockets derives from their pitch_diameters. bore
is 0 (no shaft hole cut yet — drill one with the hole command).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Sprocket | |
| teeth | Yes | ||
| height | No | ||
| placement | No | ||
| chain_pitch | Yes | ||
| roller_diameter | Yes |
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 the approximation nature, the exact construction recipe, that bore is 0 (no shaft hole), and enumerates the returned fields. It does not explicitly state document-mutation side effects, but 'Add' plus the return handle makes the create semantics 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?
Front-loads parameters, then build method, then return semantics — a sensible order with units on every numeric. The build-recipe paragraph is slightly verbose for an LLM caller but every clause adds actionable 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?
Given 6 params, no output schema and no annotations, the description supplies everything needed: parameter meanings, the derived return values (pitch_diameter, tip_radius), the mating semantics with chain and centre distances, and the known limitation. Nothing required 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 it does for 5 of 6 params with units and constraints (teeth >= 3, chain_pitch in mm with #40 example, roller_diameter in mm, height default 6.0, placement [x,y,z] mm). Only 'name' is left undocumented, and its title/default make it self-evident.
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 ('Add a roller-chain sprocket (ISO 606 / ANSI)') and immediately scopes it as 'built as a static solid plate', which sets it apart from sibling generators like add_gear, add_pulley and add_rack. An agent can identify 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?
Usage is implied by the mating/geometry context and the note that it is a 'fit/visualisation approximation... not a load-rated profile', which effectively tells the agent when this is appropriate. However it never explicitly names alternatives (add_gear, chain_drive) or states exclusions, 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.
add_threadA
Generate a REAL helical ISO-style 60-degree thread as a static solid.
Unlike hole/list_thread_options (which only flag a thread as metadata),
this cuts actual helical geometry: a truncated triangular rib swept along a
helix and fused to a core cylinder.
All lengths in mm, angles in degrees. diameter: nominal MAJOR (crest) diameter, mm. For internal=True this is the bore the tap fits. pitch: thread pitch, mm per turn (e.g. M8 coarse = 1.25). length: threaded length along +Z from z=0, mm. internal: False (default) -> a finished externally-threaded stud. True -> a TAP/insert cutting-tool solid sized to the bore; fuse it into (or cut it from) a bored hole in your part to produce a threaded bore. starts: number of thread starts, >=1. Multi-start repeats the helix rotated by 360/starts and uses lead = pitch*starts. grade: optional material / property class as ordered ("8.8", "A2"). Changes no geometry; it completes the DIN 976-1 threaded-rod designation stamped on an EXTERNAL single-start thread — that solid is studding, a thing you buy by the metre. An internal thread is a tap-shaped cutting tool and a multi-start is not a stock item, so neither is designated at all. placement: optional [x, y, z] mm translation of the solid's base (default at the origin, axis along +Z). name: optional object name.
Geometry note: the modeled minor (root) uses the ISO 5H/8 truncation; the reported minor_diameter uses the standard ISO formula diameter - 1.0825*pitch. Fallback behaviour: if the helical sweep cannot produce a valid solid the tool returns a plain cylinder tagged with the thread spec and modeled=False (this is rare for sane M-series inputs); always check the modeled flag.
Returns {handle, name, volume (mm^3), major_diameter (mm), minor_diameter
(mm), pitch (mm), length (mm), starts (int), internal (bool), modeled (bool),
designation, orderable, catalog}. Studding is bought by the bar and cut, so any
length up to the longest stock bar reads as stocked with a note that it is a
cut.
Mating numbers: drill/bore minor_diameter to tap an internal thread; clear a
major_diameter (+clearance) hole to pass an external stud.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Thread | |
| grade | No | ||
| pitch | Yes | ||
| length | Yes | ||
| starts | No | ||
| diameter | Yes | ||
| internal | No | ||
| placement | 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 richly: it discloses the fallback behavior (plain cylinder tagged with modeled=False), the discrepancy between the modeled minor (5H/8 truncation) and the reported minor_diameter formula, that `grade` changes no geometry, and the mating/drill conventions. This is well beyond baseline behavioral 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 key differentiator and organized with per-parameter lines and labeled notes. It is somewhat long and the multi-sentence `grade`/DIN 976-1 explanation is prose-heavy, but nearly every sentence adds operative detail 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?
No output schema exists, so the description must explain returns, and it fully enumerates the returned fields ({handle, name, volume, major_diameter, minor_diameter, pitch, length, starts, internal, modeled, designation, orderable, catalog}) and the stocked/cut semantics. For an 8-parameter generative tool this 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 coverage is 0%, so the description must define every parameter, and it does: diameter (major/crest, and bore for internal), pitch (mm per turn with M8 example), length (along +Z from z=0), internal, starts (with lead=pitch*starts rule), grade, placement, and name. Each parameter is given meaning and units 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?
States a specific verb and resource ('Generate a REAL helical ISO-style 60-degree thread as a static solid') and immediately distinguishes itself from the metadata-only siblings `hole`/`list_thread_options` by explaining it 'cuts actual helical geometry'. An agent can tell exactly what this produces versus the alternatives 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 tools and the condition that selects this one over them, and details the internal=False vs internal=True modes and how to fuse/cut into a hole. It stops short of an explicit 'don't use when' clause, but the routing context is strong and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_thumbnailA
Place a small isometric pictorial of the part in the top-right corner of the sheet — the "glance" reference a machinist uses to grok the 3-D shape before reading the orthographic views — IF it fits there without crowding the existing views and dimensions.
It is a real TechDraw isometric projection rendered through the same path as the other views (a vector line drawing, not a raster), scaled to fit a reserved top-right box and pinned to that corner (fit_page leaves it put, and it is never dimensioned or counted by the manufacturability gate). Best-effort: when the top-right corner is already occupied it returns {placed: False, reason} rather than overlapping content. Call it AFTER placing the views and dimensions (and after fit_page) so "fits" is judged against the final layout.
Returns {placed, box, scale?, view?, reason?}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | IsoThumb | |
| page | Yes |
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 that the thumbnail is rendered through the same vector path as other views, scaled to a reserved top-right box, pinned there, left untouched by fit_page, excluded from dimensioning and the manufacturability gate, and returned as a structured best-effort result with placed/box/scale/view/reason 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?
The core action is front-loaded and the structure moves logically from placement to rendering behavior to failure handling to return shape. It is somewhat verbose and repeats the fit/overlap condition, but the length is mostly justified by the tool's behavioral complexity.
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 tool with no annotations and no output schema, the description is quite complete: it explains placement, rendering type, fit_page interaction, manufacturability-gate exclusion, failure mode, and return fields. The notable gap is parameter meaning for page and name, which is left entirely to the undocumented 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% for two parameters, and the description never explains the page or name parameters. It refers generically to "the sheet" but does not say what page accepts or what name controls, leaving the agent with no semantic guidance beyond 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 and resource: place a small isometric pictorial of the part in the top-right corner of the sheet. It immediately distinguishes the output from other drawing content by describing it as a vector-line isometric TechDraw projection, not a raster, and as the machinist's glance reference.
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 explicit timing and conditions: call AFTER placing views and dimensions and after fit_page, so "fits" is judged against the final layout. It also states the when-not case clearly: if the top-right corner is already occupied, it returns placed=False rather than overlapping content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
annotate_faceA
Declare the semantic ROLE of a face — what it is FOR — so later edits can be checked against intent instead of re-derived from raw geometry. The role binds to the face's stable f_* tag and persists in the .FCStd as a JSON property bag (same mechanism as publish_interface); it survives save/reopen. Once declared, check_airtight_path accepts the role/name directly (e.g. inlet="inlet").
handle: the part. face: an f_* tag, 'FaceN', or int index of the face to annotate. role: one of 'inlet' | 'outlet' | 'sealing' | 'wetted' | 'ambient' | 'mating'. name: optional unique label for this annotation (default: the role, then role_2, role_3, …); re-using a name updates that annotation. meta: optional dict stored verbatim (e.g. {"spec": "32mm hose"}).
Returns a dict: {handle, name (the annotation key used), role, tag (the f_* the role is bound to), index ('FaceN' at annotation time), roles (sorted list of all annotation names now on the part)}.
| Name | Required | Description | Default |
|---|---|---|---|
| face | Yes | ||
| meta | No | ||
| name | No | ||
| role | Yes | ||
| handle | Yes |
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 the role binds to the stable f_* tag, persists in the .FCStd as a JSON property bag (same mechanism as publish_interface), survives save/reopen, and that re-using a name updates that annotation. Missing only failure/edge behavior (e.g. invalid tag handling).
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 parameter semantics, then return shape. Every sentence carries information, though the prose is slightly long and the return-value sentence could be trimmed given it is partly derivable.
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 but the description documents the return dict in detail (handle, name, role, tag, index, roles). Combined with persistence and update semantics, an agent has everything needed to call this mutation-style 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% (no parameter descriptions in the schema), so the description must compensate entirely — and it does, documenting all five params: handle, face (f_* tag, 'FaceN', or int index), role (full enum list), name (default and update semantics), and meta (stored verbatim with an example).
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: 'Declare the semantic ROLE of a face — what it is FOR'. This clearly distinguishes it from nearby siblings like classify_face_sides (classifying geometry) and list_face_roles (reading roles) by naming the intent-binding purpose.
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 why to use it (so later edits can be checked against intent) and names a concrete downstream consumer: 'check_airtight_path accepts the role/name directly (e.g. inlet="inlet")'. It does not explicitly contrast with alternative declaration tools such as declare_intent, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assembly_lockA
Write a lockfile recording each component's content hash, published- interface hash, and mate dependencies — the provenance baseline a coordinator uses to detect drift across a team. Call after a clean merge. lockfile defaults to .lock.json. Returns {lockfile, components}.
| Name | Required | Description | Default |
|---|---|---|---|
| lockfile | No | ||
| manifest | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It explains the provenance purpose, the timing (after merge), the default filename, and the return shape. It doesn't disclose overwrite semantics or permissions, but it's strong for a 0-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?
Two dense sentences plus a return summary; every sentence adds information and the purpose is front-loaded.
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, no-annotation, no-output-schema tool, it's remarkably complete: purpose, timing, default, and return shape are all covered. Minor gaps remain around failure modes and overwrite 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. It clarifies that 'lockfile defaults to <manifest>.lock.json' and implies manifest is the input file, adding meaningful 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 (Write) and resource (lockfile) with the exact contents recorded (content hash, interface hash, mate dependencies). It names its sibling function (assembly_lock_check) implicitly via 'provenance baseline a coordinator uses to detect drift'.
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 says 'Call after a clean merge,' giving a clear precondition. This differentiates it from assembly_lock_check (which presumably verifies rather than writes), though it doesn't name that sibling explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assembly_lock_checkA
Compare current component files to a lockfile and classify drift (change propagation, RFC §9): modified — file changed since lock interface_changed — published interface frames moved (subset of modified) stale — mates to an interface_changed component and was NOT itself rebuilt: a neighbor that needs re-dispatch new / removed — components added to / dropped from the manifest ok = nothing stale and no new/removed (safe to re-merge without re-dispatch). Returns {modified, interface_changed, stale, new, removed, ok}.
| Name | Required | Description | Default |
|---|---|---|---|
| lockfile | No | ||
| manifest | Yes |
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 well: it defines each drift category precisely, explains stale as a propagation consequence, and clarifies the meaning of ok. It omits whether the operation is read-only or what permissions it needs, but the semantics strongly imply a non-mutating 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?
Written as a compact classification list with a summary of the return object. Front-loaded with the action and outcome. Slightly dense but every line (each drift class) 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 2-parameter comparison tool with no output schema, the description is nearly sufficient: it enumerates return keys and defines each drift class. The one missing element is the lockfile parameter's optionality/default, which the schema alone does not explain.
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 both parameters (lockfile, manifest) are undocumented. The description references a lockfile and a manifest by name but gives no format, default behavior, or interaction semantics (e.g., that lockfile defaults to null). This is the weak point; it partially compensates but leaves real gaps.
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 (compare) and resources (component files vs lockfile) with an explicit outcome (classification of drift). It does not name or differentiate itself from the two nearest siblings, assembly_lock and validate_manifest, which an agent could easily confuse it with.
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 classification semantics (the ok flag offers implicit guidance on when a re-merge is safe), but there is no explicit statement of when to run this versus assembly_lock or validate_manifest. The agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
async_demo_submitA
Reference async long-solve: launch a job that runs OFF the MCP channel and return immediately, so a multi-minute solve never blocks the worker. (This demo just computes for duration_s then returns a deterministic result; a real FEM/CFD solve plugs into the same facility — see ankusdrive/jobs.py.) Returns {job_id, status, cache_hit}; poll with job_status / job_result. A re-submit with identical (duration_s, value) is a content-hash cache hit (no recompute).
| Name | Required | Description | Default |
|---|---|---|---|
| value | No | ||
| duration_s | 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 the non-blocking execution model, the exact return shape ({job_id, status, cache_hit}), and a non-obvious caching behavior (identical (duration_s, value) is a content-hash cache hit with no recompute). It omits failure/timeout or auth characteristics, so not perfect, but rich context is provided.
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 and the polling guidance in the first two sentences, so the essential contract is read first. The parenthetical meta-commentary about ankusdrive/jobs.py and the 'real FEM/CFD solve' is helpful context but slightly dilutes the core message.
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-parameter-required demo tool with no annotations and no output schema, the description covers what it does, how to retrieve results, and what is returned. It is complete on the interaction loop; only the meaning of the 'value' parameter remains 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 coverage is 0%, so the description must compensate, and it only partially does. It names both parameters via the cache-key tuple '(duration_s, value)' and implies duration_s is the compute time ('computes for duration_s'), but 'value' is never explained, leaving the semantics of the first parameter 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 ('launch a job') plus its defining trait ('runs OFF the MCP channel and return immediately'), which cleanly distinguishes it from synchronous siblings and from job_status/job_result. An agent knows this is the async-launch entry point 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?
Explicitly says to poll with job_status / job_result, naming the alternatives for the follow-up step, and explains the off-channel rationale (a multi-minute solve never blocks the worker). It doesn't enumerate when to prefer a synchronous solve over this facility, but the async context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
balloon_drawingA
Number every characteristic on a drawing page with an inspection balloon — each dimension, feature control frame, and feature note gets a numbered circle beside it, rendered on SVG/PDF export. This is the print a quality engineer actually works from, and the key inspection_plan and fai_report row against.
Balloon numbers are an IDENTITY, not an ordinal. They are persisted on the FreeCAD objects, so: re-running on an unchanged page reassigns nothing; adding a dimension appends the next number rather than renumbering the print; and a deleted dimension RETIRES its number instead of passing it to a different feature — an inspection record written against balloon 7 can never come to mean something else. Pass renumber=True to deliberately discard the numbering and start from 1 (which invalidates any inspection record already written).
Call it after the dimensions are placed and fit_page has run. Returns
{count, balloons, assigned, kept, retired, next_balloon}; balloons maps each
source object name to its number.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| renumber | No |
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 delivers rich behavioral detail: balloon numbers are persisted identities, re-running reassigns nothing, added dimensions append rather than renumber, deleted dimensions retire their number, and renumber=True discards numbering and invalidates records. It also states the rendered output format (SVG/PDF export) and the exact 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?
The description is front-loaded with the core action, then layers essential identity semantics, the renumber warning, call timing, and return shape. Every sentence adds value, but the length is on the higher side for two parameters, and a sentence like the quality-engineer framing is contextual rather than strictly operational.
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 output schema, the description still explains the return value structure (count, balloons, assigned, kept, retired, next_balloon) and the mapping of source objects to numbers. With no annotations, it also covers persistence, identity retirement, and renumber invalidation, leaving no critical gap 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 compensate. It thoroughly explains renumber=True semantics and consequences, which is the non-obvious parameter. The page parameter is only implicitly described via 'drawing page' and the fit_page prerequisite, leaving its expected value format unspecified, so it falls just 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?
The first sentence gives a specific verb (number) and resource (every characteristic on a drawing page) with inspection balloons, and explicitly enumerates what gets ballooned (dimensions, feature control frames, feature notes). It clearly distinguishes this from siblings like add_dimension, add_annotation, and add_feature_note by describing the output and rendering behavior.
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 the prerequisite sequence ('Call it after the dimensions are placed and fit_page has run') and warns about the when-not condition for renumber (invalidates existing inspection records). It also names the downstream consumers (inspection_plan, fai_report) that depend on balloon identity, giving clear context for when this step matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
baseline_createA
Pin a labeled, immutable BASELINE (issue #142, C3) — a {item: revision + content fingerprint} snapshot over an items.json registry (a git-tag / lockfile over the item graph) for reproducible rebuilds. The fingerprint pins the artifact BYTES, so a rebuild is verifiable byte-for-byte.
label: the baseline label (e.g. "v1.0"). registry: path to the items.json sidecar. items: optional subset of item ids to pin (default: every item). base_dir: artifact root for fingerprinting (defaults to the registry's directory). note: optional description. out: optional path — write the git-diffable baseline sidecar there.
Returns the baseline object. Deterministic: same state -> identical bytes.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | ||
| note | No | ||
| items | No | ||
| label | Yes | ||
| base_dir | No | ||
| registry | Yes |
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 declares immutability, determinism ('same state -> identical bytes'), byte-level fingerprinting, and the optional sidecar write via 'out'. It omits collision/overwrite behavior for an existing label 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?
Front-loads the core action, then lists parameters, then return/determinism. Efficient overall, though the parenthetical jargon ('issue #142, C3', '{item: revision + content fingerprint}') adds density without much selection 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?
For a 6-param mutation tool with no annotations and no output schema, the description covers parameters, side effects, determinism, and a brief return note ('Returns the baseline object'). It is nearly complete, missing only collision/overwrite and auth context.
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: all six parameters (label, registry, items, base_dir, note, out) are individually explained with meaning and defaults. This is exactly the value-add the schema lacks.
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 (pin/create) and resource (a labeled, immutable BASELINE snapshot over an items.json registry), with concrete analogies (git-tag/lockfile over the item graph). An agent can distinguish it from baseline_verify or release_package 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?
The stated purpose ('for reproducible rebuilds', 'verifiable byte-for-byte') implies when it is useful, but there is no explicit when-to-use vs the sibling baseline_verify, no exclusions, and no stated prerequisites. Usage must be inferred from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
baseline_verifyA
Verify a rebuild against a pinned baseline (issue #142, C3) — the reproducible- rebuild gate. Re-resolves every pinned item from the current registry + artifacts and checks it still matches the pinned rev AND content fingerprint; a drifted input (changed bytes, a bumped rev, a vanished item) is caught, never silently accepted.
baseline: path to the baseline sidecar. registry: path to the current items.json sidecar. base_dir: artifact root for fingerprinting (defaults to the registry's directory).
Returns {ok, label, drifted (item/field/expected/actual), missing} — ok is True iff the rebuild reproduces the baseline exactly.
| Name | Required | Description | Default |
|---|---|---|---|
| base_dir | No | ||
| baseline | Yes | ||
| registry | Yes |
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 every pinned item is re-resolved and checked against both rev AND content fingerprint, and enumerates the drift cases (changed bytes, bumped rev, vanished item) that are caught rather than silently accepted. It does not mention permission or rate-limit behavior, 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?
Front-loaded with purpose, then a parameter glossary, then the return shape. Well organized and mostly waste-free, though the parenthetical issue tag and drift examples add some length.
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 no annotations, the description supplies both the return shape ({ok, label, drifted, missing} and the ok semantics) and the behavioral core, which is strong coverage. Minor gaps remain around prerequisites/permissions for a gate that pins reproducibility.
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 three parameters: baseline (baseline sidecar path), registry (current items.json sidecar path), and base_dir (artifact root for fingerprinting, with its default). This meaningfully exceeds the bare type info 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?
States a specific verb (Verify) and resource (a rebuild against a pinned baseline) and frames it as 'the reproducible-rebuild gate.' It is clearly distinguishable from siblings like baseline_create, items_validate, and verify_contract 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?
It gives a strong contextual frame ('reproducible-rebuild gate') that implies when to use it, but it never names an alternative (e.g. items_validate, items_resolve, baseline_create) or states a when-not condition. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
beam_bucklingA
Exact column-buckling screen (Euler + Johnson, NO solver) — the closed-form
twin the CalculiX fem_buckling eigen-solve is gated against (as beam_modal
is to fem_modal). Section: width_mm+height_mm (solid rectangle, weak axis
automatic), diameter_mm (round), or explicit area_mm2+i_min_mm4. E/σ_y from
youngs_gpa/yield_mpa or a Materials-DB material. end_condition:
'pinned_pinned' | 'fixed_free' | 'fixed_pinned' | 'fixed_fixed' (theoretical K).
Euler σ_cr=π²E/λ² above the transition slenderness √(2π²E/σ_y), Johnson
parabola below (both exactly σ_y/2 at it). With load_n the safety factor
P_cr/P is returned. Escalate to fem_buckling for non-prismatic /
eccentric / built-up cases.
Returns {end_condition, k_factor, slenderness, transition_slenderness, governing, sigma_cr_mpa, p_cr_n, area_mm2, i_min_mm4, radius_gyration_mm, safety_factor, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| load_n | No | ||
| area_mm2 | No | ||
| material | No | ||
| width_mm | No | ||
| height_mm | No | ||
| i_min_mm4 | No | ||
| length_mm | Yes | ||
| yield_mpa | No | ||
| youngs_gpa | No | ||
| diameter_mm | No | ||
| end_condition | No | pinned_pinned |
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 method (exact Euler + Johnson, no solver), the transition mechanic at √(2π²E/σ_y), that the safety factor is returned when load_n is given, and enumerates the return payload including fidelity, band_pct, valid_range_ok and warnings. It does not state failure modes or what invalid/out-of-range inputs produce, 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?
Dense but front-loaded: the core identity and the no-solver distinction come first, then input modes, then the return shape. Telegraphic style packs a lot into few sentences, though the mid-paragraph formula details are slightly heavy for a description.
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 annotations and no output schema, yet the description supplies the return field list, the escalation path, and the physics governing the computation, which is enough for an agent to call it correctly. Minor gap: length_mm and precise behavior on out-of-valid-range inputs are not spelled out.
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: it maps the three section input modes (width_mm+height_mm, diameter_mm, area_mm2+i_min_mm4), the material-property sources (youngs_gpa/yield_mpa or a Materials-DB material), the four end_condition values, and the role of load_n. The required length_mm is only implied, not explicitly explained.
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 ('Exact column-buckling screen (Euler + Johnson, NO solver)') and immediately positions itself against the sibling eigen-solve tool fem_buckling, including the analogy to beam_modal/fem_modal. An agent can distinguish it from fem_buckling 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?
Gives an explicit escalation rule: 'Escalate to `fem_buckling` for non-prismatic / eccentric / built-up cases', which is a clear when-not/alternative condition. It also implies when-to-use by framing itself as the closed-form screen the FEM solve is gated against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
beam_modalA
Exact Euler-Bernoulli natural frequencies of a uniform rectangular beam — the
closed-form modal oracle (no solver), and the band the CalculiX fem_modal
eigen-solve is gated against. f_n = (βL)_n²/(2π)·sqrt(E·I/(ρ·A·L⁴)); the beam bends
in height_mm (I = width·height³/12, so a slender beam's lowest mode is the
thinnest-direction bend). boundary: 'cantilever' | 'simply_supported' |
'clamped_clamped' | 'free_free' | 'clamped_pinned' (up to 5 modes each). Material
via youngs_gpa+density_kg_m3, or a Materials-DB material name. Slender-beam
theory — accurate while length ≫ height (thick beams need a Timoshenko correction).
Returns {boundary, n_modes, frequencies_hz, beta_l, first_mode_hz, youngs_gpa, density_kg_m3, area_mm2, I_mm4, slenderness}.
| Name | Required | Description | Default |
|---|---|---|---|
| n_modes | No | ||
| boundary | No | cantilever | |
| material | No | ||
| width_mm | Yes | ||
| height_mm | Yes | ||
| length_mm | Yes | ||
| youngs_gpa | No | ||
| density_kg_m3 | 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 that there is no solver, that only up to 5 modes are supported per boundary, the material alternatives, and the accuracy domain of slender-beam theory. It does not state numeric limits (min slenderness ratio) for when the result becomes unreliable, so 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?
Front-loads the identity and formula, then physical caveats, then return shape. Dense but nearly every clause earns its place; the formula and symbol-heavy phrasing make it slightly heavier than strictly necessary for an agent.
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 physics oracle with no output schema, the description compensates fully by listing the return object's fields and explaining the underlying model, units, and applicability limits. An agent has everything needed to call and interpret it.
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 enumerates all five valid `boundary` values (which the schema does not), explains `n_modes` (up to 5 each), the `youngs_gpa`+`density_kg_m3` vs `material` alternatives, and the bending direction tied to `height_mm` (I = width·height³/12). It adds little on the sheer `length_mm`/`width_mm`/`height_mm` units, but the physics context is strong.
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+method: 'Exact Euler-Bernoulli natural frequencies of a uniform rectangular beam' and explicitly identifies itself as the closed-form modal oracle that fem_modal is gated against, cleanly separating it from that sibling.
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?
Establishes when this tool is appropriate (closed-form, no solver, slender beams) and when it is not ('thick beams need a Timoshenko correction'), and names the gating relationship to fem_modal. It does not spell out an explicit either/or selection rule with fem_modal, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bearing_lifeA
Basic rating life L10 (ISO 281): L10=(C/P)^p rev (p=3 ball, 10/3 roller), L10h=L10*1e6/(60n). Supply the dynamic rating C as dynamic_load_c_n, or pull it from the deep-groove ball catalog by designation (e.g. "6205" -> C=14.0 kN, also reporting bore/OD/width, C0 and static safety factor). Returns {l10_million_rev, l10_hours, load_ratio, dynamic_load_c_n, exponent, pass, ...} (pass vs target_hours when given).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ball | |
| speed_rpm | Yes | ||
| designation | No | ||
| target_hours | No | ||
| dynamic_load_c_n | No | ||
| equivalent_load_p_n | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden and does so well: it explains the ISO 281 model, the two-path C sourcing, that catalog lookup additionally reports bore/OD/width, C0 and static safety factor, and how the 'pass' field is evaluated against target_hours. It does not explicitly state side-effect/auth profile, but for a pure computation tool that 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-loaded with the core purpose and formulas, then the return shape; every sentence earns its place with no filler. It is dense and formula-packed, which is warranted for a 6-parameter engineering tool but slightly reduces 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?
With no output schema, the description enumerates the returned fields ({l10_million_rev, l10_hours, load_ratio, dynamic_load_c_n, exponent, pass, ...}) and the pass logic, and covers most of the 6 params. It is nearly complete for a stateless calculation tool, missing only explicit units and edge-case precedence rules.
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 by mapping dynamic_load_c_n to C, designation to the catalog lookup with an example, target_hours to the pass condition, and implicitly P and n through the formulas, plus 'p=3 ball, 10/3 roller' for the kind parameter. It does not spell out the roller value or precedence when both designation and dynamic_load_c_n are given, keeping it just below full marks.
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 computation (basic rating life L10 per ISO 281) with the governing formulas, making the tool's job unambiguous. The topic is clearly distinct from siblings like gear_rating, spring_check, or fatigue_check. An agent can tell immediately what this tool produces.
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 for invocation: supply C directly as dynamic_load_c_n, or pull it from the deep-groove ball catalog via designation (with an example and the extra data returned). It does not name alternative sibling tools to prefer or state when not to use it, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
belt_driveB
Rate a belt drive (Eytelwein/capstan). Wrap theta=pi-2asin((D-d)/2C), Fe=P/V, T1/T2=e^(mu*theta) (V-belt divides mu by sin(beta/2)). Returns {wrap_angle_deg, belt_speed_m_s, effective_force_n, tension_ratio, tight_side_n, slack_side_n, transmissible_power_w, pass}.
| Name | Required | Description | Default |
|---|---|---|---|
| power_w | Yes | ||
| friction_coef | No | ||
| small_pulley_rpm | Yes | ||
| vbelt_groove_deg | No | ||
| center_distance_mm | Yes | ||
| tight_side_limit_n | No | ||
| large_pulley_dia_mm | Yes | ||
| small_pulley_dia_mm | Yes |
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 helpfully discloses the computation model and the exact return keys, but says nothing about what determines the 'pass' flag, what limits or thresholds are applied, or how inputs like tight_side_limit_n affect 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?
Very compact and front-loaded: the core purpose leads, followed by equations and the return list with no filler. It is a bit dense (formula block crammed into one line), but every 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?
For an 8-parameter tool with no output schema and no annotations, the description usefully enumerates the return fields and the physics model. However, it omits the meaning of the 'pass' result, threshold criteria, units for several inputs, and full parameter definitions, leaving meaningful 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%, so the description must compensate. The equations do add engineering meaning for several parameters (power_w=P, diameters=D/d, center_distance=C, friction_coef=mu, vbelt_groove_deg=beta), but the mapping is implicit and tight_side_limit_n and small_pulley_rpm are left unexplained, so coverage is partial.
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 ('Rate a belt drive') and even names the governing method (Eytelwein/capstan), so the agent knows exactly what computation this performs. It does not explicitly contrast itself with the related sibling 'chain_drive', but the belt-specific framing 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 (e.g., which inputs are mandatory vs optional, valid ranges), and no mention of alternatives like chain_drive or gear_rating. The description only explains the math, leaving the agent to infer applicability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bolted_joint_checkA
Rate a bolted joint (VDI 2230-lite). Geometry from bolt_dia_mm (+pitch_mm) OR
a standard thread named via bolt_size ("M8"/"M8x1.0") that pulls dia/pitch and
the standards-table tensile stress area; proof strength from the ISO 898-1
property_class ("8.8") when given. Preload from torque via T=KFd (pass
torque_nm OR preload_n). Returns {preload_n, tensile_stress_area_mm2,
bolt_stress_mpa, preload_pct_proof, bolt_stress_with_load_mpa,
separation_load_n, separation_margin, pass, governing}. preload_target_pct is
the fraction of proof strength the preload is judged against (0.75 default;
0.65 for a reused bolt, 0.90 for a critical permanent joint).
| Name | Required | Description | Default |
|---|---|---|---|
| k_factor | No | ||
| material | No | Steel-4140-QT | |
| pitch_mm | No | ||
| bolt_size | No | ||
| preload_n | No | ||
| torque_nm | No | ||
| bolt_dia_mm | No | ||
| property_class | No | ||
| external_load_n | No | ||
| preload_target_pct | No | ||
| proof_strength_mpa | No | ||
| joint_stiffness_ratio | 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 it discharges much of it: it discloses the computation path (T=K*F*d), the defaults, and enumerates the returned fields (preload_n, bolt_stress_mpa, pass, governing). It never explicitly states that the tool is a side-effect-free rating computation or notes any rate/auth limits.
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 method, then proceeds through inputs and returns. The semicolon-chained sentences are dense but each clause carries real information; nothing 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?
Since no output schema exists, the description usefully enumerates returned fields, and it covers geometry sourcing, preload derivation, and the judgment basis. Minor gaps are the unexplained material, k_factor, and joint_stiffness_ratio parameters, but overall an agent has enough 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 largely does: bolt_size semantics with 'M8'/'M8x1.0' examples, property_class with the ISO 898-1 '8.8' example, torque/preload alternatives, and preload_target_pct are all explained with meaning. Gaps remain for k_factor, material, external_load_n, proof_strength_mpa, and joint_stiffness_ratio, which are not described.
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 ("Rate") and resource ("a bolted joint") and names the underlying method (VDI 2230-lite), which lets an agent distinguish it from sibling strength/contact checks like hertz_contact or press_fit_stress 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?
Gives clear conditional guidance for inputs: geometry via bolt_dia_mm (+pitch_mm) OR a standard bolt_size, preload via torque_nm OR preload_n, and explicit preload_target_pct values for reused vs critical permanent joints. It does not, however, state when to choose this tool over sibling checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bom_extractA
Walk an assembly and return [{part, count, total_volume_mm3, total_mass_kg?}, ...] grouped by source (component file + object), NOT the bare object name, so two distinct components both named "Box" don't collapse into one row. density (kg/mm³) is optional.
recursive (default True): descend into linked subassemblies (App::Part) so the BOM flattens to leaf parts. False counts each subassembly as one line.
orderable (default False): opt in to the BUYABILITY view — is every purchased line on this BOM a part that actually exists off the shelf? The default return is unchanged — a bare list — because everything downstream consumes it. With orderable=True you instead get a dict:
rows the same BOM rows, each also carrying designation / standard / part_class plus the catalog verdict (stocked, catalog_code, catalog) consumables purchased parts that are NOT modelled objects and would otherwise never reach a BOM — today the O-ring an oring_groove was cut for, counted across every part that calls for it undesignated purchased rows a buyer cannot order from (no designation) not_stocked rows naming a part nobody stocks, each with a reason and the nearest stocked alternatives designation the full designation_check verdict stocked_count how many purchased lines resolved to a stocked item ok False when anything purchased is undesignated OR not stocked
check_stock=False designates without checking availability. A design built out of
fasteners that do not exist is the failure this catches, and the offending rows
stay IN the list rather than being quietly dropped. Availability is a curated
snapshot of a market (captured, market), not physics.
| Name | Required | Description | Default |
|---|---|---|---|
| density | No | ||
| assembly | Yes | ||
| orderable | No | ||
| recursive | No | ||
| check_stock | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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 thoroughly: it discloses the default return type, the alternate dict return shape and its fields, that offending rows stay IN the list rather than being dropped, and that availability is a curated market snapshot ('captured', 'market'), not physics. This is exactly the beyond-schema behavioral context 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 return contract before the parameter details, and every paragraph maps to a parameter or behavior. It is long and dense, with some detail that could be trimmed, but no sentence is purely 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 5-parameter tool with an output schema and no annotations, the description covers modes, defaults, return shapes, edge-case handling, and the nature of the stock data. 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 it does: density is given a unit (kg/mm³) and marked optional, recursive's default and semantic effect are explained, orderable's default and view-switch meaning are explained, and check_stock's effect on designation is stated. Only the required 'assembly' param is left implicit, which is self-evident.
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 and resource ('Walk an assembly and return rows grouped by source'), and explicitly disambiguates the grouping key ('component file + object, NOT the bare object name'). An agent can tell what it produces and how it differs from a naive BOM listing 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?
Gives explicit when-to-use guidance for each mode: recursive=True flattens to leaf parts vs False counting subassemblies as one line; orderable=False is the default bare list because everything downstream consumes it, orderable=True opts into the BUYABILITY view; check_stock=False designates without availability checks. The condition selecting each mode is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
boolean_opA
Boolean operation on two existing objects, referenced by their handles.
op: 'cut' (base minus tool), 'fuse' (union), or 'common' (intersection). base, tool: handles returned from add_primitive (e.g. 'box_1', 'cylinder_1'). strict: raise instead of warning on a degenerate cut (see below).
Returns {handle, volume, removed_volume, volume_ratio}, plus warnings —
a list of strings — ONLY when the cut looks degenerate; the key is absent
on a clean op, so "warnings" in result is the test.
removed_volume: base_volume - result_volume, mm3. Positive means material
went away (always so for cut/common); NEGATIVE on a fuse, where it is
the volume the tool added.
volume_ratio: result_volume / base_volume, or None when the base was empty.
The two warned cases are cut-only, and each means the cut did not do what
was asked: annihilation (result ~ 0 — the tool swallowed the base, so every
later feature operates on nothing) and miss (result == base — the tool never
intersected the base, so nothing was removed). Warn-don't-fail is the
default because cutting everything away is legitimate in some workflows;
pass strict=True in a scripted recipe to turn both into an error instead.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | ||
| base | Yes | ||
| tool | Yes | ||
| strict | 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: it discloses the default warn-don't-fail policy and the rationale (cutting everything away is legitimate), the two failure modes (annihilation, miss), and the key-absence contract so the caller knows 'warnings' in result is the test. This is exactly the behavioral context 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 core purpose and op semantics, then progressively details return values and warnings. Every unit of information is useful, though the return-value block is dense and slightly verbose in places rather than perfectly 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?
No output schema exists, yet the description fully specifies the return object (handle, volume, removed_volume, volume_ratio) including the sign convention on fuse and the None case for an empty base. For a 4-param, annotation-free CSG tool, 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 coverage is 0%, so the description must compensate and it does: it defines each op value, explains that base/tool are handles from add_primitive with example format ('box_1', 'cylinder_1'), and describes strict's effect (raise vs warn on degenerate cut). All four parameters gain 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?
States a specific verb (boolean operation) and resource (two existing objects referenced by handles), and enumerates the three operation semantics ('cut' base minus tool, 'fuse' union, 'common' intersection). This clearly distinguishes it from nearby modelers like pad, pocket, and revolve that build rather than combine bodies.
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 strong conditional guidance: when the two warned degenerate cases occur and when to opt into strict=True ('pass strict=True in a scripted recipe'). It also tells the caller where base/tool handles come from (add_primitive). It stops short of explicitly framing when to choose boolean_op over sibling CSG/modeling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bounding_boxA
Axis-aligned bounding box (AABB) of a shaped object. All lengths in mm, in world coordinates. This is a measurement — it returns numbers, not a new object, and does not modify the model.
KNOWN QUIRK (issue #284): min/max/size are FreeCAD/OCC's ANALYTIC box, which is an UPPER bound, not the true extent. OCC boxes a trimmed face using its untrimmed carrier surface, so a planar cut through fillets, chamfers, lofts or a sphere can report several mm of material that is not there — a real case had a trim plane at X=-32.0 reported as X=-36.7. Before you conclude a part is the wrong size, check "verified" (and pass tight=True): the analytic box over-estimating a correct part looks exactly like a wrong part.
handle: the object to measure. oriented: if True, also compute the tightest box at any orientation (the oriented bounding box, OBB) and return it under "oriented"; if the build can't compute it, "oriented" is null. Default False. This is about ORIENTATION, not tightness — it comes from the same analytic geometry and inherits the same over-estimate. tight: if True, also tessellate the shape and return the mesh-derived box under "tight" — the trustworthy numbers when the analytic box over-estimates. Opt-in because tessellation is not free (~1.4s on a 200mm plate with 60 filleted holes). Default False. deflection: mesh chord tolerance in mm for tight=True. Default diagonal/2000 (floor 0.001mm); larger is coarser and faster.
Returns a dict:
min [x,y,z] mm — lower corner of the analytic AABB (upper bound)
max [x,y,z] mm — upper corner of the analytic AABB (upper bound)
size [x,y,z] mm — extents (max - min) along X, Y, Z
center [x,y,z] mm — AABB center point
diagonal float mm — space-diagonal length of the AABB
oriented null, or {size:[x,y,z] mm, center:[x,y,z] mm, diagonal: mm} when
oriented=True and supported — the minimum-volume box at the
shape's best orientation (size is its three edge lengths).
verified how far min/max above can be trusted:
"exact" — proven tight (the shape's own vertices reach all
six faces of the analytic box).
"mesh_agrees" — tight=True found no disagreement beyond the mesh
tolerance.
"unverified" — unproven, the usual verdict on a curved part.
Treat min/max/size as an upper bound only, and
re-run with tight=True to measure.
"over_estimate" — tight=True proved the analytic box overshoots.
Use "tight"; min/max/size are wrong-big.
tight null unless tight=True, else {min, max, size, center, diagonal,
deflection, triangles} measured off the mesh. Accurate to about
deflection; the true box lies between "tight" and the analytic
box, never outside them.
warnings list of strings (empty when there is nothing to say): which face
over-estimates and by how many mm, or that an unverified box has
not been checked.
| Name | Required | Description | Default |
|---|---|---|---|
| tight | No | ||
| handle | Yes | ||
| oriented | No | ||
| deflection | 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 does so richly: it discloses the issue #284 analytic-box over-estimation quirk, the ~1.4s tessellation cost of tight=True, the meaning of every `verified` verdict, and the guarantee that the true box lies between tight and analytic. This is exactly the behavioral context annotations would otherwise 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?
Long but front-loaded: purpose and the critical quirk come first, then parameter semantics, then the return dict. Every section is purposeful given the complexity, though the prose is denser than strictly necessary in a few places.
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 no annotations, the description correctly takes on documenting the full return dict (min/max/size/center/diagonal/oriented/verified/tight/warnings) and the safety/behavior profile. Nothing an agent needs to call or interpret this tool 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 property descriptions), so the description must compensate, and it does: it defines handle, oriented (orientation vs tightness, null on failure), tight (mesh-derived, opt-in cost), and deflection (chord tolerance, default diagonal/2000, floor 0.001mm, larger = coarser/faster). This fully covers all four otherwise-undocumented 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?
States a specific resource (axis-aligned bounding box of a shaped object) plus units and coordinate frame, and explicitly frames it as a read-only measurement ('returns numbers, not a new object, and does not modify the model'). This distinguishes it from measurement siblings like measure_distance and mass_properties without needing 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?
Gives clear situational guidance: 'Before you conclude a part is the wrong size, check "verified" (and pass tight=True)' and explains when to opt into the costly tight box. It does not, however, explicitly contrast against sibling tools (e.g. measure_distance) for the same measurement need, so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_checkA
Is this exact part something you can buy off the shelf?
Pass a canonical designation ("ISO 4762 M4×12 A2", "608-2RS") or the handle of
a part whose designation was stamped when it was generated. Offline and
deterministic.
Returns {ok, code, standard, size, length, stocked, grade_ok, reason, nearest,
lengths, grades, fidelity, captured, market}, where code is:
stocked the size/length exists and the material is listed (for a
cut-to-length product like threaded rod, any length up to the
longest stock bar counts, with a note that it is a cut)
not_stocked the size exists but the LENGTH is not a stocked rung —
nearest names the rungs either side
size_not_stocked the standard does not cover this size at all
grade_not_listed the size exists, that material does not
not_catalogued the product standard is outside this corpus's coverage. That
is an absence of evidence, explicitly NOT a claim that the
part is unavailable — check not_covered from catalog_search
undesignated there was no designation to check
ok is True only for stocked.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | No | ||
| designation | 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 declares the tool is offline and deterministic, enumerates every return `code` with its meaning, specifies that `ok` is True only for `stocked`, and explicitly warns that `not_catalogued` is an absence of evidence rather than a claim of unavailability. That is exactly the kind of non-obvious behavioral context 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 core question, then the input modes, then the return contract. The code enumeration is long but each entry is load-bearing since no output schema exists; only slight verbosity in the branching explanations.
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, so the description must describe the return shape — and it enumerates the full result object and the meaning of each status code, including edge cases like cut-to-length stock and undesignated inputs. Complete for the task.
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% with two undocumented parameters, so the description must compensate; it does by defining `designation` as a canonical designation, giving concrete format examples ('ISO 4762 M4×12 A2', '608-2RS'), and explaining that `handle` refers to a part whose designation was stamped at generation. It doesn't clarify precedence if both are supplied, 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 decision question ('Is this exact part something you can buy off the shelf?') with a clear resource (catalog stock lookup), and its scope is distinct from siblings like catalog_search, catalog_nearest, and designation_check. An agent can tell immediately what question this tool answers.
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 accepted input forms and cross-references catalog_search's `not_covered` field for the out-of-corpus case, which gives useful context. However, it never states when to prefer this over designation_check or catalog_search/catalog_nearest, so sibling routing is only partially addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_nearestA
Snap a desired standard part to the nearest one that actually exists.
This is the call that changes how you design. Ask for an ISO 4762 M4×13 and it tells you that 12 and 16 are stocked and 13 is not — which turns "I need a 13 mm screw" into "I need to adjust my stack-up to 12 or 16". Use it the moment a fastener length falls out of a dimension chain, before the geometry hardens around a size nobody sells.
standard: a product standard or alias ("ISO 4762", "DIN 912", "ISO 7380-1"). size: thread designation, nominal mm, or shaft/bore mm. length: the wanted length in mm. Omit it for a product with no length dimension (a nut, a washer, a circlip), or to list the whole stocked ladder. grade: optional property class / material, used to complete the designation the call hands back.
Exact arithmetic on a DISCRETE ladder: nothing is interpolated, and nothing is silently rounded on your behalf. A length between two rungs is not a part, so you get both rungs and the signed deltas and you decide which way to move.
Returns {ok, standard, name, size, requested_length, exact, stocked, below, above,
nearest [{length, delta}], lengths, grades, designation, reason, fidelity,
captured, market}. designation is the canonical designation of the RECOMMENDED
part, so the answer is directly usable in a BOM. ok=True means what you asked for
is already stocked.
| Name | Required | Description | Default |
|---|---|---|---|
| size | Yes | ||
| grade | No | ||
| length | No | ||
| standard | Yes |
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 does so: it states that arithmetic is exact on a discrete ladder with no interpolation, no silent rounding, both rungs plus signed deltas returned, and that ok=True means the request is already stocked. These are precisely the behavioral traits an agent needs and none are in 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-loaded with the core behavior and organized into purpose, per-parameter notes, and return semantics. A few sentences are narrative flourish ('This is the call that changes how you design') that cost space without adding invocation-relevant information, but overall it stays 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?
For a 4-parameter tool with no output schema and no annotations, the description covers inputs, arithmetic behavior, the full returned field set, the meaning of designation, and the ok flag. An agent has everything needed to call it 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?
With 0% schema description coverage, the description compensates fully: it defines standard (with two alias examples), size (thread designation, nominal mm, shaft/bore mm), length (omit for no-length products or to list the whole ladder), and grade (optional property class/material used to complete the returned designation). It adds semantics far 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: snapping a desired standard part to the nearest one that actually exists, with a concrete example (ISO 4762 M4×13 → 12/16 stocked). This is distinguishable from catalog_search and catalog_check because it is explicitly about resolving to the nearest discrete rung rather than searching a catalog.
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 for when to call it — the moment a fastener length falls out of a dimension chain, before geometry hardens. It does not explicitly name or exclude alternatives such as catalog_search or catalog_check, so the routing guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_searchA
Browse the off-the-shelf catalog: which standard components actually EXIST, in which sizes, in which stocked lengths. Call it while designing, before you commit geometry to a number — it is the difference between a design somebody can build and one that needs a special.
The dimensional corpora (threads/bearings/stock) tell you what a part measures. This one tells you whether it is a thing you can buy. Nothing else in AnkusDrive knows that an ISO 4762 M4×12 is a stocked item and an M4×13 is not.
Every argument is an optional filter: family screw | set_screw | nut | washer | retaining_ring | pin | bearing | oring | threaded_rod standard a product standard or alias — "ISO 4762" or "DIN 912" kind the product's kind tag (socket_head_cap_screw, nyloc_nut, ...) size thread designation, nominal mm, shaft/bore mm, or AS568 dash length an exact stocked length, or a min_length/max_length window (mm) grade property class / material ("8.8", "A2-70", "NBR70") drive hex_socket | hex limit max rows (default 50)
Offline, deterministic, zero network.
Returns {ok, count, truncated, items, standards, fidelity, captured, market,
not_covered}. Each item is {standard, name, family, kind, drive, size, size_kind,
lengths (the stocked ladder, narrowed to any length filter), length_count,
grades, length_measured, designation?}. Availability is a curated snapshot of a
MARKET (see market and captured), not physics — and read not_covered before
concluding from an empty result that a part does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| size | No | ||
| drive | No | ||
| grade | No | ||
| limit | No | ||
| family | No | ||
| length | No | ||
| standard | No | ||
| max_length | No | ||
| min_length | 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: 'Offline, deterministic, zero network' declares the side-effect profile, and it proactively warns that availability is 'a curated snapshot of a MARKET... not physics' and to 'read `not_covered` before concluding from an empty result that a part does not exist.' That is exactly the caveat an agent would otherwise get wrong.
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 essential distinction and structured as filter list + return-shape list, so it scans well. It is somewhat long and includes a rhetorical 'somebody can build' clause, but nearly every sentence carries actionable 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?
With no output schema, the description fully enumerates the return envelope ({ok, count, truncated, items, standards, fidelity, captured, market, not_covered}) and the item shape, and it flags the truncation and market-fidelity semantics. An agent has everything needed to call it and interpret results.
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 there are 10 parameters, so the description must compensate — it documents every filter with example values and accepted vocabularies (family enum of 9 names, 'ISO 4762' or 'DIN 912' for standard, min_length/max_length window semantics, limit default 50). This adds meaning the bare anyOf/null schema 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+resource ('Browse the off-the-shelf catalog') and then draws the exact boundary against adjacent tool families: 'The dimensional corpora (threads/bearings/stock) tell you what a part measures. This one tells you whether it is a thing you can buy.' An agent can distinguish it from catalog_nearest, list_thread_options and the geometry builders 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?
Gives explicit when ('Call it while designing, before you commit geometry to a number') and an explicit contrast with the tools it resembles, plus the consequence of skipping it ('the difference between a design somebody can build and one that needs a special'). The 'run this before you pick catalog_nearest/catalog_check' workflow is inferable from the stated sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cfd_body_dragA
Analytic EXTERNAL-flow drag screen (NO solver, milliseconds) — the external twin of cfd_pipe_flow, and the banded oracle the wind-tunnel solve cfd_external_flow_submit(model=…) is checked against. Use this FIRST to narrow a design space; escalate to the solve only for the shapes that survive.
Three families:
shape='sphere'— Clift–Gauvin over the whole standard drag curve, Cd = 24/Re·(1+0.15·Re^0.687) + 0.42/(1+4.25e4·Re^-1.16). Collapses to the EXACT Stokes 24/Re as Re→0; valid to Re=2e5 (it does not model the drag crisis). Passdiameter_mm+velocity_m_s.shape='cylinder'— Sucker–Brauer crossflow Cd (axis ⟂ flow), Cd ≈ 10 at Re=1, 1.45 at Re=100, 1.2 at Re=1e5. Passdiameter_mm,velocity_m_s, optionallength_mm(default 1 m, i.e. drag per unit span; L/D<10 warns about end relief).a tabulated bluff/streamlined shape — 'cube_face_on', 'flat_plate_normal', 'hemisphere_open_back', 'streamlined_body', 'car_modern', … (
shape='list'returns the whole table). Needsfrontal_area_mm2(or amodelhandle, whose silhouette alongflow_directionis measured off the live solid) +velocity_m_s;cdoverrides the table with a known value.
Fidelity: sphere/cylinder are correlations with band_pct 10/15; the table is band_pct 20 and only valid for Re ≈ 1e4–1e6 on a shape that genuinely matches.
Returns {cd, drag_force_n, frontal_area_m2, dynamic_pressure_pa, velocity_m_s, fidelity, band_pct, escalate_to} plus {reynolds, regime, valid_range_ok, warnings} for sphere/cylinder — or {shapes: {name: cd}} for shape='list'.
| Name | Required | Description | Default |
|---|---|---|---|
| cd | No | ||
| fluid | No | air-20c | |
| model | No | ||
| shape | No | sphere | |
| mu_pa_s | No | ||
| length_mm | No | ||
| rho_kg_m3 | No | ||
| diameter_mm | No | ||
| velocity_m_s | No | ||
| flow_direction | No | ||
| frontal_area_mm2 | No | ||
| stl_tolerance_mm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so generously: no solver, millisecond latency, per-family fidelity bands (10/15/20%), validity ceilings (Re=2e5, table only Re≈1e4–1e6), the drag-crisis limitation, and an L/D<10 warning. This is exactly the behavioral context needed to trust or reject the number.
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 key decision (screen vs. solve), then tightly bulleted families each carrying formulas, required params, and validity. Dense but every clause is functional; slightly long, and the embedded equations are borderline but justified by the fidelity claims.
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 and no output schema, the description does the heavy lifting, including a full return-value breakdown and the sphere/cylinder-vs-list conditional shape of the response. The only remaining gap is the handful of undocumented fluid/property/tolerance parameters.
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 coverage the description must compensate, and it largely does: it documents shape (listing concrete family values and shape='list'), diameter_mm, velocity_m_s, length_mm (with default/semantics), frontal_area_mm2, model, cd override, and flow_direction. It omits fluid, mu_pa_s, rho_kg_m3, and stl_tolerance_mm, so a few of the 12 params remain 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 precise verb+resource+method: 'Analytic EXTERNAL-flow drag screen (NO solver, milliseconds)'. It immediately distinguishes itself from its internal twin cfd_pipe_flow and from the wind-tunnel solve cfd_external_flow_submit, so an agent can classify 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?
Explicit routing: 'Use this FIRST to narrow a design space; escalate to the solve only for the shapes that survive.' It names the alternative and the exact condition that selects it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cfd_external_flow_submitA
External-flow CFD (drag/lift) via OpenFOAM or SU2, asynchronous. Requires an
OpenFOAM (apt/conda) or SU2 binary; when none resolves this returns {ok:false,
reason, install} rather than raising. The two case-BUILDING modes below need
OpenFOAM specifically — they emit OpenFOAM dictionaries; SU2 only ever runs a
case_dir you prepared yourself, which is why solve_capabilities does not count
it toward the cfd family's any_available (issue #237). Three modes:
Put a real solid in the virtual wind tunnel (issue #223): pass a
model(orbody) handle +velocity_m_s. The solid's faces tessellate into an STL, a farfield box is auto-sized around it by standard practice (5L upstream / 10L downstream / 5L lateral, overridable viaupstream_factor/downstream_factor/lateral_factor; the reportedblockage_ratiowarns past 5 %), snappyHexMesh carves the body out, and theforcesfunction object integrates pressure + viscous traction over it. Cd/Cl/Cm come back on the MEASURED frontal silhouette alongflow_direction(default +x; exact for a convex body — override withfrontal_area_mm2for a re-entrant one) andreference_length_mm(default: the largest bbox dimension). Mesh knobs:base_cell_mm(default L/2 — a coarser cell is REJECTED, since snappy would then mesh an empty tunnel and report ~0 drag),surface_refine[min,max] levels,wake_refine,stl_tolerance_mm,end_time. Trust: the laminar path is gated live against the sphere drag curve at Re=1 and Re=100 (within ~2 %);turbulence='kOmegaSST'runs but has no verified oracle for arbitrary bodies and comes backgated:false. Past Re≈1000 a laminar request is flagged inwarningsrather than silently answered.Build the flat-plate validation case (no
model): passvelocity_m_s, with optionalplate_length_mm(default 100), afluidname ('air-20c','water-20c',…) or explicitmu_pa_s+rho_kg_m3, and mesh knobsnx_plate/n_y/end_time. THIS MODE SOLVES A FLAT PLATE, never the caller's geometry: a 2-D laminar plate with a clean leading edge (slip→plate→slip, far-field top), whose wall-shear drag is integrated from the converged U field and returned next to the Blasius reference Cf=1.328/√Re_L (blasius_ratio≈1, ~15 %).turbulence='kOmegaSST'upgrades it to RANS (default plate_length 1000 mm so Re_L > transition), gated BANDED against the mixed-transition Cf = 0.074·Re^(−1/5) − A/Re.Run a prepared
case_dir(optionally anapplication); OpenFOAM runs with its environment sourced, an SU2 case (*.cfg+*.su2mesh) runs as a direct native subprocess — no bash/WSL needed, including on Windows.
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result. Body mode: {ok, returncode, cd, cl, cm, drag_force_n, drag_pressure_n, drag_viscous_n, lift_force_n, force_total_n, moment_total_nm, force_drift_pct, n_force_samples, reynolds, reference_length_m, frontal_area_m2, frontal_area_source, moment_reference_m (the bbox centre moments are taken about, not the global origin), blockage_ratio, base_cell_m, converged, gated, warnings, case_dir}. Flat plate: {ok, returncode, reynolds_l, cd, cf_solved, cf_blasius, blasius_ratio, drag_force_n, drag_momentum_n, drag_blasius_n, n_cells, case_dir}; RANS plate swaps the gate fields for {cf_solved (momentum), cf_mixed_ref, cf_mixed_ratio, cf_turbulent_ref, cf_wall_corrected, y_plus_estimate, band_pct}. Prepared case: {ok, returncode, solver, application, case_dir, kind, stdout_tail}.
| Name | Required | Description | Default |
|---|---|---|---|
| n_y | No | ||
| body | No | ||
| fluid | No | air-20c | |
| model | No | ||
| mu_pa_s | No | ||
| case_dir | No | ||
| end_time | No | ||
| nx_plate | No | ||
| rho_kg_m3 | No | ||
| turbulence | No | laminar | |
| application | No | ||
| wake_refine | No | ||
| base_cell_mm | No | ||
| velocity_m_s | No | ||
| flow_direction | No | ||
| lateral_factor | No | ||
| surface_refine | No | ||
| plate_length_mm | No | ||
| upstream_factor | No | ||
| frontal_area_mm2 | No | ||
| stl_tolerance_mm | No | ||
| downstream_factor | No | ||
| reference_length_mm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden: it discloses asynchronous job semantics and the polling contract, the non-raising degraded return, live gating of the laminar path against the sphere drag curve (gated:false for turbulence), warnings past Re≈1000, and the rejection of too-coarse `base_cell_mm`. This is unusually rich 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?
Front-loads the core purpose and three modes with clear bullet structure, and the long return-dict enumeration is justified by the absence of an output schema. It is dense but mostly earns its length; the inline issue references (#223, #237) are the main non-load-bearing 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 23-parameter, multi-mode, async tool with no output schema and no annotations, the description supplies mode selection, dependency requirements, trust/gating caveats, and full return-dict shapes per mode. An agent has everything needed to call and interpret 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% across 23 parameters, so the description must compensate and largely does: it explains model/body, velocity_m_s, flow_direction, frontal_area_mm2/reference_length_mm defaults, the upstream/downstream/lateral factors and blockage_ratio warning, plate knobs, and turbulence gating. A few knobs (n_y, wake_refine, stl_tolerance_mm) are only named, so it is not fully exhaustive.
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 (submit), resource (external-flow CFD) and physical outputs (drag/lift), executed via OpenFOAM or SU2. It explicitly distinguishes itself from the sibling cfd_internal_flow_submit and cfd_pipe_flow by scoping to external flow around a body, and from cfd_body_drag by covering plate/prepared-case modes too.
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 selection rules for all three modes: pass `model`/`body` + velocity for a real solid, omit `model` for the flat-plate case, or pass `case_dir` to run a prepared case. It also states when a dependency is missing ({ok:false, reason, install} instead of raising) and routes agents to solve_capabilities for availability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cfd_internal_flow_submitA
Internal-flow CFD (pressure drop) via OpenFOAM or SU2, asynchronous. Requires an
OpenFOAM (apt/conda) or SU2 binary; when none resolves this returns {ok:false,
reason, install} rather than raising. The pipe and geometry-bridge modes need
OpenFOAM specifically — they emit OpenFOAM dictionaries — but channel_height_mm
builds a NATIVE SU2 case, which is why solve_capabilities counts SU2 toward the
cfd family (issue #237). On Apple Silicon that is the difference between needing
a Multipass VM and not. turbulence='kOmegaSST' upgrades the pipe
validation case to RANS (SIMULATION_NEXT B3): wall-function k/ω/ν_t with first-cell
y+ targeted at ~30–100, developed dp/dx fitted over the second half of a ≥40·D pipe,
gated BANDED against Colebrook (colebrook_ratio ≈ 1 ± 10 % — the Moody correlation
is itself a band, never an exact gate). Four modes:
Build the native SU2 plane-channel case (no OpenFOAM, no VM): pass
channel_height_mm, optionallychannel_length_mm(default 10× the height),velocity_m_s(default Re 50), afluidormu_pa_s+rho_kg_m3(default a light oil — holding Re low with water means millimetres per second, where SU2's incompressible pseudo-time is badly scaled),nx/ny,max_iterations. Gated against the EXACT plane-Poiseuille closed form Δp = 12·μ·U·L/h², returningpoiseuille_ratio≈ 1. The inlet is the fully developed parabolic profile, so there is no entrance-length error to drown out with a long domain.Build the straight-pipe validation case (no case prep): pass
diameter_mm,length_mm, andvelocity_m_s(orflow_rate_lpm), with afluidname or explicitmu_pa_s+rho_kg_m3(mesh density vian_axial/n_radial, iterations viaend_time). The handler builds the axisymmetric laminar pipe, runs blockMesh+simpleFoam, and returns the solved Δp next to the Hagen–Poiseuille analytic reference (cfd_pipe_flow) — the kickoff's exact CFD gate,hp_ratio≈1.Solve a real FreeCAD solid — the geometry bridge: pass a
bodyhandle plusinlet_face/outlet_face(1-based indices into the solid's faces; every other face becomes a no-slip wall) andvelocity_m_s(applied along the inlet face's inward normal). The solid tessellates into a multi-region STL and meshes with blockMesh + snappyHexMesh;base_cell_mmsets the background cell size,location_in_mesh_mmthe kept-region seed point (default: bbox centre — set it for non-convex solids),stl_tolerance_mmthe tessellation sag. Use the developed-profilepressure_drop_pa; also passdiameter_mm+length_mmto get anhp_ratioreference for pipe-like bodies.Run a prepared
case_dir(optionally anapplication, e.g. 'simpleFoam'/'foamRun'); for OpenFOAM its environment is sourced before the run, while an SU2 case (*.cfg+*.su2mesh) runs as a direct native subprocess — no bash/WSL needed, including on Windows.
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result. Pipe/body cases: {ok, returncode, pressure_drop_pa (developed), pressure_drop_inlet_pa, hagen_poiseuille_pa?, hp_ratio?, n_cells, case_dir}; RANS pipe adds {dpdx_pa_m, dpdx_colebrook_pa_m, colebrook_ratio, y_plus_estimate, band_pct}. Prepared case: {ok, returncode, solver, application, case_dir, kind, stdout_tail}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| fluid | No | water-20c | |
| mu_pa_s | No | ||
| n_axial | No | ||
| case_dir | No | ||
| end_time | No | ||
| n_radial | No | ||
| length_mm | No | ||
| rho_kg_m3 | No | ||
| inlet_face | No | ||
| turbulence | No | laminar | |
| application | No | ||
| diameter_mm | No | ||
| outlet_face | No | ||
| base_cell_mm | No | ||
| velocity_m_s | No | ||
| flow_rate_lpm | No | ||
| max_iterations | No | ||
| stl_tolerance_mm | No | ||
| channel_height_mm | No | ||
| channel_length_mm | No | ||
| location_in_mesh_mm | 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. It discloses asynchronous execution, OpenFOAM/SU2 binary requirements, that a missing binary returns {ok:false, reason, install} rather than raising, environment sourcing for OpenFOAM, direct SU2 subprocess behavior on Windows, and output shapes including degradation dicts and job polling. It also describes solver-side behavior like y+ targeting and banded Colebrook gating.
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 front-loads the purpose and then uses four bulleted modes to organize the remaining detail. Most sentences carry useful invocation guidance, though some internal references like issue #237 and SIMULATION_NEXT B3 may not aid an agent. It is dense but 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?
Given a 22-parameter asynchronous tool with no output schema and no annotations, the description covers mode selection, required and optional inputs, failure behavior, solver requirements, and return shapes for degradation, pipe/body cases, RANS cases, and prepared case runs. An agent has enough context to invoke 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% with 22 parameters, so the description must compensate, and it does explain most parameters in mode-specific narratives: channel_height_mm, velocity_m_s, fluid/mu_pa_s/rho_kg_m3, body/inlet_face/outlet_face, base_cell_mm, location_in_mesh_mm, stl_tolerance_mm, turbulence, case_dir, and application. However, a few parameters such as nx/ny are only named without explanation, and the fluid default is ambiguous relative to the schema default of water-20c. Overall it adds substantial 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 opens with a specific verb+resource: 'Internal-flow CFD (pressure drop) via OpenFOAM or SU2, asynchronous.' It then enumerates four distinct modes, making clear this is not the same as external-flow or analytic pipe-flow siblings. An agent can distinguish it from cfd_external_flow_submit and cfd_pipe_flow 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 gives detailed conditions for each of the four modes, including which parameters trigger native SU2, pipe validation, geometry bridge, or prepared case_dir execution. It references cfd_pipe_flow as an analytic reference and solve_capabilities for solver counting, but it does not explicitly state when to avoid this tool or choose a sibling instead. The usage context is clear, though no explicit exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cfd_mesh_independence_submitA
Solve the same CFD case at 2-3 refined meshes and report the Grid Convergence Index — asynchronous, one job for the whole ladder. Requires OpenFOAM; degrades to {ok:false, reason, install} when it does not resolve.
Answers the question no single solve can: is this number a property of the flow, or of the mesh? On geometry with no analytic twin that band is the only error bar available, and it is what turns "a solver produced 0.31" into "0.31 ± 2 %".
Two families, dispatched like their single-solve twins:
the wind tunnel — pass
model(orbody) +velocity_m_s, plus any cfd_external_flow_submit knob. The ladder varies the background cell; the body is tessellated ONCE and shared, so the study isolates mesh error instead of mixing in a changing STL. Defaultmetric'cd'.the straight pipe — pass
diameter_mm,length_mm,velocity_m_s(orflow_rate_lpm). The ladder scalesn_axial/n_radial. Defaultmetric'pressure_drop_pa'.
The COARSEST level is the mesh a plain submit would have built and the study refines
from there (the tunnel's default cell is already the coarsest that resolves the body
at all). Cost therefore grows as the cube of refinement_ratio: 3 levels at 1.5 puts
roughly 11x the cells in the finest mesh, so budget accordingly. end_time is the
cap for the COARSEST level and is scaled up for the finer ones — a fine mesh needs
proportionally more sweeps, and a study whose finest level quietly stopped at its cap
is worthless.
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, family, metric, levels: [{label, value, cell_size_m, n_cells, converged, returncode, case_dir}], grid_convergence: {observed_order, extrapolated_value, gci_pct, monotonic, asymptotic_ratio, order_clamped, warnings, ...}, band_pct, extrapolated_value, hagen_poiseuille_pa (pipe family), warnings}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| fluid | No | air-20c | |
| model | No | ||
| levels | No | ||
| metric | No | ||
| mu_pa_s | No | ||
| n_axial | No | ||
| end_time | No | ||
| n_radial | No | ||
| length_mm | No | ||
| rho_kg_m3 | No | ||
| turbulence | No | laminar | |
| diameter_mm | No | ||
| base_cell_mm | No | ||
| velocity_m_s | No | ||
| flow_rate_lpm | No | ||
| flow_direction | No | ||
| surface_refine | No | ||
| refinement_ratio | 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: it discloses async execution ('one job for the whole ladder', poll job_result), an OpenFOAM dependency with a documented degradation shape ({ok:false, reason, install}), and the cost model (cube-of-refinement_ratio, ~11x cells at 3 levels of 1.5). It also explains the non-obvious end_time semantics as a cap on the coarsest level only, which is exactly the kind of hidden behavior an agent needs to budget a fine-mesh study.
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 opening line, and the two-family bullet structure maps cleanly onto the schema's branches. It is long, but for a 19-parameter async job every section (degradation, cost, end_time, return shape) adds operational information rather than filler; formatting is heavy 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?
With no annotations and no output schema, the description still tells the agent everything needed to call and consume the tool: it spells out the per-family parameter requirements, the async job_id/status/cache_hit return, the tool to poll (job_result), and even the nested result fields (levels, grid_convergence.gci_pct, band_pct). Nothing critical for correct invocation or interpretation 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 maps the key parameters to the two families: model/body + velocity_m_s for the tunnel, diameter_mm/length_mm/velocity_m_s or flow_rate_lpm with n_axial/n_radial scaling for the pipe, plus default metrics, levels, refinement_ratio, base_cell_mm (coarsest level) and end_time. Several params (fluid, mu_pa_s, rho_kg_m3, turbulence, flow_direction, surface_refine) are left to 'any cfd_external_flow_submit knob', which bets the agent has read the twin tool, leaving a real gap against a 19-param 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 sentence gives a specific verb+resource ('Solve the same CFD case at 2-3 refined meshes and report the Grid Convergence Index') and immediately flags it as asynchronous, distinguishing it from single-solve siblings like cfd_external_flow_submit. It further clarifies the intent ('is this number a property of the flow, or of the mesh?'), so an agent can distinguish this study tool from a plain solve 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 explicitly states the situation that justifies the cost ('Answers the question no single solve can... on geometry with no analytic twin'), and gives the two dispatch families with the exact parameter sets each requires, referencing cfd_external_flow_submit for the tunnel knobs. It stops short of naming the exact sibling to use instead for a cheap single solve, so it is clear but not fully prescriptive about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cfd_pipe_flowA
Analytic straight-pipe pressure drop (NO solver) — the fast internal-flow screen
and the exact gate the OpenFOAM cfd_internal_flow solve is checked against. Laminar
(Re<2300) is Hagen–Poiseuille Δp = 128·μ·L·Q/(π·D⁴) with its D⁴ scaling — exact;
turbulent uses smooth-pipe Blasius, or Colebrook–White when roughness_mm is given
(the Colebrook value is always reported for turbulent flow) — a ±10 % Moody-band
correlation (fidelity labeled). Give flow as flow_rate_lpm or velocity_m_s;
fluid μ,ρ from a name ('water-20c','air-20c','oil-sae30-20c','glycerin-20c') or
explicit mu_pa_s+rho_kg_m3. Escalate turbulent cases to
cfd_internal_flow_submit(turbulence='kOmegaSST').
Returns {reynolds, regime, velocity_m_s, flow_rate_m3_s, friction_factor, colebrook_friction_factor, relative_roughness, pressure_drop_pa, wall_shear_pa, hagen_poiseuille_pa, laminar, fidelity, band_pct, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| fluid | No | water-20c | |
| mu_pa_s | No | ||
| length_mm | Yes | ||
| rho_kg_m3 | No | ||
| diameter_mm | Yes | ||
| roughness_mm | No | ||
| velocity_m_s | No | ||
| flow_rate_lpm | 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 that results are analytic (no solver), that laminar Hagen–Poiseuille is exact with D⁴ scaling, that turbulent is a ±10% Moody-band correlation with labeled fidelity, and that a Colebrook value is always reported for turbulent flow. It does not address input-validation behavior (e.g., what happens if both flow_rate_lpm and velocity_m_s are supplied, or if inputs are non-physical), so it falls short of a full behavioral contract.
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?
Every clause is substantive and the defining constraint ('NO solver') is front-loaded in the first line. It is dense and parenthetical-heavy, which makes it slightly harder to scan than it needs to be, but there is little 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 an 8-parameter analytic tool with no output schema, the description enumerates the returned fields (reynolds, regime, friction_factor, colebrook_friction_factor, pressure_drop_pa, wall_shear_pa, hagen_poiseuille_pa, laminar, fidelity, band_pct, escalate_to), the fluid input model, the regime logic, and the escalation path. Nothing an agent needs in order to call it correctly 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, and it largely does: it clarifies that flow is supplied as either `flow_rate_lpm` or `velocity_m_s`, that fluid properties come from a named `fluid` ('water-20c','air-20c','oil-sae30-20c','glycerin-20c') or an explicit `mu_pa_s`+`rho_kg_m3` override, and that `roughness_mm` switches the turbulent model to Colebrook–White. What it does not resolve is precedence when both flow inputs are given, or that diameter_mm/length_mm are the required pair.
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 ('analytic straight-pipe pressure drop') and immediately distinguishes itself from the solver sibling by declaring '(NO solver)' and calling itself 'the fast internal-flow screen and the exact gate the OpenFOAM cfd_internal_flow solve is checked against'. An agent can tell it apart from cfd_internal_flow_submit 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?
Gives explicit routing: it is the fast analytic screen, and 'Escalate turbulent cases to cfd_internal_flow_submit(turbulence=\'kOmegaSST\')'. It also names the exact conditions under which it applies (laminar vs turbulent, with/without roughness). No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chain_driveA
Rate an ANSI roller-chain drive (ASME B29.1). Rated at the lower of the
link-plate-fatigue (HP1=0.004N1^1.08n1^0.9P^(3-0.07P), low speed) and
roller-impact (HP2=1000KrN1^1.5P^0.8/n1^1.5, high speed) envelopes, P in
inches. Give chain_pitch_mm (matching add_sprocket) OR a chain_number
("40","60",...) for pitch+Kr; strands scale by the B29.1 factor. Powers in W.
Returns {rated_power_w, type1_power_w, type2_power_w, governing, strands,
strand_factor, ..., power_sf?, pass}. k_r overrides the roller-impact
constant the chain_number lookup supplies (29 for the 25-240 series, 17 for
the lightweight #41) — needed for a chain outside the ANSI table.
| Name | Required | Description | Default |
|---|---|---|---|
| k_r | No | ||
| power_w | No | ||
| strands | No | ||
| speed_rpm | Yes | ||
| teeth_small | Yes | ||
| chain_number | No | ||
| chain_pitch_mm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does well: it enumerates the return keys (rated_power_w, governing, pass, ...), states the governing-envelope logic, unit conventions (P in inches, powers in W), and the k_r override conditions. It does not discuss error/pass-fail semantics beyond the 'pass' key, 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?
Front-loads the purpose and rating basis, then packs parameter guidance and return shape into dense parentheticals. Every clause is informative, though the inline formulas and symbol notation make it heavier than ideal for quick scanning.
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 computation tool with 7 params, no output schema, and no annotations, the description is largely complete: it defines the rating method, unit system, return keys, mutually exclusive pitch/chain-number paths, and the k_r escape hatch. It only leaves the exact meanings of the required geometric/speed inputs implicit.
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 several parameters: chain_pitch_mm (matching add_sprocket), chain_number examples ('40','60'), strands scaling, k_r override values, and power units. It under-explains the two required params (teeth_small, speed_rpm), which are only inferable from the N1/n1 symbols in the formulas.
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 with the governing standard: 'Rate an ANSI roller-chain drive (ASME B29.1)'. Names the two internal rating envelopes (link-plate fatigue, roller impact) and the output, so an agent can distinguish it from belt_drive and gear_rating 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?
Gives parameter-selection guidance ('Give chain_pitch_mm ... OR a chain_number') and ties chain_pitch_mm to add_sprocket, which is useful context. However, it never states when to pick this tool over the adjacent belt_drive/gear_rating rating tools, nor any speed/validity exclusions. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chamfer_edgesA
Chamfer (bevel) specific edges of a shaped Part object — the direct-shape counterpart to fillet_edges.
handle: handle of the object to chamfer (e.g. 'box_1', a boolean result). edges: non-empty list of edge references. Each may be a tag ('e_...' from list_edges, preferred), an 'EdgeN' string, or a bare 1-based integer index. size: symmetric chamfer leg distance in mm (applied equally to both faces meeting at the edge, i.e. dist1 = dist2 = size). Must be > 0. Default 1.0. name: label for the resulting feature object. Default 'Chamfer'. per_edge: add the edges one at a time, validating after each, instead of in a single apply. Slower; for geometry known to be blend-hostile. allow_partial: accept a partial result instead of aborting. Off by default.
The base object is hidden (consumed into the chamfer feature). Validated exactly like fillet_edges (issue #283) — Shape.isValid(), unchanged solid count, no growth of the tight bounding box — before a handle is issued.
Returns {handle, name, volume (mm^3), edges (resolved 1-based indices actually chamfered), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode ('batch' | 'per_edge'), partial}; when partial is True, also skipped_edges and a warnings entry. On a failed check the feature is removed from the document and BlendCheckFailed is raised naming the offending edges — never a handle to corrupt geometry.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Chamfer | |
| size | No | ||
| edges | Yes | ||
| handle | Yes | ||
| per_edge | No | ||
| allow_partial | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden and does so well: it discloses that the base object is hidden/consumed, that validation runs (isValid, unchanged solid count, bounded envelope growth) before a handle is issued, and that on failure the feature is removed and BlendCheckFailed is raised rather than returning a handle to corrupt geometry. Failure and partial-result semantics are unusually explicit.
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 a tidy per-parameter block, then behavior and return shape—easy to scan. Slight redundancy in restating schema defaults (1.0, 'Chamfer') keeps it just short of maximal conciseness, but no sentence is wasted.
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?
Despite no output schema, the description specifies the full return object (handle, name, volume, resolved edges, checks, mode, partial plus warnings) and all failure paths. Nothing an agent needs to invoke or interpret this mutation 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 documents all six parameters with meaning, defaults, and constraints (size in mm with dist1=dist2, edges accepting tags/EdgeN/integer indices, per_edge and allow_partial behavior). This is exactly the compensation a 0%-coverage schema 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?
States a specific verb+resource ('Chamfer (bevel) specific edges of a shaped Part object') and immediately anchors it against a sibling by calling it 'the direct-shape counterpart to fillet_edges'. An agent can distinguish it from fillet_edges and from partdesign_chamfer 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?
The 'direct-shape counterpart to fillet_edges' framing gives clear context for when this tool applies, and it explains when to reach for per_edge ('geometry known to be blend-hostile') and allow_partial. It stops short of explicitly routing between chamfer_edges and the sibling partdesign_chamfer, so there is no stated when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_impactA
The where-used impact report for a set of changed items over a lockfile graph
(issue #142, C3) — surfaces the §9 stale set as an item-level impact report
BEFORE a change is committed.
lockfile: path to the lockfile (the §9 dependency graph). changed: the list of changed item / component ids (an ECO's affected set).
Returns {changed, stale (the §9 immediate re-dispatch consumers), where_used (the full transitive blast radius), ok (true iff nothing is impacted)}.
| Name | Required | Description | Default |
|---|---|---|---|
| changed | Yes | ||
| lockfile | Yes |
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 returned structure (changed, stale, where_used, ok) and that it is a pre-commit report, which implies a safe read, but it never explicitly states side effects, permissions, or performance/cost characteristics.
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 and a clean parameter/Returns breakdown, but the internal references (issue #142, C3, §9) add noise that an agent cannot act on, and 'where-used' in the opening muddies the distinction from the where_used sibling.
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 must explain returns — and it enumerates each field with meaning, covering the essential contract. Parameters are also explained, so the definition is largely sufficient for a 2-param analysis 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% (schema exposes only types), so the description must compensate — and it does: lockfile is explained as the dependency-graph path and changed as the ECO's affected item/component ids. This adds real semantic meaning beyond the raw string/array types, though the id format is not specified.
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: an impact report over a lockfile graph for a set of changed items, computed before commit. It is reasonably distinguishable from the sibling where_used (this one is change-driven and pre-commit), though the heavy internal jargon ('§9 stale set', 'issue #142, C3') obscures rather than clarifies the core purpose.
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 timing context ('BEFORE a change is committed'), which implies when to call it, but never names alternatives such as where_used or lifecycle_classify_change, nor states when-not to use it. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_airtight_pathA
Functional check for an enclosed-flow part (a vacuum adapter, manifold,
duct): is there a single connected void joining the inlet to the outlet,
bounded by solid everywhere else? This catches what check_shape cannot — a
watertight solid can still have a blocked flow path or a hidden leak.
Inspection only: measures, returns no handle, mutates nothing.
handle: the part to inspect. inlet / outlet: a face reference naming each port OPENING (the rim face around the hole) — an f_* tag, 'FaceN', int index, or a role/name declared with annotate_face (e.g. "inlet"). Both ports are sealed with cap solids and the negative-space void is analysed. min_aperture_mm2: optional minimum acceptable bottleneck cross-section; a connected-but-pinched path (a near-zero 'almond slit') then fails. pad_mm: optional bounding-box margin (default max(2.0, 0.05*diagonal)).
Returns a dict (lengths mm, areas mm², volumes mm³): ok (bool) connected AND not leaky AND aperture >= threshold status (str) 'airtight' | 'bottleneck' | 'blocked' | 'leaky' connected (bool) one void joins inlet and outlet leaky (bool) with both ports capped the cavity still reaches ambient, so an unintended opening exists min_aperture_mm2 (float|null) narrowest section of the flow void bottleneck_point ([x,y,z]|null) a point on the narrowest section plane flow_void_volume_mm3 (float|null) volume of the connecting void void_components (int) number of void solids (ambient + enclosed) inlet / outlet (str) the resolved 'FaceN' references pad_mm (float) the margin used
| Name | Required | Description | Default |
|---|---|---|---|
| inlet | Yes | ||
| handle | Yes | ||
| outlet | Yes | ||
| pad_mm | No | ||
| min_aperture_mm2 | 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 does so: 'Inspection only: measures, returns no handle, mutates nothing' discloses the safety profile. It further explains the mechanism (both ports sealed with cap solids, negative-space void analysed) and the meaning of each status value, which is behavior an agent could not infer from the 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?
Long but front-loaded: the purpose sentence comes first, then per-parameter and per-return-field blocks. Given 0% schema coverage and no output schema, the length is largely earned. The 'Returns a dict' block is dense but structured; only minor trimming (e.g. parenthetical elaborations) would be 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?
With no annotations, no output schema, and 0% param coverage, the description supplies everything an agent needs: inputs with formats and defaults, the capping/analysis method, the full return dict with field types and meanings, and the pass/fail semantics via `ok` and `status`. Nothing material is missing for correct invocation or interpretation.
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: `handle` is the part to inspect; `inlet`/`outlet` are defined as rim-face references with the four accepted forms (f_* tag, 'FaceN', int, annotate_face role); `min_aperture_mm2` sets a bottleneck threshold with the 'almond slit' failure case; `pad_mm` documents its default formula. Each param gets 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?
States a precise verb+resource ('functional check for an enclosed-flow part') and names the exact question it answers (single connected void joining inlet to outlet). It explicitly distinguishes itself from the sibling `check_shape` — 'catches what check_shape cannot' — so an agent can route between them 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?
Gives a clear selection rule against the closest sibling (`check_shape`) via the watertight-vs-flow-path distinction, and notes the tool is inspection-only. It does not enumerate when NOT to use it (e.g. open-channel or non-enclosed parts), leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_shapeA
Check a shaped object's geometry validity and topology before you build on it. Inspection only — measures, returns no handle, mutates nothing, and does NOT auto-repair. Use it as a guard after booleans/sweeps/imports to confirm you have one clean watertight solid.
Note: a watertight solid can still have a BLOCKED or LEAKY enclosed-flow path — watertightness says the shell is closed, not that an internal channel is unobstructed and leak-free. For ducts/manifolds/adapters use check_airtight_path(inlet, outlet) to verify the flow path.
handle: the object to inspect.
Returns a dict (volumes in mm3): valid (bool) OCC topology/geometry is sound watertight_solid (bool) exactly one solid AND valid AND closed — the 'safe to keep building' verdict shape_type (str) e.g. 'Solid', 'Shell', 'Compound', 'Wire' closed (bool) no free boundary edges solids (int) number of solids (want 1 for a part) shells (int) number of shells faces (int) number of faces edges (int) number of edges volume_mm3 (float) total volume (0 for open/2D shapes) is_null (bool) the shape is empty check (str) present only when valid is False — diagnostics were printed to the worker log check_error (str) present only if the diagnostic pass itself raised
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
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: 'Inspection only — measures, returns no handle, mutates nothing, and does NOT auto-repair.' It also clarifies the crucial semantic caveat that watertightness does not imply an unobstructed internal path, and discloses when diagnostic fields appear.
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?
Content is front-loaded with the intent, guard usage, and caveat before a well-structured field-by-field return list. It is somewhat long, but nearly every line (repair disclaimer, airtight caveat, conditional fields) earns its place for an inspection 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, so the description compensates by fully enumerating and explaining the returned dict fields (valid, watertight_solid, shape_type, closed, solids, volume_mm3, check, check_error). Nothing an agent needs to interpret the result or know the tool's limits 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?
The single required handle param has 0% schema coverage, so the description must compensate. It does so adequately with 'handle: the object to inspect,' which conveys the parameter's role, though it adds no format or acquisition guidance (e.g., where handles come from).
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 ('Check a shaped object's geometry validity and topology') and immediately scopes it against siblings by pointing ducts/manifolds/adapters to check_airtight_path. An agent can distinguish this inspection tool from the flow-path checker 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?
It gives an explicit when ('use it as a guard after booleans/sweeps/imports to confirm you have one clean watertight solid') and names the alternative tool (check_airtight_path(inlet, outlet)) for the case where the concern is an internal channel rather than shell closure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cht_channel_submitA
Conjugate heat transfer via Elmer (P3 M6 frontier), asynchronous — ONE solve spanning a plug-flow fluid channel AND a conducting solid wall coupled at their shared interface. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising.
Builds the two-body channel (constant outer flux_w_m2, inlet Dirichlet
t_in_c, all else adiabatic) whose gates are exact WITHOUT a Nusselt
correlation: the outlet bulk temperature follows the energy balance
q″·L = ṁ·c_p·ΔT and the solid-layer drop is q″·t/k. Defaults are the
live-validated water channel (cell Péclet ≈ 9 — the builder rejects > 25, where
stabilized advection visibly leaks the energy balance). Also accepts a prepared
case_dir.
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, t_outlet_mean_c, t_out_exact_c, energy_balance_ratio (≈1, ±3%), dt_solid_k, dt_solid_exact_k, solid_drop_ratio (≈1), pe_cell, case_dir}.
| Name | Required | Description | Default |
|---|---|---|---|
| nx | No | ||
| sif | No | case.sif | |
| t_in_c | No | ||
| k_fluid | No | ||
| k_solid | No | ||
| case_dir | No | ||
| cp_fluid | No | ||
| length_m | No | ||
| ny_fluid | No | ||
| ny_solid | No | ||
| flux_w_m2 | No | ||
| rho_fluid | No | ||
| velocity_m_s | No | ||
| fluid_height_m | No | ||
| solid_thickness_m | 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 richly: asynchronous execution, an explicit degradation contract instead of a raise, the job_id/status/cache_hit return shape, the required polling step, and expected ranges for the physics gates (energy_balance_ratio ≈1 ±3%, solid_drop_ratio ≈1). It even discloses a known modeling failure mode (stabilized advection leaking the energy balance above Pe 25).
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 definition, then risk/behavior, then returns — a sensible ordering. It is dense and jargon-heavy with some run-on sentences, but nearly every clause conveys operative 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?
No output schema and no annotations exist, so the description must cover the return contract, which it does (both the degradation dict and the job_result fields with units and expected ratios). The residual gap is that mesh-resolution parameters and the sif filename are never explained for a 15-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% across 15 parameters, so the description must compensate and it partially does — flux_w_m2, t_in_c, k, t, cp, rho, velocity and length are tied to the energy-balance and solid-drop formulas, and case_dir is explained. But nx, ny_fluid, ny_solid, and sif receive no meaning in either the schema or the description, leaving several knobs 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+resource ('Conjugate heat transfer via Elmer ... ONE solve spanning a plug-flow fluid channel AND a conducting solid wall coupled at their shared interface') and pins down the exact two-body configuration built. An agent can distinguish this from cht_graetz_submit or thermal_transient_submit 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?
Gives clear operative context: requires ElmerSolver, degrades to a {ok:false, reason, install} dict rather than raising, accepts a prepared case_dir, and the applicability regime is bounded (cell Péclet ≈ 9, builder rejects > 25). It does not explicitly name an alternative sibling or state when to prefer cht_graetz_submit over this, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cht_graetz_submitA
Flow-coupled Graetz channel via Elmer (SIMULATION_NEXT B4), asynchronous — the TRUE Nusselt validation that upgrades cht_channel_submit's plug flow: FlowSolve computes the real laminar profile and HeatSolver rides on it (Convection = Computed) between two isothermal walls. Requires ElmerSolver; when absent this returns {ok:false, reason, install} rather than raising.
Two gates: the solved parabola's u_max/u_mean ≡ 3/2 exactly, and the developed
mixing-cup decay d ln(T_wall−T_bulk)/dx fitted over the second half of the
channel yields Nu, gated against the Graetz eigenvalue Nu_T = 7.5407 (parallel
plates, constant wall temperature) — a slug profile would give π² = 9.87, so
the gate also proves the profile coupling is real. This closes the loop with
the h_estimate correlation screen. The writer polices Re < 400, development
lengths inside the first 45 %, and cell Péclet ≤ 25. Also accepts a prepared
case_dir.
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, u_max_over_mean (≈1.5), nu_fit, nu_exact, nu_ratio (≈1, ±10 %), nu_slug, reynolds, prandtl, pe_cell, case_dir}.
| Name | Required | Description | Default |
|---|---|---|---|
| nx | No | ||
| ny | No | ||
| sif | No | case.sif | |
| gap_m | No | ||
| t_in_c | No | ||
| k_fluid | No | ||
| case_dir | No | ||
| cp_fluid | No | ||
| length_m | No | ||
| mu_fluid | No | ||
| t_wall_c | No | ||
| rho_fluid | No | ||
| velocity_m_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it discloses async behavior, the ElmerSolver dependency and its graceful {ok:false, reason, install} failure mode, the two validation gates, the writer's Re<400/development-length/cell-Péclet policing, and the exact returned dict fields. It stops short of documenting rate limits or job-concurrency behavior, but this is rich disclosure for an async submit 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?
It is information-dense and front-loads the core purpose, but it is sprawling and overloaded with domain jargon, nested parenthetical equations, and asides. Some sentences (the gate explanation, the return-field enumeration) earn their place, but the whole is longer than needed for an agent to act.
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 output schema and 0% schema coverage across 13 params, the description does explain the return dict fields well, which is valuable. However, it leaves the majority of input parameters' meanings and units undocumented, and there is no sibling-parameter disambiguation, so the definition is not fully complete for an agent to invoke it correctly without guessing.
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 13 parameters, so the description must compensate—but it only mentions `case_dir` (as an alternative input) and geometric/flow concepts implicitly (gap, Re, Péclet) without mapping them to parameters like nx, ny, gap_m, velocity_m_s, mu_fluid. Most parameters remain undocumented in both schema and description, a clear gap for a 13-param tool.
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: a flow-coupled Graetz channel simulation via Elmer, explicitly positioned as the 'TRUE Nusselt validation that upgrades cht_channel_submit's plug flow.' It distinguishes itself from the sibling cht_channel_submit by naming the coupling upgrade, though the phrasing is dense and requires domain familiarity to parse.
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 states when to use it (when you need the real laminar profile and Nu validation, versus cht_channel_submit's plug flow) and gives a when-not implicitly via the ElmerSolver dependency. The gate on Nu_T=7.5407 and the slug comparison provide strong context, but it doesn't spell out the alternative path when ElmerSolver is absent beyond mentioning the degradation dict.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classify_face_sidesA
Inside-vs-outside topology: for every face, decide whether its outward side opens into an enclosed cavity (wetted) or ambient (exterior). Answers the "which faces are inside the airflow path" question from issue #19 and suggests a role per face. Inspection only; returns no handle, mutates nothing.
With seal_ports=True (default) any declared inlet/outlet roles (annotate_face) are capped first, so an OPEN duct's bore reads as the enclosed flow cavity rather than as ambient.
handle: the part. seal_ports: cap declared inlet/outlet before classifying.
Returns a list (one per face) of dicts: tag / index (str) stable f_* tag and 'FaceN' kind (str) surface kind (planar/cylindrical/…) side (str) 'interior' | 'ambient' | 'ambiguous' suggested_role (str) 'wetted' for interior, 'ambient' for exterior, else null declared_role (str) the role already annotated on this face, if any
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| seal_ports | 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 declares the tool read-only, returns no handle, and mutates nothing. It also discloses the non-obvious seal_ports interaction that caps declared roles before classifying, which is real behavior beyond the schema. It does not discuss cost, permissions, or failure modes.
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 concept, then the seal_ports nuance, then the return shape. The return-value block is verbose but earns its place since there is no output schema. Minor redundancy ('returns no handle, mutates nothing' plus 'Inspection only').
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, no-annotation, no-output-schema tool, the description supplies everything needed: the classification semantics, the seal_ports behavior, and a full field-by-field breakdown of the returned list of dicts (tag/index/kind/side/suggested_role/declared_role). Nothing an agent needs to call or interpret the tool 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: handle is described as 'the part' and seal_ports as 'cap declared inlet/outlet before classifying', including what the default=True does. Both 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?
States a specific verb+resource ('classify_face_sides' → decide whether each face's outward side opens into an enclosed cavity or ambient) and frames the exact question it answers ('which faces are inside the airflow path'). An agent can distinguish it from annotate_face/list_face_roles, which deal with declared roles rather than topology classification.
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?
Clearly scopes the operation ('Inspection only; returns no handle, mutates nothing') and explains the conditional behavior of seal_ports=True, including why it matters for open duct bores. It stops short of naming explicit alternatives it should be used instead of, so it is strong context without formal exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_documentA
Close a document by name (or 'active' for the currently active one). Frees its objects and invalidates any handles into the closed doc. Returns {closed, invalidated_handles}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | active |
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 important side effects: it frees objects and invalidates handles, and it describes the return shape. It does not mention permissions or error cases, but the core destructive behavior is 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?
Two short sentences, front-loaded with the core purpose, followed by side effects and return shape. No wasted words; 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?
Given the tool's simplicity, no annotations, and no output schema, the description covers purpose, parameter special value, side effects, and return shape. It does not mention whether closing without saving discards changes, which is a minor gap for a destructive 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% for the single parameter, so the description must compensate. It does so by explaining that 'name' can be a document name or 'active' for the currently active one, adding meaning beyond the raw schema 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?
States a specific verb 'Close' and resource 'document' clearly, and distinguishes from siblings like close_sketch and close_workspace. The scope is precise enough that an agent can identify 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 does not state when to use this tool versus alternatives, nor does it provide prerequisites or exclusions. It only implies usage by explaining the 'active' parameter value, which is more about parameter semantics than tool selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_sketchD
Recompute and report DOF status. Returns {geometry_count, constraint_count, open_vertices, fully_constrained}.
| Name | Required | Description | Default |
|---|---|---|---|
| sketch | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It does say it recomputes and reports DOF status and lists a return shape, but it does not disclose whether this mutates the sketch, whether it finalizes/closes it (as the name implies), what permissions or state are needed, or 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?
It is short and front-loads the core action, but the second sentence is a raw return-shape listing that would be better placed in an output schema. Still, the text is 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 sketch-finalization/DOF tool with no annotations, no output schema, and 0% parameter documentation, the description is inadequate. It omits the tool's actual behavior and leaves the agent guessing about the primary 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% for the single required 'sketch' parameter, and the description gives no information about it (e.g., what form of identifier it expects). 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 name suggests closing a sketch, but the description says 'Recompute and report DOF status' – it never states the tool closes or finalizes a sketch. This is confusing for an agent choosing among sketch tools, and the description does not distinguish it from the many other sketch/analysis 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?
No guidance on when to use this tool versus alternatives. It gives no prerequisites, no context, and no comparison to siblings like add_sketch_constraint or solve_capabilities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_workspaceA
Shut down a workspace's worker and free its pool slot. All of that workspace's documents, unsaved changes, and handles are lost. Closing the workspace you are currently in returns you to the "default" workspace. The default workspace can be closed too (its worker respawns clean on next use). Returns {closed: , workspace: , current: }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
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 irreversible loss of documents, unsaved changes and handles, the side effect of switching back to 'default', and the respawn behavior of the default worker. It stops short of permission/auth requirements or error behavior for an invalid name.
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 its destructive consequence, then the edge-case behaviors, then the return shape. Every sentence carries information; slightly dense but no 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 destructive one-param tool with no annotations and no output schema, the description covers the action, the data loss, the current-workspace side effect, the default-workspace case, and even the return shape inline. Only the invalid-name/error path 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?
One parameter at 0% schema coverage, so the schema contributes nothing. The description implies the parameter is the workspace name and even reveals that 'default' is a valid target, which is genuine added value, but it never explicitly defines the argument or its valid values.
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 (shut down) and resource (a workspace's worker plus its pool slot), and implicitly distinguishes itself from close_document by scoping destruction to 'all of that workspace's documents, unsaved changes, and handles.' An agent can tell it apart from the sibling document-level close 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?
Gives clear situational context: it explains what happens when you close the workspace you are currently in (return to 'default') and that the default workspace may also be closed. It never explicitly names close_document or use_workspace as alternatives, so there is clear context but no stated exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cnc_machinability_checkA
3-axis CNC machinability screen off a live solid — pure geometry, NO CAM engine (no toolpath, no gouge check, no holder collision).
Counts SETUPS from a tool-approach census: for every machined face, which of ±X/±Y/±Z can both address it (the normal does not point away — a wall parallel to the tool axis is milled by the cutter's periphery) and reach it (a ray from the face escapes the solid, the same caster the moldability undercut check uses), reduced to a minimum cover. Faces lying on the stock envelope are excluded: they are billet surfaces, and counting them would quote six setups for a plain block.
Findings: 'undercut' (a machined face no principal approach reaches — 5-axis, a
special cutter, or a redesign), 'deep_pocket' (depth/(2·corner radius) past
max_l_over_d — the corner radius caps the cutter and it cannot reach),
'small_radius' (an internal corner below the smallest cutter quoted, including a
SHARP planar corner reported as radius 0, which no rotating tool can produce),
'thin_wall'. pass is false when any fires; more than max_setups is a warning,
not a failure. fidelity='correlation', band_pct=None (an ordinal screen — rank
variants with score, don't gate on it).
Returns {setups, setup_directions, coverage, machined_faces, stock_faces, machined_area_mm2, min_internal_radius_mm, max_l_over_d_seen, undercut_faces, findings:[{code, severity, feature, detail}], warnings, score, pass, fidelity, band_pct, basis, escalate_to='cnc_time_estimate', limitations, n_faces}.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| max_setups | No | ||
| min_wall_mm | No | ||
| max_l_over_d | No | ||
| min_tool_radius_mm | No |
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 what is counted (setups from a tool-approach census), what is excluded (stock envelope faces), specific finding codes and their meanings, the pass/fail logic, fidelity limitations ('ordinal screen — rank variants, don't gate'), and what is not computed (no CAM engine). This exceeds typical transparency 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?
The description is long but front-loads the core purpose and then organizes detail into a census explanation, findings list, and return-object summary. Every sentence adds technical substance needed for a complex screen with no output schema. It is dense rather than wasteful, though readability suffers slightly from packed jargon.
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 high complexity, no output schema, and zero parameter descriptions in the schema, the description supplies a comprehensive return-field list, finding semantics, pass/warning distinction, fidelity limitations, and escalation path. Nothing essential for invoking or interpreting the tool appears 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. It indirectly references max_l_over_d in the deep_pocket finding and min_tool_radius via 'small_radius', and mentions max_setups as a warning threshold, but it does not explicitly define min_wall_mm or clarify the units, defaults, or exact effect of each parameter. Partial compensation for a 5-parameter tool.
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: '3-axis CNC machinability screen off a live solid — pure geometry, NO CAM engine.' It distinguishes itself from the CAM-oriented sibling cnc_time_estimate by clarifying that no toolpath, gouge check, or holder collision is performed. An agent can immediately tell what the tool does and does not do.
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 provides clear context for use: it is an ordinal geometry screen, not a gate, and directs escalation to 'cnc_time_estimate' via escalate_to. It also warns that more than max_setups is a warning, not a failure. However, it does not explicitly contrast itself with other DFM or screening siblings like dfm_check, moldability_check, or dfa_check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cnc_time_estimateA
Machining time for a live solid from a material-removal-rate model — the
honest cnc machine time cost_estimate's flat volume table cannot give.
stock = bbox grown by stock_allowance_mm per side
roughing_min = (stock − part volume) / MRR(material)
finishing_min = machined face area / finish area-rate(material)
total = (roughing + finishing)/utilisation · tolerance factor
+ setups · setup_minMRR is per material class (aluminium 60, steel 12, stainless 6, titanium 2.5
cm³/min …) — ratios that track the standard machinability ratings amplified by
the depth-of-cut headroom a soft alloy allows on the same spindle. Stock-envelope
faces are excluded from the finishing area: facing a billet is not finishing a
pocket. setups defaults to the count cnc_machinability_check derives from the
same solid, so the two tiers agree. tolerance_class ('IT7', 7, …) scales the
cutting time through the shared tolerance-cost corpus, so a tolerance costs the
same here as in tolerance_cost_check.
fidelity='correlation', band_pct=50 — the RSS of MRR scatter (±40 %) and
cut-time utilisation scatter (±25 %), against the flat table's ±100 %; supply a
measured mrr_cm3_min and it tightens to 30. Feed machine_time_hr into
cost_estimate(machine_time_hr=…) to replace the table there too.
Returns {machine_time_min, machine_time_hr, roughing_min, finishing_min, cutting_min, setup_min_total, removed_volume_mm3, stock_volume_mm3, removal_fraction, machined_area_mm2, setups, setups_basis, material_class, material_basis, mrr_cm3_min, finish_cm2_min, utilisation, tolerance, bbox_mm, part_volume_mm3, fidelity, band_pct, basis, warnings, next}.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| setups | No | ||
| material | Yes | ||
| setup_min | No | ||
| mrr_cm3_min | No | ||
| utilisation | No | ||
| finish_cm2_min | No | ||
| tolerance_class | No | ||
| stock_allowance_mm | 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 so well: it explains the MRR model, stock envelope, exclusion of stock faces from finishing area, setups defaulting to cnc_machinability_check, tolerance scaling, fidelity band, and output fields. It still does not state whether the operation is strictly read-only, what permissions are needed, or what failure modes occur beyond 'warnings'.
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 front-loads the purpose and then uses a compact formula block and focused paragraphs. For a 9-parameter estimation tool with no annotations and no output schema, most of the detail earns its place, though the material and fidelity exposition is richer than strictly needed 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 the tool's complexity, 9 parameters, no annotations, and no output schema, the description is largely complete. It enumerates return fields such as machine_time_min, roughing_min, removal_fraction, and warnings, and documents dependencies on cost_estimate and cnc_machinability_check. Minor gaps remain around permissions and exact input formats.
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 9 parameters, so the description must compensate; it substantially does. It explains stock_allowance_mm, material, setups, mrr_cm3_min, utilisation, setup_min, and tolerance_class, and treats model as a live solid. It leaves finish_cm2_min only implicitly defined through the finishing formula and does not explain all defaults, keeping it short of perfect.
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: estimating machining time for a live solid from a material-removal-rate model. It directly distinguishes itself from cost_estimate's flat volume table, so an agent can tell why this tool exists and when it differs from a sibling.
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 clear context by contrasting this tool with cost_estimate's flat table and by referencing cnc_machinability_check for setups and tolerance_cost_check for tolerance scaling. It also says to feed machine_time_hr into cost_estimate, which is actionable usage guidance. However, it never states an explicit 'do not use this when' condition or a clean if/then alternative selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
component_contract_checkA
Builder-side contract gate for one component (issue #169) — the local half of
the gate merge_assembly re-runs at fan-in. Any MCP host builds a component with
the full AnkusDrive tool surface, then calls this on its part BEFORE saving,
against its builder brief (a ankusdrive.builder_brief/1 slice), and repairs any
failing check. Catching a violation here turns the expensive loop (build → merge
→ gate-fail → rebuild) into a cheap local one. Never raises on a failing check.
handle: the component's shaped object. brief: a builder brief. Only three of its keys drive checks (the rest guide the build, not the gate): envelope {min:[x,y,z], max:[x,y,z]} the part's LOCAL bbox must fit inside. interfaces {name: {origin?:[x,y,z], z_axis?:[x,y,z], tol_mm?, angle_tol_deg?}} each named frame must be PUBLISHED (publish_interface) with a sane frame, and within tolerance of a pinned origin/axis if the brief gives one. performance {requirements?: [{name, limit}], required?: bool} the quantitative spec (#226) the builder must DECLARE (declare_performance, no looser than briefed) and PROVE (verify_performance) before fan-in.
Checks run: watertight (check_shape's one-clean-solid verdict), envelope (local bbox inside the keep-out box), interface: (published + sane + in tol), performance_spec: (declared as briefed) and performance: (the last RECORDED verify_performance verdict says it is met).
A performance requirement the record says is NOT met fails the gate. One with no
verdict yet — never verified, a solve still in flight, or a verdict invalidated by a
later edit — is neither passed nor failed: it comes back in skipped with a reason,
because "unverified" is not "fine" and must not be actioned as either.
Returns {handle, ok, checks:[{check, passed, detail}], reasons:[...],
skipped:[{check, reason}], performance?} — ok True iff every check passed (skips
never move it); reasons is the failing checks' details. A part that declares no
performance contract gets no performance rows, empty skipped and no performance
key, so the geometric gate is unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | ||
| handle | Yes |
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 richly: never raises on a failing check, ok is True iff every check passed, skips never move it, and unverified performance requirements return in `skipped` rather than passing or failing. It also enumerates the exact checks run and the meaning of ok/reasons/skipped/performance.
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 and workflow position, then structured into labeled blocks for handle, brief keys, checks run, and return shape. It is long, but for a tool with nested objects and 0% schema coverage most of the text earns its place; a little prose repetition 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?
Complete for this complexity: it explains the checks, the skip-vs-fail semantics, the return object, and the edge case where a part with no performance contract gets no performance rows and an unchanged geometric gate. 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 does: handle is 'the component's shaped object', and brief is a builder_brief/1 slice with its three gate-relevant keys (envelope, interfaces, performance) each explained with field shapes and 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: a builder-side contract gate for one component, and explicitly positions itself as the local half of the gate that merge_assembly re-runs at fan-in. An agent can distinguish it from merge_assembly, envelope_check, verify_contract, and interface_align_check 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?
Gives clear when-to-use context: call it after building a component but BEFORE saving, against the builder brief, and repair failing checks, to convert an expensive build→merge→gate-fail loop into a cheap local one. It stops short of naming explicit alternatives or when-not conditions, but the workflow placement is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contact_setupA
Set up surface-to-surface contact between face pairs for a CalculiX solve and
flip the solver to nonlinear — no new solver (promotes the CCX contact/nonlinear
flags the FEM path already exposes). face_pairs is a list of
{a:{handle, tag|face}, b:{handle, tag|face}} (master, slave) pairs; friction is
the Coulomb coefficient (0 = frictionless); slope optionally sets the penalty
contact stiffness; nonlinear (default True) sets the solver's
GeometricalNonlinearity.
Run fem_run + fem_results after. Gate RELATIVE to a bonded reference on the same mesh: a bonded model is stiffer (less peak displacement) than frictional contact. Returns {contacts:[handles], n_pairs, friction, nonlinear}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Contact | |
| slope | No | ||
| analysis | Yes | ||
| friction | No | ||
| nonlinear | No | ||
| face_pairs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. It discloses the mutation to solver nonlinear state, the master/slave ordering of pairs, the frictionless default, and the returned structure. It does not state required permissions or side effects on existing analysis state, leaving a small 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 well but packs parameter explanations, sequencing, a gate heuristic, and a return shape into one dense block. The gate paragraph is arguably tangential to the tool's call contract and adds length without helping invocation correctness.
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 6-param, no-annotation, no-output-schema tool it covers purpose, ordering, most parameter semantics, and return shape. Missing analysis param description and permission/side-effect disclosure, but the critical pieces for correct invocation are present.
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: face_pairs is documented as a list of {a:{handle,tag|face}, b:{handle,tag|face}} master/slave pairs, friction as Coulomb coefficient, slope as penalty stiffness, nonlinear default True, name implied. It omits the 'analysis' parameter 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 ('Set up surface-to-surface contact between face pairs for a CalculiX solve and flip the solver to nonlinear'), and distinguishes from siblings by noting it promotes existing CCX flags rather than adding a new solver. An agent can tell it apart from hertz_contact and fem_add_constraint.
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?
Explicit sequencing guidance: 'Run fem_run + fem_results after' and a gate instruction relative to a bonded reference on the same mesh. Missing explicit when-not-to-use and named alternatives among siblings, 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.
copy_shapeA
Duplicate a shaped object as an INDEPENDENT static solid.
Unlike add_part (which creates an App::Link that tracks the source), this deep-copies the geometry: later edits to the original do NOT propagate to the copy. Use it to seed a mirror/pattern, or to drop a standalone duplicate instance into an assembly.
handle: handle of the source object (must have a Shape). placement: optional absolute [x, y, z] translation in mm applied to the copy's base. Omit to leave the copy coincident with the source. The source object is unchanged and stays visible. name: optional name for the new object (default '_copy').
Returns {handle, name, volume}: handle is a new 'copy_N' handle, name is the FreeCAD object name, volume is the copied solid's volume in mm^3.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| handle | Yes | ||
| placement | 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 discharges most of it: it discloses that this is a deep copy, that edits to the original do NOT propagate, that the source is unchanged and stays visible, and that it returns {handle, name, volume}. It omits any permission/auth or rate-limit context, though those are weakly relevant for a local CAD 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-loaded with the one-line essence, followed by differentiation, use cases, and a per-parameter breakdown. It is a little long, and the parenthetical asides could be trimmed, but nearly every sentence carries information an agent needs.
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 there is no output schema, the description documents the return object ({handle, name, volume} with types), the parameter defaults, and the non-propagation semantics. Nothing an agent needs to invoke and interpret the result 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 it does: handle is qualified ('must have a Shape'), placement is defined as optional absolute [x, y, z] mm with the omit-behavior spelled out ('copy coincident with the source'), and name gets a stated default ('<SourceName>_copy'). This adds real semantics beyond the bare types 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?
States a specific verb ('duplicate') and resource ('shaped object'), and immediately distinguishes itself from the sibling add_part by contrasting a static solid deep-copy against an App::Link. An agent can tell it apart from add_part, scale_shape, mirrored, and linear_pattern 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 (add_part) and the condition that selects between them ('tracks the source' vs 'later edits do NOT propagate'), then gives two concrete use cases (seed a mirror/pattern, drop a standalone duplicate into an assembly). When-to-use and the nearest alternative are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cost_estimateA
Per-unit cost rollup (Design for Cost). material_cost = volume·density·price ·(1+scrap) from the Materials DB (process: cnc | fdm | casting | injection). process_cost = amortized setup + per-process machine time; tooling amortized over quantity, so unit_cost falls as quantity rises. The machine-time table is order-of-magnitude (fidelity='correlation', band_pct=100) — trust the ratios between processes/quantities, not the absolute dollars; material_cost alone is exact given its inputs.
material may be any Materials-DB card name (material_list / material_get), or
anything at all if you price it yourself: price_usd_kg and density_kg_m3
override the DB lookup and are flagged in breakdown.price_basis /
density_basis as 'explicit' instead of 'material'. A generic word like
'aluminum' is a CATEGORY, not a card — it carries a density but no price, so it
needs price_usd_kg or a real card name (AL6061-T6, …); the error says which.
Two optional inputs sharpen it. tolerance_class ('IT7', '9', …) scales the
TABLE machine time by the tolerance-cost curve (see tolerance_cost_check):
holding tighter than the process's natural capability roughly doubles cost every
1.5 IT grades. machine_time_hr REPLACES the table with a time a real model
computed (cnc_time_estimate) and drops band_pct from 100 to that model's band
(50 by default, or machine_time_band_pct); the tolerance factor is then not
applied again, because cnc_time_estimate already applied the same curve.
Both default to None, reproducing the pre-existing behaviour exactly.
Returns {material_cost, process_cost, tooling_amortized, unit_cost, mass_kg, fidelity, band_pct, breakdown:{…, density_kg_m3, price_usd_kg, density_basis, price_basis, machine_time_hr, machine_time_basis, base_machine_time_hr, tolerance_class, tolerance_factor, tolerance_applied, tolerance_basis}}. Errors on a material with no usable density/price and no override, an unknown process/tolerance class, or a non-positive volume/quantity/machine time.
| Name | Required | Description | Default |
|---|---|---|---|
| process | No | cnc | |
| material | Yes | ||
| quantity | No | ||
| setup_min | No | ||
| volume_mm3 | Yes | ||
| tooling_usd | No | ||
| price_usd_kg | No | ||
| density_kg_m3 | No | ||
| scrap_fraction | No | ||
| machine_time_hr | No | ||
| tolerance_class | No | ||
| machine_rate_usd_hr | No | ||
| machine_time_band_pct | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does: it discloses the fidelity caveat ('order-of-magnitude', fidelity='correlation', band_pct=100), which outputs are exact vs approximate, that unit_cost falls with quantity, that the tolerance factor is not double-applied when machine_time_hr is given, and enumerates the exact error conditions. This is unusually rich behavioral 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?
Dense multi-paragraph prose packed with useful facts, but it is long and hard to scan; the fidelity caveat and formula context are not front-loaded ahead of the return-shape enumeration. Every sentence roughly earns its place, yet the density hurts quick 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 13-parameter, annotation-free, output-schema-free tool, the description spells out inputs, override behavior, approximate vs exact outputs, the full return structure and the error cases. 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?
With 0% schema description coverage across 13 params, the description compensates well: the cost formulas map volume, density, price, scrap and setup/machine time to their roles, the process enum is enumerated (cnc | fdm | casting | injection), and material/override/tolerance/machine_time params get detailed semantics. Gaps remain for machine_rate_usd_hr, tooling_usd and quantity, which are only implied.
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 ('Per-unit cost rollup'), names the decomposition (material_cost, process_cost, tooling_amortized, unit_cost) and the Design-for-Cost framing. An agent can distinguish this cost model from cnc_time_estimate, tolerance_cost_check and mass_properties 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?
Gives clear conditions for the optional inputs: use price_usd_kg/density_kg_m3 to override the DB, tolerance_class to sharpen via the tolerance-cost curve, machine_time_hr to replace the table with cnc_time_estimate output. It points at sibling tools (material_list, material_get, cnc_time_estimate, tolerance_cost_check) but never states explicit exclusions such as 'do not use this for X'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creep_flagA
Screen for creep risk: compare operating temperature to the material's max service temperature (Materials DB, or an override). A screen, not a Larson-Miller life model. pass = below the service limit. Returns {operating_temp_c, service_temp_c, margin_c, stress_mpa, creep_risk, pass, reason}.
| Name | Required | Description | Default |
|---|---|---|---|
| temp_c | Yes | ||
| material | No | Steel-1045 | |
| stress_mpa | Yes | ||
| max_service_temp_c | 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 the data source (Materials DB or override), the classification semantics (pass = below the service limit), and enumerates the returned fields. It omits any note on permissions, determinism, or what happens when the material is absent from the DB.
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?
Three tight sentences: purpose first, scope boundary second, contract third. The return-field list is dense but functional and nothing is wasted.
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 no annotations and no output schema, the description covers what the tool computes, the pass semantics, and the response shape. The remaining gap is that stress_mpa's influence on the result and the override precedence are only inferable.
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: it maps temp_c to 'operating temperature', the material argument to a Materials DB lookup, and max_service_temp_c to the explicit override. Only stress_mpa's role is left unclear (it appears only in the return list), and the Steel-1045 default is not mentioned.
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 — screen for creep risk — and explicitly defines the mechanism (compare operating temp to max service temperature) plus the pass criterion. It also draws a boundary against a more rigorous approach ('not a Larson-Miller life model'), which distinguishes it from analysis 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?
It signals the intended usage tier ('A screen, not a Larson-Miller life model'), which implies when it is appropriate versus a full life model. However, it names no actual sibling tool as an alternative and gives no conditions such as when an override should be supplied instead of the Materials DB lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declare_intentA
Record the functional invariants a part must keep satisfying, so they can be re-checked after every edit (see verify_intent). Persists in the .FCStd as a JSON property bag (AD_Intent); one contract per part — re-declaring replaces.
handle: the part. contract: a dict with any of these (declare at least one): watertight (bool) require check_shape's watertight_solid verdict. airtight_path (dict) {inlet, outlet, min_aperture_mm2?}; each port is a face tag / 'FaceN' / int / declared role-or-name. required_faces (list) face tags / 'FaceN' / declared role-or-names that must still resolve (catches a deleted/drifted face).
Returns {handle, contract} — the stored contract.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| contract | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it states persistence in the .FCStd as a JSON property bag (AD_Intent), that re-declaring replaces the existing contract, and the exact return shape {handle, contract}. It omits validation timing and error behavior for invalid contracts, but the major mutation and storage traits 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 purpose and persistence, then structured into a concise parameter breakdown and a return statement. Every sentence earns its place, and the bullet-style contract documentation is efficient for a zero-coverage 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 no output schema, no annotations, and 0% schema description coverage, the description supplies the missing return shape, storage behavior, replacement semantics, and exhaustive parameter semantics. It is sufficient for an agent to call the tool correctly without opening other documentation.
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 defines handle as 'the part' and fully explains the contract object: allowed keys (watertight, airtight_path, required_faces), their types and meanings, nested fields, accepted face-reference formats, and the requirement to declare at least one. This is far beyond what 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 states a specific verb and resource: 'Record the functional invariants a part must keep satisfying.' It explicitly points to the sibling re-check tool ('see verify_intent') and clarifies the one-contract-per-part scope, so an agent can distinguish this declaration tool from the verification 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?
The description gives clear context: declare invariants so they can be re-checked after every edit, and it names verify_intent as the follow-up tool. It does not provide explicit when-not guidance or distinguish this tool from other contract-related siblings like verify_contract, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
declare_performanceA
Record a quantitative PERFORMANCE spec on a part so it can be re-proved after every edit — the performance twin of declare_intent, which only covers geometry. Persists in the .FCStd as a JSON property bag; one contract per part, re-declaring replaces it.
Each requirement is metric-agnostic — the contract layer only orchestrates, so the metric is whatever the named tool already returns, and "Cd ≤ 0.30", "Δp ≤ 50 Pa", "first mode ≥ 200 Hz" and "ΔT ≤ 40 K" are the same machinery:
{"name": "drag_at_cruise",
"metric": "cd", # dotted path into the tool's result
"tool": "cfd_external_flow_submit", # what measures it at solver tier
"conditions": {"model": "$handle", "velocity_m_s": 30, "fluid": "air-20c"},
"limit": {"max": 0.30}, # max, min, or both (a window)
"screen": {"tool": "cfd_body_drag", "metric": "cd",
"conditions": {"shape": "sphere", "diameter_mm": 50,
"velocity_m_s": 30}},
"fidelity_floor": "solver", # "screen" if an estimate is proof enough
"trust": {"converged": true, "band_max_pct": 5}}"$handle" anywhere in conditions is replaced with this part's handle at
verification time, so a contract is portable between parts. trust demands are
enforced by verify_performance against the solver's own trust block: a requirement
asking for converged: true can never be satisfied by an unconverged solve.
Returns {handle, contract: {requirements: [...]}, n_requirements}. Raises ValueError on a malformed requirement, naming the offending one.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| requirements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does well: it discloses persistence in the .FCStd as a JSON property bag, one-contract-per-part with re-declaring replacing it, $handle substitution at verification time, trust enforcement via verify_performance, and ValueError on malformed requirements. It does not cover permissions or concurrency, but the mutation lifecycle and error behavior are strong.
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 dense JSON example is valuable but the prose and example together are long and somewhat back-loaded; the key scoping facts (twin of declare_intent, one per part, replaces on redeclare) are scattered rather than front-loaded in a single crisp 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 complex, 2-param but structurally rich tool with no output schema, the description covers the contract model, the return shape ({handle, contract, n_requirements}), the trust interaction with verify_performance, and error behavior. Coverage is strong; only the top-level handle parameter and cross-part portability caveats are lightly treated.
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% (schema just lists handle and requirements), so the description must compensate and does: it documents the requirement object structure in detail (name, metric, tool, conditions, limit window, screen, fidelity_floor, trust) and explains $handle substitution and value constraints. The handle parameter itself is only implied.
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 (Record) and resource (quantitative PERFORMANCE spec / contract) on a part, and explicitly contrasts it with the sibling declare_intent ('the performance twin of declare_intent, which only covers geometry'). An agent can distinguish this from declare_intent and verify_performance 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?
Clearly positions the tool relative to declare_intent and verify_performance (internally enforced), and states the persistence/re-declaration semantics. It does not spell out explicit when-not-to-use cases, but the twin framing gives clear selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dem_flow_submitA
Discharge spheres from a flat-bottomed hopper box through a central orifice
with the REAL YADE discrete-element engine and measure the steady mass-flow
rate — gated against granular_screen('beverloo') (flow ∝ outlet^2.5). Submit
two outlet_m sizes and feed the (outlet, flow) pair to
granular_screen('beverloo_exponent') to check the Beverloo 2.5 exponent (vs the
Torricelli 2.0 of a draining fluid). YADE is GPL-3.0 and is run ONLY in a
subprocess; runs OFF the MCP channel via a background job.
box_m is the [Lx, Ly, Lz] hopper box (m; default [0.10, 0.10, 0.20]);
outlet_m the central orifice diameter; settle_steps/flow_steps the DEM
step budgets. Returns {job_id, status, cache_hit, oracle}; the job result
carries the Beverloo oracle PLUS {mass_flow_kg_s, n_discharged,
discharge_time_s, positions:[...]}. Absent YADE: {ok:false, reason, install,
oracle}.
| Name | Required | Description | Default |
|---|---|---|---|
| box_m | No | ||
| density | No | ||
| outlet_m | No | ||
| radius_m | No | ||
| young_pa | No | ||
| n_spheres | No | ||
| flow_steps | No | ||
| friction_deg | No | ||
| settle_steps | No |
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 critical behavior: YADE is GPL-3.0, runs ONLY in a subprocess, and executes off the MCP channel as a background job. It also describes the return shape ({job_id, status, cache_hit, oracle}), the job result payload, and the failure mode when YADE is absent, giving an agent rich operational 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 description is dense but front-loads the core purpose, then moves through workflow, parameters, and returns in a logical order. It is somewhat long and contains minor redundancy around the Beverloo exponent, but no sentence is purely 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 complex asynchronous DEM simulation with no annotations and no output schema, the description covers purpose, workflow, subprocess/installation constraints, return values, and failure behavior. It falls short on fully explaining five input parameters, but the critical operational context needed to invoke and interpret the tool is present.
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 9 parameters, so the description must compensate, but it only clarifies box_m format, outlet_m meaning, and settle_steps/flow_steps budgets. It leaves density, radius_m, young_pa, n_spheres, and friction_deg completely undocumented, forcing the agent to guess their physical meaning and units.
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: discharging spheres from a hopper through an orifice with the YADE DEM engine to measure steady mass-flow rate. It distinguishes itself from the sibling granular_screen by naming the Beverloo gate and the exact follow-up tool, so an agent can identify its role immediately.
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 explicitly says to submit two outlet_m sizes and feed the resulting (outlet, flow) pair into granular_screen('beverloo_exponent') to validate the exponent. This gives clear workflow context and a named alternative, though it does not state when not to use this tool or list all prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dem_pack_submitA
Pour N monodisperse spheres into a box and settle them under gravity with the REAL YADE discrete-element engine, then measure the random close-packing fraction φ of the settled bed — gated against granular_screen('packing') (RCP band 0.60–0.66, well below the crystalline 0.7405). YADE is GPL-3.0 and is run ONLY in a subprocess (the parent never imports it — same arm's-length isolation as the GPL Elmer/OpenFOAM binaries). Runs OFF the MCP channel via a background job, so a multi-second settle never blocks the worker.
box_m is the [Lx, Ly] floor footprint (m; default [0.06, 0.06]); the column
height is sized to hold n_spheres. friction_deg is the inter-particle
friction angle; young_pa the contact modulus; density the grain density.
Returns {job_id, status, cache_hit, oracle} (poll job_status / job_result);
the job result carries the oracle band PLUS the measured {packing_fraction,
in_band, n_settled, settled_height_m, mean_coordination, positions:[[x,y,z,r]]}.
Absent YADE: {ok:false, reason, install, oracle}.
| Name | Required | Description | Default |
|---|---|---|---|
| box_m | No | ||
| steps | No | ||
| density | No | ||
| radius_m | No | ||
| young_pa | No | ||
| n_spheres | No | ||
| friction_deg | 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 richly: YADE is GPL-3.0 and runs only in a subprocess, the job runs off the MCP channel so a multi-second settle never blocks the worker, and it documents the async job_id/status/cache_hit polling contract plus the absent-YADE failure payload.
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 result are front-loaded in the first sentence, and the rest is information-dense rather than padded. The GPL arm's-length isolation aside is somewhat expansive for tool selection but arguably useful transparency.
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 fully specifies the return shape ({job_id, status, cache_hit, oracle}), the async polling path (job_status / job_result), the downstream result fields (packing_fraction, in_band, n_settled, settled_height_m, mean_coordination, positions), and the failure case. Nothing essential for correct invocation 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. It documents box_m (footprint and default), friction_deg (inter-particle friction angle), young_pa (contact modulus), and density (grain density), but steps, radius_m, and n_spheres (only implied via 'N monodisperse spheres') remain 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 chain (pour, settle, measure) on a specific resource (DEM sphere packing of N monodisperse spheres with the YADE engine) and explicitly ties the result to granular_screen('packing') RCP band 0.60–0.66. An agent can immediately distinguish this from siblings like dem_flow_submit or granular_screen.
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: it is the packing-fraction oracle run off-channel as a background job, with a defined fallback when YADE is absent. However, it never explicitly contrasts when to pick this versus dem_flow_submit or pack_check, 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.
designation_checkA
Gate: every purchased part on this assembly must be orderable.
Flags BOM rows a buyer cannot act on — a purchased standard part with no canonical designation, or one whose designation is missing a fact needed to order it (no material grade). Run it before quoting or releasing a package: a BOM whose purchased lines are geometry names silently pushes the sourcing work onto a human, once per revision.
Purchased-ness is EXACT for AnkusDrive-generated parts (the object carries a stamp)
and a documented name heuristic for everything else — so a hand-modelled
"Bracket" is never flagged, while a hand-modelled "M6Screw" is. Pass rows
instead of assembly to check BOM rows you already hold.
Returns {ok, findings, purchased, designated, undesignated, incomplete, basis}; each finding carries part / count / code (no_designation | incomplete_designation) / certainty (stamped | name_heuristic) / reason. ok=False means the BOM cannot be ordered as it stands.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | ||
| assembly | No | ||
| recursive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden and does so: it discloses the exactness asymmetry (stamped parts exact, everything else a documented name heuristic), gives concrete examples ('Bracket' never flagged, 'M6Screw' is), and explains that ok=False means the BOM cannot be ordered as it stands.
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 gate rule, then examples, then edge cases, then return shape — a sensible order with no repetition. Slightly long and includes a rhetorical aside ('once per revision') that is persuasive rather than operational.
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 compensates by enumerating the returned fields and the finding codes, so an agent knows what comes back. The gap is the undocumented `recursive` flag, which materially changes behavior for sub-assemblies.
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 3 parameters. The description meaningfully disambiguates rows vs assembly and explains what each input represents, but it is silent on `recursive` (default true) and on the shape of a row object, so half the parameter surface remains 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?
Opens with a precise verb+resource+condition: 'every purchased part on this assembly must be orderable.' It clearly separates this gate from neighbors like bom_extract (which extracts) and component_contract_check (a different contract), so an agent can pick 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?
States when to run it ('before quoting or releasing a package') and why (sourcing work silently pushed onto a human once per revision). It also names the input alternative explicitly: 'Pass rows instead of assembly to check BOM rows you already hold.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dfa_checkA
Grade an assembly (Boothroyd-Dewhurst-lite). assembly_efficiency = theoretical_min/(part_count+fastener_count) (theoretical_min = unique_part_count or 1); assembly_score scales that by a handling penalty from insertion_axes/ symmetry and decreases monotonically as part/fastener count rises. The grade is an ordinal index for comparing variants (fidelity='correlation', band_pct=None) — rank with it, don't gate on the absolute value. Returns {part_count, fastener_count, insertion_axes, handling_difficulty, assembly_efficiency, assembly_score, symmetry_score, fidelity, band_pct}.
| Name | Required | Description | Default |
|---|---|---|---|
| part_count | Yes | ||
| fastener_count | No | ||
| insertion_axes | No | ||
| unique_part_count | No | ||
| symmetric_fraction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does so: it discloses the scoring formula (theoretical_min/(part_count+fastener_count)), that theoretical_min falls back to 1, that assembly_score is monotone decreasing in part/fastener count, that the result is an ordinal correlation with fidelity='correlation' and band_pct=None, and even enumerates the returned fields. This is unusually rich behavioral disclosure for a metric 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?
It is dense but front-loaded: purpose first, then the formula, then usage caveat, then return shape. Parenthetical formulas are efficient rather than wasteful, though the long single block with stacked em-dashes and parentheticals is harder to scan 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?
There is no output schema, so the description assumes the job of describing the return object and does list all nine fields, and it flags the key interpretive caveat (ordinal, not absolute). Remaining gaps — no statement that this is a pure calculator requiring no document handle, and no per-field meaning for handling_difficulty/symmetry_score — are modest given the overall 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%, so the description must compensate, and it does: it ties unique_part_count to theoretical_min ('or 1' explains the null default), ties insertion_axes and symmetry to the handling penalty, and explains the role of part_count and fastener_count in the denominator. It does not state the numeric defaults for faster/symmetry/symmetric_fraction, leaving a small 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+resource ('Grade an assembly') and immediately names the methodology (Boothroyd-Dewhurst-lite), which is far more precise than most siblings like dfm_check or moldability_check. It never explicitly contrasts itself with those siblings, 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?
It gives real usage direction: the score is 'an ordinal index for comparing variants' and the agent is told explicitly 'rank with it, don't gate on the absolute value.' That is a clear when-to-use plus a when-not-to guidance. It names no alternative tool, so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dfm_checkA
Screen a part for manufacturability against a pull/tool axis. Give a
hand-built faces list of {name, draft_deg, wall_mm?} — draft_deg relative to
pull_axis (0 = a vertical wall needing draft; <0 = a re-entrant undercut) — OR
a live handle, whose per-face descriptors are read off the solid (draft vs
the pull axis + a ray-cast undercut test + inward-chord wall sampling) and
scored identically (v2 Shape wiring). draft_violations are 0≤draft<min_draft_deg,
undercut_faces are draft<0, min_wall_violations are wall_mm<min_wall_mm
(defaults by process: injection 1.0, cnc 0.5, sheet/fdm 0.8).
Sheet metal: a handle built by sheet_base/sheet_flange/sheet_tab/sheet_hem is
ALSO screened against the press-brake rules (minimum bend radius by material,
minimum flange length, hole-to-bend distance, refold collision) with no extra
argument — those rules are DELEGATED to the same implementation sheet_check
calls, so the two tools cannot return different verdicts on one part. Pass an
explicit sheet block {thickness_mm, material?, bends, holes?, interferences?}
to screen bends on a part AnkusDrive did not model.
Returns {process, pull_axis, min_wall_mm, draft_violations, undercut_faces,
min_wall_violations, score, pass} — plus n_faces + wall_thickness_stats on the
handle path, and a sheet sub-result {ok, findings, rules, fidelity, band_pct}
whose failures also gate pass on the sheet-metal path.
| Name | Required | Description | Default |
|---|---|---|---|
| faces | No | ||
| sheet | No | ||
| handle | No | ||
| process | No | injection | |
| pull_axis | No | +z | |
| min_wall_mm | No | ||
| min_draft_deg | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description must carry the full behavioral burden, and it does: it defines scoring semantics, the exact meaning of draft_violations/undercut_faces/min_wall_violations, per-process default wall thicknesses, and the important guarantee that sheet rules are DELEGATED to sheet_check's implementation so both tools cannot disagree. It never explicitly states that the screen is side-effect-free/read-only or what happens on a missing/invalid handle.
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 paragraph is long but dense and front-loaded with the purpose; the 'Sheet metal:' prefix segments the second concern. Nearly every clause (violation definitions, per-process defaults, delegation guarantee) earns its place, though the parenthetical about ray-cast/underscore sampling 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 7-parameter, zero-schema-coverage tool with no output schema and no annotations, the description is strong: it documents inputs, defaults, and the full return object ({process, pull_axis, min_wall_mm, draft_violations, undercut_faces, min_wall_violations, score, pass} plus handle-path extras and the sheet sub-result). Remaining gaps are the process/pull_axis value vocabularies and any statement about 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 description coverage is 0% across 7 parameters, so the description does all the work: it explains the shape of faces ({name, draft_deg, wall_mm?}), the meaning of draft_deg relative to pull_axis, the sheet block fields, and the fact that defaults for min_wall_mm are derived from process (injection 1.0, cnc 0.5, sheet/fdm 0.8). Only min_draft_deg is covered indirectly and the valid process enum is not enumerated.
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 ('Screen a part for manufacturability against a pull/tool axis') plus the core inputs and outputs, so the agent knows exactly what the tool computes. It does not, however, distinguish itself from the many sibling manufacturability screeners (moldability_check, cnc_machinability_check, dfa_check, pack_check); it only notes that sheet rules are shared with sheet_check.
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 conditional input guidance ('OR a live handle', 'Pass an explicit sheet block ... to screen bends on a part AnkusDrive did not model'), which implies when each input path is appropriate. It never states when to choose this tool over the sibling screeners, leaving tool selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dipole_resonanceA
Thin centre-fed half-wave dipole first resonance (NO solver, banded) — the
closed-form twin the openEMS FDTD S11 antenna sweep (em_fullwave_submit) is
gated against. Give EXACTLY ONE of length_mm (→ resonant frequency) or
freq_ghz (→ resonant length). End-effect shortening k = shortening makes
the resonant length a little under λ/2: L = k·λ, f_r = k·c/L (k≈0.48 textbook;
≈0.475 typical wire). Because k tracks the length/diameter ratio this is a
±band correlation (fidelity='banded', ~±3% over k∈[0.46,0.49]); an FDTD S11
sweep must put its first resonance inside [freq_lo, freq_hi] (or [length_lo,
length_hi]).
Returns {given, shortening, half_wavelength_mm, resonant_length_mm, resonant_freq_ghz, freq_lo_ghz, freq_hi_ghz, length_lo_mm, length_hi_mm, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| freq_ghz | No | ||
| length_mm | No | ||
| shortening | 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 discloses key traits: no solver, banded fidelity (~±3%), the shortening factor model, input exclusivity, and the list of return fields. It does not describe error modes or the meaning of `warnings` and `escalate_to`, but overall it is more transparent than most.
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 purpose and input requirement, then supplies necessary technical context without filler. It is dense but every sentence earns its place; minor length could be trimmed, but nothing is extraneous.
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 output schema, and no schema descriptions, the description is thorough: it covers inputs, the closed-form model, banded nature, and lists return fields. It could be slightly more complete by explaining the return fields' types or `warnings`/`escalate_to` semantics, but an agent has enough 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. It fully explains all three parameters: exactly one of `length_mm` or `freq_ghz`, the meaning and default of `shortening`, and the relationship L = k·λ and f_r = k·c/L.
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 computation: thin centre-fed half-wave dipole first resonance using a closed-form model. It also names the sibling it is gated against (`em_fullwave_submit`), so an agent can distinguish it from other EM tools.
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?
Specifies to give exactly one of `length_mm` or `freq_ghz`, and explains that an FDTD S11 sweep must place its first resonance inside the returned band. However, it does not explicitly state when not to use this tool or name the primary alternative in a decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draftB
Apply a draft angle to faces (for moldability).
base: feature handle. faces: list of {handle, face: tag|'FaceN'}. angle_deg: draft angle (positive degrees). neutral_plane: {handle, face: tag|'FaceN'} for the plane along which the angle is measured (typically the parting plane). reversed: flip the direction of the draft.
| Name | Required | Description | Default |
|---|---|---|---|
| base | Yes | ||
| name | No | Draft | |
| faces | Yes | ||
| reversed | No | ||
| angle_deg | No | ||
| neutral_plane | 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. It implies a mutation of faces but doesn't state whether this is destructive, requires a specific document state, needs to be committed in a transaction, or has any side effects. For a part-design mutation tool, this is a significant 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 description is a compact list of parameter definitions, front-loaded with the tool's purpose. Each line earns its place. It could be slightly more structured, but it's efficient and clear.
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 6-parameter part-design mutation tool with no annotations and no output schema, the description provides parameter semantics but omits critical behavioral context: transaction requirements, error conditions, what happens to existing geometry, and expected document state. It is incomplete for an agent to invoke safely.
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 defining each parameter's meaning: base as feature handle, faces as a list of handle/face objects, angle_deg as positive degrees, neutral_plane as the measurement plane, and reversed as direction flip. It adds substantial value beyond the bare schema property names.
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: applying a draft angle to faces, with a parenthetical purpose (moldability). This clearly distinguishes it from siblings like chamfer_edges or fillet_edges, which also modify faces but for different purposes.
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 mentions 'for moldability' but doesn't explain when to use draft vs other face-modification tools, nor does it mention prerequisites like needing a neutral plane. No explicit when-to-use or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drawing_gateA
Manufacturing-completeness gate for a drawing page: does the placed dimension set fully and non-redundantly reconstruct the part? A green render is not a manufacturable drawing — this validates the drawing itself, the way the geometry-realizes-declaration gate validates an assembly.
Reads the real solid + the placed dimensions and accounts degrees of freedom, process-aware: a 'prismatic' (milled/plate) part must locate each hole by X/Y from a datum and size the block W×H×T; a 'turned' part is concentric, so a step needs only Ø + axial length. process='auto' infers it from the geometry.
Returns {ok, violations, slots_total, slots_covered, process, features,
dimensions, enumerated_features, datum_faces, section_recommended}.
section_recommended ({recommended, reasons, feature_ids}) advises whether the
part has internal geometry that needs a cross-section (see add_section_view).
Each violation has a code
(under = a feature size/location is missing; redundant = a DOF dimensioned more
than once; conflict = dimensioned twice with disagreeing values; extra = a dim
that pins nothing; no_datum = a location not taken from a datum) and a human
reason. ok=True (empty violations) means the drawing is manufacturing-complete.
Datum-origin discipline turns on automatically when the part has faces annotated role='datum' (annotate_face): a location dimension not measured from a datum face is then flagged no_datum. Set datums_declared=True to force the check on even without annotated datums.
require_ballooned=True additionally demands that every characteristic carries an
inspection balloon (see balloon_drawing) — the requirement a release flow imposes
when the drawing must ship with an inspection plan. Unballooned characteristics
become not_ballooned violations and fail the gate. The ballooned
({ok, total, ballooned, missing}) summary is reported either way.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| process | No | auto | |
| datums_declared | No | ||
| require_ballooned | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the entire behavioral burden and does so: it enumerates the violation taxonomy (under/redundant/conflict/extra/no_datum/not_ballooned) with meanings, defines ok=True semantics, explains the DOF-accounting and process-aware ('prismatic' vs 'turned') rules, and discloses the returned payload keys plus the ballooned summary being reported even when not required. This is unusually rich disclosure for a validator.
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 and the checks it performs, then proceeds to return payload and violation codes. Dense and long, but nearly every sentence supplies non-obvious semantics; the violation-code enumeration is worth its length, though the prose could be trimmed slightly.
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, so the description must describe returns — and it lists the full response shape, explains section_recommended's sub-fields, and defines what an empty violations list means. Given the tool's complexity, an agent has everything needed to call and interpret it.
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 supply all parameter meaning, and it does: process='auto' infers from geometry with 'prismatic'/'turned' behaviors described; datums_declared forces the datum check on without annotated datums; require_ballooned demands a balloon per characteristic and its failure mode. Only 'page' is left implicit, which is self-evident from context.
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 — validates the *drawing* itself by checking whether the placed dimension set fully and non-redundantly reconstructs the part — and explicitly distinguishes itself from the sibling geometry gate ('the way the geometry-realizes-declaration gate validates an assembly'). An agent can tell this apart from drawing_legibility, gdt_check, or verify_feature 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?
Gives clear triggering context: IT is the gate to run when deciding whether a drawing is manufacturing-complete, and it names the conditions that activate extra checks (datum-origin discipline auto-on, datums_declared=True to force it, require_ballooned=True for release flows). It cross-references relevant siblings (add_section_view, balloon_drawing, annotate_face) but never states when to prefer it over drawing_legibility or gdt_check, so it falls short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drawing_legibilityA
Legibility gate for a drawing page: on the ACTUAL placed graphics, flag the ways the layout becomes unreadable — overlapping dimension labels, a dimension line crossing a view it does not reference, or anything past the sheet border.
min_gap (mm) is the breathing room required between two labels. Returns {ok,
violations, labels, segments, views}; each violation has a code
(overlap/crosses_view/out_of_border) and a human reason. ok=True means the
placed dimensions read cleanly on the sheet. Inspection balloons count as placed
graphics too — a numbered circle sitting on a neighbour or off the sheet is
flagged like any other label.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| min_gap | 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 what is inspected, the exact return shape ({ok, violations, labels, segments, views}), the meaning of ok=True, and the non-obvious rule that inspection balloons are treated as placed labels. It omits whether the operation is read-only/side-effect-free and any permission or rendering prerequisites.
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 layered detail on the parameter and return contract. Every sentence adds information, though the prose is somewhat dense and could be trimmed without losing 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?
No output schema exists, but the description supplies the return shape and violation codes, and with no annotations it adequately conveys behavior and the inspection scope. Only the read-only nature and invocation preconditions are left unstated.
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 min_gap well (mm, 'breathing room between two labels') beyond the schema's bare type/default, but the required `page` parameter is left completely undefined (though it is largely self-evident). 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?
Names a specific verb+resource (legibility gate over placed drawing graphics) and enumerates the exact failure modes it detects: overlapping labels, dimension lines crossing unrelated views, and out-of-border items. This is clearly distinguishable from the sibling drawing_gate and other drawing tools 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 — it operates 'on the ACTUAL placed graphics', suggesting a post-placement check — but the description never states when to prefer it over the similar sibling drawing_gate, nor any preconditions or when-not-to-use guidance. The agent must infer the trigger from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
drop_impactA
Drop/impact screen by exact energy balance (NO solver). Give
crush_distance_mm (available cushion/crumple stroke) -> deceleration, OR
deceleration_limit_g (fragility spec) -> required stroke — exactly one.
G_avg = h/d exactly (mass cancels); g_peak = pulse_factor·G_avg with pulse
bounding the shape: 'constant' (ideal crush, 1×) | 'linear_spring' (elastic,
2×) | 'half_sine' (π/2×). v = √(2gh). mass_g only adds peak_force_n and
energy_j. fidelity='exact'; no explicit impact-dynamics solve is shipped
(escalate_to=None — horizon scope).
Returns {drop_height_mm, impact_velocity_m_s, pulse, pulse_factor, crush_distance_mm, g_avg, g_peak, pulse_duration_ms, deceleration_limit_g, required_crush_mm, energy_j, peak_force_n, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| pulse | No | linear_spring | |
| mass_g | No | ||
| drop_height_mm | Yes | ||
| crush_distance_mm | No | ||
| deceleration_limit_g | 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 mostly succeeds: it declares the tool is analytic-only, that no impact-dynamics solve is shipped, and that escalate_to=None marks a horizon-scope limit. Physics assumptions are stated (mass cancels, mass_g only affects peak_force_n and energy_j), though the meaning of the returned warnings/band_pct flags is left 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?
Dense but front-loaded: purpose first, then the input disjunction, then the physics, then the return keys. The symbolic notation and enumerated return list are information-dense rather than padded, though the combined physics+return block makes it heavier to parse than a two-sentence 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?
With no output schema and no annotations, the description compensates fully: it enumerates every returned field, explains the underlying model and its fidelity, and flags the absence of an escalation path. Nothing needed to invoke it or interpret its result 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 do all the work and does: it defines pulse's three shapes with their exact multipliers (1×, 2×, π/2×), explains that mass_g feeds only peak_force_n and energy_j, and enforces the mutual exclusivity of crush_distance_mm and deceleration_limit_g. An agent can call this correctly without opening 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+resource (drop/impact screen) and pins down the method precisely: 'exact energy balance (NO solver)', which separates it from solver-based siblings like fem_run or contact_setup. It does not name those siblings explicitly, so differentiation is by implication rather than routing, keeping it just 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 'exactly one' rule for crush_distance_mm vs deceleration_limit_g is an explicit, actionable usage constraint that prevents a common invocation error. It stops short of a 5 because it never says when to prefer this analytic screen over a full impact/FEM study, even though solver-oriented siblings exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eco_createA
Build an ECO change-order record (issue #142, C3) — turn a change into a record, not a silent mutation (the diff IS the change order, mapping onto a git commit/PR). Optionally compute its where-used impact over a lockfile in the same call, so the blast radius travels with the record.
id: the ECO id (e.g. "ECO-0001").
affected: the list of changed item / component ids.
disposition: the change disposition (use_as_is | rework | scrap | revise | ...).
effectivity: a dict with exactly one of date|serial|revision (when it takes
effect).
title / note: optional human description recorded on the record.
interface_change: true if a published interface moved (the §9 stale trigger).
lockfile: optional path — when given, the result embeds an impact report.
out: optional path — write the git-diffable ECO sidecar there.
Returns the ECO object (with impact when a lockfile is supplied); a malformed
ECO fails loudly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| out | No | ||
| note | No | ||
| title | No | ||
| affected | Yes | ||
| lockfile | No | ||
| disposition | Yes | ||
| effectivity | Yes | ||
| interface_change | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries real behavioral weight: it discloses that a lockfile embeds an `impact` report, that `out` writes a git-diffable sidecar, and that a malformed ECO 'fails loudly'. It omits permission/auth requirements and rate behavior, but the mutation and side-effect profile is otherwise 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-loads the core purpose, then uses compact per-parameter lines, so it is easy to scan. It is a touch long and a few parentheticals (issue number, section reference) do not earn their space, but there is little 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 9-parameter, nested-object mutation tool with no annotations and no output schema, the description explains both the return ('the ECO object, with `impact` when a lockfile is supplied') and failure behavior, which is what an agent needs. Missing only auth/permission context.
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%, yet the description documents every meaningful parameter: id, affected list, disposition (with candidate values), effectivity (exactly one of date|serial|revision), title/note, interface_change, lockfile, and out. This fully compensates for the bare schema and even supplies the enum values the schema lacks.
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 ('Build an ECO change-order record') and crisply frames its role as recording a change rather than performing a silent mutation, which distinguishes it from mutating siblings like lifecycle_apply_change. The internal jargon '(issue #142, C3)' and '§9 stale trigger' add little for an outside agent, and there's no explicit differentiation from change_impact or eco_validate.
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 notes that where-used impact can optionally be computed 'in the same call' via a lockfile, implying a workflow against change_impact, but never states when to pick eco_create over eco_validate, change_impact, or lifecycle_apply_change. Usage is inferable rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eco_validateA
Validate an ECO (engineering change order) record (issue #142, C3) — the cheap front door. Checks the schema stamp, a non-empty id + affected item set, a present disposition, and an effectivity carrying exactly one of date|serial|revision.
eco: the ECO object.
Returns {ok, problems} — ok is True iff problems is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| eco | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It discloses the return shape {ok, problems} and the validation logic, but does not state whether the call is read-only, mutates state, or requires permissions. That is a notable gap for a validation 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?
Front-loaded with the tool's purpose and checks. The parenthetical issue reference and 'cheap front door' are minor noise, but the description is otherwise 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?
Given no output schema, the description helpfully states the return shape. For a validator, the key missing piece is confirming read-only behavior (no annotations to do so) and what a 'problem' entry looks like. Still, it is complete enough 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?
Schema coverage is 0% and the single eco parameter is an untyped object, so the description must compensate. It names required components (schema stamp, id, affected item set, disposition, effectivity with exactly one of date|serial|revision), which adds real meaning, but exact field names and structure remain unspecified.
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 'Validate' and resource 'ECO record', and enumerates the exact checks performed (schema stamp, id/affected items, disposition, effectivity). However, it does not explicitly contrast with sibling ECO tools like eco_create or change_impact, so it falls short of the 5 mark.
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?
'Cheap front door' implies pre-validation before heavier operations, but there is no explicit when-to-use, when-not, or named alternative. The implied context is thin, so a 3 is warranted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
elastica_deflectionA
Exact large-deflection cantilever tip — Bisshopp–Drucker elastica (NO
solver) — the closed-form twin the *NLGEOM CalculiX solve is gated against.
Section: width_mm+height_mm (solid rectangle, I = b·h³/12, load transverse to
height_mm) or explicit i_mm4. E from youngs_gpa or a Materials-DB material.
Load parameter α = P·L²/(E·I); the tip slope solves the elliptic-integral
elastica. Linear theory δ/L = α/3 over-predicts the transverse tip and ignores
the axial draw-in — the elastica captures both, and nonlinear_over_linear is
the divergence the solve must reproduce. Valid for tip slope < ~80° (α ≲ 3.5);
beyond that escalate to a follower-load fem_set_nonlinear_material solve.
Returns {alpha, tip_slope_deg, tip_disp_mm (transverse), tip_x_mm (axial projection), axial_drawin_mm, linear_tip_mm, nonlinear_over_linear, youngs_mpa, I_mm4, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| i_mm4 | No | ||
| load_n | Yes | ||
| material | No | ||
| width_mm | No | ||
| height_mm | No | ||
| length_mm | Yes | ||
| youngs_gpa | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the whole burden, and it delivers: no solver (pure closed-form), the elliptic-integral solution method, the validity range α ≲ 3.5, the escalation target, and the diagnostic outputs warnings/escalate_to/fidelity/band_pct. It also flags the physics it captures that linear theory misses (axial draw-in, over-prediction).
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 — purpose first, then geometry, then physics, then validity, then return shape. Every clause (formula for I, α definition, escalation threshold, output list) carries information the agent cannot get from the schema or annotations, so nothing 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 annotations and no output schema, the description still supplies the behavioral profile, the validity envelope, the escalation route, and a full enumeration of return fields. Nothing an agent needs to select or invoke this 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 coverage is 0%, yet the description conveys the role of every parameter: width_mm+height_mm form a solid rectangle with I = b·h³/12 and load transverse to height_mm, i_mm4 is the explicit alternative, E comes from youngs_gpa or a Materials-DB `material`, load_n sets α = P·L²/(E·I), and length_mm is L. It adds the section geometry and load direction that the schema 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 precise verb+resource: closed-form large-deflection cantilever tip via the Bisshopp–Drucker elastica. It explicitly distinguishes itself from the FEM siblings ("NO solver", "the closed-form twin the *NLGEOM CalculiX solve is gated against"), so an agent can separate it from fem_run / fem_set_nonlinear_material 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?
Gives an explicit applicability window ("Valid for tip slope < ~80° (α ≲ 3.5)") and a concrete when-not/escalation path ("beyond that escalate to a follower-load fem_set_nonlinear_material solve"), naming the alternative tool. This is the full when/when-not/alternative triad.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
em_conduction_submitA
DC current conduction via Elmer's StatCurrentSolver (P3 M6 frontier),
asynchronous. Requires ElmerSolver; when absent this returns {ok:false, reason,
install} rather than raising. Builds a rectangular strip with voltage_v
across its ends and reads the electrode current, total Joule heating and
Elmer's effective resistance — all machine-exact against R = L/(σ·A)
(resistance_ratio = 1.000000 live).
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, current_a, joule_w, effective_resistance_ohm, resistance_exact_ohm, current_exact_a, resistance_ratio, case_dir}.
| Name | Required | Description | Default |
|---|---|---|---|
| nx | No | ||
| ny | No | ||
| width_m | No | ||
| length_m | No | ||
| conductor | No | copper | |
| voltage_v | No | ||
| conductivity_s_m | 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 disclose important behavior: the call is asynchronous, it returns {ok:false, reason, install} rather than raising when ElmerSolver is absent, and the result must be retrieved via job_result. The expected return keys (job_id, status, cache_hit) and the degradation-dict fallback are also spelled out, which is above-average transparency 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 description front-loads the core purpose and then layers on prerequisites, physics, and return shape without much redundancy. It is dense with notation (R = L/(σ·A), resistance_ratio, backticked names) but each sentence carries distinct 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?
With no output schema and no annotations, the description does the heavy lifting, and it covers both the async-submit return ({job_id, status, cache_hit}) and the polled result fields (current_a, joule_w, effective_resistance_ohm, resistance_ratio, etc.). The main remaining gap is parameter-level detail for the geometry/grid arguments.
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: voltage_v is defined as the voltage across the strip ends, and conductivity/length/width are implicit in the R = L/(σ·A) formula framing. However, nx, ny, and conductor are never explained, leaving several of the seven parameters undocumented in both the schema and 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+resource — DC current conduction via Elmer's StatCurrentSolver — and describes exactly what is simulated (a rectangular strip with voltage_v across its ends) and what is measured (electrode current, Joule heating, effective resistance). It does not, however, distinguish itself from the very similar sibling em_dc_resistance, so an agent cannot tell from the description alone which of the two 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?
The description implies the workflow (submit, then poll job_result) and notes a prerequisite (ElmerSolver must be present), which gives context for use. But it names no alternatives and gives no explicit when-to-use/when-not guidance versus em_dc_resistance or em_field, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
em_dc_resistanceA
Exact DC resistance of a uniform conductor (NO solver) — R = L/(σ·A), the
closed-form anchor the Elmer em_conduction_submit gate reproduces to machine
precision. With voltage_v the Ohm/Joule pair is included (I = V/R, P = V·I).
σ from conductivity_s_m or a conductor name.
Returns {resistance_ohm, conductivity_s_m, length_m, area_m2, current_a?, joule_w?}.
| Name | Required | Description | Default |
|---|---|---|---|
| area_mm2 | Yes | ||
| conductor | No | ||
| length_mm | Yes | ||
| voltage_v | No | ||
| conductivity_s_m | 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 notable work: it declares the computation is closed-form with no solver, specifies the exact return payload including which fields are optional (current_a?, joule_w?), and states the conditional that produces them. It leaves unit handling and any validation/error behavior unstated, so it is not exhaustive, but the behavioral profile is well conveyed.
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?
Core purpose and formula are front-loaded, and the trailing Returns block efficiently covers the output. Three sentences plus one return clause, with essentially no filler; only marginal 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 pure math tool with no output schema and no annotations, the description supplies the formula, the computational nature, and the full return shape, which is what an agent needs to call it correctly. The missing unit semantics on the two required geometry inputs is the only substantive 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 supply all parameter meaning. It usefully explains conductivity_s_m vs the conductor-name alternative and the role of voltage_v, but says nothing about length_mm and area_mm2 (the two required params) or the fact that results are converted to meters in the return, leaving a real 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+resource (exact DC resistance of a uniform conductor), gives the governing formula R = L/(σ·A), and explicitly frames itself against the sibling em_conduction_submit as the closed-form anchor with 'NO solver'. An agent can tell it apart from the FEM conduction path 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?
The description clearly positions this as the analytical/closed-form result that the em_conduction_submit gate reproduces, which implicitly tells the agent when to reach for this versus the solver, and it notes that passing voltage_v unlocks the Ohm/Joule output. It stops short of an explicit when-not or a direct routing sentence, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
em_fieldA
Exact magnetostatic field of the two canonical sources (NO solver):
kind='wire' is the long straight wire B = μ₀·I/(2π·r) at distance_mm
(Ampère's law); kind='solenoid' is the long-solenoid interior
B = μ₀·μ_r·n·I with turns_per_m.
Returns {b_t, b_mt, …} (the field in tesla and millitesla).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | wire | |
| mu_r | No | ||
| current_a | No | ||
| distance_mm | No | ||
| turns_per_m | 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. It gives explicit kind-specific formulas and the return shape/units ({b_t, b_mt, …}), but does not explicitly state statelessness, side-effect-free behavior, or default/null handling.
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 purpose and the two source formulas in a few compact lines. Every clause adds technical detail, with no 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?
No output schema exists, but the description names return fields and units. It covers the physics and parameter roles, yet leaves default/null semantics implicit, a minor gap for a 5-parameter 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%, so the description must compensate. It maps kind to wire/solenoid formulas and ties distance_mm, turns_per_m, current_a, and mu_r to variables in those equations, though it does not clarify required vs optional parameters or 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 specific computation — exact magnetostatic field — and names the two canonical sources with their formulas. The 'NO solver' phrase distinguishes it from numerical siblings such as em_fullwave_submit.
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?
Clearly limits use to two canonical sources and contrasts with a solver, so the context of use is explicit. It does not name an alternative sibling for arbitrary geometries or numerical field solving.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
em_fullwave_submitA
Full-wave FDTD EM solve on openEMS, asynchronous (OFF the MCP channel) — the
real-field twin of the analytic waveguide_cutoff / dipole_resonance
oracles. openEMS is GPL-3.0 and is run ONLY out-of-process via
ankusdrive/em_fullwave_gpl_runner.py; degrades to {ok:false, reason, install}
when no openEMS venv resolves.
problem='waveguide_sweep' (default): hollow rectangular guide, broad wall
a_mm/narrow wall b_mm (default a/2), length length_mm (default 60), TE10
port at each end. Sweep f_start_ghz..f_stop_ghz (default 4..10 GHz —
straddling the WR-90 cutoff 6.56 GHz) in n_freq points, nrts max timesteps,
cells_per_wl mesh density, eps_r fill. The result's fc_crossing_ghz
(half-power transmission) vs the analytic c/(2a) (fc_ratio≈1, evanescent_mean
≈0, propagating_mean≈1) IS the gate. problem='dipole_s11': centre-fed thin
dipole (length_mm, gap_mm, radius_mm), sweep S11, report first resonance.
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, fc_analytic_ghz, freq_ghz[], s21_db[], transmission_norm[], fc_crossing_ghz, fc_ratio, evanescent_mean, propagating_mean, n_cells, wall_s} (waveguide) or {freq_ghz[], s11_db[], resonance_ghz} (dipole).
| Name | Required | Description | Default |
|---|---|---|---|
| a_mm | No | ||
| b_mm | No | ||
| nrts | No | ||
| eps_r | No | ||
| gap_mm | No | ||
| n_freq | No | ||
| problem | No | waveguide_sweep | |
| timeout | No | ||
| length_mm | No | ||
| radius_mm | No | ||
| f_stop_ghz | No | ||
| f_start_ghz | No | ||
| cells_per_wl | 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 discloses asynchronous execution off the MCP channel, that openEMS is run out-of-process via a specific runner, the degradation response, and that results are retrieved by polling `job_result`. It does not cover rate limits, permissions, or expected wall-clock duration beyond the `timeout` default, but the behavioral picture is substantially complete.
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 dense but front-loads the core identity, async nature, and degradation behavior before drilling into parameters and return values. Every major sentence adds needed detail for a complex 13-parameter tool, though the prose style is compact and could be easier 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?
For a complex, annotation-free tool with 13 parameters and no output schema, the description covers the important bases: parameter meanings, async polling flow, degradation behavior, and the shape of returned results for both problem types. The only notable gap is that `timeout` is not explained in the description, but the rest is complete enough to invoke and interpret 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% across 13 parameters, so the description must compensate, and it largely does: it explains `problem` values, defines `a_mm`/`b_mm` (broad/narrow wall), `length_mm`, `f_start_ghz`..`f_stop_ghz`, `n_freq`, `nrts`, `cells_per_wl`, `eps_r`, and the dipole-specific `gap_mm`/`radius_mm`. It omits the `timeout` parameter's meaning, but otherwise adds significant semantic value 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 ('Full-wave FDTD EM solve on openEMS') and distinguishes itself from sibling oracles by naming them: 'the real-field twin of the analytic `waveguide_cutoff` / `dipole_resonance` oracles.' It also names two problem modes and their core outputs, so an agent can tell exactly what this tool does and how it differs from the analytic alternatives.
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?
Implies when to use it by positioning it as the real-field twin of the analytic oracles, and it states the degradation condition ('degrades to {ok:false, ...} when no openEMS venv resolves'), which helps an agent decide whether to call it. It does not explicitly say when to avoid it or name a better alternative if openEMS is unavailable, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
em_induction_heating_submitA
Coupled induction heating via Elmer (SIMULATION_NEXT B5), asynchronous —
completes em_induction_submit into a THERMAL answer: the harmonic
MagnetoDynamics solve runs once, MagnetoDynamicsCalcFields turns it into the
time-averaged Joule loss field, and a transient adiabatic HeatSolver
integrates it for heat_duration_s. Requires ElmerSolver; when absent this
returns {ok:false, reason, install} rather than raising.
Two gates: joule_power_ratio — the solved eddy-current power vs the exact
deep-slab dissipation P″ = R_s·|H₀|²/2 = ω²σA₀²δ/4 (from the shipped
em_skin_depth chain; live 1.0003) — and energy_balance_ratio — the mean
temperature rise vs P·t/(m·cₚ) (live 1.005). Conductor σ from a name or
explicit conductivity_s_m; thermal ρ/cₚ/k explicit. Also accepts a prepared
case_dir.
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, eddy_power_w_m, p_total_exact_w_m, joule_power_ratio (≈1), t_mean_final_k, dt_mean_exact_k, energy_balance_ratio (≈1), skin_depth_m, case_dir}.
| Name | Required | Description | Default |
|---|---|---|---|
| nx | No | ||
| ny | No | ||
| sif | No | case.sif | |
| mu_r | No | ||
| depths | No | ||
| n_steps | No | ||
| case_dir | No | ||
| cp_j_kgk | No | ||
| a_surface | No | ||
| conductor | No | copper | |
| k_thermal | No | ||
| frequency_hz | No | ||
| density_kg_m3 | No | ||
| heat_duration_s | No | ||
| conductivity_s_m | 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: it discloses async submission, the no-raise failure contract ({ok:false, reason, install}), the solver dependency, the two physics gates and their live values, and the accepted inputs. This is unusually rich behavioral disclosure for a submit 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?
Information-dense and front-loaded, leading with what the tool is before the mechanics. The embedded formulas and parentheticals are justified by the physics, though the paragraph is long and 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?
For a complex 15-parameter coupled multiphysics job with no output schema, the description covers the return contract (job_id/status/cache_hit then job_result fields) and the failure path thoroughly. The gap is the undocumented numeric parameters, which leaves an agent guessing on mesh and excitation 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?
Schema coverage is 0% across 15 parameters, so the description must compensate, and it only partly does: it clarifies conductor vs conductivity_s_m, that thermal rho/cp/k are explicit, and the role of heat_duration_s and case_dir. The mesh/numerics parameters (nx, ny, n_steps, depths, mu_r, a_surface, frequency_hz, sif) remain unexplained 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 (coupled induction heating via Elmer) and explicitly positions itself relative to the sibling em_induction_submit by saying it 'completes' it into a THERMAL answer. An agent can distinguish the two 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?
Makes clear this is the thermal follow-on to em_induction_submit and that it is asynchronous ('poll job_result'), and notes the alternative path when ElmerSolver is absent (returns {ok:false, ...}). It gives strong positive context but no explicit when-not-this-tool statement beyond the missing-solver case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
em_induction_submitA
AC skin effect / induction via Elmer's harmonic 2-D magnetodynamics (P3 M6
frontier), asynchronous. Requires ElmerSolver; when absent this returns
{ok:false, reason, install} rather than raising. Builds a conductor slab
depths skin depths deep driven by the surface vector potential at
frequency_hz, solves the complex field, and fits the e-folding length of
BOTH the magnitude and the phase of A(x) — each must equal the exact
δ = √(2/(ω·μ₀·μ_r·σ)) (live: decay_ratio 0.999, phase_ratio 1.000). The Joule
deposition profile |J|² ∝ e^(−2x/δ) is the induction-heating answer.
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, skin_depth_exact_m, decay_length_m, phase_length_m, decay_ratio, phase_ratio, case_dir}.
| Name | Required | Description | Default |
|---|---|---|---|
| nx | No | ||
| ny | No | ||
| mu_r | No | ||
| depths | No | ||
| conductor | No | copper | |
| frequency_hz | No | ||
| conductivity_s_m | 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 does so well: it discloses async execution, graceful degradation to {ok:false, reason, install} instead of raising, that it returns a job_id requiring polling of job_result, and that cache_hit may be returned. It omits any safety/permission profile or cost/rate context, 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 purpose and prerequisite, with the return/polling contract last. It is dense but mostly earns its place, though jargon like 'P3 M6 frontier' and the exact live ratios add noise that isn't needed to invoke 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?
With no output schema, the description supplies the key return fields (skin_depth_exact_m, decay_length_m, phase_length_m, decay_ratio, phase_ratio) and the async polling pattern, so an agent knows how to call and follow up. Minor gaps remain around mesh params and result interpretation limits.
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 7 parameters, so the description must compensate. It embeds depth (`depths` skin depths), `frequency_hz`, and the roles of μ_r and σ in the δ formula, but leaves nx, ny (mesh dimensions) and conductor selection 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 technique and resource: AC skin effect via Elmer harmonic 2-D magnetodynamics, with the concrete operation (build slab, solve complex field, fit decay lengths of both magnitude and phase). This clearly distinguishes it from siblings like em_skin_depth and em_induction_heating_submit.
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 a prerequisite (requires ElmerSolver) and the fallback behavior when absent, and indicates the async job workflow. However, it never states when to choose this tool over near siblings such as em_skin_depth or em_induction_heating_submit, leaving usage selection implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
em_skin_depthA
Exact AC skin depth (NO solver) — δ = √(2/(ω·μ₀·μ_r·σ)) plus the per-square
surface resistance R_s = 1/(σ·δ); fields/current decay e^(−x/δ) into the
conductor (~95% of induction heating deposits within 1.5·δ). σ from an explicit
conductivity_s_m or a conductor name (copper, aluminum, silver, gold, brass,
steel-mild, stainless-304).
Returns {skin_depth_m, skin_depth_mm, surface_resistance_ohm, angular_frequency_rad_s, conductivity_s_m, mu_r}.
| Name | Required | Description | Default |
|---|---|---|---|
| mu_r | No | ||
| conductor | No | ||
| frequency_hz | Yes | ||
| conductivity_s_m | 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; it discloses the closed-form model, the decay law, the conductivity source options, and the exact return keys. It stops short of stating precedence between conductivity_s_m and conductor, or how invalid/unsupported inputs 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-loads the core purpose and formula in the first clause, then covers the physics rationale and inputs. The remaining sentences all earn their place, though the formula and physics aside make it denser than a terse one-liner.
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 pure-computation tool with no output schema and no annotations, the description supplies the return field list, input sources, and method, which is nearly sufficient. Remaining gaps are minor: parameter precedence and error behavior are untreated.
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: it names conductivity_s_m explicitly, enumerates the valid conductor names, and ties mu_r and frequency_hz to terms in the formula. It omits mu_r's default and which of conductivity_s_m vs conductor wins when both 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?
Uses a specific verb+resource ('Exact AC skin depth') and immediately disambiguates from the solver-based siblings in this family (em_field, em_induction_*, em_conduction_submit) with the parenthetical 'NO solver'. The embedded formula states exactly what is computed, so an agent can tell it apart 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 'NO solver' framing implies this is the lightweight analytic path versus the submit-style siblings, and the ~1.5·δ note hints at a use case (induction heating depth coverage). However, it never explicitly states when to choose this over em_induction_submit or em_dc_resistance, so usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
engrave_textA
Engrave (cut) or emboss (add) extruded text onto a planar face of a solid.
The text is rendered in a system TrueType font, extruded, laid flat on the chosen face centred on its centroid, then booleaned into the host solid.
handle: the host solid to mark. face: the planar face to put the text on — a stable f_* tag (preferred), a 'FaceN' index string, or an int. Must be a flat (planar) face. Get a tag from list_faces / query_faces. text: the string to render (non-empty). size: cap height of the text in mm (default 5.0). depth: extrusion/engraving depth in mm (default 0.5). Engrave recesses the text this far below the surface; emboss raises it this far above. mode: 'engrave' (default) cuts the text into the solid (removes material); 'emboss' fuses raised text onto the surface (adds material). position: optional [u, v] in-face offset in mm from the face centroid, along the text's local X (u) and Y (v) axes. Omit to centre on the face. font: optional absolute path to a .ttf/.ttc font file. If omitted, common macOS fonts are auto-probed (Arial, then Helvetica). If none is found and none is supplied, the call raises RuntimeError — pass an explicit path. name: label for the resulting solid (default 'Text').
Returns {handle, name, volume, text, mode, depth} where volume is the mm^3 of the resulting solid (less than the input for engrave, more for emboss). The host solid is consumed/hidden and replaced by the returned handle.
| Name | Required | Description | Default |
|---|---|---|---|
| face | Yes | ||
| font | No | ||
| mode | No | engrave | |
| name | No | Text | |
| size | No | ||
| text | Yes | ||
| depth | No | ||
| handle | Yes | ||
| position | 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: it discloses the mutation model (host solid is consumed/hidden and replaced by the returned handle), the material consequence of each mode, and a concrete failure path (RuntimeError when no font is found, with the fix of passing an explicit path). It also explains the underlying boolean 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 purpose and mechanism, then a clean per-parameter block. Every line earns its place, though the mechanism paragraph and font paragraph add some length that could be tightened without losing 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?
Despite no output schema, the description spells out the return shape ({handle, name, volume, text, mode, depth}) and interprets volume for both modes, plus states the handle-replacement contract. Nothing needed to invoke 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% across 9 parameters, so the description must compensate and it does — every parameter (handle, face, text, size, depth, mode, position, font, name) is documented with type, default, units, and accepted value forms (e.g. face accepts f_* tag, 'FaceN', or int; position is [u, v] mm offsets).
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 pair and resource ('Engrave (cut) or emboss (add) extruded text onto a planar face of a solid') and immediately disambiguates the two modes. No sibling tool does text marking, so the 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?
Gives clear conditional guidance for the mode parameter ('engrave' removes material, 'emboss' adds it) and points to list_faces/query_faces for obtaining a valid face tag. It does not name an alternative tool or state explicit when-not-to-use conditions, but the operation is narrow enough that little routing guidance is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
envelope_checkA
Keep-out gate: assert each named part's world bounding box stays inside its declared envelope. envelopes maps a part's link name (or label) to {"min": [x,y,z], "max": [x,y,z]} in the assembly frame. Returns violations [{part, axis, got, allowed}, ...]; empty means everything is within its box.
| Name | Required | Description | Default |
|---|---|---|---|
| assembly | Yes | ||
| envelopes | Yes |
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 it does meaningful work: it defines that bounds are evaluated in the world/assembly frame, that the result is a violations list of {part, axis, got, allowed}, and that an empty list means full compliance. It does not state whether the check is read-only, what happens on parts with no envelope entry, or tolerance/strictness behavior, 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?
Three tight sentences: the purpose is front-loaded, then the input contract, then the return contract. No filler, and the most decision-relevant information (what it asserts and what an empty result means) is stated up front.
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 no annotations, so the description must cover both semantics and return shape, which it largely does by documenting the violations record fields and the empty-list convention. Remaining gaps are the meaning/format of the 'assembly' argument and edge-case behavior (parts absent from envelopes, boundary-touching), which are minor for a pure 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 description coverage is 0%, so the description must compensate, and it does for the hard parameter: 'envelopes maps a part's link name (or label) to {min:[x,y,z], max:[x,y,z]} in the assembly frame' fully explains the nested object's key and value shape. The 'assembly' parameter is only obliquely covered by the phrase 'in the assembly frame,' leaving its form (document name vs. handle) unclarified.
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: 'assert each named part's world bounding box stays inside its declared envelope,' with the 'Keep-out gate' framing that separates it from measurement tools like bounding_box or overlap tools like interference_check. It never names a sibling explicitly, so it falls just short of a 5, but an agent can tell what it does 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 'Keep-out gate' framing implies this belongs in a verification/validation flow, but there is no explicit statement of when to call it versus bounding_box, interference_check, or min_clearance, and no prerequisites (e.g., that the assembly must be built/solved first) are stated. Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_drawingB
Export a drawing page to PDF, SVG, or DXF (format inferred from the path extension), headless. PDF/SVG are composed from the template, the per-view geometry, and any dimensions/annotations on the page; DXF uses FreeCAD's native page writer. Returns {path, size, format, views, dimensions}.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| path | Yes |
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 useful traits: headless operation, format inferred from path extension, how PDF/SVG are composed versus DXF using FreeCAD's native writer, and the return fields. It still omits error conditions, overwrite behavior, and whether the page must already exist.
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 tool's action and formats, then compactly covers composition behavior and the return shape. Every clause is informative, and there is no redundant 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 write-like export tool with no annotations and no output schema, the description usefully states the return fields and format behavior. However, it leaves important context unstated: file-system side effects (overwrite behavior, directory requirements), error cases, and clarification of the 'page' 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 adds meaning for 'path' by explaining format inference from the extension, but gives no explanation of what 'page' refers to (name, handle, object) beyond the generic term 'drawing page.'
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) and resource (drawing page) with supported formats (PDF/SVG/DXF). It implicitly distinguishes from shape or sheet exporters by naming 'drawing page,' but does not explicitly name any sibling tool as an alternative.
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 no guidance on when to use this tool versus alternatives like render_view, export_shape, or sheet_flat_export. The format-inference rule is a behavioral detail, not usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_shapeB
Export a shape to STEP/IGES/BREP/STL. Format inferred from path extension.
object: FreeCAD object name (NOT a AnkusDrive handle). If omitted, exports the first shaped object in the active document.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| object | 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 behavioral burden. It usefully discloses that format is inferred from the path extension and what happens when 'object' is omitted, but it is silent on critical behaviors for a file-writing tool: whether an existing file is overwritten, required permissions, error behavior on invalid extensions, and what is returned. This is a significant gap for a mutating 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?
Two short sentences plus a targeted parameter note, with the operation and format behavior front-loaded and no filler. Every clause carries information the agent needs.
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 export with no output schema and no annotations, the description covers purpose, format inference, and the optional-parameter fallback, which is most of what is needed. It omits return value/confirmation semantics and overwrite behavior, leaving modest but 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 coverage is 0%, so the description must compensate, and it does: it explains that the destination format derives from the 'path' extension, and clarifies that 'object' is a FreeCAD object name (not an AnkusDrive handle) with a documented default of exporting the first shaped object. This adds real meaning beyond the bare JSON-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 clear verb+resource (export a shape) and enumerates the supported formats (STEP/IGES/BREP/STL), so the agent knows exactly what operation is performed. It does not explicitly differentiate itself from neighboring export tools like export_drawing or sheet_flat_export, but the shape/file-format scope is specific enough to be actionable.
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 one concrete usage rule — omit 'object' to export the first shaped object in the active document — which implies when the optional parameter is appropriate. However, there is no guidance on when to choose this over sibling exporters (export_drawing, sheet_flat_export) or any prerequisite (e.g., document must be open).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fai_reportA
First-article inspection report for a drawing page, shaped like AS9102 Rev B Form 3.
Each ballooned characteristic becomes a row carrying the AS9102 fields (Char No. / Reference Location / Characteristic Designator / Requirement / Results / Designed-Qualified Tooling / Nonconformance Number / Notes) plus its limits, the suggested measurement method, and a computed status.
results: balloon number -> measured value; each row is then accepted or rejected
against its limits. For a position control you may pass {"x":.., "y":..} and
the diametral deviation 2·√(x²+y²) is used, matching gdt_check. Omit it
entirely to get a BLANK form for the inspector — every row comes back
'not_evaluated', never a silent pass.
path: optionally write the report — .csv (the data), .svg or .pdf (a printable
paginated table).
part / rev: identity stamped into the file; default to the page's part name and
title-block revision.
reference: AS9102 field 6 (Reference Location), e.g. the sheet/zone; defaults to
the view each characteristic is dimensioned on.
THIS IS NOT A CERTIFIED AS9102 SUBMISSION — it reproduces the Form 3 field layout so a real form can be filled from it, and says so on every artifact it writes.
Returns {ok, columns, rows, summary, disclaimer, part, rev, plan_ok, unmeasurable, path?, size?, format?}; ok=False means at least one characteristic measured out of limits.
| Name | Required | Description | Default |
|---|---|---|---|
| rev | No | ||
| page | Yes | ||
| part | No | ||
| path | No | ||
| ratio | No | ||
| results | No | ||
| reference | No |
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 well: it discloses the BLANK form behavior with 'not_evaluated' rather than a silent pass, the position-control diametral deviation rule, the file-write side effects of path (.csv/.svg/.pdf), defaulting behavior for part/rev/reference, and the certified-submission disclaimer. It omits whether the tool mutates document state or requires write permissions, but the disclosure is otherwise unusually rich 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?
Content is front-loaded and mostly scannable, but the description is long and mixes sentence fragments with a per-parameter list, and the Returns block re-lists a long field set. Most sentences earn their place, though the return-value enumeration is slightly over-detailed given the parameter prose already covering outputs.
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-parameter, no-annotation tool with no output schema, the description covers inputs, evaluation semantics, the blank-form path, output file side effects, and even the return key set. What is missing is guidance on which sibling tool precedes or supersedes it (balloon_drawing, gdt_check) and any note on the unexplained 'ratio' 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 and largely does: it explains results, path (including which formats write what), part/rev defaults, and reference (AS9102 field 6 with its default). Only 'ratio' is left completely unexplained in both schema and description, 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?
The description names a specific verb and resource ('First-article inspection report for a drawing page') and pins it to a recognizable standard (AS9102 Rev B Form 3), which distinguishes it from siblings like balloon_drawing and inspection_plan. However, it never names or contrasts those siblings, so an agent must infer the boundary itself.
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 through the results/path mechanics (pass results to evaluate, omit to get a blank form) and explains that results maps balloon numbers to measured values, which effectively tells the agent when to supply each. But it never explicitly states when to prefer this tool over gdt_check, balloon_drawing, or inspection_plan, nor any preconditions such as requiring a ballooned drawing page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
family_materializeA
Materialize a whole variant family from ONE design table (issue #138, B1) — "make all the gears" becomes a table, not a loop. For each row, in table order, builds the part with its recipe (A1, #136) and allocates one item + one sequential part number (C1, #140). Subsumes standard-part catalogs: a bearing catalog is a family table keyed by designation, sourced from the ISO corpus.
Two modes (both supported): "instances" (each variant its own released file + part number) and "configurations" (variants share one artifact). Builds into the active document. Returns {schema, family, recipe, mode, key, count, rows, registry}.
table: path to the family table (.csv or .json). registry: optional items.json path (created if absent, written back). mode: optional override of the table's mode (instances|configurations).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| table | Yes | ||
| registry | 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 does well: it discloses that it builds into the active document, creates items and sequential part numbers, creates the registry file if absent and writes it back, and returns a specific object shape. It doesn't cover failure modes or side effects like what happens on duplicate keys, but the mutation and allocation behavior is 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?
The content is valuable but front-loaded awkwardly: the parenthetical issue/PR references (issue #138, B1, A1 #136, C1 #140) and the ISO corpus tangent add noise. The parameter list at the end is well-structured, but the prose block is denser 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?
For a 3-param mutation tool with no annotations and no output schema, the description is nearly complete: it covers inputs, modes, side effects (registry write-back, builds into active document), and the return shape. The main gap is the expected table format/columns, which an agent would need to supply valid input.
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 all three parameters: table (path to .csv or .json), registry (optional items.json path, created if absent, written back), and mode (optional override of table's mode with instances|configurations enum). This is strong compensation, though it doesn't specify the table's required columns/schema, which matters for a 'family table'.
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: 'Materialize a whole variant family from ONE design table', with a vivid framing ('make all the gears becomes a table, not a loop'). It distinguishes itself from siblings like family_validate and recipe by describing the batch-build-and-allocate behavior, though it doesn't explicitly name which sibling to use instead for validation.
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 modes clearly and when each applies (instances vs configurations), and notes it subsumes standard-part catalogs. It implies usage context strongly (building a family from a table) but doesn't explicitly state when NOT to use it versus family_validate or recipe_validate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
family_validateA
Validate a variant-family design table (issue #138, B1) — a row x column table where row = a variant (keyed by a size designator) and column = a recipe parameter / feature-flag / material. Loads CSV or JSON and checks the recipe, mode, key column, duplicate/missing size keys, and every per-row recipe-door value; each problem names the row+column. Returns {ok, problems}.
table: path to the family table (.csv or .json).
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes |
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 fairly well: it discloses the input handling (Loads CSV or JSON), the specific checks performed (recipe, mode, key column, duplicate/missing size keys, per-row recipe-door value), that problems are localized to row+column, and the return shape {ok, problems}. It omits environment/auth or performance traits, but for a validation tool this is strong 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 core content (what is validated, what is checked, and the return shape) is front-loaded and each claim earns its place. Minor noise such as the internal ticket reference '(issue #138, B1)' adds no value to an agent but does not undermine the structure.
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, no-output-schema tool, the description supplies the domain model, the validation checks, and the return contract ({ok, problems}), which is enough for an agent to call it correctly. It is space-efficient and covers the essentials an agent needs.
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 'table' has no schema description, so the description must compensate — it does, stating the parameter is a path to the family table and the accepted formats (.csv or .json). That exceeds the bare type:string 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?
States a specific verb (validate) and resource (a variant-family design table), then concretely defines that resource as a row x column table where row = variant keyed by size designator and column = recipe parameter / feature-flag / material. Among many *_validate siblings (recipe_validate, feature_validate, items_validate, project_validate), the variant-family-table scope makes this tool's domain distinguishable.
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 domain description — an agent can infer it is for validating a variant-family design table — but there is no explicit when-to-use/when-not statement and no routing to alternatives despite the crowded set of sibling validators. Adequate but leaves selection guidance to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fatigue_checkA
Rate fatigue life (S-N Basquin + Goodman mean-stress correction). σ_a =
stress_range/2; infinite-life SF = 1/(σ_a/σ_e + σ_m/σ_uts); finite life from
an equivalent fully-reversed amplitude on a log-log S-N line. σ_e/σ_uts come
from the material (or overrides). pass = survives cycles (σ_ar ≤ σ_e ⇒
infinite life); a tensile mean ≥ σ_uts fails outright. Returns
{stress_amplitude_mpa, mean_stress_mpa, endurance_mpa, uts_mpa,
equiv_reversed_mpa, safety_factor, life_cycles, required_cycles, pass,
governing_mode, endurance_basis}.
The S-N line runs from (1e3, s1000_fraction·UTS) to (endurance_cycles, σ_e).
Both default to the steel convention (0.9 and 1e6); aluminium and other
non-ferrous alloys have no true endurance knee, so set endurance_cycles to the
life the quoted σ_e was measured at (commonly 5e8).
| Name | Required | Description | Default |
|---|---|---|---|
| cycles | No | ||
| uts_mpa | No | ||
| material | No | Steel-1045 | |
| endurance_mpa | No | ||
| s1000_fraction | No | ||
| mean_stress_mpa | No | ||
| endurance_cycles | No | ||
| stress_range_mpa | Yes |
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 defines the calculation method, the pass/fail criterion, the tensile-mean failure condition, defaults for steel and aluminium, and the output fields returned. It discloses important edge cases like the absence of a true endurance knee for non-ferrous alloys.
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 dense and technical, but for an 8-parameter engineering calculation with no schema descriptions it is appropriately sized and front-loaded with the purpose and method. The equations earn their place, though the inline formula formatting slightly reduces readability compared with a more structured 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?
Given no annotations, no output schema, and 0% parameter schema coverage, the description provides the full context needed to invoke the tool correctly: required inputs, calculation basis, defaults, failure modes, and the complete output field list. Nothing essential for a correct call 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 explain all eight parameters, and it does: stress_range_mpa via σ_a = stress_range/2, cycles via the pass condition, mean_stress_mpa via Goodman correction, uts_mpa/endurance_mpa/material via material-or-override sourcing, s1000_fraction via the S-N line start, and endurance_cycles via default and aluminium guidance. This fully compensates for the missing schema descriptions.
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: 'Rate fatigue life (S-N Basquin + Goodman mean-stress correction).' This clearly distinguishes the tool from generic analysis tools like fracture_check or creep_flag. However, it does not explicitly name or contrast itself with any sibling tool, leaving the agent to infer differentiation from the method 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?
The description explains how the calculation works and when a result passes or fails, but it gives no guidance on when to select this tool instead of alternatives such as fracture_check, creep_flag, or other structural checks. No explicit exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
feature_instantiateA
Stamp a registered FEATURE TEMPLATE onto a host body at reference geometry supplied BY NAME (PowerCopy/UDF, issue #139) — e.g. a mounting_boss onto a published seat frame, or a bolt_pattern onto an f_ face tag. Validates {refs, inputs} at the door, resolves each reference against the host's CURRENT geometry (an f_ tag / interface name that doesn't resolve fails loudly), then runs the deterministic build — geometry + publish_interface + declare_intent.
template: registered template name (feature_list to browse). host: the handle of the body to stamp onto. refs: reference inputs by name — an interface name, an f_/e_ tag, or a literal {origin, z_axis?, x_axis?} frame, per the template's declared ref kinds. inputs: scalar parameters (typed + unit-bearing + range-checked).
Returns {template, schema, host, refs, inputs, handle, name, interfaces, intent}.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | ||
| refs | No | ||
| inputs | No | ||
| template | Yes |
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 up-front validation of {refs, inputs}, resolution against the host's CURRENT geometry, that unresolved tags/interfaces 'fail loudly', and a deterministic build that also runs publish_interface and declare_intent as side effects. This is exactly the behavioral context an agent needs before invoking a mutating 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?
Purpose and behavior are front-loaded in the first sentence, followed by a compact parameter glossary. Dense with parentheticals and an issue reference, but every element is informative and nothing is wasted.
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?
Despite no output schema, the description spells out the return shape ({template, schema, host, refs, inputs, handle, name, interfaces, intent}) and the composed side effects. Combined with validation and failure-mode notes, an agent has everything needed to call and interpret 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 and does: template (registered name, browsable via feature_list), host (body handle), refs (interface name / f_ / e_ tag / literal {origin, z_axis?, x_axis?} frame), and inputs (typed, unit-bearing, range-checked scalars). All four parameters gain 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?
Specific verb ('stamp') plus resource ('registered FEATURE TEMPLATE') with two concrete examples (mounting_boss onto seat frame, bolt_pattern onto f_ face tag). It clearly distinguishes itself from sibling feature tools (feature_list, feature_schema, feature_validate) by describing a build action rather than a browse/validate action.
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 context: a template must be registered, and it routes the agent to feature_list to browse templates. However, it never explicitly states when NOT to use this versus alternatives like feature_validate or family_materialize, so the comparison is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
feature_listA
List every registered FEATURE TEMPLATE — the PowerCopy/UDF analog of a part recipe: a reusable feature with declared reference-geometry inputs (a frame, an f_/e_ tag, an axis) plus scalar parameters, stamped onto a host by name (issue #139). Returns {schema, count, templates} where each maps to {doc, refs, required, optional, emits}; the directory to browse before picking one with feature_schema / feature_instantiate.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does describe the return shape ({schema, count, templates} with field mappings), which is useful behavioral context. However, it doesn't cover permission requirements, whether templates are mutable, or other behavioral traits. Adequate but with 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 description is a single dense sentence followed by the return-shape clause, front-loading the core action. It's information-dense and every clause contributes, though the extended parenthetical explanation is somewhat heavy.
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?
Completes the picture for a read-only list tool with zero parameters and no annotations: it names the resource, describes what a template contains, gives the return shape, and routes to the next tools. No output schema exists, and the description compensates by describing structure. Minor gaps in behavioral traits remain but the essentials 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?
There are zero input parameters, which gives a baseline of 4. The description adds context about the domain (reference geometry like frames, f_/e_ tags, axes plus scalar parameters) rather than restating parameters, which is appropriate.
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 every registered FEATURE TEMPLATE') and elaborates on what a feature template is (PowerCopy/UDF analog of a part recipe with reference-geometry inputs stamped onto a host). This clearly distinguishes it from siblings feature_schema and feature_instantiate.
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 says to browse this directory before picking one with feature_schema / feature_instantiate, which gives clear ordering guidance relative to siblings. It doesn't explicitly state when NOT to use it or include exclusion conditions, but the workflow context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
feature_schemaB
Return one feature template's declared REF+INPUT SCHEMA — its reference geometry (name/kind) and its scalar parameters (type/unit/default/range). Returns {schema, template, doc, refs:[{name, kind, required, doc?}], inputs:[{name, type, unit?, default?, min?, max?, required, choices?, doc?}], emits}. An unknown name fails loudly.
| Name | Required | Description | Default |
|---|---|---|---|
| template | Yes |
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 exact return shape and that unknown names cause a loud failure, which are useful behavioral details. However, it does not state that the operation is read-only, non-destructive, or whether it requires an open document, leaving some 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 description is two sentences, front-loaded with the core purpose, followed by a dense but efficient return structure and an error note. Every element is relevant, with no filler or repetition.
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 absence of an output schema means the description must explain return values, which it does in detail. However, it omits prerequisites (e.g., needing an open document), where to find valid template names, and other usage context, leaving it only adequately complete for a schema retrieval 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 identifies the parameter as a feature template name and warns about unknown names, but gives no format, examples, or pointer to how valid names are obtained, adding only minimal meaning beyond the schema's 'template' string.
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 'Return' and resource 'one feature template's declared REF+INPUT SCHEMA', making the purpose clear. It does not explicitly differentiate from siblings like feature_list or feature_validate, but the scope is distinct enough for an agent to understand what it does.
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 guidance is given on when to use this tool versus alternatives such as feature_list or feature_instantiate. The note that 'an unknown name fails loudly' is a behavioral warning, not usage context, leaving the agent to infer the appropriate call conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
feature_validateA
Validate a feature instantiation {template, refs, inputs} WITHOUT building it — the cheap structural front door (mirrors recipe_validate). Catches an unknown template, an unknown/missing required reference, a malformed reference value, and every scalar-input failure (missing required, out of range, wrong type, bad unit, unknown key). A tag that doesn't resolve against real geometry is caught at feature_instantiate time. Returns {ok, problems}.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | ||
| inputs | No | ||
| template | Yes |
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 enumerates exactly which failure classes are caught (unknown template, unknown/missing/malformed refs, scalar-input failures) and explicitly discloses the limitation that unresolved geometry tags are only caught at feature_instantiate time. It does not state that the call is side-effect-free or how errors are surfaced, 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?
Front-loaded with the core action and the key differentiator ('WITHOUT building it'), followed by the failure inventory and the return shape. Informative density is high; the parenthetical aside about recipe_validate and the em-dash clause are slightly run-on but each 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?
There is no output schema, and the description supplies the return contract {ok, problems}. It covers inputs, failure taxonomy, and the deferred-check boundary, so an agent has enough to invoke and interpret the result. Remaining gap is minor (no statement about idempotency/side effects), acceptable for a validation 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: it names all three parameters (template, refs, inputs) and maps failure semantics to them — unknown template to 'template', unknown/missing/malformed reference to 'refs', scalar failures to 'inputs'. It doesn't specify the shape of refs/inputs objects, but the schema's additionalProperties leaves those open anyway.
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 (validate) and resource (a feature instantiation {template, refs, inputs}) and immediately distinguishes itself from feature_instantiate with 'WITHOUT building it', plus names recipe_validate as the analogous sibling. An agent can pick this over feature_instantiate from the description 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 context: this is the cheap pre-build check, and it is the front door before instantiation. It also names the boundary case (tag resolution is deferred to feature_instantiate time). It stops short of an explicit when-not/alternative instruction such as 'call feature_instantiate only after this passes'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_add_constraintC
Add a constraint by face/edge tag (Slice 1).
kind: structural: 'fixed' | 'force' | 'pressure' | 'displacement' thermal: 'temperature' | 'heatflux' | 'initial_temperature' refs: list of {handle, tag} dicts; 'tag' may be a face tag (f_...) or edge tag (e_...). Resolved against the live shape so refs survive unrelated geometry edits.
For 'force': force (N), optional direction {handle, edge|tag}. For 'pressure': pressure (MPa). For 'displacement': x/y/z (mm) or x_free/y_free/z_free. For 'temperature' / 'initial_temperature': temperature (°C / K). For 'heatflux': flux_type ('DFlux'|'Convection'|'Radiation'), and DFlux: flux (W/m²); Convection: ambient_temp (°C) + film_coef (W/m²K); Radiation: ambient_temp + emissivity.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| y | No | ||
| z | No | ||
| flux | No | ||
| kind | Yes | ||
| name | No | ||
| refs | Yes | ||
| force | No | ||
| x_free | No | ||
| y_free | No | ||
| z_free | No | ||
| analysis | Yes | ||
| pressure | No | ||
| reversed | No | ||
| direction | No | ||
| film_coef | No | ||
| flux_type | No | ||
| emissivity | No | ||
| temperature | No | ||
| ambient_temp | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full behavioral burden. It states that refs are resolved against the live shape and survive geometry edits, which is useful. However, it omits critical traits: is the operation destructive? Does it require an existing analysis? Are there permission or rate limits? What is the response? For a mutation tool with 20 parameters and no annotations, this is a significant 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 description is front-loaded with the core action and then organized by kind with clear bullet-like formatting. It is efficient and structured, though not maximally concise (e.g., '(Slice 1)' is cryptic and could be omitted). Every sentence earns its place in explaining parameter 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?
Given the complexity (20 parameters, no annotations, no output schema, 0% schema coverage), the description is incomplete. It covers required parameters for each kind but omits optional parameters like name, reversed, and the free flags. It also lacks behavioral context like return value or side effects. It is minimally viable but has clear 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%, so the description must compensate. It explains what kind values are valid and lists required parameters for each kind (force, pressure, displacement, temperature, heatflux, etc.), which adds substantial meaning beyond the bare schema. However, it does not cover all 20 parameters (e.g., name, reversed, x_free/y_free/z_free are only partially mentioned). It covers the most critical ones but leaves gaps, so a 3 is appropriate.
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: 'Add a constraint by face/edge tag'. It distinguishes the mechanism (refs resolved against live shape) but does not differentiate from siblings like fem_set_material or contact_setup beyond the general FEM family context. The purpose is clear but lacks explicit 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?
There is no explicit guidance on when to use this tool vs alternatives (e.g., fem_new_analysis, fem_set_material, contact_setup). The description implies it's for adding constraints in a FEM analysis but offers no when/when-not or alternative conditions. No usage context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_bucklingC
Configure analysis for linear buckling. Apply a unit-magnitude force constraint at the load location; the result factors are the multipliers at which buckling occurs.
| Name | Required | Description | Default |
|---|---|---|---|
| analysis | Yes | ||
| n_factors | 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 behavioral disclosure burden. It adds useful method context: applying a unit force and interpreting factors as buckling multipliers. However, it does not state whether this mutates existing analysis state, what permissions or prior setup are needed, or how the result is retrieved.
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 front-loaded sentences with no wasted words. The purpose is stated first, followed by the key computational detail and result interpretation.
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 FEM configuration tool with no annotations, no output schema, and 0% schema description coverage, this description is incomplete. It explains the buckling method and result meaning, but omits prerequisites, parameter meanings, and how this step fits with fem_run and fem_buckling_results.
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 undocumented parameters. It does not explain what 'analysis' should contain or what 'n_factors' controls, leaving both parameters effectively meaningless to an agent.
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: 'Configure analysis for linear buckling.' An agent can tell this is an FEM buckling setup tool, distinct from generic FEM tools like fem_run or result readers. However, it does not explicitly differentiate itself from related siblings such as beam_buckling or fem_buckling_results.
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 procedural detail about applying a unit-magnitude force, but it does not say when to use this tool versus alternatives like fem_modal, beam_buckling, or fem_buckling_results. No prerequisites or workflow placement are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_buckling_resultsB
Extract buckling load multipliers from a completed buckling run. Returns {buckling_factors: [...], modes: [{mode, factor}, ...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| analysis | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden, and it does disclose the return structure (buckling_factors and modes), which is helpful. However, it omits whether the operation is read-only, requires a specific run state, or how the analysis must be identified, leaving important behavioral traits unstated.
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 tightly written sentences: the first states the purpose, the second gives the return shape. Every clause earns its place and the purpose is front-loaded.
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 description partially compensates for the missing output schema by showing the return shape, which is helpful. But the critical input parameter is undocumented in both schema and description, and no annotations exist, so an agent still lacks enough information to invoke the tool confidently.
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 'analysis' parameter, and the description never mentions it or explains what value it expects. The only hint is 'from a completed buckling run', which does not clarify whether 'analysis' is an ID, name, or handle.
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 ('Extract'), resource ('buckling load multipliers'), and scope ('from a completed buckling run'), which clearly separates it from the sibling fem_buckling that runs the analysis. It does not name a sibling explicitly, so it falls short of the top mark.
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 a completed buckling run' implies this should be called after a buckling solve, but the description gives no explicit when-to-use guidance or named alternative. Usage is inferable from the precondition rather than stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_cantilever_demoA
Run the built-in cantilever FEM demo end-to-end (geometry → mesh → CalculiX).
Dimensions in mm, force in N. Returns {nodes, tets, max_displacement_mm, max_vonmises_mpa, workdir}. A fresh document is created; existing state in the session is NOT overwritten but a new document becomes active.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| width | No | ||
| height | No | ||
| length | No | ||
| workdir | No | ||
| mesh_size | 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 the exact return payload (nodes, tets, max_displacement_mm, max_vonmises_mpa, workdir) even though no output schema exists, and clearly describes the mutation side effect ('a fresh document is created; existing state... is NOT overwritten but a new document becomes active'). It omits runtime, solver prerequisites, and failure modes.
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?
Three compact sentences ordered purpose-first, then units, then return shape, then side effects. No filler, and the most decision-relevant constraint (document creation) is stated explicitly rather than buried.
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 six parameters, no annotations, and no output schema, the description adequately covers the return contract, units, and state impact. The main remaining gap is that mesh_size and workdir are undefined, which slightly weakens callers tuning mesh resolution or output location.
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 supplies units ('dimensions in mm, force in N') for the geometric/force inputs, but never names the parameters and leaves mesh_size and workdir entirely unexplained, so a meaningful chunk of the schema remains 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 description uses a specific verb ('Run') and resource ('built-in cantilever FEM demo'), and the 'geometry → mesh → CalculiX' clause makes the scope concrete. It implicitly distinguishes itself from real analysis siblings (fem_run, fem_mesh) by being a self-contained demo, though it does not name an alternative.
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 word 'demo' suggests it is for exercising/testing the pipeline, but there is no explicit when-to-use, when-not-to-use, or routing versus fem_run/fem_modal. An agent must infer the intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_meshB
Create a Gmsh mesh of body, attached to analysis.
char_length: max characteristic element length in mm. 0 = let Gmsh pick. element_order: '1st' or '2nd' (quadratic). Use '2nd' for bending/modal accuracy — linear tets (C3D4) shear-lock and overstiffen thin sections (a cantilever's first natural frequency lands ~50% high with only 1-2 elements through the thickness; 2nd-order tets bring it within ~1% of beam theory). Default lets Gmsh choose. Returns {handle, name, nodes, tets}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| name | No | Mesh | |
| analysis | Yes | ||
| char_length | No | ||
| element_order | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It discloses the return shape ('Returns {handle, name, nodes, tets}') and that the mesh is attached to the analysis, plus default behavior for char_length and element_order. It does not mention permissions, side effects on existing analysis data, or any error/rate-limit behavior, so it is only moderately 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 core purpose, then addresses key parameters in a logical order. The lengthy parenthetical justifying 2nd-order elements is detailed but relevant, though it adds some unnecessary length for a tool description.
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 an output schema, the description helpfully states the return shape. With no annotations, it should ideally cover more behavioral context, and it omits the 'name' parameter entirely. It is adequate for an agent to call the tool but not fully complete for the richness of the 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%, so the description must compensate for all five parameters. It thoroughly describes char_length (max element length in mm, 0 = Gmsh picks) and element_order ('1st' or '2nd', default lets Gmsh choose), and body/analysis are semantically implied by the opening sentence. However, the 'name' parameter is never mentioned, leaving one of five parameters 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 ('Create a Gmsh mesh of body, attached to analysis'), so the agent knows exactly what it does. However, it does not distinguish this tool from siblings like fem_mesh_refinement or fem_new_analysis, 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 gives clear guidance for choosing element_order ('Use 2nd for bending/modal accuracy'), which implies when the tool is useful for modal or bending analysis. But it never states when to use this tool versus alternatives (e.g., fem_mesh_refinement) or any prerequisites, leaving tool-level usage 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.
fem_mesh_refinementA
Add a local mesh-refinement region to an existing FEM mesh.
mesh: handle of the FEM mesh. refs: list of {handle, face|edge|tag} dicts identifying the elements (faces/edges) to refine on. char_length: characteristic element length (mm) on those elements; should be smaller than the global mesh setting to actually refine.
| Name | Required | Description | Default |
|---|---|---|---|
| mesh | Yes | ||
| name | No | MeshRegion | |
| refs | Yes | ||
| char_length | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full burden. It discloses that the operation adds to an existing mesh and that char_length must be smaller than the global setting to actually refine, which is a useful behavioral condition. However, it does not state whether the mesh is modified in place or a new handle is returned, nor any permission or reversibility details, leaving major behavioral gaps 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?
The description is front-loaded with the purpose, then a compact parameter glossary. Every sentence contributes; there is no repetition or 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 FEM mesh-modification tool with no annotations and no output schema, the definition covers the core action and most parameters, but it omits the optional 'name' parameter, mutation/return semantics, and how this tool fits between fem_mesh and fem_run. It is minimally adequate but not fully 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 explains mesh (handle), refs (list of dicts with handle and face/edge/tag), and char_length (units in mm and a constraint relative to global mesh), covering three of four parameters. The optional 'name' parameter is not described.
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 ('Add'), resource ('local mesh-refinement region'), and target ('existing FEM mesh'), which clearly distinguishes it from global mesh generation (fem_mesh) and downstream solve tools. It is not a tautology and an agent can identify the action 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 implies usage ('on an existing FEM mesh') and gives a condition for effect ('char_length should be smaller than the global mesh setting to actually refine'), but it does not explicitly say when to use this versus fem_mesh or other mesh tools, nor any exclusions. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_modalA
Configure analysis for modal (frequency) extraction.
Sets solver AnalysisType='frequency' and EigenmodesCount=n_modes. f_low / f_high (Hz) optionally bound the requested mode range. Caller still calls fem_run, then fem_modal_results to read frequencies.
| Name | Required | Description | Default |
|---|---|---|---|
| f_low | No | ||
| f_high | No | ||
| n_modes | No | ||
| analysis | Yes |
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 concrete state it mutates (AnalysisType='frequency', EigenmodesCount=n_modes) and the required follow-up calls. It omits whether the target analysis must pre-exist or how existing settings are affected, but the core behavioral picture is present.
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?
Four short, front-loaded sentences with no filler; the primary purpose leads and each subsequent line adds distinct information (settings, range semantics, workflow).
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 configuration tool with no annotations and no output schema, it supplies purpose, parameter meaning, and the run/read workflow. Gaps remain around prerequisites (does an analysis object need to exist first?) and mutation side effects, but it is nearly 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 explains the units and role of f_low/f_high (Hz, bounding the requested mode range) and maps n_modes to EigenmodesCount. Only the required 'analysis' handle is left unexplained, but its meaning is largely evident from context.
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: 'Configure analysis for modal (frequency) extraction.' It names the exact solver setting being configured, which cleanly distinguishes it from the sibling analysis-configuration tools like fem_buckling and the fem_results family.
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 workflow ordering: the caller still calls fem_run and then fem_modal_results to read frequencies. This tells the agent the correct sequence, though it does not state exclusions or name alternative analysis-config tools for other physics types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_modal_resultsB
Extract natural frequencies from a completed modal run. Returns {frequencies_hz: [...], modes: [{mode, frequency_hz, max_displacement_mm}, ...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| analysis | Yes |
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 it does disclose the return shape including the per-mode fields, which is genuinely useful. It does not state what happens if the run is incomplete, whether results are cached, or what permissions/state the analysis must be in, so 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?
Two tightly written sentences: the action and precondition come first, followed by the literal return shape. Every clause earns its place with no 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?
Because no output schema exists, the description correctly compensates by spelling out the return structure, which is a real strength. The gap is on the input side: the required 'analysis' argument is never explained, and with no annotations there is no safety or state information to fall back on.
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 'analysis' parameter has 0% schema description coverage, and the description adds no meaning at all about what value it expects (a name, handle, ID, or index) or how to obtain it. This leaves the only required input 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 description states a specific verb and resource ('Extract natural frequencies') and scopes it to a 'completed modal run', which distinguishes it from the sibling fem_modal that performs the run. It does not name any sibling explicitly, so the differentiation is inferred 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 a completed modal run' implies the prerequisite (a prior fem_modal solve), which is useful context. However, there is no explicit when-to-use/when-not guidance and no pointer to fem_modal_results versus fem_results or fem_result_probe, so the agent must infer which result tool to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_new_analysisC
Create a Fem::FemAnalysis container. Returns {handle, name}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Analysis |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden but only says it creates a container and returns {handle, name}. It does not disclose mutation side effects, persistence, whether an active document is required, error behavior, or what the handle is used for. The return shape is useful but insufficient.
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 creation action and followed by the return shape. There is no filler or redundancy; every phrase 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 simple one-parameter creation tool with no output schema, the description does provide the return fields {handle, name}. However, it omits parameter semantics and any FEM workflow context, leaving meaningful gaps for an agent navigating a large sibling toolset.
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 schema has one parameter, name, with 0% description coverage and a default of 'Analysis'. The description never mentions the input name parameter or what it controls. Because schema coverage is extremely low, the description should compensate but adds no parameter 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?
The description states a specific verb and resource: 'Create a Fem::FemAnalysis container.' This is clear enough for an agent to distinguish it from sibling FEM setup/solver/result tools. It does not, however, explain how it relates to downstream FEM workflow tools, so it falls short of a full 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 gives no when-to-use guidance, no prerequisites, and no alternatives. An agent must infer that this is a first step before fem_set_material, fem_add_constraint, fem_mesh, etc. There is no explicit routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_result_probeA
Probe FEM results at a specific location, instead of only the global
max + top-N that fem_results returns. Answers "what is the stress at this
point / on this face?" — the agent-friendly form for design iteration.
Pick exactly one mode:
POINT: point=[x, y, z] (mm, model coordinates). Interpolates the field barycentrically inside the tet containing the point (method='interpolated'); if the point is outside the mesh it falls back to the nearest node and reports distance_mm (method='nearest_node').
FACE: handle= + face=<'f_*' tag or 'FaceN'>. Aggregates the field over the mesh nodes on that CAD face, returning {min, max, mean}.
field: 'auto' (default — every field present in the result) | 'vonmises' | 'displacement' | 'temperature'.
Returns (point mode) {mode:'point', query_point, method, element_id?, node?, distance_mm, vonmises_mpa?, displacement_mm?, displacement_vector?, temperature_c?}; (face mode) {mode:'face', face, node_count, vonmises_mpa?:{min,max,mean}, displacement_mm?:{...}, temperature_c?:{...}}.
| Name | Required | Description | Default |
|---|---|---|---|
| face | No | ||
| field | No | auto | |
| point | No | ||
| handle | No | ||
| analysis | Yes |
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 barycentric interpolation, nearest-node fallback with distance_mm, method values, and face aggregation returning min/max/mean. It does not explicitly state read-only status or permission requirements, but the operation’s behavior is otherwise 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 purpose, then cleanly split into mode, field, and return sections. The bullets are structured and every sentence contributes needed detail for a complex 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 5-parameter tool with no annotations and no output schema, the description supplies mode mechanics, parameter semantics, and detailed return structures. It is nearly complete, but missing any explanation of the required `analysis` parameter keeps it just short of full completeness.
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 defines `point` coordinates in mm/model coordinates, `handle` plus `face` tags for face mode, and `field` enum values. However, the required `analysis` parameter is never explained, which is a meaningful 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: probe FEM results at a specific location. It explicitly distinguishes itself from sibling `fem_results` by contrasting specific-location probing with global max + top-N output, so an agent can select it confidently.
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 says to pick exactly one mode and names the `fem_results` alternative for global/max summaries. It defines the POINT and FACE mode conditions clearly, though it does not spell out prerequisites such as needing an existing analysis result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_resultsB
Extract summary results from an analysis.
Returns {max_vonmises_mpa, max_displacement_mm, max_displacement_vector, top_stress_nodes: [{node, vonmises_mpa, displacement_mm}, ...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| analysis | Yes |
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 discloses the return structure, which is helpful, but doesn't mention whether the analysis must be completed first, whether it's read-only, or any side effects. With no annotations, this is a moderate 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 description is two sentences and front-loads the purpose, followed by the return shape. It is efficient with no wasted words, though the return structure could be formatted more clearly.
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-parameter tool with no output schema and no annotations, the description provides the return shape but lacks parameter semantics, prerequisites, and behavioral context. It is minimally adequate but missing key details an agent would need.
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 should compensate. It doesn't explain what the 'analysis' parameter expects (e.g., an analysis ID or name) or what 'top_n' controls beyond the implied default. The return schema mentions top_stress_nodes but doesn't map to the top_n parameter.
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 ('Extract summary results from an analysis'), which is clearly distinguishable from siblings like fem_result_probe or fem_modal_results. It doesn't explicitly name alternatives, but the purpose 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?
Implied usage is that this is used after running an analysis, but there is no explicit when-to-use guidance or mention of alternatives such as fem_result_probe. An agent must infer context from the tool name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_runB
Run the CalculiX solver on an analysis. Blocks until the solve finishes.
workdir defaults to <TMPDIR>/ankusdrive_fem. Returns {workdir, status}.
| Name | Required | Description | Default |
|---|---|---|---|
| workdir | No | ||
| analysis | Yes |
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 the synchronous blocking nature ('Blocks until the solve finishes') and the return shape {workdir, status}, but says nothing about failure modes, what status values mean, expected runtime, or auth/permission needs for a long-running solve.
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?
Three tight sentences, front-loaded with the action, then the blocking behavior, then the params/return. Every sentence earns its place with no 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 solver-execution tool with no annotations, no output schema, and 0% parameter coverage, the description is adequate but thin. It covers the return shape and blocking behavior, but omits prerequisites, status semantics, and error/timeout handling that an agent needs before invoking a solve.
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 the `workdir` default path, adding real value, but leaves `analysis` unexplained — the agent cannot tell whether it is a name, handle, or id. Partial compensation across two 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?
States a specific verb+resource: 'Run the CalculiX solver on an analysis.' Names the concrete solver and the input, so the agent knows it is executing an FEM solve. It does not explicitly position itself against sibling solvers like fem_modal or fem_buckling, which limits 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?
No statement of when to use this versus the many other fem_* and solver-submit siblings, and no prerequisites (mesh, material, constraints must already exist). The agent is left to infer the workflow context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_set_materialB
Bind a material to a body in an analysis.
material is a dict with at minimum: {"YoungsModulus": "210000 MPa", "PoissonRatio": "0.30", "Density": "7900 kg/m^3", "Name": "Steel-Generic"} Any extra keys are passed through to the FEM material card.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| name | No | Material | |
| analysis | Yes | ||
| material | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It usefully discloses the minimum material dict keys and that extra keys pass through to the FEM material card, but it does not state whether binding overwrites an existing material, what permissions are needed, or what side effects occur.
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 short, front-loaded with the core action, and then gives only the material example and passthrough rule. Every sentence earns its place and there is no 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 mutation tool with no annotations and a nested object parameter, the description covers the critical material payload but omits prerequisite context about analysis and body references, overwrite behavior, and optional naming. It is adequate to attempt a call with the example dict, 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%, so the description has to compensate for all four parameters. It adds strong meaning for the complex material object by giving required keys and units, but it says nothing about body, analysis, or name, leaving the majority of 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?
The description gives a specific verb and resource: 'Bind a material to a body in an analysis.' That clearly separates it from general material lookup or solver setup tools. It does not explicitly name or compare itself to the closest sibling, fem_set_nonlinear_material, 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?
There is no when-to-use guidance, no prerequisites, and no alternatives named. The action is implied by the verb, but an agent gets no explicit instruction about when this tool is the right choice versus material_select, fem_set_nonlinear_material, or fem_add_constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_set_nonlinear_materialA
Attach an elastoplastic (*PLASTIC) hardening curve to a linear FEM material
and switch the CalculiX solve to nonlinear — the material-nonlinearity half of
the nonlinear FEM path (contact_setup is the geometric/contact half). No new
solver: this promotes the CCX MaterialNonlinearity / GeometricalNonlinearity
flags the FEM path already exposes. base_material is the handle from
fem_set_material (its YoungsModulus/PoissonRatio stay the elastic branch).
Give the post-yield curve either as yield_points ([[stress_MPa,
plastic_strain], ...], first point at plastic_strain 0 = initial yield) or from
yield_mpa (+ optional tangent_modulus_mpa linear-hardening slope and
max_plastic_strain). With no tangent modulus the curve is
elastic–perfectly-plastic and caps the stress at σ_y exactly. hardening:
'isotropic' (monotonic) or 'kinematic' (cyclic/Bauschinger). Set
geometric_nonlinearity=true to combine plasticity with large deflection
(*NLGEOM). ramp_increments sub-divides the load step so ccx's plastic
return-mapping converges. Run fem_run + fem_results after; gate against
plastic_collapse (perfectly-plastic stress saturates at σ_y, collapse at M_p).
Returns {handle, name, hardening, yield_points, n_points, solver_material_nonlinear, solver_geometric_nonlinear, ramp_increments}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | NonlinearMaterial | |
| analysis | Yes | ||
| hardening | No | isotropic | |
| yield_mpa | No | ||
| yield_points | No | ||
| base_material | Yes | ||
| ramp_increments | No | ||
| max_plastic_strain | No | ||
| tangent_modulus_mpa | No | ||
| geometric_nonlinearity | No |
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 delivers: it clarifies 'No new solver' and that it 'promotes the CCX MaterialNonlinearity / GeometricalNonlinearity flags', explains that base_material comes from fem_set_material, details how elastic-perfectly-plastic behavior arises without a tangent modulus, and lists the exact return fields. This is unusually rich behavioral disclosure for a mutation/configuration 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 remaining text is dense with useful technical detail. Every sentence contributes to correct invocation, parameter meaning, or workflow integration, and the length is justified by 10 parameters and zero annotation support.
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, lack of annotations, and lack of an output schema, the description is substantially complete: it explains the solver-flag effect, parameter formats, the downstream fem_run/fem_results workflow, and the returned fields. The main omission is any explanation of the required 'analysis' parameter or how it relates to an FEM analysis object, which would help an agent 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 description coverage is 0%, so the description must compensate, and it does so for most parameters: it defines yield_points as [[stress_MPa, plastic_strain], ...] with first point at plastic_strain 0, explains yield_mpa with optional tangent_modulus_mpa and max_plastic_strain, and covers hardening, ramp_increments, and geometric_nonlinearity. However, the required 'analysis' parameter and the 'name' parameter are not described at all, leaving a gap in an otherwise strong semantic explanation.
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 the specific verb 'Attach' and names the exact resource: an elastoplastic (PLASTIC) hardening curve applied to a linear FEM material, while switching the solve to nonlinear. It explicitly distinguishes itself from its closest sibling by saying it is 'the material-nonlinearity half of the nonlinear FEM path (contact_setup is the geometric/contact half).' An agent can identify the tool's role 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 exactly when to use it (material nonlinearity, as opposed to geometric/contact nonlinearity handled by contact_setup) and describes the downstream workflow: 'Run fem_run + fem_results after; gate against plastic_collapse.' The alternative tool is named and its complementary condition is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_set_solverB
Add a solver to an analysis. kind: 'ccx' (CalculiX) or 'elmer'.
tunables: dict of solver-property values, e.g. {"GeometricalNonlinearity": "linear", "ThermoMechSteadyState": True, "MatrixSolverType": "default"}. Sensible CCX defaults are filled in if omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ccx | |
| name | No | Solver | |
| analysis | Yes | ||
| tunables | 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 of behavioral disclosure. It states that CCX defaults are filled in, but it does not disclose side effects, idempotency, permissions, overwrite behavior, or error handling for this add/mutation 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 with the core action and then efficiently details kind and tunables with concrete examples. 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?
With no annotations, no output schema, and 0% schema description coverage, the description should do more to explain the tool's place in the FEM workflow. It covers the essential invocation details for kind and tunables, but leaves the required analysis identifier and the relationship to siblings like fem_run and fem_new_analysis unclear.
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 explains kind and tunables with examples and default behavior, but it leaves name and analysis poorly described beyond the implied target of the operation, so it only partially fills the 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: 'Add a solver to an analysis.' It distinguishes itself from siblings such as fem_new_analysis (create analysis) and fem_add_constraint (add constraint) by naming the exact operation. The kind options further specify the tool's scope.
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 no explicit guidance on when to use this tool versus alternatives like fem_new_analysis, fem_run, or fem_set_material. It only implies that an analysis must already exist. There are no prerequisites, exclusions, or ordering instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fem_thermal_resultsA
Extract temperature field summary from a completed thermal run. Returns {temperatures_c: {min, max, mean}, top_n_hot_nodes: [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| top_n | No | ||
| analysis | Yes |
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 the return shape (temperature min/max/mean and hottest nodes) in place of an output schema, but says nothing about permissions, read-vs-write semantics, units beyond the _c suffix, or error behavior for an incomplete run.
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 zero filler; the core action and the return contract are both front-loaded and immediately scannable.
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 two-parameter results tool with no output schema, the inline description of the returned object usefully fills the output-schema gap. It stops short of covering the required analysis argument or run-completion prerequisites, but it is close to 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?
Schema description coverage is 0%, so the description must compensate. The return field "top_n_hot_nodes" loosely implies the top_n parameter controls how many hot nodes are listed, but neither top_n's count semantics nor the required "analysis" identifier format is explained anywhere.
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 ("Extract") and resource ("temperature field summary from a completed thermal run"), which clearly separates it from general result tools like fem_results and modal tools like fem_modal_results. It does not, however, explicitly name or differentiate itself from 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?
The phrase "from a completed thermal run" implies a prerequisite (the run must be finished first), but there is no explicit when-to-use guidance, no statement of when to prefer fem_results or fem_result_probe instead, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fillet_edgesA
Fillet edges of a shaped Part object. edges accepts tags (e_... from
list_edges, preferred), 'EdgeN' strings, or bare 1-based ints. radius is
the blend radius in mm (> 0).
Every result is validated before a handle comes back (issue #283): this OCC build's fillet is edge- and order-sensitive enough to produce corrupt geometry with no exception at all — a 20 mm cube filleted on all 12 edges at r=11 returns one solid with a LARGER volume and a 13 mm larger bounding box. The checks are Shape.isValid(), an unchanged solid count, and no growth of the tight bounding box (a fillet only removes or holds the envelope).
per_edge: skip the single-shot apply and add the edges one at a time, validating after each. Slower (one recompute per edge); for geometry already known to be blend-hostile. allow_partial: accept a partial result instead of aborting. Off by default.
Returns {handle, name, volume (mm^3), edges (the 1-based indices actually filleted), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode ('batch' | 'per_edge'), partial}. When partial is True the reply also carries skipped_edges and a warnings entry saying the solid is NOT the part that was asked for.
On failure the handler retries per edge to find the culprits, removes the failed feature from the document and raises BlendCheckFailed naming the offending edges and the subset that does fillet cleanly. It never returns a handle to corrupt geometry, and never quietly drops a fillet unless allow_partial was asked for.
| Name | Required | Description | Default |
|---|---|---|---|
| edges | Yes | ||
| handle | Yes | ||
| radius | No | ||
| per_edge | No | ||
| allow_partial | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the entire burden and does so richly: it discloses validation gates (isValid, solid count, envelope growth), the silent-corruption failure mode, the per-edge retry-and-raise behavior on failure, and the guarantee that no handle to corrupt geometry is ever returned. This is far beyond what a schema or annotation would convey.
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 parameter formats, then behavior. It is dense but a couple of passages (the 20 mm cube anecdote, restating the envelope rule) run longer than needed, though the concrete example does earn some of its space by illustrating the failure mode.
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 fully specifies the return dict (handle, name, volume, edges, checks, mode, partial plus skipped_edges/warnings), and covers mutation, partial-result, and failure semantics. An agent has everything needed to call and interpret this 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: `edges` accepts tags/'EdgeN'/bare 1-based ints (tag preferred), `radius` is mm and must be > 0, and both booleans have their semantics and defaults explained. Each documented parameter gains meaning absent from 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+resource ('Fillet edges of a shaped Part object') and immediately specifies the accepted edge identifier formats, which pins down exactly what the tool operates on. It does not differentiate itself from the sibling fillet/chamfer tools (partdesign_fillet, chamfer_edges), so it falls short of the top mark.
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 per_edge and allow_partial options carry explicit when-to-use guidance ('for geometry already known to be blend-hostile', 'accept a partial result instead of aborting'). It never names an alternative tool or states when not to fillet at all, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fit_checkA
Classify a hole/shaft pair. hole and shaft are {nominal, plus, minus} (signed deviations) or {nominal, tol}. Returns {fit_class:'clearance'| 'transition'|'interference', min_clearance, max_clearance, nominal_clearance, prob_interference} (prob from a normal model with half-band = 3-sigma).
| Name | Required | Description | Default |
|---|---|---|---|
| hole | Yes | ||
| shaft | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations to lean on, the description steps up by disclosing the return object's fields (fit_class, min/max/nominal clearance, prob_interference) and the underlying statistical assumption (normal model, half-band = 3-sigma), which is real behavioral context. It stops short of stating that this is a side-effect-free computation or how errors/ambiguous inputs are handled.
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 dense sentences, front-loaded with the purpose followed by input shapes then return keys; nothing is wasted. The terse shorthand ('half-band = 3-sigma') is efficient but slightly compression-heavy for an agent with no other context.
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, so the description is the only source of return-value information, and it delivers the full result shape plus the probabilistic model. Inputs are also fully specified locally; the remaining gap is routing guidance against sibling tools and any statement of units or failure 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?
The schema declares both required parameters as untyped objects with additionalProperties=true and zero description coverage, so the description is doing all the work: it defines the two accepted shapes, {nominal, plus, minus} as signed deviations and {nominal, tol}. That fully compensates for the schema gap, with units and the meaning of 'nominal' left unstated.
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: 'Classify a hole/shaft pair', so the agent immediately knows this computes a fit classification. It does not, however, distinguish itself from close siblings such as fit_class or press_fit_stress, 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 statement of when to use this tool versus the many overlapping siblings (fit_class, interference_check, min_clearance, tolerance_stackup). The agent must infer the intended context from the name and the input format alone; no exclusions 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.
fit_classA
ISO 286 limits for a fit code (e.g. 'H7/g6'), in mm. v1 covers a hole-basis H with shaft clearance letters (h, g, f, e). Returns {basic_size, fit, hole:{upper_dev,lower_dev,min,max}, shaft:{...}, fit_class, min_clearance, max_clearance, prob_interference}. Errors on an out-of-table size (>500 mm) or an unsupported code (non-H hole or interference shaft letter).
| Name | Required | Description | Default |
|---|---|---|---|
| fit | No | H7/g6 | |
| basic_size | Yes |
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 units (mm), the version-1 scope limitation (hole-basis H, clearance letters h/g/f/e), the exact return shape, and the two error conditions (>500 mm out-of-table size, unsupported code). It lacks nothing critical for a pure lookup/calculation 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?
Three dense sentences, front-loaded with purpose, then scope, then return/errors. Nearly every clause earns its place; the only mild cost is packing the return object and error cases into a single long 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?
There is no output schema and no annotations, so the description must supply the contract, and it does: it enumerates return fields and states the failure modes. Complete enough to call correctly and interpret results, though it omits any note on default behavior when 'fit' is omitted (only inferable from the schema default).
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: 'fit' is illustrated with the format 'H7/g6' (matching the default), and 'basic_size' is given units (mm) and a range (>500 mm errors). This meaningfully extends the bare {fit, basic_size} 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 resource and standard: 'ISO 286 limits for a fit code (e.g. H7/g6), in mm,' which tells an agent exactly what the tool computes. It does not, however, name or distinguish itself from plausible siblings such as fit_check or fit_page, so sibling differentiation is absent.
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 scopes the tool ('v1 covers a hole-basis H with shaft clearance letters (h, g, f, e)'), which implies when it applies, but it never says when to prefer this over fit_check or other fit-related siblings. Usage is inferable from the scope statement rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fit_pageA
Auto-fit a drawing to its sheet: recentre the views so the part AND its
placed dimensions sit inside the printable border (clear of the title block).
The projection group's Automatic scale already sizes the part; its dimensions
extend a fixed margin beyond it which can run off an edge — call this after
placing dimensions to slide everything inside. margin mm is the border inset.
Returns {scale, fits, envelope, border}; fits=False means the part + dims are too
large even when centred (use a larger sheet).
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| margin | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses that the projection group's Automatic scale already sizes the part, that dimensions extend a fixed margin that can run off an edge, and what the tool changes (slides everything inside). It does not state whether the document is mutated or requires a saved/active page, 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?
Front-loaded with the primary action and its reason, followed by the causal explanation and the return contract. Dense but each sentence adds information; only the margin explanation mildly overlaps the schema default.
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 return shape {scale, fits, envelope, border} and the meaning of fits=False, plus the sequencing and failure remedy. The remaining gap is the `page` argument's identity and whether the drawing is modified in place.
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 only two params exist. The description explains `margin` as the border inset in mm (matching the default of 8), but `page` is left undefined — an agent cannot tell whether it is a name, index, or handle. Partial compensation, so a middling 3.
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 (auto-fit) and resource (drawing to its sheet) and explains the exact mechanism — recentring views so the part plus placed dimensions sit inside the printable border, clear of the title block. This is far more precise than any sibling drawing tool and lets an agent distinguish it from add_projection_group or add_dimension.
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 sequencing ('call this after placing dimensions') and a terminal condition ('fits=False means the part + dims are too large even when centred — use a larger sheet'). It stops short of naming an alternative tool or a when-not-to-call rule, but the temporal placement guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fluid_propsA
Thermophysical properties of a fluid at (T, P) from CoolProp's equation of
state (issue #100). name is a fluid (e.g. 'water', 'air', 'R134a', 'CO2',
'nitrogen'), T_K absolute temperature [K], P_Pa pressure [Pa, default
1 atm). Returns {ok, density [kg/m³], viscosity [Pa·s], cp [J/kg·K],
conductivity [W/m·K], prandtl, kinematic_viscosity [m²/s], fidelity,
valid_range_ok, source, warnings, coolprop_available}. This is the DEFAULT
fluid-property source behind the convection/CFD screens; explicit caller props
still override. Degrades cleanly when the (opt-in) CoolProp extra is absent:
air/water return ≈20 °C constants (fidelity='constant_fallback'); other fluids
return {ok:false, reason, install}. CoolProp (BSD-3) is cited as the source.
| Name | Required | Description | Default |
|---|---|---|---|
| T_K | Yes | ||
| P_Pa | No | ||
| name | Yes |
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 degradation path when the opt-in CoolProp extra is absent (air/water return ~20 °C constants with fidelity='constant_fallback'; other fluids return {ok:false, reason, install}). It does not discuss permissions or rate limits, but as a pure read/compute tool those are 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?
Dense and front-loaded, leading with the core purpose, inputs, then return shape and fallback. Some clutter dilutes it, such as the parenthetical '(issue #100)' and the trailing source-license note, which do not help an agent invoke 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?
No output schema exists, but the description enumerates all returned fields (density, viscosity, cp, conductivity, prandtl, kinematic_viscosity, fidelity, valid_range_ok, source, warnings, coolprop_available), covering inputs, outputs, and fallback behavior. The only gap is deeper detail on valid-range and warning semantics.
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: name is documented as a fluid with concrete examples ('water', 'air', 'R134a', 'CO2', 'nitrogen'), T_K as absolute temperature [K], and P_Pa as pressure [Pa, default 1 atm], all with units and 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 specific verb+resource: computes thermophysical properties of a fluid at (T, P) from CoolProp's equation of state. It also positions itself against siblings by declaring it is the DEFAULT fluid-property source behind the convection/CFD screens, so an agent can distinguish it from ad-hoc property tools.
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 when it applies (default source for convection/CFD screens) and notes the override condition: explicit caller props still take precedence. It does not name a concrete alternative tool or an explicit when-not-to-use case, 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.
fracture_checkA
Rate brittle fracture (LEFM): K = Y·σ·√(π·a) vs K_IC. a is crack length in mm; Y (geometry_factor) defaults 1.12 (edge crack), 1.0 for a centre crack. K_IC from the material (or override). Critical crack a_c = (K_IC/(Y·σ))²/π. Returns {k_applied_mpa_sqrt_m, k_ic_mpa_sqrt_m, geometry_factor, safety_factor, margin, critical_crack_mm, pass}; a crack past a_c gives SF<1 and margin<0.
| Name | Required | Description | Default |
|---|---|---|---|
| material | No | Steel-1045 | |
| stress_mpa | Yes | ||
| crack_len_mm | Yes | ||
| geometry_factor | No | ||
| fracture_toughness_mpa_sqrt_m | 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 behavioral burden. It explains the underlying formula, default behavior for geometry_factor, material-based or override K_IC, how critical crack length is computed, and the meaning of SF<1 and margin<0. This is substantial behavioral context, though it doesn't state whether the tool is read-only or any side effects (there likely are none for a computation, but that isn't explicit).
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 dense but front-loads the core purpose, formula, parameter definitions, and return fields in a compact multi-sentence block. It is efficient for the information density, though the return field list makes it slightly long; every sentence is relevant.
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 computational tool with no output schema and no annotations, the description fully covers formula, parameter semantics, defaults, critical crack definition, and output keys. It is nearly complete; the only minor gap is explicit mention that the tool is non-mutating and requires no authentication, which is likely inferable.
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 explains units and meaning of a (crack length in mm), Y (geometry_factor, with defaults 1.12 edge and 1.0 centre), and K_IC (from material or override). It also clarifies that stress_mpa and crack_len_mm are the required inputs by usage context. This adds far more meaning than 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?
States a specific verb+resource: rate brittle fracture using LEFM with the K = Y·σ·√(π·a) formula, and gives the exact governing equation and pass criterion. It is clearly distinguished from siblings like fatigue_check, plate_check, or fem_buckling by naming the specific fracture mechanics method and output fields.
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 when to use it (need to assess whether a crack will propagate vs. K_IC) through the formula and pass/margin semantics, and it specifies default geometry factors for edge vs. centre cracks. It doesn't explicitly name an alternative for fatigue or other failure modes, but the LEFM context is clear enough without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fsi_channel_pressureA
Fully-developed plane-channel pressure drop Δp = 12·μ·U·L/h² (NO solver) —
the fluid load that physically sources the pressure-loaded-plate FSI anchor.
For laminar flow between parallel plates a gap gap_mm apart with mean velocity
velocity_m_s over length length_mm, the exact plane-Poiseuille wall pressure
drop feeds fsi_plate_deflection/fsi_interface_balance as pressure_pa. The
Reynolds number Re = ρ·U·h/μ flags when the laminar (exact) assumption holds
(Re ≲ 1400). Default fluid is water at 20 °C (μ=1e-3 Pa·s, ρ=1000).
Returns {pressure_pa, pressure_drop_pa, reynolds, regime, velocity_m_s, wall_shear_pa, fidelity, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| gap_mm | Yes | ||
| mu_pa_s | No | ||
| length_mm | Yes | ||
| rho_kg_m3 | No | ||
| velocity_m_s | Yes |
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 declares the analytic/no-solver nature, the laminar regime limit (Re ≲ 1400), the default fluid properties, and enumerates the returned fields including warnings and escalate_to. It does not discuss failure/escalation behavior in detail, keeping it below 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-loads the formula and the key '(NO solver)' qualifier, then adds only supporting context (parameters, regime check, defaults, returns). Dense but every sentence earns its place; slightly formula-heavy for a description field.
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, but the description enumerates the return keys (pressure_pa, reynolds, regime, warnings, escalate_to, etc.), covering what an agent needs to consume the result. Combined with the validity-range note, it is essentially complete for this analytic 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 largely does: it explains gap_mm (plate separation), velocity_m_s (mean velocity), length_mm (flow length), and supplies the defaults and physical meaning for mu_pa_s (μ=1e-3) and rho_kg_m3 (ρ=1000). Units are conveyed indirectly, so not fully exhaustive.
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 (compute plane-channel pressure drop) and gives the exact governing formula Δp = 12·μ·U·L/h². The '(NO solver)' tag and the named downstream consumers (fsi_plate_deflection / fsi_interface_balance) distinguish it cleanly from solver-based channel siblings like cht_channel_submit and cfd_pipe_flow.
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 says exactly what role the output plays ('the fluid load that sources the pressure-loaded-plate FSI anchor ... feeds fsi_plate_deflection/fsi_interface_balance as pressure_pa') and gives the validity condition Re ≲ 1400 for the laminar assumption. It stops short of explicitly naming alternatives for out-of-range (turbulent) cases, so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fsi_interface_balanceA
Partitioned wet-interface force balance (NO solver) — the FSI analogue of
the optics energy-balance gate. The fluid presses a uniform pressure_pa over
the length_mm×width_mm strip, so the total traction is F = pressure·area; a
converged partitioned solve must hand the solid exactly this load and the
solid's support reactions must carry it (Newton's third law across the coupling
surface). Pass the measured fluid_force_n (∮p·dA over the OpenFOAM wet patch)
and/or solid_reaction_n (Σ ccx reaction at the clamp); the relative residual
|F_fluid − R_solid|/F_fluid is the conservation error. With neither supplied it
returns the reference analytic load (residual 0) the real solve closes on.
Returns {area_mm2, reference_load_n, fluid_force_n, solid_reaction_n, residual_n, relative_residual, balanced, fidelity, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| width_mm | Yes | ||
| length_mm | Yes | ||
| pressure_pa | Yes | ||
| fluid_force_n | No | ||
| solid_reaction_n | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so this description carries the full load; it does so well by spelling out the physics (Newton's third law across the coupling surface), the residual definition, and the no-input fallback behavior. It stops short of stating auth/prereq requirements or whether the returned balanced/escalate_to fields gate downstream steps.
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 identity, then the physics, then the residual definition, then the no-input fallback, then the return shape. Necessary content, but dense prose and a symbol-heavy formula could be tightened; sentences are not wasteful but are not crisp either.
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 solver-less gate tool with no output schema and no annotations, the description supplies the missing contract: what the return fields mean (area, reference load, fluid force, solid reaction, residual, relative residual, balanced, fidelity, escalate_to) and the physics rationale. It leaves minor gaps (units for inputs, when balanced/escalate_to should trigger action) but is otherwise 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?
Schema coverage is 0%, so the description must compensate. It names each parameter's meaning: pressure_pa times length_mm×width_mm gives the reference load, fluid_force_n is ∮p·dA over the OpenFOAM wet patch, solid_reaction_n is Σ ccx reaction at the clamp. That covers all five parameters, though units/definitions for pressure/length/width are only implied.
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: a partitioned wet-interface force balance with no solver. It names the solids coupling and the exact conservation quantity (F = pressure·area). It distinguishes itself from other fsi_* siblings only implicitly through the 'NO solver' framing and the return set.
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 how the tool is used: pass fluid_force_n and/or solid_reaction_n to close the balance; with neither supplied it returns the reference analytic load. That's clear context for the intended workflow, but it doesn't name an alternative (e.g., fsi_plate_deflection, fsi_channel_pressure) or explicitly state when to choose this gate over a full solve.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fsi_plate_deflectionA
Exact small-deflection tip/centre deflection of a uniform-pressure-loaded
thin plate strip (NO solver) — the closed-form twin the coupled
OpenFOAM→CalculiX FSI solve (fsi_pressure_plate_submit) is gated against. The
wetted strip is width_mm×length_mm; the fluid pressure pressure_pa (Pa)
acts normal to it, giving the line load q = pressure·width. Section is the
solid rectangle I = width·thickness³/12 unless an explicit i_mm4 is given. E
from youngs_gpa or a Materials-DB material. support='cantilever' (clamped
one edge): δ_tip = q·L⁴/(8·E·I), root moment q·L²/2, reaction q·L; 'clamped-
clamped': centre δ = q·L⁴/(384·E·I), reaction q·L/2 each. Valid while δ ≲
thickness (small-deflection); past that escalate to an NLGEOM follower-pressure
ccx solve.
Returns {support, pressure_pa, line_load_n_per_mm, total_load_n, I_mm4, tip_disp_mm, root_moment_nmm, reaction_n, max_stress_mpa, youngs_mpa, slenderness, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| i_mm4 | No | ||
| support | No | cantilever | |
| material | No | ||
| width_mm | Yes | ||
| length_mm | Yes | ||
| youngs_gpa | No | ||
| pressure_pa | Yes | ||
| thickness_mm | Yes |
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 it does this well: it discloses the closed-form math used per support case, the small-deflection validity band, and returns warnings/escalate_to/valid_range_ok. It does not explicitly state that the call is a pure side-effect-free computation with no state changes, which is the only 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?
Purpose and the sibling relationship are front-loaded, and every sentence carries technical content. It is dense and long with stacked formulas, so it is efficient rather than trim, costing it a point on 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?
There is no output schema, but the description enumerates the full return object (line_load_n_per_mm, tip_disp_mm, root_moment_nmm, reaction_n, max_stress_mpa, slenderness, fidelity, band_pct, valid_range_ok, warnings, escalate_to). An agent has everything needed to invoke 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% (bare titles only, no enum on `support`), so the description must compensate — and it does: it defines `support` values ('cantilever' vs 'clamped-clamped'), the role of `i_mm4` as an override, `material` vs `youngs_gpa` sourcing, `pressure_pa` acting normal to produce line load, and width/length as the wetted strip. This is meaning well beyond 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 precise verb+resource ('Exact small-deflection tip/centre deflection of a uniform-pressure-loaded thin plate strip') and immediately names the sibling it pairs with ('the closed-form twin the coupled OpenFOAM→CalculiX FSI solve (fsi_pressure_plate_submit) is gated against'). An agent can distinguish this analytic calculation from the solver tool 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?
Explicitly gives the validity condition ('Valid while δ ≲ thickness (small-deflection)') and the escalation path ('past that escalate to an NLGEOM follower-pressure ccx solve'), naming the alternative. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fsi_pressure_plate_submitA
Partitioned fluid-structure-interaction solve on the preCICE OpenFOAM↔
CalculiX stack, asynchronous (OFF the MCP channel) — the real coupled-field
twin of the analytic fsi_plate_deflection / fsi_interface_balance oracles.
A flexible flap clamped at a channel floor deflects under the flow: OpenFOAM
(pimpleFoam) writes the wet-interface Force, ccx_preCICE returns the
Displacement, and preCICE drives the implicit coupling to convergence each
time window. preCICE is LGPL-3.0 and the two heavy solvers run ONLY as
subprocesses; degrades to {ok:false, reason, install, stack} when the stack is
absent (build via scripts/install-solvers.sh fsi).
Physics knobs: inlet_velocity_m_s, nu_m2_s, rho_kg_m3 (fluid),
youngs_pa/poisson/density_kg_m3 (solid), end_time_s/time_window_s/
max_iterations (coupling). Geometry/mesh come from the validated vendored
template (no FreeCAD touch). Returns the degradation dict, or {job_id, status,
cache_hit}; poll job_result for {ok, time_windows, tip_disp_m, tip_history,
coupling_converged, case_dir} — the tip displacement is the field the
fsi_plate_deflection oracle gates.
| Name | Required | Description | Default |
|---|---|---|---|
| nu_m2_s | No | ||
| poisson | No | ||
| timeout | No | ||
| rho_kg_m3 | No | ||
| youngs_pa | No | ||
| end_time_s | No | ||
| density_kg_m3 | No | ||
| time_window_s | No | ||
| max_iterations | No | ||
| inlet_velocity_m_s | 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 thoroughly: async/off-channel execution, subprocess-only heavy solvers, LGPL-3.0 dependency, and an explicit degradation path ({ok:false, reason, install, stack} when the stack is absent). It also discloses the immediate return shape and the polling contract, which is exactly what an agent needs to handle this long-running job.
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 mostly front-loaded: the solve and its stack come first, then degradation behavior, then physics knobs and return contract. Every sentence carries technical content, though the phrasing is heavy enough to be slightly hard to parse on first read.
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 asynchronous multi-physics job with no output schema and no annotations, the description covers execution mode, failure mode, return values, and the polling target (job_result giving time_windows, tip_disp_m, coupling_converged, case_dir). Nothing essential for correct invocation 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 largely does, naming 9 of 10 parameters and grouping them semantically (fluid: inlet_velocity_m_s/nu_m2_s/rho_kg_m3; solid: youngs_pa/poisson/density_kg_m3; coupling: end_time_s/time_window_s/max_iterations). It omits the `timeout` parameter and gives no units or ranges beyond the names, so it falls 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 (partitioned FSI solve on the preCICE OpenFOAM↔CalculiX stack) and explicitly differentiates itself from siblings by naming the analytic oracles it is the 'real coupled-field twin' of. An agent can separate it from fsi_plate_deflection and fsi_interface_balance 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?
Clearly positions usage against alternatives: it is the real coupled twin vs the analytic oracles, runs asynchronously OFF the MCP channel, and instructs the caller to poll job_result afterward. It stops short of an explicit 'use this when X, use the oracle when Y' rule, so it is strong context but not full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdt_checkA
Check a measured feature against a GD&T tolerance zone. control: position | flatness | straightness | circularity | cylindricity | perpendicularity | parallelism | angularity | concentricity | runout | total_runout | profile_line | profile_surface. actual is the measured deviation; for position pass offset={x,y} to use the diametral 2*hypot(x,y). mmc_bonus adds bonus tolerance. Returns {control, zone, effective_zone, actual, margin, pass, datum_refs}.
| Name | Required | Description | Default |
|---|---|---|---|
| zone | Yes | ||
| actual | No | ||
| offset | No | ||
| control | Yes | ||
| mmc_bonus | No | ||
| datum_refs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does disclose meaningful behavior: the diametral 2*hypot(x,y) offset computation, that mmc_bonus adds bonus tolerance, and the returned field set. It does not explicitly state that the tool is side-effect-free/read-only, but the checker framing makes this 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?
Front-loads the purpose in one sentence, then adds control enumeration, parameter guidance, and the return shape. The inline enum list is dense but necessary; every clause carries information with 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?
With no output schema and 0% schema description coverage, the description supplies the return structure and most parameter semantics on its own. Given the domain-specific GD&T complexity, it is nearly self-sufficient, missing only explicit meaning for zone and datum_refs.
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 explains four of six parameters with real semantic meaning: control (with the full enum), actual (measured deviation), offset (diametral form), and mmc_bonus. Only zone and datum_refs are left to inference, a minor residual 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 ('Check a measured feature against a GD&T tolerance zone') and immediately enumerates the exact set of controls it supports. This distinguishes it clearly from generic tolerance siblings like tolerance_stackup, fit_check, or envelope_check without opening their 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 is rich on invocation semantics (which control values exist, when to pass offset={x,y}, what mmc_bonus does) but never states when to reach for this tool versus alternatives like tolerance_stackup or fit_check, nor any exclusions. 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.
gear_ratingA
Rate spur-gear tooth bending (Lewis): sigma=Ft/(bmY). Pass
tangential_force_n, or power_w + pinion_speed_rpm. Returns {tangential_force_n,
pitch_dia_mm, pitch_line_velocity_m_s, lewis_form_factor, bending_stress_mpa,
allowable_bending_mpa, bending_sf, pass}. First-order screen, not full AGMA.
The allowable defaults to the material's fatigue endurance (else 0.3·UTS);
allowable_bending_mpa overrides it with an AGMA/spec number.
| Name | Required | Description | Default |
|---|---|---|---|
| teeth | Yes | ||
| power_w | No | ||
| material | No | Steel-4140-QT | |
| module_mm | Yes | ||
| face_width_mm | Yes | ||
| pinion_speed_rpm | No | ||
| lewis_form_factor | No | ||
| tangential_force_n | No | ||
| allowable_bending_mpa | 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 the formula used, the screening-vs-AGMA limitation, the allowable defaulting rule (material fatigue endurance, else 0.3·UTS), and the override path. It does not discuss unit conventions or failure/error behavior, so it is 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?
Front-loads purpose and formula, then input strategy, then return shape, then caveats/defaults. Every sentence is load-bearing with no filler, unusual for a definition this information-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?
For a 9-parameter analysis tool with no output schema and no annotations, the description covers inputs, defaults, override behavior, and even the return key set inline. An agent has enough to call it correctly without opening any 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 coverage is 0% across 9 parameters, so the description must compensate and largely does: it explains the force-input alternatives (tangential_force_n vs power_w+pinion_speed_rpm) and the override semantics of allowable_bending_mpa. It leaves module_mm, teeth, face_width_mm, and especially lewis_form_factor uncharacterized, so a gap remains.
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 ('Rate spur-gear tooth bending (Lewis)') and backs it with the governing equation sigma=Ft/(b*m*Y), so the agent knows exactly what computation runs. The 'not full AGMA' phrase distinguishes this screening tool from heavier siblings like fatigue_check or hertz_contact.
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 input paths ('Pass tangential_force_n, or power_w + pinion_speed_rpm') and states the domain limit ('First-order screen, not full AGMA'), telling the agent when the result is adequate versus when to escalate. No alternatives are named explicitly, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interfaceA
Read back a single published interface FRAME by name from a component (issue #139). The reference-by-name primitive feature templates ride on: an unpublished name fails loudly. Returns {handle, name, frame}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| handle | Yes |
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 read-only behavior, the loud failure on an unpublished name, and the return shape {handle, name, frame}. It omits permission or rate-limit details, but for a read primitive this is solid 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 first sentence is front-loaded with the action and resource, and the three-sentence structure is efficient. Minor noise from 'issue #139' and template jargon 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?
Given no annotations, no output schema, and 0% schema coverage, the description provides useful return-shape and failure-mode context. However, it leaves 'interface FRAME' and handle semantics undefined, which is a meaningful gap for an agent navigating a large API.
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 maps the 'name' parameter to the interface name and 'handle' to a component ('by name from a component'), but it does not explain handle format or what a FRAME is, leaving both parameters only partially clarified.
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: 'Read back a single published interface FRAME by name from a component.' It distinguishes a read of a published interface from the sibling publish_interface, but does not explicitly name an alternative read tool such as get_object, 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?
Usage is implied: read back a published interface by name. The note that 'an unpublished name fails loudly' adds a prerequisite, but there is no explicit when-to-use versus alternatives like publish_interface or other retrieval tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_objectC
Dump a handle's properties + shape stats. Useful when no dedicated tool exposes what you need.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
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. The word 'dump' implies a read operation, but the description never states that it is read-only, whether it mutates state, what permissions it needs, or how large/heavy the returned payload might be. For a tool with zero annotation coverage, this is a significant 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 short sentences with no wasted words, and the core action is front-loaded ahead of the usage hint. Slightly informal ('dump') but structurally efficient.
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 no annotations, the description must explain what the tool returns and its safety profile. It gestures at 'properties + shape stats' but leaves the central term 'handle' undefined and says nothing about read-only behavior or return shape, so it is not complete enough for reliable 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% and the single parameter 'handle' is undocumented in the schema. The description only repeats the word 'handle' without explaining what a handle is, its expected format, or where an agent obtains one. It adds almost no meaning beyond the schema's parameter 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 description states a verb (dump) and a resource (a handle's properties + shape stats), which is more than a tautology. However, it is vague about what 'properties' and 'shape stats' actually include and does not differentiate from siblings like list_objects, check_shape, or mass_properties, so an agent cannot tell exactly what this returns versus those tools.
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?
'Useful when no dedicated tool exposes what you need' gives a fallback heuristic, implying it should be used only when no specialized sibling covers the need. This is weaker than naming specific alternatives, but it does provide a conditional context for use rather than none at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
granular_screenA
Closed-form granular/powder-mechanics oracles — banded correlations, NO
external solver (the FreeCAD-free analytic twins the YADE DEM solve is gated
against). These are correlations, not exact theory, so each returns
fidelity='correlation' + an honest [low, high] band; the band IS the oracle.
Dispatch on problem:
'packing' (regime='random_close'|'random_loose'|'fcc'[, coordination]) — monodisperse sphere solid-volume fraction φ. RCP ≈ 0.637 (band 0.60–0.66), the random pile a real settle must hit, well below the crystalline FCC/HCP 0.7405. 'beverloo' (outlet_m, particle_d_m[, bulk_density_kg_m3 | material]) — flat-bottom hopper discharge W = C·ρ·√g·(D−k·d)^2.5 [kg/s]; flow ∝ outlet to the 2.5 power, independent of fill height. 'beverloo_exponent' (outlet1_m, flow1_kg_s, outlet2_m, flow2_kg_s [, particle_d_m]) — recover the log-log flow exponent from two (outlet, flow) points; granular 2.5 (band 2.2–2.8) vs Torricelli 2.0. 'repose' (friction_coeff[, saturation]) — poured-pile repose angle θ ≈ atan(μ) + ±25% band. 'repose_monotone' (mu_low, repose_low_deg, mu_high, repose_high_deg) — the steeper-with-friction monotonicity gate.
SI units (m, kg/m³, kg/s, degrees). Escalate to dem_pack_submit / dem_flow_submit (the real YADE solve) for polydisperse mixes, non-spherical grains, cohesion, or geometry this monodisperse idealization can't see.
| Name | Required | Description | Default |
|---|---|---|---|
| mu_low | No | ||
| regime | No | random_close | |
| mu_high | No | ||
| problem | No | packing | |
| material | No | ||
| outlet_m | No | ||
| outlet1_m | No | ||
| outlet2_m | No | ||
| flow1_kg_s | No | ||
| flow2_kg_s | No | ||
| saturation | No | ||
| coordination | No | ||
| particle_d_m | No | ||
| friction_coeff | No | ||
| repose_low_deg | No | ||
| repose_high_deg | No | ||
| bulk_density_kg_m3 | 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 key traits: the tool is analytic/no-solver, outputs carry fidelity='correlation' plus a [low, high] band that 'IS the oracle', and results are correlations rather than exact theory. It also fixes units (SI: m, kg/m³, kg/s, degrees). It stops short of error/validation behavior or what happens on out-of-range or missing inputs, so 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?
Front-loads the core claim ('Closed-form ... oracles') before the dispatch list, and the per-mode indented entries are information-dense with no padding. It is long, but the length is justified by five distinct modes with divergent signatures; only minor trims are 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 17-param, zero-coverage, no-annotation, no-output-schema tool, the description must do nearly everything, and it covers dispatch, per-mode params, return contract (fidelity/band), units, and the escalate-vs-stop boundary. Missing pieces are minor: no statement of which params are required per mode beyond bracket convention, and no default (`problem` defaults to 'packing') is surfaced.
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 17 params, so the description must compensate — and it largely does by mapping parameters to each problem mode, e.g. 'beverloo (outlet_m, particle_d_m[, bulk_density_kg_m3 | material])' and 'beverloo_exponent (outlet1_m, flow1_kg_s, outlet2_m, flow2_kg_s [, particle_d_m])', using brackets to signal optionality. Parameters like `saturation`, `coordination`, `mu_low/mu_high`, and `repose_*` are placed in their modes, though none get unit or range semantics beyond the global SI note.
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 resource and mechanism: 'Closed-form granular/powder-mechanics oracles — banded correlations, NO external solver', and explicitly ties itself to the sibling solve it is not ('the FreeCAD-free analytic twins the YADE DEM solve is gated against'). The dispatch-on-`problem` structure names each oracle ('packing', 'beverloo', 'beverloo_exponent', 'repose', 'repose_monotone'), so an agent can tell exactly what it does 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?
Gives an explicit escalation rule with named alternatives and the exact conditions that select them: 'Escalate to dem_pack_submit / dem_flow_submit ... for polydisperse mixes, non-spherical grains, cohesion, or geometry this monodisperse idealization can't see.' It also frames the idealization boundary (monodisperse, spherical), leaving no inference about when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grid_convergenceA
Grid Convergence Index — how much of a solved number is the MESH (no solver, milliseconds). Give it the same quantity solved on 2-3 systematically refined meshes, FINEST FIRST, and it fits the observed order of convergence, Richardson-extrapolates to zero cell size, and returns the percentage band inside which the mesh-independent answer lies. Roache's GCI as codified in ASME V&V 20.
This is the honest band_pct for a result with no analytic oracle — the
verification counterpart to every validation ratio in the solver families — and it
is deliberately family-agnostic: three CFD drag coefficients, three FEM peak
stresses and three modal frequencies are all valid input; only you know what the
mesh size means. cfd_mesh_independence_submit is the driver that produces the
three CFD values for you.
Describe the meshes with either cell_sizes (representative cell length, same
order as values) or cell_counts (total cells; h = N^(-1/dimensions)). With
THREE values the order is measured and the safety factor is 1.25; with TWO it must
be assumed (assumed_order, default 2.0) and the factor triples to 3.0 — a much
wider band, which is the honest price of the missing mesh.
Watch three fields before quoting the band: monotonic False means the solutions
oscillate and the extrapolation is not meaningful (usually an unconverged level,
not a mesh effect); asymptotic_ratio far from 1 means the meshes have not reached
the range where the theory holds, so gci_pct is a LOWER bound; order_clamped
True means the fitted order was unphysical and a clamped one was used.
Returns {n_levels, values, cell_sizes, refinement_ratios, observed_order, order_used, order_clamped, extrapolated_value, gci_pct, gci_coarse_pct, band_pct, relative_error_pct, monotonic, asymptotic_ratio, safety_factor, converged_fit, fidelity, warnings}.
| Name | Required | Description | Default |
|---|---|---|---|
| values | Yes | ||
| cell_sizes | No | ||
| dimensions | No | ||
| cell_counts | No | ||
| assumed_order | 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: no solver / milliseconds, the safety-factor difference (1.25 with three values, 3.0 with two), and three caveat fields (`monotonic`, `asymptotic_ratio` as a lower bound, `order_clamped`) with their failure interpretations. This is unusually rich behavioral 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 and the practical rule (finest first, 2-3 levels) before the caveats, and every paragraph is doing work. It is dense and on the long side, but the length tracks the genuine complexity of the computation rather than 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?
No output schema exists, yet the description enumerates the returned fields and explains the ones that matter for interpretation (`gci_pct`, `band_pct`, `order_clamped`, `monotonic`, `asymptotic_ratio`). Combined with the input guidance, an agent has everything needed to call and interpret it.
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: `cell_sizes` (representative cell length, same order as `values`), `cell_counts` (total cells, h = N^(-1/`dimensions`)), and `assumed_order` (default 2.0, only with two values) are all explained. `dimensions` is only covered implicitly through the h formula, which is the one small 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 (fits order, Richardson-extrapolates, returns a band) on a specific resource (mesh convergence / GCI of a solved quantity), and explicitly differentiates from the sibling it could be confused with (`cfd_mesh_independence_submit` is the driver that produces the CFD values). An agent knows exactly what this computes 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?
Explicitly says when to use it (a result with no analytic oracle, the verification counterpart to validation ratios) and names the alternative workflow (cfd_mesh_independence_submit feeding the three CFD values). Also gives the 2-vs-3-level tradeoff that determines whether you should call it at all with sparse data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harmonic_responseA
Exact SDOF harmonic frequency response (NO solver) — the FRF screen and the
oracle the Elmer harmonic_response_submit sweep is gated against. Bridges
beam_modal (f_n) and random_vibration (Q = 1/(2ζ)): with r = f/f_n,
|H| = 1/√((1−r²)²+(2ζr)²), phase = atan2(2ζr, 1−r²), peak amplification
Q = 1/(2ζ√(1−ζ²)) at f_peak = f_n·√(1−2ζ²), half-power bandwidth ≈ 2ζ·f_n.
With frequency_hz the response at that drive is returned;
static_deflection_mm scales it to an absolute amplitude_mm. fidelity='exact';
ζ ≥ 1/√2 has no peak (flagged). Escalate to harmonic_response_submit for a
real meshed FRF (multi-mode, geometry-true).
Returns {natural_frequency_hz, damping_ratio, q_factor, f_peak_hz, half_power_bandwidth_hz, frequency_ratio, amplification, phase_deg, amplitude_mm, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| frequency_hz | No | ||
| damping_ratio | Yes | ||
| natural_frequency_hz | Yes | ||
| static_deflection_mm | 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 behavioral burden. It discloses substantial behavior: the exact analytic formulas, fidelity='exact', the ζ ≥ 1/√2 no-peak edge case being flagged, and the internal warnings/valid_range_ok fields. It does not state whether it performs any I/O or has side effects, but as an analytic screen that is implied.
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 dense and front-loaded: the core purpose ('Exact SDOF harmonic frequency response (NO solver)') leads, followed by formulas and edge cases. It is barely oversized for the amount of genuinely useful information packed in, though the formula block makes it read more like a spec than 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?
With no annotations, no output schema, and 0% parameter description coverage, the description compensates fully: it documents inputs, the analytic model, edge-case behavior, and enumerates the exact return fields including warnings and escalate_to. Nothing needed 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 largely does: it defines r = f/f_n, explains `frequency_hz` as the drive frequency at which the response is returned, `static_deflection_mm` as absolute scaling to amplitude_mm, and `damping_ratio` via ζ. Only the `natural_frequency_hz` parameter is not explicitly explained, but its meaning is obvious from context.
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 precisely what the tool computes: an exact closed-form SDOF harmonic frequency response (FRF) with no solver, and explicitly distinguishes it from the meshed `harmonic_response_submit` sibling it gates. It also positions it relative to `beam_modal` and `random_vibration`. This is a specific verb+resource with clear 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?
It states when to use this analytic FRF screen ('NO solver') and when to escalate to `harmonic_response_submit` ('for a real meshed FRF (multi-mode, geometry-true)'). It also names the upstream siblings that supply its inputs (`beam_modal` for f_n, `random_vibration` for Q=1/(2ζ)), giving explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
harmonic_response_submitA
Harmonic forced response (FRF) via Elmer StressSolve Harmonic Analysis
(SIMULATION_NEXT Tier B2), asynchronous — a plane-stress cantilever driven by
a harmonic tip traction, swept one quasi-static point + n_sweep points across
±span_pct% of its first resonance, with Rayleigh β tuned to damping_ratio
at f₁. Requires ElmerSolver; when absent this returns {ok:false, reason,
install} rather than raising.
Three gates from the in-phase (real) response: f1_ratio — Re(H) = 0 exactly
AT resonance, so the swept tip response's sign-flip locates f₁ vs the
Euler-Bernoulli beam_modal closed form (within ~2%, plane-stress vs beam
theory); static_ratio — the quasi-static point vs the exact tip compliance
F·L³/(3EI) (within ~5%); q_ratio — max|Re|/static vs Q/2 = 1/(4ζ), the
exact SDOF light-damping identity (within ~15%, sweep-sampled). Cross-links
harmonic_response (the SDOF oracle) and random_vibration (same Q). Also
accepts a prepared case_dir.
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, f1_solved_hz, f1_eb_hz, f1_ratio, static_solved_m, static_exact_m, static_ratio, peak_over_static, q_factor, q_ratio, frf:[[f_hz, tip_re_m]], case_dir}.
| Name | Required | Description | Default |
|---|---|---|---|
| nx | No | ||
| ny | No | ||
| sif | No | case.sif | |
| n_sweep | No | ||
| poisson | No | ||
| case_dir | No | ||
| height_m | No | ||
| length_m | No | ||
| span_pct | No | ||
| youngs_pa | No | ||
| traction_pa | No | ||
| damping_ratio | No | ||
| density_kg_m3 | 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 behavioral burden, and it does substantial work: it discloses the ElmerSolver dependency with an explicit degradation contract ({ok:false, reason, install} rather than raising), async job semantics (poll job_result), cache_hit behavior, and the three-gate pass criteria with tolerances. Auth, mutation, and idempotency semantics remain unstated.
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 and structured but not front-loaded: the operational summary, gate semantics, cross-links, and return shape are all packed into three long paragraphs. Each clause carries information, but the agent must parse a lot of physics parentheticals before reaching the async contract and return fields.
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 async solver submission with no output schema and no annotations, the description is unusually complete: it covers the degradation path, the async poll target, the full result field list, and the validation gates. It stops short on parameter documentation and on routing versus sibling FEM tools, so it is strong but not exhaustive.
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 13 parameters, so the description must compensate, and it only names a few (span_pct, damping_ratio, n_sweep, case_dir) in prose without units or ranges. Critical parameters such as nx/ny, length_m, height_m, youngs_pa, density_kg_m3, and traction_pa go unexplained 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: 'Harmonic forced response (FRF) via Elmer StressSolve Harmonic Analysis', and the physics is spelled out (plane-stress cantilever, harmonic tip traction, resonance sweep). It distinguishes itself from nearby siblings like harmonic_response (called out as the SDOF oracle) and random_vibration, but it does not cleanly separate itself from the broader FEM submission family or explain why a user would pick this over fem_run/fem_modal.
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?
Mentions it is asynchronous and 'Also accepts a prepared case_dir', which hints at context, but there is no explicit when-to-use versus fem_modal, fem_run, beam_modal, or harmonic_response. The cross-link mentions are inferential rather than directive, so 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.
helixA
Generate a Part::Helix curve. radius, pitch, height in mm. angle (deg) is the cone angle (0 = cylindrical helix, >0 = conical).
Returns a handle to a 1D helical curve. To get a 3D helical solid (e.g. for threads), use the curve as the spine of a sweep.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Helix | |
| angle | No | ||
| pitch | No | ||
| height | No | ||
| radius | 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 discloses the return (a handle to a 1D helical curve), the units (mm, deg), and the important limitation that it is a curve rather than a solid. It omits any note on orientation/axis, error conditions, or permissions, 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?
Front-loads the core action, then parameter semantics, then return value and a practical tip. Every sentence is useful and there is minimal waste, though the parameter and return sentences could be slightly more compact.
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 no annotations, the description covers what is needed to call it correctly: units, the cone-angle interpretation, and that it returns a curve handle that must be swept for a solid. It is complete enough for correct invocation, with only minor gaps around orientation and error 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. It documents radius, pitch, and height units (mm) and the meaning of angle (cone angle; 0 = cylindrical, >0 = conical), covering 4 of 5 parameters meaningfully; only 'name' is left unexplained, which is near-trivial.
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) and resource (Part::Helix curve), and explicitly differentiates its output from a related sibling action by noting that a 3D helical solid is obtained via a sweep using this curve as the spine. An agent can tell what this produces versus sweep/thread tools 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?
Gives clear usage context: use this to get a 1D curve, and specifically use the curve as a sweep spine to obtain a 3D solid for threads. It routes the agent toward the follow-up operation, though it does not name an explicit alternative tool (e.g. add_thread) or state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hertz_contactA
Exact Hertzian point-contact peak pressure (NO solver) — the screening twin
of a frictional CONTACT PAIR solve. Sphere of radius_mm on a flat (default)
or on a second sphere radius2_mm (negative for a conforming socket). Each
body's elastics from youngs#_gpa+poisson# or a Materials-DB material#; body 2
defaults to body 1. Reduced modulus 1/E = (1−ν₁²)/E₁ + (1−ν₂²)/E₂, effective
radius 1/R = 1/R₁ + 1/R₂; contact radius a = (3FR/4E*)^(1/3), peak pressure
p₀ = 3F/(2πa²) = 1.5× mean, approach δ = a²/R. Half-space theory: valid while
a ≪ R and p₀ below first sub-surface yield (~1.6·σ_y) — past that escalate to
the nonlinear fem_set_nonlinear_material contact path.
Returns {e_star_mpa, effective_radius_mm, contact_radius_mm, peak_pressure_mpa, mean_pressure_mpa, approach_mm, a_over_R, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| load_n | Yes | ||
| poisson1 | No | ||
| poisson2 | No | ||
| material1 | No | ||
| material2 | No | ||
| radius_mm | Yes | ||
| radius2_mm | No | ||
| youngs1_gpa | No | ||
| youngs2_gpa | 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 does so well: it discloses that no solver is used, the half-space assumptions, the validity limit, the yield-based escalation condition, and the exact output fields including warnings, fidelity, band_pct, valid_range_ok, and escalate_to.
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 dense but front-loaded, opening with the core purpose before adding formulas, validity, and return fields. Every sentence earns its place for a calculation tool with 9 parameters and 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, no-annotation, no-output-schema tool with 9 parameters, this is complete: it explains the physics, parameter mapping, validity limits, escalation behavior, and all returned fields. Nothing critical for correct invocation 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: it explains radius2_mm as a second sphere or negative conforming socket, body 2 defaulting to body 1, elastic sourcing from youngs#_gpa+poisson# or a Materials-DB material#, and the reduced modulus / effective radius formulas that tie parameters to the calculation.
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 calculation—Hertzian point-contact peak pressure—and explicitly distinguishes it as a no-solver screening twin of a frictional contact-pair solve. It also names the escalation path, fem_set_nonlinear_material, so the agent can differentiate it from solver-based 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?
It gives clear when-to-use context as a screening calculation and an explicit when-not-to-use boundary: valid while a ≪ R and p0 is below first sub-surface yield, past which the agent should escalate to the nonlinear FEM contact path. The alternative tool is named directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
h_estimateA
Screening convection coefficient h (NO solver) — the honest h_conv to feed
thermal_lumped / thermal_transient_1d / a convection BC, instead of a guess.
geometry picks the correlation: natural (velocity_m_s = 0)
'vertical_plate' | 'horizontal_cylinder' (Churchill–Chu); forced (velocity_m_s > 0)
'flat_plate' (averaged laminar/mixed Nu) | 'cylinder_crossflow' (Hilpert).
characteristic_mm is the plate height/length or cylinder diameter. Film-temp
air properties built in; another fluid needs explicit k_w_mk + nu_m2_s + pr
(+ beta_per_k for natural). emissivity > 0 adds the linearized radiation screen
into h_total_w_m2k.
This is a focusing estimate, not a gate: fidelity='correlation' with band_pct
the literature scatter (±15–20 %). Escalate to the conjugate solve
cht_channel_submit (or a meshed convection BC via thermal_transient_submit)
when the thermal margin is within ~2× band_pct. Returns {geometry, mode,
correlation, h_conv_w_m2k, h_rad_w_m2k, h_total_w_m2k, nusselt, reynolds,
rayleigh, prandtl, film_temp_c, fidelity, band_pct, valid_range_ok, warnings,
escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| pr | No | ||
| fluid | No | air | |
| k_w_mk | No | ||
| nu_m2_s | No | ||
| geometry | Yes | ||
| beta_per_k | No | ||
| emissivity | No | ||
| t_ambient_c | No | ||
| t_surface_c | Yes | ||
| velocity_m_s | No | ||
| characteristic_mm | Yes |
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 the correlation-based fidelity, literature scatter of ±15–20%, valid_range_ok warnings, built-in air properties, explicit property requirements for other fluids, and radiation inclusion via emissivity. It also states the return fields and escalation target.
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 dense with useful detail, with every major sentence contributing selection, parameter, or output information. It is somewhat long due to the return-field list and parenthetical qualifications, but the length is justified by the tool's 11 parameters and lack of 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?
Given no annotations, no output schema, 11 parameters, and 0% schema description coverage, the description supplies the missing context: purpose, parameter semantics, return fields, accuracy limitations, and escalation path. An agent has enough information to select and 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. It explains geometry choices and correlation mapping, characteristic_mm meaning, velocity-based natural/forced mode, required fluid properties, and emissivity effects; however, it does not explicitly clarify t_ambient_c or t_surface_c semantics beyond their self-explanatory names.
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 precise purpose: screening convection coefficient h, explicitly NO solver, and distinguishes it from downstream thermal tools. It names thermal_lumped, thermal_transient_1d, and convection BC usage, making the resource and scope 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?
It explicitly says this is a focusing estimate, not a gate, and gives the escalation condition: move to cht_channel_submit or a meshed convection BC when the thermal margin is within ~2× band_pct. It also explains how geometry and velocity determine the correlation, which is essential selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
holeA
Drill a parametric Hole from a sketch (one or more circles).
sketch: handle of a sketch placed on a face of an existing body feature.
depth_type: 'Dimension' (use depth) or 'ThroughAll'.
cut_type: 'None' | 'Counterbore' | 'Countersink' | 'Counterdrill'.
When non-None, cut_diameter (head clearance) and cut_depth apply.
threaded=True applies a tap. thread_type / thread_size are COUPLED enums —
valid thread_size values DEPEND on thread_type ('M4' fits 'ISOMetricProfile'
but not 'UNC'). Use list_thread_options() to discover thread_type values
and list_thread_options(thread_type=...) for that type's valid sizes.
intended_for ('print'|'machine'|'drawing'): drives ModelThread default when
threaded=True so the caller doesn't have to know what ModelThread means.
print → ModelThread=True. Required for 3D-printed threaded holes —
the screw must engage the printed thread geometry; a smooth
pilot won't tap itself.
machine → ModelThread=False. CAM software reads thread metadata and
drives a physical tap. Modeling thread bloats files and
fights patterns/fillets.
drawing → ModelThread=False. Drawings annotate threads symbolically.
Explicit model_thread overrides intended_for.
through ('wall'|'body'): preferred over depth_type/depth. 'wall' ray-casts
to the first exit boundary and drills exactly one wall thick — critical on
shelled bodies where 'body' (ThroughAll) would destroy the cavity. Implies
direction='into_body'. Result carries wall_depth_mm.
direction (preferred over reversed): 'into_body' picks the Reversed value
that actually removes material; 'away_from_body' picks the value that
removes none. Hole and Pocket interpret the raw flag differently.
reversed: legacy raw flag, used only if neither through nor direction
is set.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Hole | |
| depth | No | ||
| sketch | Yes | ||
| through | No | ||
| cut_type | No | None | |
| diameter | No | ||
| reversed | No | ||
| threaded | No | ||
| cut_depth | No | ||
| direction | No | ||
| depth_type | No | ThroughAll | |
| thread_size | No | ||
| thread_type | No | ||
| cut_diameter | No | ||
| intended_for | No | ||
| model_thread | 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 delivers: it warns that 'body' (ThroughAll) 'would destroy the cavity' on shelled bodies, that `threaded=True applies a tap', that intended_for drives ModelThread defaults, and that the result carries wall_depth_mm. It even discloses that Hole and Pocket interpret the raw `reversed` flag differently.
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?
Long but organized by parameter name and front-loaded with the core purpose. Every section adds real meaning, though the intended_for bullets and thread explanations are dense enough that some 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 16-parameter mutation tool with no annotations, no output schema, and 0% schema coverage, this is thorough. Minor gaps remain: `name` and `diameter` are never described, and the returned handle/object is not stated beyond wall_depth_mm.
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 16 params, so the description must compensate and largely does: it explains depth_type, cut_type/cut_diameter/cut_depth, threaded, thread_type/thread_size coupling, intended_for, model_thread, through, direction, and reversed. The coupling warning ('M4' valid for ISOMetricProfile but not UNC) is exactly the semantic the schema omits.
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: 'Drill a parametric Hole from a sketch (one or more circles)' names both the operation and its source geometry, which an agent can act on immediately. It doesn't explicitly distinguish itself from closely related material-removing siblings like `pocket` or `pad`, 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?
Explicitly states priority relationships among alternatives: `through` is 'preferred over depth_type/depth', `direction` is 'preferred over reversed', and legacy `reversed` is used 'only if neither' is set. It also routes enum discovery to list_thread_options(), so the agent knows when and how to reach the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspection_planA
The characteristic list for a drawing page as data: every dimension, feature control frame, and feature note, ballooned, with nominal, limits, and a suggested measurement method per row.
The method follows the tolerance rather than a guess: the gauge-maker's ratio:1
rule (default 10:1 — the instrument must resolve a tenth of the tolerance band)
walked down a per-family instrument ladder, so a loose feature isn't sent to the
CMM and a tight bore isn't signed off with a caliper. A bore takes the pin/bore
gauge ladder (a micrometer can't reach inside one); a GD&T control referencing a
datum frame is CMM work; a datum-free form control is surface-plate work. The
required resolution is exact arithmetic, the instrument mapping is shop
convention — hence fidelity='correlation'.
Returns {ok, characteristics, count, by_method, unmeasurable, retired,
next_balloon, fidelity, band_pct, basis}. ok=False means a characteristic cannot
be inspected as drawn — an untoleranced size the inspector has no limits to
accept or reject against (code no_tolerance), or a band finer than any instrument
on its ladder (code no_instrument) — with unmeasurable naming which and why.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| ratio | 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 discloses fidelity='correlation', enumerates the failure conditions (ok=False with codes no_tolerance and no_instrument), and names whose characteristics are unmeasurable and why. It also documents the return keys, giving an agent a precise behavioral contract.
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 information-dense but overlong and not front-loaded; the opening is a noun phrase rather than a crisp statement of purpose, and method-ladder detail crowds out usage guidance. Several clauses are convoluted, though most sentences ultimately 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?
With no output schema, the description helpfully enumerates the return object and its failure semantics, which is what an agent needs to interpret results. The main gap is the undocumented `page` parameter and absent routing guidance versus sibling inspection/report 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 explains the `ratio` parameter thoroughly (the gauge-maker's ratio:1 rule, default 10:1), but the required `page` parameter is left entirely undocumented — no format, identifier, or source is described. 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 resource and scope: a characteristic list for a drawing page, ballooned, with nominal, limits, and a measurement method per row. An agent can tell this apart from siblings like balloon_drawing or fai_report, though it never names them. It lacks an explicit action verb ('build/generate'), making the deliverable clear but the operation 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?
There is no when-to-use guidance or comparison to alternatives such as fai_report, balloon_drawing, or drawing_gate. The long passage about gauge ratio and instrument ladders describes internal method selection, not when an agent should pick this tool. Usage must be inferred from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interface_align_checkA
Gate: verify declared interface pairs coincide in world space — the "do the OTHER interfaces line up?" check for multi-interface mates. After the primary mate seats a part, this confirms its secondary interfaces (a second bolt pattern, a bore axis) actually meet the parent's.
pairs: [{child, child_iface, parent, parent_iface}, ...] (child/parent are link names in the assembly). Returns misaligned pairs [{..., gap_mm}], empty if every pair coincides within tol_mm.
| Name | Required | Description | Default |
|---|---|---|---|
| pairs | Yes | ||
| tol_mm | No | ||
| assembly | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It discloses gate semantics and the return shape (misaligned pairs with gap_mm, empty when aligned), but does not state that it is read-only, whether it mutates assembly state, what permissions it needs, or whether a failed gate blocks downstream steps – important for a 'Gate' 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-loads the gate identity, then the workflow context, then the parameters and return contract – a sensible order. Some phrasing is chattier than needed ('the do the OTHER interfaces line up? check'), but every sentence contributes information about params or return values.
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 no annotations, the description supplies the return contract (misaligned pairs with gap_mm, empty on success) and the parameter encoding, which is most of what an agent needs. It still leaves the assembly argument and the tool's mutation/permission profile unstated.
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 the pairs item shape {child, child_iface, parent, parent_iface}, clarifies that child/parent are link names in the assembly, and explains tol_mm as the coincidence tolerance. Only the assembly parameter is left unexplained, hence a 4 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?
States a specific verb (verify coincide in world space) on a specific resource (declared interface pairs), and explicitly scopes itself against the primary mate: it is 'the do the OTHER interfaces line up? check for multi-interface mates.' An agent can distinguish it from interference_check or envelope_check 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?
Gives clear sequencing context ('After the primary mate seats a part, this confirms its secondary interfaces'), which tells the agent when in the workflow to call it. It does not name a competing sibling or state when-not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
interference_checkA
Pairwise interference: compute volume of intersection between every pair of parts. Returns [{a, b, interference_mm3}, ...] descending by volume. Empty list = no interference.
| Name | Required | Description | Default |
|---|---|---|---|
| assembly | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden alone. It does disclose the return shape and the 'empty list = no interference' semantics, which is genuinely useful. However it never states that this is a read-only/non-mutating analysis, nor warns about cost (pairwise comparison scales quadratically with part count), which an agent needs to avoid calling it on huge assemblies.
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?
Three short sentences: operation, return format, and the empty-result interpretation. Front-loaded with the core action and free of 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, the description usefully specifies the return structure and ordering, so the result contract is covered. Remaining gaps are the meaning/format of the 'assembly' argument and any indication of computational cost or scale limits, which matter for a pairwise comparison 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?
The single required parameter 'assembly' has 0% schema description coverage and is never mentioned in the description. It is ambiguous whether it expects an assembly name, id, or handle, and the description does not compensate for that 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?
Specific verb+resource ('compute volume of intersection between every pair of parts') with explicit scope ('pairwise') that separates it from near-neighbors like min_clearance, envelope_check, and component_contract_check. An agent can tell immediately that this is a clash/interference detection routine rather than a general measurement or contract check.
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 the use case (detecting overlapping parts) but never states when to prefer it over siblings such as min_clearance (gap checking) or envelope_check (bounding checks), nor does it mention prerequisites like requiring an assembly with multiple parts. Usage is inferable but not guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
items_check_manifestA
Reference-integrity guard (#140 C1): check every item-reference in a manifest ({"item":""} on a component/instance) resolves against an items.json registry. Returns {ok, problems} — a dangling item-ref is caught before a merge, removing the "a part is its filename" fragility.
| Name | Required | Description | Default |
|---|---|---|---|
| manifest | Yes | ||
| registry | Yes |
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 shape {ok, problems} and the failure semantics (dangling refs caught before merge), which is genuinely useful, but it omits whether inputs are paths or inline content, error behavior, and any permission/read-only nature. Partial but not complete 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?
Single dense sentence that front-loads the purpose and packs the return shape and rationale. Slightly parenthetical with the inline JSON example, but no wasted 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?
For a two-required-param, no-annotation, no-output-schema tool, the description gives purpose and return shape but leaves parameter format and error semantics unresolved. Adequate as a minimum viable definition, 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% and the description never explains the two required parameters. 'manifest' and 'registry' are named in prose but it is not stated whether they are file paths, JSON strings, or handles — a critical ambiguity for calling the tool 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+resource: checks that every item-reference in a manifest resolves against an items.json registry. It names the exact data shape ({"item":"<id>"}) and the failure mode (dangling refs before a merge), clearly distinguishing it from siblings like items_validate, items_resolve, and validate_manifest.
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?
Implies the usage context (a pre-merge integrity guard) but never explicitly states when to reach for this versus items_validate, items_resolve, or validate_manifest. The 'before a merge' hint gives some routing guidance but no explicit when-not or alternative-naming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
items_newB
Allocate a non-significant sequential part number and register a new item in an items.json sidecar (created if absent), writing it back. The reserved rev / lifecycle fields are seeded with held defaults (the #141 state machine, not C1).
registry: path to the items.json sidecar (created if it does not exist). item: the new item's stable logical id (what manifests reference). files: optional list of artifact paths the item maps to. metadata: optional free-form, queryable attributes (where "meaning" lives).
Returns {part_number, item, registry}.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| files | No | ||
| metadata | No | ||
| registry | Yes |
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 the sidecar is created if absent, that the file is written back, that reserved rev/lifecycle fields are seeded with held defaults, and what is returned. It omits important behavioral detail such as duplicate-item handling, idempotency, concurrency/locking, or error conditions.
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 action sentence is front-loaded, followed by a compact per-parameter list and a return-value line. Every element earns its place; the only minor cost is the internal-reference jargon ('#141 state machine, not C1') that an outside reader cannot decode.
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 no annotations and no output schema, the description covers the action, side effects, all parameters, and the return shape ({part_number, item, registry}). Only edge-case behavior (duplicate id, failure modes) 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 documents all four parameters (registry, item, files, metadata) including which are optional. It adds meaning the bare schema lacks (e.g., item = 'stable logical id manifests reference', metadata = 'free-form queryable attributes').
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 pair ('Allocate a non-significant sequential part number and register a new item') and names the exact artifact store ('items.json sidecar'). It is clearly distinct from the validation/resolution siblings (items_validate, items_resolve), though it never names an alternative 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?
There is no when-to-use vs when-not guidance and no alternative is named. An agent can infer from 'register a new item' that this is the creation path versus items_validate/items_resolve, but that is inference, not stated guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
items_resolveA
Resolve an item-reference (an item id) to its artifact file(s) against an items.json registry — identity, not a bare path, so renaming/moving a file updates the item's files[] without breaking references. Returns {ok, files}, or {ok:false, problems} on a dangling reference (an unknown item id).
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| registry | Yes |
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 identity-based resolution model, the return shape {ok, files}, and the failure mode {ok:false, problems} for dangling references. It does not cover permissions, rate limits, or registry format expectations, but the core behavior is 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?
A single dense sentence that front-loads the core action and semantics. It is efficient, though the parenthetical explanation makes it slightly heavy. No wasted 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?
For a 2-parameter tool with no output schema and no annotations, the description supplies the key missing context: what resolution means, the identity model, and the exact return/failure shape. It is nearly complete, missing only alternate-tool guidance.
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 that 'item' is an item id and 'registry' is an items.json registry, which adds meaning beyond the bare string types, but lacks format or path details. This is a reasonable partial 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?
The description states a specific verb (resolve) and resource (an item-reference to artifact files against an items.json registry), and explains the identity semantics. It does not name a specific sibling alternative, but the purpose is clear and distinguishable from items_validate and items_new.
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 never says when to use this tool versus alternatives like items_validate, project_resolve_manifest, or project_check_references. It explains what happens internally but provides no usage context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
items_validateA
Validate an items.json registry (the PLM item/document/file split, #140 C1). Checks the schema stamp ("ankusdrive.items/1"), each item record's shape, that part numbers are unique, and the held reserved rev/lifecycle fields. An item is the logical part (part_number + rev + lifecycle + metadata), distinct from its file artifact(s); part numbers are non-significant + sequential, with meaning in queryable metadata.
registry: path to the items.json sidecar.
Returns {ok, problems, schema, count} — ok is True iff problems is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| registry | Yes |
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 discloses the domain model (logical item vs file artifact), the exact validation checks, and the return contract (ok is True iff problems is empty). It does not state whether validation is strictly 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?
Front-loaded with the verb and resource, then progressively discloses checks, domain model, and return shape. Slightly dense, but each sentence adds information an agent needs for this PLM concept rather than restating 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?
No output schema exists, but the description defines the return object shape and the meaning of ok, and explains the item/file split that an agent needs to interpret results correctly. Only missing permissions/side-effect context.
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?
There is exactly one parameter at 0% schema coverage, and the description compensates by explaining that 'registry' is the path to the items.json sidecar, clarifying both format and expected file.
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 (validate) and resource (items.json registry), then enumerates exactly what is checked: schema stamp, record shape, part-number uniqueness, reserved field usage. This lets an agent distinguish it from items_new, items_resolve, and items_check_manifest 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?
Usage is implied by the name and the check list, but there is no explicit when-to-use statement, no prerequisite (e.g. after items_new or before release), and no routing away from overlapping validators like items_check_manifest or validate_manifest.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_listA
List every async job this worker session. Returns {count, jobs:[{job_id,
kind, status, elapsed_s}]} in submit order, plus main_thread_queue:{queued, ran,
failed, drains, pending} — the diagnostic for a shape optimization that looks
stuck. Those builds run on the worker's main thread, and that queue is drained
once per request: pending high with drains climbing means the work is slow;
drains flat means nothing is polling, so nothing is advancing.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 discloses the return structure and explains the main_thread_queue diagnostic in useful detail, but it does not state whether the operation is read-only, whether it has side effects, or any 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?
The description is front-loaded with the core purpose, then efficiently presents the return shape and diagnostic interpretation. Every sentence adds value, and there is no redundant or padding language.
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 parameters, no annotations, and no output schema, the description supplies the return shape and queue diagnostic needed to interpret the tool correctly. It omits safety or side-effect context, but for a parameterless list operation it is largely 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?
The input schema has zero parameters, so the baseline score is 4. The description adds no parameter detail because there are none to describe.
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 every async job this worker session.' It also specifies the return shape, making the tool's purpose unmistakable. However, it does not explicitly differentiate itself from sibling tools like job_status or job_result, which would be needed for 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 gives clear context for when the tool is useful: 'the diagnostic for a shape optimization that looks stuck,' with interpretation of pending/drains. It does not explicitly name alternatives or state when not to use it, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_resultA
Fetch an async job's outcome. Returns {job_id, kind, status, elapsed_s, result (when done) | error (when failed)}; while running neither is set. discard=True frees a terminal job (and its cache entry) once you have it.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| discard | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses the return shape, states that result/error are unset while the job is running (state-dependent behavior), and warns that discard frees the job and its cache entry once terminal — a genuinely non-obvious side effect. It omits error/not-found handling and any auth notes, keeping it at a strong 4 rather than 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?
Three compact sentences with no filler, and the core purpose is front-loaded before the return-shape and discard details. The inline brace notation for the return object is dense but readable.
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, so the description correctly spells out the returned fields and their conditional presence. Combined with the discard semantics, an agent has enough to call it correctly; missing only invalid-job_id or failure-mode guidance.
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 well for discard (frees terminal job and cache entry), but job_id is left entirely to the name and required list. Half the parameters are effectively explained, which fits the 'minimum viable' band.
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: fetch an async job's outcome. An agent can tell this apart from submission tools like async_demo_submit or render_photoreal_submit. It does not explicitly differentiate from sibling job_status or job_list, which is the main gap.
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 guidance for the discard parameter (frees a terminal job once you have it), but says nothing about when to prefer this over job_status or job_list, nor prerequisites such as holding a valid job_id. Usage is implied rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_statusA
Lightweight poll of any async job (from an *_submit tool). Returns {job_id, kind, status: 'running'|'done'|'failed', elapsed_s, meta} (+ error when failed) WITHOUT the result payload — cheap to call in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
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 return shape, the status enum, the presence of an error field on failure, and that no result payload is included — all useful behavioral context. It does not state explicitly that the call is read-only/side-effect free or describe failure modes, leaving some 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?
A single dense sentence with a compact inline return-shape spec; the value proposition (no payload → cheap) is front-loaded and nothing is wasted.
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, but the description itself enumerates the returned fields and their meaning, plus the failure case. For a one-parameter polling tool, everything needed to call it correctly is present.
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 job_id is undocumented in the schema. The description compensates partially by tying the id to an *_submit tool, implying where it comes from, but adds no format or validity detail. Baseline 3 is appropriate.
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 (poll) plus resource (any async job) and names its origin (*_submit tool). It also implicitly distinguishes itself from the sibling job_result by noting it returns status WITHOUT the result payload.
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 (after an *_submit tool) and a usage pattern (cheap to call in a loop), which implies polling rather than fetching results. It stops short of explicitly naming job_result as the alternative for retrieving payloads, so it stops at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
laminate_propertiesA
Effective stiffness, thermal warp, and first-ply failure of a bonded
multi-layer composite stack (NO solver) — the closed-form screening twin a
layered multi-material CalculiX fem_run static solve is gated against (e.g.
1 metal layer + 1 plastic layer, or any [(material, thickness), …]).
layers is the stack bottom→top; each entry is a mapping with a thickness
(mm) and either a corpus material name or explicit E/youngs_mpa/
youngs_gpa (+ optional nu/poisson, yield_mpa, cte/cte_per_k,
density_kg_m3, thermal_conductivity_w_mk); explicit values override the
card. width_mm scales EI / first-ply. Optional delta_T (K) gives the
bimetal thermal curvature; force_n (in-plane, total across width) and/or
moment_nmm (about the neutral axis) give the first-ply margin.
Computes the in-plane modulus (Voigt rule-of-mixtures parallel, Reuss series
through-thickness); the transformed-section neutral axis, EI_eff, and flexural
modulus E_flex = 12·EI/(b·h³); the CLT A/B/D matrices per unit width (B ≠ 0 ⇒
bending–extension coupling / warp warning); mass-averaged ρ, stiffness-weighted
in-plane CTE, series/parallel thermal conductivity; the transformed-section
bimetal curvature (= Timoshenko's two-layer formula exactly, also reported);
and per-layer extreme-fibre stress → margin to yield → governing layer + load
to first yield. A single-material stack reduces to that material's E / EI; a
symmetric stack gives B = 0; ΔT = 0 or zero CTE-mismatch gives zero curl.
Escalate to a layered fem_run solve for thick stacks, anticlastic curvature,
free-edge interlaminar stress, or non-isotropic plies.
Returns {n_layers, width_mm, total_thickness_mm, layers, E_inplane_mpa, E_through_mpa, neutral_axis_mm, EI_eff_nmm2, E_flex_mpa, A_matrix, B_matrix, D_matrix, coupling_ratio, asymmetric, rho_eff_kg_m3, cte_eff_per_k, k_through_w_mk, k_inplane_w_mk, delta_T, thermal_curvature_per_mm, radius_of_curvature_mm, timoshenko_curvature_per_mm, applied_force_n, applied_moment_nmm, kappa_applied_per_mm, axial_strain, layer_stresses, first_ply, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| layers | Yes | ||
| delta_T | No | ||
| force_n | No | ||
| width_mm | No | ||
| moment_nmm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, and it does so well: it lists the exact methods (Voigt/Reuss rule-of-mixtures, transformed-section neutral axis, CLT A/B/D), the degenerate cases (single material, symmetric stack, zero delta_T) and the fidelity/band/warnings outputs. It stops short of describing auth, cost, or rate behavior, but for a physics screen its behavioral disclosure is 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?
The definition is long and dense, mixing usage positioning, parameter docs, method enumeration, and a return-value dump into prose. It is front-loaded with the core purpose, but the return listing and mid-paragraph method detail could be trimmed or moved.
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 tool with 0% schema coverage, no annotations, and no output schema, the description supplies nearly everything an agent needs: what it computes, its inputs, its outputs, its limitations, and when to escalate. It is close to complete, missing only minor unit/default clarity.
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: it explains layers is bottom→top with thickness in mm plus either a material name or explicit E/nu/yield/cte/density/k properties with override semantics, and explains delta_T, force_n, and moment_nmm roles. It omits width_mm's default and unit semantics for some quantities.
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: computes effective stiffness, thermal warp, and first-ply failure of a bonded multi-layer composite stack, and explicitly positions it as the closed-form screening twin gated against a layered fem_run static solve. This distinguishes it from the sibling fem_run and other structural tools.
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 when to use the tool (screening closed-form twin) and when not to, listing exactly what triggers escalation to a layered fem_run solve: thick stacks, anticlastic curvature, free-edge interlaminar stress, or non-isotropic plies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lifecycle_apply_changeA
Apply a change to a RELEASED item, dispatching on the F3 predicate (#141 C2)
— the sanctioned way to change a frozen part. An F3-preserving change opens a
new revision on the SAME part number (rev A->B, back to in_work); an
F3-breaking change allocates a NEW part number as a new item (new_item
required) carrying a supersedes back-link, leaving the released item
untouched.
registry: path to the items.json sidecar (written back on success). item: the released item id being changed. after: the proposed new metadata (attribute object). new_item: id for the new item when the change is F3-breaking. extra_f3 / actor / note: optional, as in lifecycle_classify_change / lifecycle_transition.
Returns {ok, disposition, item, part_number, rev, ...}, or {ok:false, problems} (e.g. the item is not released, or an F3-break lacks new_item).
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| note | No | ||
| actor | No | ||
| after | Yes | ||
| extra_f3 | No | ||
| new_item | No | ||
| registry | Yes |
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 mutates state, exactly what each branch does (new rev on same part vs. new part number with supersedes back-link), that the released item is left untouched on an F3-break, and two concrete failure modes. It omits permission/auth requirements and concurrency/locking behavior, which for a mutation tool remains a 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?
Dense but well-structured: the core F3 dispatch is front-loaded, followed by per-parameter notes and return shape. Slightly verbose in the branch explanation, but almost every sentence carries actionable 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?
For a 7-parameter mutation tool with no annotations and no output schema, the definition is unusually complete – it documents the mutation semantics, both outcome branches, the return object, and failure cases. What remains thin is the exact meaning of the F3 predicate and the contents of `after`.
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 largely does: registry, item, after, new_item, and the extra_f3/actor/note group are each explained, including the conditional requirement on new_item. The `after` object is only glossed as 'proposed new metadata', leaving its expected keys unspecified.
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 ('apply a change to a RELEASED item') and immediately distinguishes itself from sibling lifecycle tools by describing the F3 dispatch. An agent can tell it apart from lifecycle_classify_change and lifecycle_transition.
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?
Frames itself as 'the sanctioned way to change a frozen part' and describes the two branches that determine the outcome, which is strong context. It references lifecycle_classify_change/lifecycle_transition for optional params but never states an explicit when-not-to-use or a precondition checklist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lifecycle_classify_changeA
The deterministic Form/Fit/Function predicate (#141 C2): compare an item's before/after attributes and decide rename-vs-revise. A change touching a Form/Fit/Function (public, interface-defining) attribute breaks interchangeability => "new_part_number" (allocate a new number); a change to only internal/hidden attributes is interchangeable => "revise" (bump the revision, same part number).
before / after: attribute objects (the item's interface-defining + internal attributes, before and after the proposed change). extra_f3: optional map of extra attribute name -> F3 leg ("form"/"fit"/ "function") for domain-specific interface attributes.
Returns the verdict {disposition, f3, changed, f3_changed, categories, reason} where disposition is "revise" / "new_part_number" / "noop".
| Name | Required | Description | Default |
|---|---|---|---|
| after | Yes | ||
| before | Yes | ||
| extra_f3 | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden and does well: it discloses that the tool is a deterministic predicate (implying no side effects), what it compares, and the exact shape of the verdict. It stops short of explicitly guaranteeing read-only/no-mutation behavior or describing failure modes, so 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?
Front-loaded with the core purpose and decision logic, then the parameter and return details in clearly separated blocks. The opaque spec reference '(#141 C2)' is noise for an agent, but overall the text is 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?
No output schema exists, yet the description enumerates the returned verdict fields (disposition, f3, changed, f3_changed, categories, reason), so an agent knows what to expect. Combined with the parameter explanations and decision rule, nothing essential is missing 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 compensate, and it does: it explains that before/after are attribute objects containing interface-defining and internal attributes, and that extra_f3 maps attribute names to Form/Fit/Function legs. This adds real meaning beyond the bare 'object' schemas, though the internal structure of the attribute objects is still unspecified.
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 ('deterministic Form/Fit/Function predicate ... compare before/after attributes and decide rename-vs-revise') and names the exact verdicts it produces. It is clearly distinguishable from siblings like lifecycle_transition and lifecycle_apply_change, which mutate state, because this one is framed as a pure decision predicate.
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 a clear decision rule for when the result should be 'new_part_number' vs 'revise', which tells an agent when this tool is the right one to call. It does not, however, explicitly name alternatives (e.g. lifecycle_editable, lifecycle_apply_change) or state when NOT to use it, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lifecycle_editableA
The cheap "is this editable?" check a builder runs before writing (#141 C2). An item is editable only in lifecycle state in_work; in_review, released and obsolete are frozen (released = immutable, the API-stability guarantee).
registry: path to the items.json sidecar. item: the item id to check.
Returns {ok, editable, state}.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| registry | Yes |
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 enumerates the editability rule (editable only in in_work; in_review/released/obsolete frozen), flags 'released = immutable' as an API-stability guarantee, and notes the check is 'cheap'. It stops short of stating whether it is a pure read or what happens on a missing item.
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 question, then the rule, then per-parameter notes and the return shape. Slightly cluttered by the internal ticket reference '(#141 C2)', which adds no value to an agent.
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 including 'Returns {ok, editable, state}' is genuinely useful. Combined with the state rule and both parameter meanings, the description is nearly complete for a two-parameter boolean-ish check; only edge-case/error 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 it does: 'registry' is defined as the path to the items.json sidecar and 'item' as the item id to check. Both required parameters are meaningfully explained.
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 ('is this editable?' check) and immediately scopes it as a pre-write guard a builder runs. It also names the exact semantics that distinguish it from lifecycle_transition/lifecycle_apply_change 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 usage context ('the cheap check a builder runs before writing'), which implies when to call it versus the heavier lifecycle_transition tool. It does not explicitly name an alternative or state when NOT to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lifecycle_transitionA
Move an item through the lifecycle state machine in_work -> in_review -> released -> obsolete, guarded by a transition table (#141 C2). An illegal edge (e.g. skipping review, or re-opening a released item in place) is rejected loudly; releasing stamps the item's first revision and freezes it.
registry: path to the items.json sidecar (written back on success). item: the item id to transition. to: the target lifecycle state. actor / note: optional provenance recorded in the item's transition log.
Returns {ok, state, rev}, or {ok:false, problems} on an illegal transition.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| item | Yes | ||
| note | No | ||
| actor | No | ||
| registry | Yes |
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 richly: it discloses transition-table guarding, loud rejection of illegal edges, revision stamping and freezing on release, registry write-back on success, optional provenance logging for actor/note, and the return shape {ok, state, rev} or {ok:false, problems}.
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?
Core purpose and state machine are front-loaded, followed by compact parameter and return-value notes. The internal reference '(#141 C2)' and phrasing like 'rejected loudly' are minor, and overall the text is 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?
Despite having no annotations, no output schema, and 0% schema description coverage, the description supplies behavior, parameter meaning, and return values. That is sufficient for an agent to call the tool correctly, though it does not spell out prerequisites like registry existence.
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 five parameters, and the description documents each one: registry path and its write-back behavior, item id, target state, and optional actor/note as provenance in the transition log. It also supplies the valid lifecycle states as an implicit enum that the schema lacks.
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 ('Move') and resource ('item through the lifecycle state machine'), and enumerates the full state sequence in_work -> in_review -> released -> obsolete. It does not name or exclude sibling tools such as lifecycle_editable, lifecycle_classify_change, or lifecycle_apply_change, so sibling differentiation is absent.
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 statement, no alternatives mentioned, and no prerequisites (e.g. whether the registry file must already exist). The state machine context implies the operation but does not guide tool selection against the other lifecycle_* siblings, matching the 'no guidance' anchor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linear_patternC
Repeat a PartDesign feature linearly along a direction.
direction: 'X'|'Y'|'Z' for body origin axes, or {handle, edge: tag|'EdgeN'} for an edge-aligned direction. length: total span (mm) covered by the pattern. occurrences: number of copies (>=2). Includes the original.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | LinearPattern | |
| length | No | ||
| feature | Yes | ||
| reversed | No | ||
| direction | No | X | |
| occurrences | 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, but it only describes geometric parameters. It does not disclose whether this modifies the model, whether the original feature is preserved, permission requirements, or the result format.
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 lists parameter details compactly. It is appropriately sized with no filler, though it could be slightly more 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?
For a 6-parameter tool with no annotations and no output schema, the description is incomplete. It lacks explanation of the required 'feature' parameter, the 'reversed' flag, and expected output or 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 description coverage is 0%, so the description must define all parameters. It explains direction, length, and occurrences well but omits meaning for 'feature' (required), 'reversed', and 'name', leaving key parameter semantics 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 description states a specific verb and resource: 'Repeat a PartDesign feature linearly along a direction.' This clearly distinguishes it from polar or mirrored patterns, but it does not name sibling tools or explicitly differentiate usage from them.
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 polar_pattern or mirrored, nor any prerequisites or context for choosing linear patterning. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assembly_partsB
List parts of an assembly: name, type, linked-target name, position, volume.
| Name | Required | Description | Default |
|---|---|---|---|
| assembly | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided the description carries the full burden. It discloses the return fields (name, type, linked-target name, position, volume), which is genuinely useful behavioral context, but says nothing about whether it is read-only, how permissions work, or how results scale for large assemblies.
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?
A single front-loaded sentence with the action first and the returned fields after. No padding or wasted clauses, though the field list could be introduced more cleanly.
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 one-parameter list tool with no output schema, enumerating the returned fields compensates reasonably for the missing output schema. However, with no annotations and an undocumented parameter format, the description is not fully sufficient to invoke it confidently.
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 is one required parameter, so the description must compensate. It only implies the parameter via 'of an assembly' and never specifies the expected format (assembly name, handle, or document path), leaving the agent guessing.
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 ('List') and resource ('parts of an assembly') and even enumerates the returned fields. It is distinguishable from list-oriented siblings like list_objects and list_faces, though it does not explicitly name an alternative 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?
No when-to-use guidance, prerequisites, or alternative tools are mentioned. The agent must infer from the name that this is the correct tool for inspecting assembly composition, with no exclusions offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsA
List all open documents: [{name, label, file_path, dirty, active, object_count}, ...].
| Name | Required | Description | Default |
|---|---|---|---|
No 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 partially meets that with the inline return shape, which reveals the tool is a non-destructive enumeration returning document metadata. It says nothing about ordering, whether documents from other workspaces are included, or cost/volume limits, which are the remaining behavioral 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?
A single compact sentence, front-loaded with the verb and resource, followed by the return shape. Nothing is redundant or 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?
With no output schema and no annotations, the description compensates by documenting the returned fields (name, label, file_path, dirty, active, object_count), which is enough for an agent to consume the result. It stops short of explaining ordering or cross-workspace scope.
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 per the rubric the baseline is 4. There are no inputs that need explanation, and the description correctly does not invent any.
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 ('List') and resource ('all open documents'), so an agent immediately knows this is a read-only enumeration of currently open documents. However, it does not name or contrast with siblings such as list_objects, list_workspaces, or get_object, so the 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?
There is no statement of when to use this tool versus alternatives, no prerequisites, and no exclusions. The phrase 'all open documents' implicitly scopes the result set, but the agent receives no guidance on choosing this over list_objects or get_object.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_edgesA
List all edges of a shaped object with stable tags + descriptors.
Returns [{tag, index, kind, length, centroid, axis?, radius?}, ...]. Same stability story as list_faces.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
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 format (array of objects with tag, index, kind, length, centroid, axis?, radius?) and a 'stable tags' behavioral trait, but does not state that the operation is read-only, nor does it mention permissions or 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?
Two sentences plus a compact return-structure line. Purpose is front-loaded, and every element earns its place by adding value (return fields, stability reference).
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 list tool with no annotations and no output schema, the description covers purpose and return shape, but the lack of any explanation of the required 'handle' parameter leaves a significant gap for an agent trying 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 description coverage is 0% for the sole required parameter 'handle'. The description only indirectly implies the handle refers to a shaped object, but does not explain what a handle is, its format, or how to obtain one. This is insufficient compensation for the missing schema 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?
Specific verb 'List' plus resource 'edges of a shaped object', with scope 'all' and output descriptors. It distinguishes itself from sibling list_faces by referencing 'same stability story as list_faces', making the edge-vs-face distinction 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?
The description implies the tool is used when enumerating edges of a shaped object, but offers no explicit when-to-use guidance or alternatives (e.g., resolve_edge for a single edge). The reference to list_faces is about stability, not usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_face_rolesA
Read back the semantic face roles declared on a part (see annotate_face).
Each entry re-resolves its stored tag against the CURRENT geometry, so a drifted or deleted face is reported rather than silently resolving wrong.
Returns a list (sorted by name) of dicts: name (str) the annotation key role (str) inlet | outlet | sealing | wetted | ambient | mating tag (str) the f_* face tag the role is bound to present (bool) whether that tag still resolves on the current shape index (str) 'FaceN' on the current shape (only when present) meta (dict) the verbatim metadata (only when set)
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
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 well: it discloses that each tag is re-resolved against CURRENT geometry and that drifted/deleted faces are reported rather than silently mis-resolving. It also fully documents the return structure. It does not discuss ordering stability beyond 'sorted by name' or any auth/handle 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 core purpose in one sentence, then a second sentence for the important drift-detection behavior, then a clean field-by-field return list. No filler; every line 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?
With no output schema and no annotations, the description steps up by enumerating the returned dict fields and their types, which is the key missing piece. The only gap is the undocumented handle parameter, which would otherwise have been trivial to add.
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 'handle' parameter, but it never mentions it. The only argument is left entirely undefined, leaving the agent to infer it refers to the part handle referenced by annotate_face.
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 (read back semantic face roles on a part) and immediately anchors it to its counterpart annotate_face. An agent can distinguish it from list_faces/query_faces because the resource is 'roles', not raw faces.
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 'see annotate_face' cross-reference routes the agent to the paired write tool and implies this is its read counterpart. However, it never explicitly says when to prefer this over siblings like list_faces or query_faces, and gives 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.
list_facesB
List all faces of a shaped object with stable tags + geometric descriptors.
Returns [{tag, index, kind, area, centroid, normal?, axis?, radius?}, ...]. Tags survive geometry edits as long as the face's surface kind, area, centroid, and (where meaningful) normal/axis/radius do not change. Use the tag in subsequent calls instead of the FaceN index.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description must carry the full burden. It gives the return array shape and stable-tag semantics under geometry edits, plus guidance to use tags instead of FaceN. Missing an explicit read-only/side-effect statement, but 'list' and the stability detail provide substantial 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?
Front-loaded purpose, then return shape, stability rule, and tag usage; every sentence contributes. No redundant or filler 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?
No output schema or annotations, but the description supplies the return shape and tag stability, covering the biggest unknowns. It omits handle semantics and when to choose it over query_faces/resolve_face, so it is not fully 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% and there is a single required 'handle' parameter. The description only implies the handle refers to a shaped object; it never specifies handle format, provenance, or expected values. Adds little 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?
Specific verb 'List' and resource 'faces of a shaped object', with stable tags and geometric descriptors. Clear, but does not name or differentiate from face-related siblings like query_faces or resolve_face.
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 only post-call guidance to use tags instead of the FaceN index. No statement of when to choose this tool over alternatives such as query_faces or resolve_face.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_objectsA
List objects in the active document. Returns [{name, type, label}, ...].
| Name | Required | Description | Default |
|---|---|---|---|
No 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 tuple shape ({name, type, label}), which is genuinely useful given there is no output schema, but it says nothing about scope (recursive? hidden bodies? sketches vs. all types) or ordering. Adequate but shallow for a discovery 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?
Two sentences, zero waste, with the action front-loaded and the return shape immediately following. Every clause 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 parameterless read-only listing tool with no output schema, the description supplies the essentials, including the return shape. It is nearly complete; only the scope of what counts as an 'object' is left open.
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 per the baseline there is nothing for the description to clarify beyond what the schema provides. The description is consistent with the empty argument object.
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 objects in the active document') and adds the return shape, so the agent knows exactly what this yields. It does not differentiate itself from near siblings such as get_object, list_faces, or list_edges, but the action itself 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?
No when-to-use, when-not-to-use, or alternative is named. The agent must infer that this is the entry point for discovering document contents rather than reading it anywhere in the text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_thread_optionsA
Discover the COUPLED ThreadType / ThreadSize enums on the hole tool.
Call with no args to list valid thread_type values. Call with thread_type=... to list the valid thread_size values for that type (the coupling: thread_size='M4' is valid for 'ISOMetricProfile' but not for 'UNC'). Use this BEFORE calling hole(threaded=True, thread_type=..., thread_size=...) to avoid a failed enum-value call.
Returns either {thread_types: [...]} or {thread_type, thread_sizes: [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It discloses the coupling behavior (thread_size='M4' valid for ISOMetricProfile but not UNC) and the failure-avoidance purpose, and even specifies return shapes. It does not mention performance/rate concerns, but for a pure lookup tool that 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?
Three short paragraphs: purpose, usage modes, return shapes. Front-loaded with the core purpose, zero 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?
No output schema and no annotations, so the description must carry everything. It covers purpose, usage, coupling semantics, and return shapes, which is sufficient to invoke correctly. It could be slightly more complete by listing the actual enum values or noting the empty-arg default behavior more sharply, but 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% and the single parameter has no description. The description fully compensates: it explains thread_type is optional, what omitting it does, and what passing it produces. The only gap is that it does not enumerate concrete valid thread_type strings, though it promises the tool returns 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?
Names a specific resource (coupled ThreadType/ThreadSize enums on the hole tool) and verb (list valid values). Distinguishes clearly from sibling 'hole' by explaining it is a lookup prerequisite rather than the operation itself.
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 states when to call with no args vs with thread_type, and explicitly routes the agent: 'Use this BEFORE calling hole(threaded=True, ...) to avoid a failed enum-value call.' The when/when-not/alternative condition is fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesA
List the live workspaces (freecadcmd processes) and the pool limits. Each entry is {name, alive, idle_s, current}. Use to see who is holding a slot before claiming or closing one. Returns {current, max, idle_reap_s, workspaces: [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 behavior: it specifies the pool-limit fields (idle_reap_s, max) and per-entry liveness fields (alive, idle_s, current), which tells the agent what state it is observing. It does not discuss caching or freshness of the list, but for a read-only listing the disclosure is 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?
Three tight sentences, front-loaded with what is listed, followed by entry shape, usage trigger, and full return shape. No sentence is filler and the key scoping information comes first.
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 annotations and no output schema, the description compensates by spelling out both the per-entry and top-level return shapes, which is what an agent needs to interpret results. It is essentially complete for a zero-arg read tool, with only minor gaps such as ordering or staleness of the listing.
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 for the description to disambiguate; the 0-param baseline of 4 applies.
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 (List) and resource (workspaces), and disambiguates the term by parenthetically defining a workspace as a freecadcmd process. This distinguishes it from siblings like use_workspace and close_workspace without needing to open 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?
"Use to see who is holding a slot before claiming or closing one" gives a clear precondition for calling it, implicitly routing to use_workspace/close_workspace. It stops short of naming those siblings explicitly as alternatives, so it is clear context rather than fully explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loftB
Loft (additively) between two or more sketches.
sketches: ordered list of sketch handles. The first becomes the Profile, the rest become Sections. closed: True connects the last section back to the first (toroidal). ruled: True uses straight ruled surfaces between adjacent sections.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Loft | |
| ruled | No | ||
| closed | No | ||
| reversed | No | ||
| sketches | Yes |
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 states that the operation is additive and explains how closed and ruled alter the resulting geometry, but it does not cover permissions, error conditions, interaction with existing geometry, or undo 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 description is tightly structured and front-loaded, with one sentence for the core purpose and bullet-style definitions for key parameters. 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 5-parameter CAD tool with no annotations and no output schema, the description gives enough to understand the core operation but lacks prerequisites, handling of reversed/name, and behavioral edge cases. It is minimally viable but not fully 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 documents the sketches ordering and the closed and ruled flags, but omits the name and reversed parameters, leaving important semantic gaps.
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 modeling verb and resource: loft between two or more sketches, with the additively qualifier. It clearly identifies the operation among CAD siblings, though it does not explicitly distinguish itself from alternatives like sweep or revolve.
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 choose loft over sibling operations such as sweep, revolve, or pad. The description only defines the operation itself, leaving the agent to infer usage context without explicit conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_assemblyB
Create an App::Part container to hold linked parts. Returns {handle, name}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Assembly |
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 partially compensates by disclosing the return shape ("Returns {handle, name}"), which is valuable since there is no output schema, but it omits whether this mutates the active document, what scope the container lives in, and any prerequisites for use.
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, front-loaded sentences with no padding: the action first, the return value second. Nothing is wasted, though there is also very little 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?
For a container-creation tool with no annotations and no output schema, the description covers the core action and the returned handle/name, which is the minimum an agent needs to chain a subsequent call. It still leaves out document context, side effects, and any distinction from related assembly 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 description coverage is 0% for the single `name` parameter, and the description says nothing about it — not that it is optional, not the default value, not the naming constraints. The agent must read the schema to learn anything about this argument, so 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?
States a specific verb and resource ("Create an App::Part container to hold linked parts"), and naming App::Part distinguishes it from the sibling add_part and make_body at a conceptual level. It does not, however, explicitly contrast itself with the closest siblings (add_part, make_body, merge_assembly).
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 (e.g., must a document be open/active?), and no mention of alternatives such as add_part or merge_assembly. The phrase "to hold linked parts" hints at intent but leaves the agent to infer the workflow position.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_bodyB
Create a PartDesign Body. Subsequent sketches/features go inside it.
Returns {handle, name}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Body |
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 discloses the return shape {handle, name}, but does not say whether the body is created in the active document, whether it becomes active, what side effects occur, or what errors may arise.
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 action, followed by scope and return information. Every sentence earns its place with no 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 simple creation tool with no annotations or output schema, the description covers purpose and return shape, but omits parameter meaning and document context. It is minimally adequate rather than fully 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%, and the single parameter 'name' has no schema description. The tool description does not mention the parameter at all, so it adds no meaning beyond the raw property name and default value.
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: 'Create a PartDesign Body.' The follow-up sentence clarifies its role as a container for subsequent sketches/features. It does not differentiate from sibling creation tools like make_assembly or add_part, but the resource is specific.
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?
'Subsequent sketches/features go inside it' implies usage context, but there is no explicit when-to-use vs alternatives such as make_assembly, add_part, or new_document, and no prerequisites like needing an active document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_datum_planeB
Create a Datum Plane in a Body.
base: 'XY' | 'XZ' | 'YZ' for body origin planes. Pass a face_tag dict {handle, tag} for attachment to a face on another shape. offset: shift along the plane normal in mm.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | XY | |
| body | Yes | ||
| name | No | DatumPlane | |
| offset | 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 behavioral burden. It explains plane construction modes but says nothing about whether an active document is required, permissions, whether the created plane returns or persists a handle, or any failure behavior. For a creation tool with zero annotation coverage, this is a significant 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 sentence and the parameter notes are compact and scannable. The mention of a face_tag dict that maps to no schema parameter slightly muddies an otherwise tight structure.
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 creation tool with no annotations and no output schema, the description covers the plane-mode parameters but omits what 'body' should reference and what the tool returns. It is partially complete but leaves gaps an agent may need before calling it.
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 documents valid 'base' values ('XY'|'XZ'|'YZ') and states 'offset' is in mm, adding real meaning. But it leaves 'body' and 'name' unexplained, and references a 'face_tag dict {handle, tag}' that does not correspond to any declared parameter, which is confusing.
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 ('Create a Datum Plane in a Body'), which clearly identifies the operation. It does not explicitly differentiate from nearby creation tools like make_sketch or make_body, but the resource is distinctive enough that an agent can place it correctly.
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?
Guidance is present for the parameter choices ('base' for body origin planes vs a face_tag dict for attachment to another shape), which implies when each mode applies. However, there is no explicit statement of when to prefer this tool over alternatives such as make_sketch, so usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_drawing_pageC
Create a TechDraw page using a built-in A4 landscape template by default. template: optional absolute path to a .svg template.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Page | |
| template | 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. It usefully discloses the default template (A4 landscape) and that a template is optional, but says nothing about side effects, whether the page is attached to the active document, or what is returned. For a creation tool with zero annotation coverage this is thin.
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 with the core default behavior front-loaded and the parameter note second. Nothing is wasted, though the parameter note is sentence-fragmented rather than integrated.
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, no annotations, and 0% schema coverage, the description should at minimum explain the name parameter and what the tool returns or how to reference the created page. It covers only the template argument, leaving an agent uncertain about the result and about the required context.
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 the 'template' parameter well (optional, absolute path to a .svg), but the 'name' parameter — its role, whether it must be unique, and how it identifies the page — is undocumented anywhere.
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 ('Create a TechDraw page') and names the default behavior (built-in A4 landscape template). It is clear what the tool produces, though it does not explicitly distinguish itself from nearby siblings like sheet_base or add_section_view.
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 (e.g., must a document be active or open?), and no alternatives named. The only implied usage is that you call it when you want a drawing page, which the name already conveys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_sketchB
Create a sketch in a Body, attached to a plane.
plane: 'XY' | 'XZ' | 'YZ' for origin planes, or a datum-plane handle. Returns {handle, name}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| name | No | Sketch | |
| plane | No | XY |
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 helpfully discloses the return shape (Returns {handle, name}) and the accepted plane inputs, but says nothing about prerequisites (does the body need to exist), transaction/document-mutation semantics, or name handling beyond the schema 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?
Front-loaded with the action, then the plane options, then the return value. Compact and waste-free; every clause adds usable 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?
For a creation tool with no output schema and no annotations, it covers the plane choices and the return shape reasonably, but omits the required body parameter's meaning, preconditions, and document/transaction effects, leaving gaps an agent would need.
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 the 'plane' parameter well (enumerating 'XY'|'XZ'|'YZ' plus the datum-plane-handle option), which is meaningful beyond the bare schema, but leaves the required 'body' and optional 'name' parameters completely 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+resource (create a sketch) plus its anchoring context (in a Body, attached to a plane), which distinguishes it from siblings like add_sketch_geometry, add_sketch_constraint, and close_sketch. Clear, though it doesn't explicitly name an alternative 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?
Usage is implied by 'create a sketch in a Body, attached to a plane' but there is no explicit when-to-use, when-not-to-use, or named alternative (e.g. make_datum_plane before this, close_sketch after). An agent can infer the role but gets no routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mass_propertiesA
Mass properties of a shaped object: volume (mm³), surface area (mm²), centroid, bounding box, inertia tensor. If density (kg/mm³) is given, also returns mass (kg). Steel = 7.9e-6, aluminum = 2.7e-6, ABS = 1.05e-6.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| density | 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: a pure read/compute tool that returns a fixed set of quantities, the exact units, and the side effect that supplying density adds mass. It does not address permissions or handle validity, but for a non-mutating computation there is little remaining behavioral risk to expose.
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 that are front-loaded with the returned quantities and units, then the conditional density behavior and reference values. Every clause earns its place with no 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, the description usefully enumerates return values and units, and it fully explains the optional density parameter. The only gap is the unexplained required handle, which slightly limits completeness given the total absence of structured field documentation.
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 strongly for density: it gives units (kg/mm³), the conditional effect (mass in kg), and concrete reference values for steel, aluminum and ABS. The handle parameter is left unexplained, so coverage is 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 states a specific computation ('mass properties of a shaped object') and enumerates the exact outputs (volume, surface area, centroid, bounding box, inertia tensor, conditional mass), which is far more specific than a name restatement. It does not, however, explicitly distinguish itself from the overlapping sibling bounding_box, whose output it partly subsumes.
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 hints at usage via the conditional 'If density is given, also returns mass,' but never states when to prefer this tool over measure_distance or bounding_box, nor any prerequisites for the handle. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
material_getA
Look up a material by name (e.g. 'AL6061-T6'). Returns the full property card as SI quantity strings (YoungsModulus, PoissonRatio, Density, yield_strength, fracture_toughness, thermal_conductivity, cte, rough_cost, refractive_index where applicable, source, basis). The structural keys are FEM-card-compatible, so the result feeds fem_set_material directly. On a miss returns {ok:false, reason} with a did_you_mean suggestion.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
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 enumerates the returned keys, states the value format (SI quantity strings), and describes the failure mode ({ok:false, reason} plus a did_you_mean suggestion). Missing only things like case-sensitivity or match strictness.
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?
Three dense sentences, front-loaded with the core lookup action, followed by return contract and error behavior. Every sentence contributes, though the key enumeration is somewhat long.
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 lookup with no output schema and no annotations, the description supplies the return shape, value format, error contract, and downstream compatibility. An agent has essentially everything needed to call and interpret it.
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 gives one concrete example ('AL6061-T6'), which conveys the expected name format, but says nothing about case sensitivity, aliases, or fuzzy matching behavior for the single required parameter.
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 ('look up') and resource ('a material by name') with a concrete example value ('AL6061-T6'). An agent can distinguish this from material_list/material_select purely from the description.
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 example and the note that the result feeds fem_set_material directly, which is a useful downstream routing hint. However, it never explicitly states when to choose this over material_list or material_select, nor any preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
material_listA
List available materials, optionally filtered to one category ('aluminum' | 'steel' | 'titanium' | 'magnesium' | 'polymer' | 'glass'). Returns {count, category, materials:[{name, category}, ...]} sorted by name.
| Name | Required | Description | Default |
|---|---|---|---|
| category | 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. 'List' implies a safe read, and the description usefully discloses the return shape and sort order, but it says nothing about pagination, result limits, or behavior when the category has no matches.
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 sentences, front-loaded with the action and scope, followed by the return contract and ordering. No filler, no restating the tool 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?
For a single optional-parameter read tool with no output schema, the description covers the valid values, optionability, and return shape, which is close to sufficient. Minor gaps: no mention of empty-result or large-result 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% and the schema does not even constrain the string to an enum, so the description's inline enumeration of the six valid category values adds substantial meaning beyond the schema. It also conveys that the parameter is optional via 'optionally'.
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 available materials') with the exact optional filter dimension. It is clearly distinguishable from the sibling material-related tools (material_get, material_select), which retrieve or choose a single material rather than enumerate the catalog.
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 word 'optionally' tells the agent filtering is not required, which is useful implied usage, but there is no explicit guidance on when to reach for material_list versus material_get, material_select, or catalog_search in the sibling list. Usage is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
material_selectA
Ashby-style selection: filter the corpus, then rank survivors.
criteria keys are min_/max_ (e.g. min_yield_mpa, max_density_g_cc, min_service_temp_c). rank_by: specific_strength | specific_stiffness | strength | stiffness | cost | density. Returns {rank_by, count, criteria, candidates:[{name, score, yield_mpa, density_g_cc, youngs_gpa, cost_usd_kg}, ...]} best-first; an empty filter returns no candidates rather than the closest miss.
| Name | Required | Description | Default |
|---|---|---|---|
| rank_by | No | specific_strength | |
| criteria | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure and does well: it explains the return shape, best-first ordering, and the important empty-filter behavior. It does not state side-effect or concurrency details, but for a read-only selection tool this is reasonable.
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 dense but purposeful and front-loaded: purpose first, then criteria format, rank_by options, return shape, and one important edge case. 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?
For a two-parameter tool with no annotations and no output schema, the description provides the return shape, parameter semantics, ranking options, and empty-result behavior. It does not enumerate every valid accessor, but the pattern and examples are 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%, so the description must compensate, and it does: it explains the criteria key pattern min_<accessor>/max_<accessor>, gives concrete examples, and enumerates rank_by values. This adds substantial 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 clearly states a specific verb and resource: material selection by filtering and ranking. It distinguishes the tool as an Ashby-style selector, but it does not explicitly differentiate from sibling tools such as material_list or material_get.
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 criteria format and rank_by options, but there is no explicit guidance on when to choose this tool over material_list or material_get. It also does not state any conditions where this tool should not be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_angleA
Angle (degrees) between two planar faces or two straight edges.
a, b: object handles. a_ref, b_ref: REQUIRED sub-shape references, one per handle. Both must be the SAME kind:
face tags ('f_*' from list_faces/query_faces, or 'FaceN', or 1-based int) -> angle is between the faces' outward normals. Faces must be planar.
edge tags ('e_*' from list_edges, or 'EdgeN', or 1-based int) -> angle is between the edges' tangent directions. Edges must be straight. Mixing a face ref with an edge ref, a non-planar face, or a curved edge raises.
Units: degrees. Returns:
angle_deg: raw angle between the two direction vectors, 0..180.
supplement_deg: 180 - angle_deg (the complementary angle; use this for the acute reading when angle_deg is obtuse).
kind: "face" or "edge". Two adjacent box faces -> angle_deg 90. Two opposite parallel box faces -> angle_deg 180, supplement_deg 0. Read-only: measures, creates no geometry.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | ||
| b | Yes | ||
| a_ref | Yes | ||
| b_ref | Yes |
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 several behavioral facts beyond the schema: read-only (creates no geometry), raises on mixed/non-planar/curved refs, and returns degree units with specific fields. It doesn't state permissions or whether it needs a document context, but covers failure modes well.
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 ref formats, then constraints and return semantics. It is longer than minimal but every section adds needed meaning given zero schema coverage. The return-value enumeration is somewhat verbose but justified without an 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 no annotations, no output schema, 0% schema coverage, and four required params, the description supplies operand formats, unit, return fields (angle_deg, supplement_deg, kind), constraint rules, and worked examples. Missing is explicit mention of document/active-context prerequisites and alternative angular tools, but otherwise complete for a measurement 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 fully. It does: defines a and b as object handles, a_ref and b_ref as required sub-shape references (one per handle), and enumerates accepted tag formats ('f_*', 'FaceN', 1-based int for faces; 'e_*', 'EdgeN', 1-based int for edges), plus the same-kind constraint. This is more than the empty 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?
States a specific verb (measure), resource (angle), and the exact operands (two planar faces or two straight edges) in the first sentence. This distinguishes it from measure_distance and min_clearance among siblings by naming the geometry type and the reference requirement.
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?
Implies usage through the operand constraints (must be same kind, faces planar, edges straight) and explains the face-vs-edge ref tag formats, which routes the agent to list_faces/query_faces/list_edges for refs. However, it doesn't explicitly say when to prefer this over measure_distance or bounding_box for angular questions, so it lacks a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_distanceA
Minimum distance between two entities, in mm. The workhorse measurement tool: lets a blind agent verify gaps, clearances, and contact.
Args:
a: handle of the first object.
b: handle of the second object.
a_ref: optional sub-shape selector on a to measure FROM instead of the
whole solid -- an f_* face tag, an e_* edge tag, or a literal
"FaceN"/"EdgeN" (1-based). Omit to use the whole shape.
b_ref: optional sub-shape selector on b (same forms as a_ref).
Measures the minimum (closest-approach) distance, so distance_mm = 0 means the two entities touch or interpenetrate. This does NOT report overlap volume -- use min_clearance / interference_check for penetration depth.
Returns a dict (no handle; this is a measurement): distance_mm: float -- minimum gap in mm (0.0 when touching/intersecting). point_on_a: [x, y, z] mm -- closest point on a (or its sub-shape). point_on_b: [x, y, z] mm -- closest point on b (or its sub-shape). touching: bool -- True when distance_mm < 1e-7.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | ||
| b | Yes | ||
| a_ref | No | ||
| b_ref | 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 it well: it defines the degenerate case (distance_mm = 0 means touch/interpenetrate), gives the exact touching threshold (1e-7), states the tool is non-mutating/no handle returned, and openly declares what it does not compute.
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 essential scope in the first sentence and organizes the rest into Args/Returns blocks with no wasted content. The docstring-style layout is slightly verbose for a 4-parameter tool, but every line 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?
Covers everything an agent needs despite no output schema and no annotations: argument forms, measurement semantics, edge cases, and a full returns breakdown (distance_mm, point_on_a, point_on_b, touching) so the caller knows exactly what comes back.
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 does: it defines a and b as object handles, and a_ref/b_ref as optional sub-shape selectors with concrete accepted forms (f_* face tag, e_* edge tag, literal 'FaceN'/'EdgeN', 1-based) plus the default 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?
States a precise verb+resource (minimum distance between two entities) with units (mm) and even names the quantity type (closest-approach vs overlap). It distinguishes itself from measurement siblings like min_clearance and interference_check within the same paragraph.
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 tells the agent when to use it ('verify gaps, clearances, and contact') and when not to ('This does NOT report overlap volume -- use min_clearance / interference_check for penetration depth'). The alternative tool is named with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mechanism_kinematicsA
Closed-form planar mechanism kinematics — exact, NO external solver (the static
pre-check / gate for mechanism_simulate_submit). Pick mechanism:
'fourbar': link lengths crank/coupler/rocker/ground -> {mobility_dof (=1), grashof: {condition, type, input_crank_fully_rotates, shortest}, reachable, n_reached, coupler_path [[x,y]...], reachable_bbox_mm}.
config'open'|'crossed'.'slider_crank': crank_mm/conrod_mm (+ wrist_offset_mm) -> {stroke_mm (exactly 2·R in-line, independent of conrod), x_tdc_mm, x_bdc_mm, inline_stroke_exact}.
'gruebler': n_links (incl. ground) + joints ([{type}...]) -> {mobility_dof}.
Returns the per-mechanism dict above. Raises on an unknown mechanism or a link set that cannot close.
| Name | Required | Description | Default |
|---|---|---|---|
| crank | No | ||
| config | No | open | |
| ground | No | ||
| joints | No | ||
| planar | No | ||
| rocker | No | ||
| coupler | No | ||
| n_links | No | ||
| n_steps | No | ||
| crank_mm | No | ||
| conrod_mm | No | ||
| mechanism | No | fourbar | |
| wrist_offset_mm | 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 that results are exact with NO external solver, that it raises on an unknown mechanism or a non-closing link set, and what it returns. It does not explicitly state that the call is side-effect-free/read-only, which would complete the picture.
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 key framing (exact, no solver, gate for the sibling), then organized into per-mechanism bullets. The output-dict enumeration is dense but justified since there is no output schema; minor redundancy in restating the return dict at the end.
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 tool with no annotations and no output schema, the description covers the three mechanism modes, their inputs, return shapes, and error behavior, which is substantial. The unaddressed `n_steps`/`planar` params and the absent read-only statement 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 largely does: it maps crank/coupler/rocker/ground to 'fourbar', crank_mm/conrod_mm/wrist_offset_mm to 'slider_crank', n_links/joints to 'gruebler', and documents `config` values. However, `n_steps` and `planar` are never explained, leaving two of thirteen parameters 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 ('closed-form planar mechanism kinematics') and explicitly positions itself relative to a sibling ('the static pre-check / gate for mechanism_simulate_submit'). An agent can distinguish it from mechanism_simulate_submit 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?
Clearly frames the tool as a gate/pre-check before mechanism_simulate_submit and tells the agent which `mechanism` value to pick for each analysis. It lacks explicit when-not-to-use guidance (e.g., when to skip straight to the simulate submit), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mechanism_simulate_submitA
Simulate a rigid-link mechanism's DYNAMICS with PyBullet, asynchronously (the
MBD family; requires the mbd extra — pip install 'ankusdrive[mbd]'). Use
mechanism_kinematics first for the exact closed-form gates (DOF, Grashof, stroke).
links is a tree: [{name, box_mm:[lx,ly,lz], mass_g, parent (link index, −1 =
fixed base), joint_type ('revolute'|'prismatic'|'fixed'), joint_axis:[x,y,z],
joint_at_mm:[x,y,z] (in the parent frame), com_mm:[x,y,z]}]. drivers:
[{link, rate_dps}] (revolute) or [{link, rate_mm_s}] (prismatic). Optional
obstacles ([{box_mm, at_mm}]) for through-motion contact, base, gravity
(m/s², default [0,0,−9.81]), dt_s, duration_s. gears
([{link_a, link_b, ratio, axis?, max_force?}]) couples two revolute links by
ω_b = −ω_a/ratio (ratio = Nb/Na for an Na/Nb external mesh) — the moving image of
the gear-train ratio gate.
Returns immediately. If PyBullet is absent: {ok:false, reason, install, mobility_dof, n_links}. Otherwise {job_id, status, cache_hit, mobility_dof}; poll job_result(job_id) for {trajectories, orientations (per-link world quaternion, sampled with trajectories), max_torques, collisions_through_motion (with the sim time of each contact), reachable_envelope {bbox_mm}, mobility_dof}.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | ||
| dt_s | No | ||
| gears | No | ||
| links | Yes | ||
| drivers | No | ||
| gravity | No | ||
| obstacles | No | ||
| duration_s | No | ||
| loop_closures | 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 the async submit-and-poll pattern ('Returns immediately', poll job_result(job_id)), the missing-dependency fallback shape ({ok:false, reason, install...}), and the install requirement. It omits failure/timeout modes and job lifecycle behavior, 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?
Information-dense and front-loaded with the purpose and routing before the parameter grammar. The long param enumeration is justified by the 0% schema coverage, though the run-on formatting makes it less scannable 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?
With no output schema and no annotations, the description correctly documents return values (job_id, status, cache_hit, mobility_dof) and the polled job_result payload fields. This is strong coverage for a complex async tool, with the loop_closures param and job-failure handling being the only notable omissions.
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 9 params, so the description must compensate and largely does, fully specifying the links tree fields, drivers formats for revolute/prismatic, obstacles, gears coupling formula, gravity default, and dt_s/duration_s. It leaves the loop_closures parameter entirely undocumented and 'base' only named without format, which are real gaps.
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 ('Simulate a rigid-link mechanism's DYNAMICS with PyBullet, asynchronously') and immediately scopes it to the MBD family. It explicitly distinguishes itself from the sibling mechanism_kinematics by noting this is the dynamics path while kinematics provides closed-form gates.
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 a clear directive: 'Use mechanism_kinematics first for the exact closed-form gates (DOF, Grashof, stroke)', naming the alternative tool and the condition that selects it. It does not spell out explicit when-not conditions or prerequisites beyond the extra-install requirement, so it falls just short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_assemblyA
Construct-up an assembly from a manifest JSON (the coordinator's one call): create the doc, link each component by file path, place it, recompute, and run the gates. Component files resolve relative to the manifest's directory; links auto-reload, so re-running picks up updated components (deterministic, idempotent).
manifest shape: { "name": "gearbox", "root": "gearbox.FCStd", "components": {"": {"file": "rel/part.FCStd", "object": ""?, "envelope": {"min":[...],"max":[...]}?}}, "instances": [{"component":"", "name":""?, "placement": [x,y,z] | {position,axis,angle_deg}, "mate": {"child_iface","parent","parent_iface", "verify_align":{"child_iface","parent_iface"}?}?}], "mates": [{"child","parent","child_iface","parent_iface", "verify_align":{...}?}]? }
Placement positions anchors; mate-by-frame positions everything else by aligning published interface frames (see publish_interface).
Any component carrying a PERFORMANCE contract (declare_performance, #226) is gated on it too, with no manifest opt-in: the merge consults the verdict verify_performance last RECORDED on that part and never measures, so it stays synchronous and deterministic. A requirement measured as NOT met fails the merge; a requirement with no verdict yet is neither passed nor failed and rides in report["performance"]["skipped"] — "unverified" is never read as "fine".
Returns {assembly, doc, root, placed, gates:{interference, bom, envelope,
interface_align?, typed?, requirements?, mobility?, performance?}, ok,
requirements?, mobility?, performance?, children?, library?}. The performance
gate and report block are absent entirely when no component declares a contract.
| Name | Required | Description | Default |
|---|---|---|---|
| manifest | Yes |
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 delivers: idempotency and determinism ('links auto-reload, so re-running picks up updated components'), synchronous gating semantics (verdict consulted, never measured), and the precise failure rule ('A requirement measured as NOT met fails the merge; no verdict is neither passed nor failed'). It also discloses the absence behavior of the performance gate/report block.
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 manifest shape, then gating semantics and the return object in a logical order. Dense but every block earns its place; only minor markdown pressure from the nested manifest pseudo-schema 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 single-parameter coordinator with no output schema and no annotations, the description supplies the manifest contract, precondition dependencies, failure/skip semantics, idempotency guarantee, and the full return shape. An agent could invoke this correctly without reading any other source.
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 schema declares only an opaque string manifest, so the description must compensate — and it does with a full manifest shape including components, instances, placement forms (array vs position/axis/angle_deg), mate/verify_align, and resolution rules ('files resolve relative to the manifest's directory'). This is stronger than most schemas would 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 opens with a specific verb-and-resource statement ('Construct-up an assembly from a manifest JSON') and immediately scopes it as 'the coordinator's one call', which distinguishes it from sibling primitives like add_part, make_assembly, and interference_check. An agent can tell exactly what this tool owns 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 names related tools for preconditions (publish_interface, declare_performance, verify_performance) and clarifies that mates populate placement rather than requiring explicit positions. It doesn't explicitly say when not to use it versus make_assembly or validate_manifest, so no full exclusion guidance, but the coordinator framing is strong context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
min_clearanceA
Closest approach between two solids — the measured gap, richer than the
binary interference_check. a and b are object handles. All lengths mm,
volumes mm³.
Returns a dict:
status: "clear" (a positive gap separates them),
"contact" (faces/edges touch, gap ~ 0), or
"interference" (the solids interpenetrate / share material).
clearance_mm: minimum distance between the two solids (mm). 0.0 when they
are touching or interfering.
overlap_volume_mm3: volume of interpenetration (mm³). Present ONLY when
status == "interference".
point_on_a: [x,y,z] of the closest point on a. Present when status is
"clear" or "contact" (omitted for "interference").
point_on_b: [x,y,z] of the closest point on b. Present when status is
"clear" or "contact" (omitted for "interference").
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | ||
| b | Yes |
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 thoroughly discloses the return statuses, optional fields, units, and output structure, though it does not explicitly state that the operation is read-only or side-effect free.
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 return-value detail is justified because no output schema exists. Each sentence earns its place by clarifying scope, units, or conditional field presence.
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 output schema, and 0% schema description coverage, the description is nearly complete: it explains parameters, units, statuses, and returned fields. Minor gaps remain around read-only behavior and how object handles are obtained.
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%, with only generic titles A and B. The description compensates by explaining that `a` and `b` are object handles, which is the key semantic missing from the schema, though it does not describe accepted handle syntax.
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 measurement operation on two solids and explicitly contrasts it with the sibling interference_check. An agent can distinguish this tool from the binary interference checker 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?
Names the relevant alternative (interference_check) and indicates this tool is richer for measured gaps. It lacks an explicit when-not statement, but the comparative framing gives clear selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mirroredB
Mirror a PartDesign feature across a plane.
plane: 'XY'|'XZ'|'YZ' for body origin planes, a datum-plane handle string, or {handle, face: tag|'FaceN'} for a face-defined mirror plane.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Mirrored | |
| plane | No | YZ | |
| feature | Yes |
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 of behavioral disclosure. It says what mirroring does but does not disclose whether it creates an associative feature, mutates the body, requires active-body context, or what happens if the plane or feature is invalid.
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 plane syntax is given immediately after without filler. The description is appropriately sized for a CAD feature operation with one complex parameter.
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-like PartDesign operation with no annotations and no output schema, the description covers the core action and the most complex parameter but omits prerequisites and behavioral consequences. It is minimally adequate for invocation, but not complete for an agent that must know when and how safely to apply it.
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 substantial meaning for the complex 'plane' parameter by documenting origin planes, datum-plane handles, and face-defined mirror planes, but it leaves the required 'feature' parameter and the optional 'name' parameter largely 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?
The description states a specific verb and resource: 'Mirror a PartDesign feature across a plane.' It clearly separates the tool from adjacent transformations such as linear_pattern, polar_pattern, and generic transform by naming mirroring and the PartDesign feature 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?
No guidance is given about when to use this tool versus alternatives like linear_pattern or polar_pattern. It also does not state prerequisites such as requiring an active PartDesign body or selecting an existing feature before mirroring.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moldability_checkA
Geometry-aware moldability DFx screen — resolves the model handle's
solid, samples local wall thickness per face via inward chords (the same
machinery as optics_moldability_check), then grades it through the pure-Python
moldability screen: WALL-THICKNESS QUALITY (recommended-band range /
uniformity / sink risk, cooling tied to the thickest wall) + the CTE
SHRINKAGE estimate for the resin. Low-fidelity gate — escalate_to=
'molding_fill_submit'.
material drives the recommended-wall band, the CTE shrinkage, and cooling
(degrades gracefully when the corpus lacks the issue #106 fields).
nominal_mm anchors the range check (else the sampled-wall mean). The same
shrinkage/thickness overrides as moldability_screen apply.
Returns the moldability_screen verdict {thickness:{…}, shrinkage:{…}, pass, score, fidelity, band_pct, warnings, escalate_to} plus {n_faces, n_wall_samples}.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| material | No | ||
| fail_ratio | No | ||
| nominal_mm | No | ||
| warn_ratio | No | ||
| alpha_per_k | No | ||
| sink_factor | No | ||
| t_ambient_c | No | ||
| t_solidify_c | 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 so richly: it explains inward-chord wall sampling, the pure-Python grading process, material-driven band/shrinkage/cooling behavior, graceful degradation when corpus fields are missing, nominal_mm fallback logic, and the exact return shape plus escalation 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 description is dense but front-loaded and largely free of filler, with each clause adding technical substance. A few parenthetical and run-on constructions make it harder to scan than necessary, but the content is purposeful.
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 9-parameter tool with no annotations, no output schema, and no schema descriptions, the description explains the process, return values, and escalation path well. However, six parameter semantics remain undocumented, so an agent lacks enough information to tune the screen confidently beyond defaults.
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 description only directly explains model, material, and nominal_mm. It vaguely points to 'the same shrinkage/thickness overrides as moldability_screen' but does not define fail_ratio, warn_ratio, sink_factor, alpha_per_k, t_ambient_c, or t_solidify_c, leaving most of the 9 parameters 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 description identifies a specific verb and resource: a geometry-aware moldability DFx screen that resolves a model solid, samples wall thickness, and grades thickness quality plus CTE shrinkage. It distinguishes itself from siblings by naming the low-fidelity gate, the escalation target molding_fill_submit, and the shared machinery with optics_moldability_check.
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 that this is a low-fidelity gate and says escalate_to='molding_fill_submit', giving clear context for when to use it versus a higher-fidelity molding fill analysis. It also references moldability_screen and optics_moldability_check, though it does not lay out explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moldability_screenA
Moldability DFx screen (NO solver, NO geometry) — fast analytic gate combining two checks molders reason about first: (1) WALL-THICKNESS QUALITY — is the nominal wall in the resin's recommended moldable band, and is the section uniform enough (uniformity_ratio = t_max/t_min; warn >2, fail >3) to avoid sink/warp; thick-lobe samples (> sink_factor·nominal, k≈1.5) flagged; cooling tied to the thickest wall (t ∝ s²). (2) SHRINKAGE — first-order from the resin CTE: S_linear = alpha·ΔT, S_vol ≈ 3·S_linear, cavity_scale_factor = 1/(1−S_linear); semicrystalline resins (PP/PE/PA/POM/PLA/HDPE/LDPE) flag model_underpredicts and carry a published_shrinkage_pct.
Pass wall_samples (local wall thicknesses, mm) and/or nominal_mm, plus
material. Degrades gracefully when the corpus lacks the (issue #106)
recommended-wall / mold-shrinkage / crystallinity fields. Low-fidelity gate:
escalate_to='molding_fill_submit'.
Returns {thickness:{…}, shrinkage:{…}, material, pass, score, fidelity, band_pct, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| material | No | ||
| fail_ratio | No | ||
| nominal_mm | No | ||
| warn_ratio | No | ||
| alpha_per_k | No | ||
| sink_factor | No | ||
| t_ambient_c | No | ||
| t_solidify_c | No | ||
| wall_samples | 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 richly: it discloses no-solver/no-geometry limits, the analytic logics (uniformity_ratio thresholds warn>2/fail>3, sink lobe detection, t∝s² cooling, S_linear=alpha·ΔT, cavity_scale_factor), graceful degradation when corpus fields are missing, and the full return shape. This is unusually complete behavioral disclosure for a mutation-free analytic 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-loads the tool's identity and scope, then uses numbered checks and a return-key list, so structure is strong. It is dense and jargon-heavy but nearly every clause conveys the analytic behavior; the enumeration could be slightly 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 9-parameter analytic tool with no output schema and no annotations, the description covers purpose, mechanics, return keys and escalation well enough to call it correctly. The main omission is the meaning of the three unexplained thermal/shrinkage override parameters.
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 9 params, so the description must compensate. It explains material, wall_samples and nominal_mm, and indirectly encodes warn_ratio/fail_ratio and sink_factor via their default values, but alpha_per_k, t_ambient_c and t_solidify_c go entirely unexplained, leaving a meaningful 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 ('Moldability DFx screen') and scopes it precisely with 'NO solver, NO geometry — fast analytic gate', which clearly distinguishes it from solver-based siblings like molding_fill_submit, molding_screen and moldability_check. The two named checks (wall-thickness quality, shrinkage) define exactly what it computes.
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 use and names the escalation path ('Low-fidelity gate: escalate_to=molding_fill_submit'), plus the input condition ('Pass wall_samples and/or nominal_mm, plus material'). It does not explicitly state when NOT to use it or contrast against the very similar moldability_check sibling, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
molding_fill_submitA
Injection-molding FILL (+ optional PACK/COOL) solve, asynchronous — the higher-
fidelity twin
molding_screen escalates to. Answers can this geometry actually be molded:
short-shot / fill ability (the strongest, most reliable gate), fill time, and a
peak injection-pressure proxy — a real two-phase (melt + air) flow solve, not the
spiral-flow correlation. Requires an OpenFOAM binary; when none resolves this
returns {ok:false, reason, install} rather than raising.
Backend: when the openInjMoldSim binary resolves (GPL-3.0, a modified
compressibleInterFoam on OpenFOAM-7 .org — Cross-WLF + 2-domain Tait), the worker
generates and runs an OF7-org case from the params below (or runs a prepared
case_dir if given) — a pressure-driven, non-isothermal plaque fill with the
Cross-WLF/Tait coefficients pulled from the materials corpus for resin. Where
that build is absent it falls back to a 2-D plaque-cavity interFoam VOF case on
the existing OpenFOAM (.com/ESI) — same physics family, answers fill/short-shot but
not packing. The GPL solver is held at the subprocess boundary (never imported).
openInjMoldSim (OF7) params: resin (corpus key, default "PS"), length_mm,
wall_thickness_mm (gap), depth_mm, nx/ny, peak_pressure_mpa (gate ramp,
default 2), melt_temp_c (220), mold_temp_c (60), wall_h_w_m2k (wall heat-
transfer coeff; default ~adiabatic for a clean fill — raise for freeze-off),
fill_end (terminate fraction, default 0.98). Pass application to force the
interFoam-prepared path.
Packing/cooling (openInjMoldSim only): set stages="fill_pack" to also run the
cooling continuation after fill (seal the gate, switch walls to cooling, hold). Knobs:
pack_phases (default 2), cool_window_s (cooling duration; default a few× the fill
time — note a 1 mm wall cools in ~seconds, so a short window gives partial cooling),
eject_temp_c (for cooling-time; default 80), pack_wall_h_w_m2k (cool-side wall
coeff; default 1250). The pack result adds pack:{rho_mean_final, rho_min, volumetric_shrinkage_pct, frozen_fraction, cooling_time_s, residual_pressure_pa} and
pack_gate:{pass (on sink risk), score, volumetric_shrinkage_pct, expected_densification_pct (Tait-EOS), pvt_faithful, sink_risk, warnings}.
Net mold shrinkage (the cavity-sizing number; issue #116) — distinct from
pack_gate's raw-PVT densification. The fill_pack result also models the packing-feed
make-up (melt fed at the hold pressure until the gate freezes at the Tait no-flow
transition; only the uncompensated post-gate-freeze densification is net shrinkage)
and gates it against the resin's published linear band. hold_pressure_pa (effective
cavity packing pressure; default = the ramp peak), room_temp_c (free-part relax
temperature; default 23). Adds net_shrinkage:{net_linear_pct, net_vol_pct, raw_vol_pct, compensated_vol_pct, gate_freeze_temp_k} and shrinkage_gate:{pass (in corpus band), score, net_linear_pct, corpus_band_pct, in_band, warnings}. Plus
cooling_dT_through_k — the antisymmetric through-thickness differential auto-derived
from the cooling field, ready to flow straight into molding_warpage_submit (pass it,
or pass this result's case_dir+nx/ny as cooling_case_dir etc.).
Asymmetric per-wall cooling (#134): set pack_wall_h_low_w_m2k and
pack_wall_h_high_w_m2k (the y=0 and y=H mold-face heat-transfer coeffs) to DIFFERENT
values to model an asymmetric cool — the case is meshed with split wallLow/wallHigh
patches and each face cools at its own rate, freezing a real through-thickness bending
differential. This is what makes the live cooling_dT_through_k nonzero (a symmetric
cool correctly gives ≈0 → no warp). The part bows toward the slower-cooled (lower-h,
hotter, last-to-freeze) face; the result adds asymmetric_cooling:{pack_wall_h_low_w_m2k, pack_wall_h_high_w_m2k, warps_toward}. Leave both unset (or equal) for the default
symmetric cool. Feed the resulting case_dir into molding_warpage_submit to predict
the warp magnitude.
Drive the interFoam path with cavity + process params:
length_mm(flow length, default 100),wall_thickness_mm(cavity height, default 2),depth_mm(out-of-plane, default 1), meshnx/ny.inject_velocity_m_sORflow_rate_cm3_s(+ optionalgate_height_mmfor the gate area) — the melt mean inlet speed.melt rheology:
melt_rho_kg_m3(default 900),melt_nu_m2_s(kinematic, default 1e-3) for Newtonian, or acarreau{nu0,nuInf,k,n} BirdCarreau dict (the shear-thinning Cross-WLF stand-in).end_time_s(run bound; default ≈4× the plug-flow fill time),machine_max_pressure_pa(press limit, default 180 MPa),fill_fraction_pass(full-fill threshold, default 0.97). Or pass a preparedcase_dirto run the resolved solver directly.
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result. interFoam result: {ok, returncode, backend, case_dir, expected_fill_time_s, flow_length_ratio, fill:{filled_fraction, filled_cell_fraction, front_x_frac, last_to_fill_x_frac, max_pressure_pa}, gate:{pass, score, fidelity:"solve", band_pct, short_shot, fill_time_s, max_pressure_pa, pressure_ok, warnings}}.
| Name | Required | Description | Default |
|---|---|---|---|
| nx | No | ||
| ny | No | ||
| resin | No | ||
| stages | No | ||
| carreau | No | ||
| case_dir | No | ||
| depth_mm | No | ||
| fill_end | No | ||
| length_mm | No | ||
| end_time_s | No | ||
| application | No | ||
| melt_temp_c | No | ||
| mold_temp_c | No | ||
| pack_phases | No | ||
| room_temp_c | No | ||
| eject_temp_c | No | ||
| melt_nu_m2_s | No | ||
| wall_h_w_m2k | No | ||
| cool_window_s | No | ||
| gate_height_mm | No | ||
| melt_rho_kg_m3 | No | ||
| flow_rate_cm3_s | No | ||
| hold_pressure_pa | No | ||
| pack_wall_h_w_m2k | No | ||
| peak_pressure_mpa | No | ||
| wall_thickness_mm | No | ||
| fill_fraction_pass | No | ||
| inject_velocity_m_s | No | ||
| pack_wall_h_low_w_m2k | No | ||
| pack_wall_h_high_w_m2k | No | ||
| machine_max_pressure_pa | 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: it discloses the OpenFOAM binary dependency, the non-raising failure contract ({ok:false, reason, install}), the async contract ({job_id, status, cache_hit} plus poll `job_result`), the two backend physics tiers and their divergence (OF7-org compressibleInterFoam vs ESI interFoam), and the GPL subprocess isolation. This is far more than the structured fields convey.
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 before any parameter detail, and each section (backend, packing, net shrinkage, asymmetric cooling, interFoam drive, returns) is scoped. It is long and heavily bolded, but with 31 parameters and two solver backends the density is largely earned; some register text is 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 31-parameter async solver with no output schema and no annotations, the description supplies prerequisites, failure modes, stage semantics, the full returned dict shapes (fill/gate/pack/pack_gate/net_shrinkage/shrinkage_gate) and the handoff keys to the next tool. 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 coverage is 0% (titles only), so the description must compensate for all 31 parameters — and it does, giving defaults and physical meaning for nearly every one (e.g. `wall_h_w_m2k` 'default ~adiabatic for a clean fill — raise for freeze-off', `hold_pressure_pa` ties to the ramp peak, the `pack_wall_h_low/high` pair explains the asymmetric-cooling semantics). It also clarifies mutually exclusive drivers (`inject_velocity_m_s` OR `flow_rate_cm3_s`) and the `carreau` dict shape.
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 (injection-molding FILL solve, asynchronous) plus the exact question it answers (can this geometry be molded, short-shot/fill ability, fill time, peak pressure proxy). It explicitly distinguishes itself from `molding_screen` as the 'higher-fidelity twin' it escalates to, so an agent can separate the two 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?
Names the alternative (`molding_screen` for the lower-fidelity screen), the downstream consumer (`molding_warpage_submit`, fed by `cooling_dT_through_k` or `case_dir`), and the switch that forces a path (`application`). It also states the fallback condition (openInjMoldSim absent → interFoam) and what each stage adds, so route selection is explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
molding_screenA
Injection-molding screen (NO solver): one-term cooling time (exact given α,
t_cool = s²/(π²α)·ln(8·(T_melt−T_mold)/(π²·(T_eject−T_mold))) — the t ∝ s²
design lever) + the spiral-flow fill check (fill_ok when flow_length ≤
(L/t-limit)·wall — chart correlation, ±30 %). material picks per-polymer
defaults (ABS | PP | PC | PA66 | POM | HDPE | PS), each individually
overridable; with all temps + alpha_mm2_s explicit no material is needed.
A cooling-only call returns fidelity='exact'; adding flow_length_mm makes the
headline answer fidelity='correlation', band_pct=30 (cooling stays exact).
When a flow_length_mm is given the headline check is a chart correlation, so
escalate_to='molding_fill_submit' (the openInjMoldSim VOF fill solve, #105);
a cooling-only call needs no solver and returns escalate_to=None.
Returns {material, wall_thickness_mm, t_melt_c, t_mold_c, t_eject_c, alpha_mm2_s, cooling_time_s, flow_length_mm, flow_ratio, flow_ratio_limit, fill_ok, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| material | No | ||
| t_melt_c | No | ||
| t_mold_c | No | ||
| t_eject_c | No | ||
| alpha_mm2_s | No | ||
| flow_length_mm | No | ||
| flow_ratio_limit | No | ||
| wall_thickness_mm | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden and does it well: it states fidelity='exact' for cooling-only vs fidelity='correlation' with band_pct=30 (±30%) once flow_length_mm is added, lists the validation/return fields (valid_range_ok, warnings, flow_ratio_limit), and names the escalation target. Minor gap: no permissions/rate/precondition notes, but for a stateless calculator the accuracy/limitation disclosure is the material 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?
Purpose and the key design formula (t ∝ s²) are front-loaded, and nearly every clause conveys operative information such as fidelity switching and escalation. It is dense and leans on an inline equation and a long return-field list, which slightly hurts scannability 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?
With no output schema and no annotations, the description compensates by listing the returned fields and the fidelity/band semantics, which is exactly what an agent needs to interpret results. Combined with the escalation rule and the material/parameter rules, it is complete enough to invoke and interpret correctly, missing only explicit range/limit values.
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 8 params, so the description must compensate and largely does: it explains that material selects per-polymer defaults (ABS|PP|PC|PA66|POM|HDPE|PS) and is individually overridable, that all temps plus alpha_mm2_s make material unnecessary, and that flow_length_mm triggers the fill check. It leaves some params (t_melt/t_mold/t_eject relationships, flow_ratio_limit) implicit, so not full 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 names a specific verb+resource ('Injection-molding screen, NO solver') and enumerates exactly what it computes: one-term cooling time plus a spiral-flow fill check. It tells the agent how it differs from the sibling it would otherwise escalate to ('molding_fill_submit' for the VOF fill solve), so the tool is distinguishable 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 explicit when-to-use branching: a cooling-only call is sufficient and needs no solver (escalate_to=None), whereas supplying flow_length_mm makes the headline a correlation and routes to molding_fill_submit. That is clear context and an alternative, though it never contrasts with near-neighbor siblings like moldability_screen/moldability_check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
molding_warpage_submitA
Injection-molding WARPAGE / residual distortion, asynchronous — the FEM
thermo-elastic post-step of the cooling solve (GitHub issue #113 Part B; the
higher-fidelity twin of the #104 CTE shrinkage screen). Answers will the part bow
out of flat once it cools and is ejected. Requires the ccx (CalculiX) binary;
when none resolves this returns {ok:false, reason, install} rather than raising.
The physics: a moulding shrinks as it cools (CTE); uniform shrinkage just makes
it smaller, but differential shrinkage warps it. The dominant driver is the
asymmetric frozen-in through-thickness temperature field at ejection (an unbalanced
cooling layout, one mould half hotter, a rib on one face). Pass that as
dT_through_k (K, the through-thickness differential: T at the thin-face minimum
minus the maximum). The worker meshes body, imposes the field as a thermal
eigenstrain, pins a statically-determinate 3-2-1 constraint, and solves the free
linear-elastic distortion in ccx. A balanced field (dT_through_k≈0) warps ~0; an
asymmetric one bows to the analytic plate curvature (κ=α·ΔT/h), directionally
correct.
Backend: CalculiX (ccx), driven by a deck the worker writes directly (the GPL
solver is held at the subprocess boundary, never imported). Units mm / MPa / 1/K /
°C, so warp comes back in mm.
Coupled cooling hand-off (issue #116): instead of hand-passing dT_through_k,
pass cooling_case_dir (a molding_fill_submit(stages="fill_pack") result's
case_dir) with cooling_nx/cooling_ny (the cooling case mesh; defaults 60/8) and
optional cooling_nz/cooling_time — the worker reads that cooling solve's cell-
centre temperature field and auto-derives the antisymmetric (bending) through-
thickness differential. The result reports dT_through_k and dT_source.
Params: body (a shape handle — the part), and either dT_through_k or
cooling_case_dir (one is required). Material
elastic props from material (corpus card) or explicit youngs_mpa/poisson/
cte_per_k — solidified-resin defaults are used with a warning otherwise (the
corpus rheology cards don't carry structural props). ref_temp_c is the stress-
free / solidification temperature (warp is invariant to it — it only scales the
reported residual stress). char_length_mm sets the mesh size; thickness_axis
('x'|'y'|'z') overrides the auto-detected through-thickness axis; flatness_tol_mm
or flatness_tol_frac (default 0.2 % of span) set the gate tolerance.
Fidelity caveat: a one-way, linear-elastic, loose coupling — it ignores
viscoelastic stress relaxation, flow-induced anisotropy, and the packing-pressure
residual; it captures the dominant differential-shrinkage warp and its direction,
not a calibrated absolute. fidelity="solve" with a conservative band_pct; read
the band.
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, returncode, solver, case_dir, nodes, tets, warp_axis, span_mm, thickness_mm, dT_through_k, dT_source, analytic_bow_mm, gate} where gate is {pass (on flatness), score, fidelity:"solve", band_pct, max_warp_mm, flatness_tol_mm, warp_per_span, max_disp_mm, warp_faithful, analytic_bow_mm, warnings}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| poisson | No | ||
| material | No | ||
| cte_per_k | No | ||
| cooling_nx | No | ||
| cooling_ny | No | ||
| cooling_nz | No | ||
| ref_temp_c | No | ||
| youngs_mpa | No | ||
| cooling_time | No | ||
| dT_through_k | No | ||
| char_length_mm | No | ||
| thickness_axis | No | ||
| flatness_tol_mm | No | ||
| cooling_case_dir | No | ||
| flatness_tol_frac | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does so well: asynchronous return shape, ccx requirement, graceful {ok:false,reason,install} on missing solver, GPL boundary, unit system, and a candid fidelity caveat. It does not state permission/auth needs or caching behavior, but covers the meaningful behavioral traits.
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 genuinely needed given 16 undocumented params, but the prose is dense and discursive with bold markup, parenthetical asides, and long compound sentences, so it is not tightly front-loaded. It earns its length but not its 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?
Given high complexity (16 params, no schema docs, no annotations, no output schema), the description covers inputs, physics rationale, solver backend, degradation path, and the full return/gate structure an agent needs to interpret results. 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 it does: it explains body, the either/or of dT_through_k vs cooling_case_dir with cooling_nx/ny/nz/time defaults, material vs explicit youngs_mpa/poisson/cte_per_k with default warnings, ref_temp_c semantics, thickness_axis override, and flatness_tol_mm/frac defaults. This is richer than 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+resource (submits an injection-molding warpage / residual-distortion FEM post-step) and explicitly situates it against siblings (#113 Part B, the higher-fidelity twin of the #104 CTE shrinkage screen) and the companion molding_fill_submit tool. An agent can distinguish this from a generic FEM or a screen 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?
Gives explicit when-to-use conditions ('will the part bow out of flat once it cools and is ejected'), the required alternative inputs (either dT_through_k or cooling_case_dir), the coupled-cooling hand-off path from molding_fill_submit, and a fidelity caveat describing when the answer is not trustworthy. This is unusually complete routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monopole_sphereA
Exact pulsating (monopole) sphere radiated power + far-field pressure (NO
solver) — the closed-form twin the Bempp exterior-acoustics BEM radiation solve
(acoustic_radiation_submit) is gated against. A sphere of radius a_m
vibrating with uniform surface normal velocity u_amp at freq_hz radiates
W = (ρc/2)|U|²(4πa²)(ka)²/(1+(ka)²) and, at range r_m, |p(r)| =
ρc|U|·ka/√(1+(ka)²)·(a/r) — both EXACT. The radiation efficiency
σ=(ka)²/(1+(ka)²) → 0 (poor sub-wavelength radiator) as ka→0 and → 1 as ka→∞.
rho/c default to air at 20 °C. A BEM Neumann (velocity) solve must reproduce
W and |p(r)|.
Returns {a_m, freq_hz, k_per_m, ka, u_amp, rho, c, radiation_efficiency, radiated_power_w, surface_pressure_abs, r_m, farfield_pressure_abs, farfield_pressure_x_r, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| c | No | ||
| a_m | Yes | ||
| r_m | No | ||
| rho | No | ||
| u_amp | No | ||
| freq_hz | Yes |
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 tool is exact, solver-free, gives the closed-form formulas, notes that rho/c default to air at 20 °C, and describes the expected BEM reproduction relationship. For a pure analytical calculation, this is unusually 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 purpose is front-loaded, and the formulas, efficiency asymptotics, defaults, and return fields all earn their place. Since there is no output schema, listing the returned fields is necessary rather than 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?
The description is highly informative for a six-parameter analytical tool with no annotations or output schema. It still leaves some details implicit, such as units, the behavior when `r_m` is omitted, and the meaning of return fields like `fidelity`, `band_pct`, and `escalate_to`.
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 the six parameters. It gives physical meaning for `a_m`, `u_amp`, `freq_hz`, and `r_m`, and notes that `rho`/`c` default to air at 20 °C. It does not fully explain the optional `r_m` null behavior or state units explicitly, leaving a gap despite good overall 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?
States a specific computation: exact monopole-sphere radiated power and far-field pressure without a solver. It explicitly positions itself as the closed-form twin that `acoustic_radiation_submit` is gated against, so an agent can distinguish it from the BEM sibling.
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 names the BEM alternative and says this tool is the closed-form reference against which that solve is gated, which gives clear usage context. It does not explicitly state when not to use this tool or give a direct 'use this instead of X when Y' rule, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_documentB
Create a new FreeCAD document and make it active. Returns {doc: }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | part |
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 two useful behaviors: that the new document is made active (a state mutation affecting other tools) and the return shape {doc: <name>}. It omits collision behavior, required permissions, or any rate/limits 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?
Two compact sentences, no filler, with the creation action and its side effect front-loaded ahead of the return 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?
Adequate for a trivial create tool with no output schema: action, side effect, and return shape are all present. However, nothing is said about the name parameter or what happens when a document with that name already exists, which an agent 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 coverage is 0% and the single parameter name is never mentioned. The return hint '{doc: <name>}' weakly implies the parameter becomes the document name, but its purpose, default ('part'), and format constraints are left entirely to the caller.
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 ('Create a new FreeCAD document') plus an immediate side effect ('make it active'). The word 'new' implicitly distinguishes it from the sibling open_document, but no sibling is named explicitly, 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?
No when-to-use guidance, no prerequisites, and no mention of alternatives like open_document or set_active_document. The intended usage (starting a fresh model) is only weakly implied by the verb 'Create'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_documentA
Open an existing .FCStd file, make it active. Returns doc name and object list.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It usefully discloses the side effect ('make it active') and the return payload ('doc name and object list'), but omits what happens if the file is missing, already open, or the path is invalid, and says nothing about 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?
Two tight sentences with the core action and side effect front-loaded and the return value appended. No 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?
No annotations and no output schema, so the description must stand alone. It covers the action, the side effect, and the return shape, but leaves error/failure behavior and path conventions unspecified for a document-loading 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 coverage is 0%, so the description must carry parameter meaning; it adds the useful constraint that 'path' points to an .FCStd file, but says nothing about relative vs absolute paths or 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 ('Open') and resource ('an existing .FCStd file'), plus the side effect of making it active. A reader can distinguish it from new_document and close_document, though it doesn't explicitly name 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?
The word 'existing' loosely implies this is for files that already exist rather than new ones, but there is no explicit when-to-use guidance or mention of alternatives like set_active_document or new_document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optics_lens_designA
First-order + spot analysis of a SEQUENTIAL optical system with optiland
(MIT, in-process). Requires the optics extra; degrades to {ok:false, reason,
install} otherwise. For a single lens optiland is gated against the analytic
thick-lens oracle (oracle_dev_pct).
surfaces: list (object->image) of {radius, thickness, material, stop?} — exactly
one surface must set stop:true (the aperture stop). epd (entrance-pupil dia)
OR fno. wavelengths_um (first is primary, default [0.5876]). field_angles_deg
(default [0.0]). image_solve solves the last gap to paraxial focus.
Returns the degradation dict, or {ok, backend:'optiland', optiland_version, efl_mm, bfl_mm, fno, n_surfaces, rms_spot_um:[per field], oracle_efl_mm, oracle_dev_pct}.
| Name | Required | Description | Default |
|---|---|---|---|
| epd | No | ||
| fno | No | ||
| surfaces | Yes | ||
| want_spot | No | ||
| image_solve | No | ||
| wavelengths_um | No | ||
| field_angles_deg | 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 so well: it discloses the soft dependency and the graceful degradation to {ok:false, reason, install}, the single-lens oracle gating, and the constraint that exactly one surface must set stop:true. It omits things like expected units beyond what it lists or runtime/rate-limit characteristics, but the precondition and failure-mode coverage is strong for an unannotated 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?
Purpose and dependency warning are front-loaded, and the parameter notes are terse and information-dense. It is slightly dense with backtick-heavy notation but each sentence carries concrete information, so little is wasted.
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 usefully enumerates the return fields (degradation dict or {ok, backend, optiland_version, efl_mm, bfl_mm, fno, n_surfaces, rms_spot_um, oracle_efl_mm, oracle_dev_pct}). An agent has enough to call it correctly, with the only gap being the unexplained want_spot toggle.
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: it explains the surfaces structure (object->image with {radius, thickness, material, stop?}), the epd-OR-fno relationship, the primary-wavelength convention with default 0.5876, the field_angles_deg default, and the semantics of image_solve. It never explains want_spot, leaving one of seven parameters 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 analysis type (first-order + spot) applied to a specific resource (a SEQUENTIAL optical system via optiland), which distinguishes it from the raytrace and solid_trace siblings. It does not explicitly name or contrast with the closest siblings (optics_lens_optimize, optics_raytrace), leaving some differentiation 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?
The description gives a prerequisite ('Requires the `optics` extra') and a special gating case for single lenses, but never states when to choose this tool over optics_raytrace, optics_lens_optimize, or optics_solid_trace. Usage context 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.
optics_lens_optimizeA
Optimize a SEQUENTIAL optical system with optiland's optimizer (MIT,
in-process) — the capability rayoptics lacks. Requires the optics extra;
degrades to {ok:false, reason, install} otherwise.
surfaces: as in optics_lens_design. variables: [{type:'radius'|'thickness',
surface:<1-based int>}] — the degrees of freedom. targets: [{operand:'f2'|
'rms_spot_size'|…, target, weight?, surface?}] — the merit function. maxiter
caps iterations.
Returns the degradation dict, or {ok, backend:'optiland', converged, n_fev, before:{efl_mm,rss}, after:{efl_mm,rss}, surfaces:[optimized]}.
| Name | Required | Description | Default |
|---|---|---|---|
| epd | No | ||
| maxiter | No | ||
| targets | Yes | ||
| surfaces | Yes | ||
| variables | Yes | ||
| wavelengths_um | No | ||
| field_angles_deg | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and does well: it discloses the soft dependency ('Requires the optics extra; degrades to {ok:false, reason, install} otherwise') and the return shape including before/after metrics. It does not disclose convergence failure modes or rate/time behavior for the optimization loop.
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 capability and constraint, then structured parameter definitions. Slightly dense but each line earns its place; no 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 7-param optimization tool with no annotations and no output schema, the description covers the key parameters, the optional dependency behavior, and the return payload. It is nearly complete; missing only how surfaces/wavelengths/field_angles interact with optimization scope and any convergence/iteration caveats.
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 description compensates thoroughly, defining `variables` element structure ({type:'radius'|'thickness', surface:<1-based int>}), `targets` shape with operand enum examples, and `maxiter` semantics. This goes well beyond the bare property names 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?
Specific verb+resource: 'Optimize a SEQUENTIAL optical system with optiland's optimizer'. It distinguishes from siblings by naming optics_lens_design for the surface schema and explicitly notes the capability rayoptics lacks, separating it from optics_raytrace.
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?
Implies usage via reference to optics_lens_design for surfaces and by framing it as the sequential optimization path. However it does not explicitly state when to use this vs. optics_solid_trace or optics_raytrace, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optics_moldability_checkA
Moldability screen for a part against a single pull axis — geometric, no
solver. Resolves the model handle's solid, then per face computes the draft
relative to pull_axis from the outward normal (draft_deg = 90 − angle(normal,
pull); 0 = a wall parallel to the pull that needs draft) and ray-casts the face
centroid along ±pull: a face the straight pull frees in neither direction is a
re-entrant UNDERCUT (reported with negative draft). Inward chords give a wall-
thickness distribution. Scored through the same DfM machinery as dfm_check.
pull_axis: '+z'/'-x'/… or an [x,y,z] vector. process ('injection'|'cnc'|
'sheet'|'fdm') sets the default min wall; override with min_wall_mm.
Returns {process, pull_axis, n_faces, undercut_faces, draft_violations, min_wall_violations, wall_thickness_stats:{min_mm,mean_mm,max_mm,n}, score, pass}.
| Name | Required | Description | Default |
|---|---|---|---|
| model | Yes | ||
| process | No | injection | |
| pull_axis | No | +z | |
| min_wall_mm | No | ||
| min_draft_deg | 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 so: it discloses the underlying computation (per-face draft from outward normal, ray-cast along ±pull, inward chords for wall thickness), how an undercut is reported (negative draft), and that scoring reuses DfM machinery. It omits cost/limit behavior, but for a local read-only analysis this is unusually rich 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 one-line purpose, then detail; the dense math is justified because no output schema exists and the return-value enumeration is needed. It is long but each sentence carries technical content 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 5-parameter analysis tool with no output schema and no annotations, the description supplies the return object, the parameter formats, and the algorithm. Remaining gaps are min_draft_deg semantics and how score/pass thresholds are determined, plus no differentiation from the similarly named moldability 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 compensate and mostly does: it gives the pull_axis syntax ('+z'/'-x'/… or [x,y,z]), the process enum values ('injection'|'cnc'|'sheet'|'fdm') and that they set the default min wall, and the min_wall_mm override. Only min_draft_deg is left unexplained beyond its 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?
States a specific verb+resource: a moldability screen for a part against a single pull axis, explicitly geometric and solver-free, with a formula for draft and a definition of UNDERCUT. It relates itself to dfm_check ('same DfM machinery'), but never distinguishes itself from the near-identical siblings moldability_check and moldability_screen, so an agent cannot tell those 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?
The 'geometric, no solver' framing implies a fast screening use case, but there is no explicit when-to-use / when-not statement and no mention of moldability_check, moldability_screen, or dfm_check as alternatives to route between. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optics_raytraceA
Ray-trace a bundle through a dielectric optical model with rayoptics
(asynchronous-free; needs no FreeCAD geometry). Requires the rayoptics wheel
(the optics extra); when it does not resolve this returns {ok:false, reason,
install} rather than raising. The geometric refraction comes from rayoptics;
the Fresnel/TIR energy split + the exit histogram come from the exact
analysis/optics core, so the trace is gated against that oracle
(oracle_max_dev_deg = max rayoptics−Snell exit-angle deviation, ~0).
n_refractive is the medium index n2 (default PMMA 1.49062). source_config
is {kind:'collimated'(angle_deg)|'cone'(half_angle_deg)|'lambertian'
(max_angle_deg)} (default collimated at normal incidence). model may carry
{n1 (incident index, default air 1.0), absorption (0..1 bulk loss),
target_half_angle_deg (the acceptance cone counted as efficiency)}.
Returns the degradation dict, or {ok, backend:'rayoptics', rayoptics_version, n_rays, n1, n2, critical_angle_deg, efficiency, leakage_fraction, absorbed_fraction, tir_fraction, energy_balance, oracle_max_dev_deg, exit_distribution:[{angle_deg,intensity}], hotspot_locations}.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | ||
| n_rays | No | ||
| n_refractive | No | ||
| source_config | 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 the rayoptics wheel dependency, that failures return {ok:false, reason, install} instead of raising, and that results are gated against an exact oracle via oracle_max_dev_deg. It does not cover permissions, limits, or convergence caveats, 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?
Content is front-loaded (verb+resource first, then dependency behavior, then parameters and returns). It is dense and parenthetical-heavy but nearly every sentence carries distinct information, with 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?
For a 4-param tool with no output schema and no annotations, the description covers purpose, dependency/failure behavior, all defaulted parameters, and the returned dict fields (efficiency, tir_fraction, exit_distribution, hotspot_locations, etc.). Gaps are minor rather than blocking.
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: it defines n_refractive (n2, default PMMA 1.49062), enumerates source_config kinds with their fields, and lists model keys (n1 default air, absorption, target_half_angle_deg). n_rays is only inferable from the return-field list, leaving one parameter under-explained.
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 precise verb+resource: 'Ray-trace a bundle through a dielectric optical model with rayoptics'. It also implicitly differentiates itself from geometry-bound siblings like optics_solid_trace by noting it 'needs no FreeCAD geometry' and is 'asynchronous-free', so an agent can place it 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 conveys context ('needs no FreeCAD geometry', dependency on the optics extra, async-free), which implies when this is the right tool, but it never names an alternative or states an explicit when-not condition. Usage must be inferred rather than read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optics_solid_traceA
NON-SEQUENTIAL ray trace through a real solid (STL mesh) with a refractive
index — the lane for molded optical parts (light-pipes, prisms, lenses). Backed
by KrakenOS, which is GPL-3.0 and is run ONLY in a subprocess (the parent never
imports it — same arm's-length isolation as the GPL Elmer/OpenFOAM binaries).
Requires the optics_gpl extra; degrades to {ok:false, reason, install} otherwise.
Geometry: pass a model handle (exported to STL here) OR a ready stl_path.
Material: glass (KrakenOS catalog name, e.g. 'BK7') or n_refractive (constant
index). rays: [{origin:[x,y,z], dir:[l,m,n]}]; each ray's turn_deg is its
input->exit bend (~90 for a TIR corner prism, ~0 for a straight pass). solid:
{diameter, thickness, axis_move} placement. wavelength_um default 0.55.
want_paths (default False): also return each valid ray's polyline as
paths — the per-surface hit points [[x,y,z], ...] in the traced frame.
The LAST point of each path is the ray's EXIT LOCATION on the solid, so the
spatial exit/leakage map a diffuser needs can be reconstructed from it.
Returns the degradation dict, or {ok, backend:'KrakenOS (subprocess-isolated, GPL-3.0)', n_launched, n_valid, valid_fraction, mean_turn_deg, max_turn_deg, rays:[{valid, exit_dir, turn_deg}], stl_path, paths?:[[[x,y,z],...],...]}.
| Name | Required | Description | Default |
|---|---|---|---|
| rays | Yes | ||
| glass | No | ||
| model | No | ||
| solid | No | ||
| stl_path | No | ||
| want_paths | No | ||
| n_refractive | No | ||
| wavelength_um | 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 so thoroughly: non-sequential nature, KrakenOS backend, GPL-3.0 subprocess isolation, extra requirement, degradation dict on missing optional dependency, and the exact return structure. It also explains the meaning of turn_deg and the exit-location semantics of want_paths.
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 purpose and then organizes remaining detail under Geometry, Material, rays, solid, wavelength, and returns. The length is justified by the complex eight-parameter, no-schema-description call, and every sentence adds operational 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?
Given no annotations and no output schema, the description provides enough for correct invocation: it documents all parameters, the optional-dependency failure mode, and the full success return shape. An agent has the information needed to decide and 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?
Schema description coverage is 0%, so the description must compensate and it does. It defines the roles of model vs stl_path, glass vs n_refractive, the rays item format, solid placement shape, wavelength default, and want_paths/paths output 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: non-sequential ray trace through a real solid STL mesh with refractive index. The scope 'real solid (STL mesh)' clearly distinguishes it from a generic or sequential optics ray trace sibling such as optics_raytrace.
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 for use ('the lane for molded optical parts') and practical setup requirements (optics_gpl extra, degradation behavior, model vs stl_path). It does not explicitly name when to choose a sibling like optics_raytrace instead, so it stops short of full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
optimize_submitA
Vary parameters until the spec is met, then say whether it was PROVEN — the step that closes the design-to-spec loop.
Everything else in this family measures; this searches. Two things make it different from a generic minimizer, and both come from the performance-contract layer underneath it:
A constraint verdict has three states. indeterminate — the measurement's
uncertainty band straddles the limit — is NOT a failed step. An optimizer that reads
it as a failure walks away from good designs; one that reads it as a pass converges
on unproven ones. During the search an indeterminate constraint is scored on its
nominal value, so it neither attracts nor repels, and the winner is proved properly
at the end.
Convergence is not proof. A simplex can settle on a point that clears its limit
by 2 % while its own grid-convergence band is 5 % wide — noise with a favourable
sign. proven is therefore reported separately from converged, and is True only
when the final measurement has every constraint at pass and no margin swallowed by
its own band.
variables must be continuous and bounded — {"name": "diameter_mm", "min": 5, "max": 25, "start": 10}. An optimizer without a box walks to values that satisfy the
arithmetic and mean nothing physically.
objective and each constraints entry use the performance-requirement mapping
({tool, metric, conditions, limit, screen, band_pct}), with "$<variable>" in
conditions carrying the candidate's value. tier='auto' searches cheaply on each
block's screen estimator, then polishes on the real tool from where the screen
landed; 'screen' or 'solver' runs just that leg.
The search is a bounded Nelder-Mead — derivative-free because there is no adjoint
through a CFD solve — so every evaluation is a real measurement. budget
({max_evals, max_wall_s}, default 40 evaluations) is the ceiling; revisited points
are served from cache and do NOT count against it.
Shape optimization. Pass a recipe (+ fixed_inputs) and it is rebuilt for
every candidate, so the search varies GEOMETRY rather than only numbers —
"$handle" in a response's conditions is that candidate's part, and the returned
history carries the handle each point built. Pass handle instead to optimize
parameters against one fixed part; pass neither and the search is purely parametric.
Geometry-driven candidates are built on the MAIN thread through the worker's
work queue, because FreeCAD's document API is not thread-safe and this search runs
as a background job. That queue is drained once per incoming request, so a shape
search only advances while you are polling job_status/job_result — the poll
you must do anyway is what gives it its turn. Poll at your normal cadence and it
simply works; stop polling and it stalls rather than finishing in the background.
A candidate whose recipe fails to build is scored out as an infeasible point, not
an error. study_submit remains the right tool for a FIXED grid over recipe
geometry, which needs no queue at all.
Returns {job_id, status}; poll job_result for {ok, proven, stop_reason, best_params, best_value, objective: {name, metric, sense, value, band_pct}, constraints: [{name, state, measured, limit, band_pct, margin, margin_pct, detail, trust_reasons?}], phases: [{tier, n_evals, best_params, best_value, converged, reason}], history: [{i, tier, params, value, score, feasible, cached}], n_evals, n_cached, budget, variables, warnings}.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | auto | |
| budget | No | ||
| handle | No | ||
| recipe | No | ||
| objective | Yes | ||
| variables | Yes | ||
| constraints | No | ||
| fixed_inputs | No |
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 so richly: the three states of a constraint verdict and how 'indeterminate' is treated mid-search, why 'proven' is reported separately from 'converged', the bounded Nelder-Mead nature and derivative-free rationale, budget defaults and cache semantics, thread-safety/queue behavior, and that infeasible candidates are scored rather than raised as errors.
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 organized under bold headers, so it is skimmable. It is nonetheless long and somewhat prose-heavy for a tool description, though most sentences carry non-redundant operational detail, so the length is largely justified.
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 8-parameter submit tool with no output schema, the description explains the return payload structure (job_id/status, then the job_result fields) and the async polling workflow in detail. Nothing essential to correct invocation 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 largely does: it documents the `variables` shape ({name,min,max,start}) with an example, the `objective`/`constraints` requirement mapping ({tool, metric, conditions, limit, screen, band_pct}), the `$<variable>` and `$handle` substitution syntax, tier values, budget fields with the 40-eval default, and the recipe/handle/fixed_inputs 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 ('Vary parameters until the spec is met... this searches') and explicitly contrasts its role against the rest of the family ('Everything else in this family measures; this searches'). It also names the closest sibling, study_submit, and the exact condition that separates them (fixed grid vs. searching). An agent can route correctly 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?
Explicitly states when to use the alternatives: study_submit for a FIXED grid over recipe geometry, tier='screen'/'solver'/'auto' for legs of the search, and recipe vs handle vs neither for geometry-driven vs fixed-part vs purely parametric searches. It also documents the polling prerequisite for shape searches ('a shape search only advances while you are polling').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oring_grooveA
Compute a static O-ring gland (groove) and optionally cut it into a face.
This is the gland calc designers always fumble, plus an optional cut. Given the O-ring cross-section it returns standard static-seal gland dimensions; with cut=True it also machines the annular groove into a flat face.
cross_section: O-ring wire cross-section diameter in mm (e.g. 1.78, 2.62). Required, > 0. inner_diameter: groove inner diameter in mm (the O-ring's nominal seal ID). Required when cut=True; used to size the returned diameters either way. handle: host solid to cut into (required only when cut=True). face: the flat face to cut the groove into — a stable f_* tag (preferred), a 'FaceN' index string, or an int. Required when cut=True. Must be planar. gland_type: seal-geometry label, default 'static_radial' (informational). compound: optional elastomer + durometer the RING is ordered in ("NBR70", "FKM75", "EPDM70"). Changes no geometry; it completes the AS568 designation of the ring itself — the purchased part this groove exists to hold, which no BOM would otherwise contain because the ring is never a modelled object. cut: True (default) cuts the groove and returns a new solid; False makes this a pure calculator (no geometry, no handle). name: name for the resulting solid when cut=True.
Gland rule (static seal): groove_depth = cross_section0.75 (~25% squeeze, clamped to a 20-30% band), groove_width = cross_section1.30. The groove's inner diameter equals inner_diameter and it spans outward by groove_width.
Returns {groove_depth, groove_width, groove_inner_diameter,
groove_outer_diameter, squeeze_pct, cross_section, gland_type, oring} (all mm
except squeeze_pct in percent). When cut=True it ALSO returns {handle, name,
volume} for the grooved solid; the host input is hidden. mating numbers: cut a
groove of inner_diameter to seat an O-ring of that ID; groove_outer_diameter
sizes the radial space the groove occupies. oring is the RING's designation
card ("AS568-214 NBR70"), or ok=False naming the nearest tabulated sizes when
the gland is not an AS568 standard size — an off-table ring is a custom tooled
part, and saying so beats naming a dash number that will not seal.
oring_catalog is the ring's off-the-shelf verdict.
| Name | Required | Description | Default |
|---|---|---|---|
| cut | No | ||
| face | No | ||
| name | No | ORingGroove | |
| handle | No | ||
| compound | No | ||
| gland_type | No | static_radial | |
| cross_section | Yes | ||
| inner_diameter | 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 it discloses a lot: the gland rule formula and squeeze band, the exact return fields, that the host input is hidden after the cut, and the off-table error behavior (ok=False with nearest tabulated sizes) rather than a misleading dash number. It stops short of stating whether the cut is destructive/reversible or whether any permissions are needed, which keeps it from a 5 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 and well organized (first sentence states purpose, then per-parameter detail, then return shape), but it is long and contains flourishes that do not help invocation, notably the compound tangent about the ring being "the purchased part this groove exists to hold, which no BOM would otherwise contain because the ring is never a modelled object." Useful content, but some sentences do not 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?
Given 8 parameters at 0% schema coverage, no annotations, and no output schema, the description fills every gap an agent needs: input semantics, which fields are conditionally required, the return payload in both modes, and error/degenerate-case behavior. Nothing required 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 has to do all the work, and it does: it documents all eight parameters with units and constraints (cross_section > 0, inner_diameter required when cutting, face accepting f_* tags / FaceN strings / int-strings and requiring planarity). It even adds semantics not in the schema, e.g. that inner_diameter is used to size diameters even when not cutting, despite the schema default of 0.
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 ("Compute a static O-ring gland (groove)") and the optional side effect ("cut it into a face"), which immediately distinguishes it from generic modeling siblings like add_bearing or shell_solid. An agent can identify the domain (static seal gland) and both operating modes 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?
Clearly explains when the parameters are required ("Required when cut=True", "required only when cut=True") and contrasts the two modes: cut=True machines geometry vs cut=False being a "pure calculator (no geometry, no handle)". It does not, however, route the agent to an alternative such as seal_check for validation-only needs, so there is no explicit sibling exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pack_checkA
Check a part against a shipping carton + compute billable weight.
part_bbox_mm/carton_mm are [l,w,h] mm; fits allows reorientation (sorted-dim
compare). void_fraction = 1−vol(part)/vol(carton); dim_weight_kg =
vol(carton cm³)/dim_factor (default 5000 metric DIM); billable_weight_kg =
max(actual, dimensional). Returns {fits, void_fraction, dim_weight_kg,
actual_mass_kg, billable_weight_kg, pass}.
| Name | Required | Description | Default |
|---|---|---|---|
| mass_g | Yes | ||
| carton_mm | Yes | ||
| dim_factor | No | ||
| part_bbox_mm | Yes |
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 `fits` permits reorientation via sorted-dimension comparison, defines each computed quantity, notes the DIM factor default and the max() rule for billable weight. It omits error/failure behavior and the unit of mass_g, but the computational semantics are unusually well exposed.
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 purpose in the first clause, then packs tightly-worded parameter and formula definitions with no filler. The formula block is dense but each line adds information that is unavailable elsewhere given the absent 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 pure-computation tool with no output schema and 0% parameter coverage, the description supplies both the input conventions and the exact return shape ({fits, void_fraction, dim_weight_kg, actual_mass_kg, billable_weight_kg, pass}), which is exactly what's needed to call and interpret it. Only usage routing and mass units are 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 for three of four parameters: part_bbox_mm/carton_mm are declared as [l,w,h] in mm, and dim_factor is given a default of 5000 with 'metric DIM' semantics. Only mass_g's unit is left implicit (inferable from the returned actual_mass_kg).
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 pair: checking a part against a shipping carton and computing billable weight, which is distinct in scope from engineering siblings like fit_check or envelope_check. The 'shipping carton + billable weight' framing makes the logistics intent unmistakable, though it never explicitly names the sibling it complements or excludes.
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 computes but gives no when-to-use guidance, no prerequisites, and no routing against the many adjacent check tools (fit_check, envelope_check, interference_check). An agent must infer its applicability from the domain alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
padC
Pad a sketch by length mm. symmetric=True extrudes both directions.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Pad | |
| length | No | ||
| sketch | Yes | ||
| reversed | No | ||
| symmetric | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden but only adds the symmetric two-direction behavior. It does not say whether the sketch is consumed, whether it appends to or creates a solid, whether it requires a closed profile, or what permissions/state are needed for a 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?
Two short, front-loaded sentences with no filler; the primary operation is stated first and the behavioral note second. It is efficient, though slightly terse given the number of undocumented parameters.
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 5-parameter mutation tool with no annotations and no output schema needs substantially more disclosure than two sentences. Missing sketch-handling behavior, prerequisites, and coverage of three parameters leaves the agent under-informed.
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, yet it only clarifies length (unit mm) and symmetric (both directions). The name, sketch, and reversed parameters are left entirely undocumented, and 'reversed' direction semantics are never explained.
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 (Pad) and resource (sketch) plus the key dimension (length in mm), so an agent can tell this is an additive material operation versus siblings like pocket or revolve. It stops short of naming any alternative to differentiate 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?
There is no when-to-use guidance, no hint about prerequisrequisites (a closed sketch), and no comparison to pocket/revolve/loft, which are the obvious alternatives. The 'symmetric=True' sentence describes a parameter's effect, not a usage condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
partdesign_chamferA
PartDesign Chamfer on edges of a feature in a Body. edges accepts e_*
tags or 'EdgeN' index strings; size is the chamfer leg in mm (> 0).
Validated and rolled back on failure exactly like partdesign_fillet (issue #283), with the same per_edge / allow_partial opt-ins.
Returns {handle, name, volume (mm^3), edges (the 'EdgeN' names actually chamfered), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode, partial}; when partial is True, also skipped_edges and a warnings entry. On a failed check the feature is removed, the Body's Tip is restored, and BlendCheckFailed is raised naming the offending edges.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | PdChamfer | |
| size | No | ||
| edges | Yes | ||
| feature | Yes | ||
| per_edge | No | ||
| allow_partial | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden: it discloses validation and rollback on failure, the exact return structure (including checks, partial mode, and warnings), and the specific exception raised on failure (BlendCheckFailed naming offending edges). This is rich, actionable context beyond what any structured field provides.
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, then validation, then return details. It is dense but every sentence adds value given the lack of annotations and schema descriptions; slight trimming could improve readability without losing 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?
For a tool with no annotations and no output schema, the description is very complete: it details return values, error handling, and key parameter semantics. Some gaps remain (feature parameter description, exact effect of per_edge/allow_partial), but overall it gives an agent 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 coverage is 0%, so the description must compensate. It clearly explains `edges` (e_* tags or 'EdgeN' strings) and `size` (chamfer leg in mm > 0), and mentions `per_edge`/`allow_partial` as opt-ins, but it does not explain what those flags do, nor does it describe `feature` or `name`. Compensation is partial for the 6 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?
States a specific verb (Chamfer) and target (edges of a feature in a Body), and distinguishes itself from partdesign_fillet by referencing that sibling. However, it does not explicitly differentiate from the other chamfer tool, chamfer_edges, which appears in the sibling list.
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 the usage context (PartDesign feature within a Body, same workflow as partdesign_fillet), but gives no explicit when-to-use, when-not-to-use, or alternatives guidance (e.g., when to pick this over chamfer_edges).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
partdesign_filletA
PartDesign Fillet on edges of a feature in a Body. edges accepts e_*
tags or 'EdgeN' index strings; radius in mm (> 0).
Validated before a handle is issued, like fillet_edges (issue #283): Shape.isValid(), unchanged solid count, and no growth of the tight bounding box. PartDesign needs it as badly as the Part workbench — r=0.6 on a 40x40x1 pad returns an 'Up-to-date' single solid 15% LARGER than the pad.
per_edge: add the edges one at a time, validating after each. allow_partial: accept a partial result instead of aborting. Off by default.
Returns {handle, name, volume (mm^3), edges (the 'EdgeN' names actually filleted), checks {valid, solids, envelope_ok, envelope_growth_mm, envelope_tol_mm}, mode ('batch' | 'per_edge'), partial}; when partial is True, also skipped_edges and a warnings entry. On a failed check the feature is removed, the Body's Tip is restored, and BlendCheckFailed is raised naming the offending edges and the subset that does fillet cleanly.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | PdFillet | |
| edges | Yes | ||
| radius | No | ||
| feature | Yes | ||
| per_edge | No | ||
| allow_partial | 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 so: it discloses the pre-handle validation (isValid, solid count, bounding-box growth), the failure semantics (feature removed, Body Tip restored, BlendCheckFailed naming offending edges), and the partial-result behavior of allow_partial. It even documents the return payload and the edge-subset warning 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 action and parameter syntax before the validation rationale. The r=0.6/15%-larger anecdote and issue #283 reference are mildly digressive but serve to justify the validation behavior, so the length is mostly 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?
For a 6-parameter mutation tool with no output schema and no annotations, the description supplies parameter formats, validation scope, success payload, and failure/exception behavior. Nothing an agent needs to invoke it correctly appears 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 it explains edges (e_* tags or 'EdgeN' index strings), radius (mm, must be > 0), per_edge (validate after each edge), and allow_partial (off by default). Only the required 'feature' parameter and 'name' are left unexplained, a modest gap against otherwise strong 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?
States a specific verb (Fillet) and resource (edges of a feature in a Body) plus the workbench context (PartDesign), which is enough to separate it from the generic fillet_edges sibling. It stops short of explicitly contrasting scope with fillet_edges, leaving the PartDesign-vs-Part distinction to be inferred from the parenthetical reference.
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?
Mentions fillet_edges and that the same validation applies, implying this is the PartDesign-body variant, but never gives an explicit 'use this instead of X when...' rule. The per_edge and allow_partial flags hint at workflow choices without stating when each mode is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Check that the FreeCAD worker is alive. Returns 'pong' on success.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden, but for a trivial health probe it adds little beyond restating the expected success output. It omits failure/timeout behavior and whether the check has side effects, though the scope is small enough that this is 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?
Two short sentences, front-loaded with the core action and immediately followed by the success result. Every phrase earns its place with no 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 zero-parameter liveness probe with an output schema already covering the return value, the description is essentially complete. Minor omission: it does not state what a failed probe looks like, but the output schema fills that need.
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 are no parameter semantics to document; the baseline for a 0-param tool is 4. Nothing in the description misrepresents the empty input contract.
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 (check) and resource (FreeCAD worker liveness) and adds the observable result ('pong'), so an agent can tell what the tool does at a glance. It does not, however, explicitly distinguish itself from the nearby liveness/management siblings such as restart_worker or setup_status.
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 statement of when this liveness probe is appropriate versus restart_worker or version, and no mention of prerequisites. Usage is only weakly implied by the health-check framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plastic_collapseA
Exact plastic-hinge collapse of a solid rectangular beam (NO solver) — the
closed-form twin the perfectly-plastic CalculiX solve
(fem_set_nonlinear_material) is gated against. The beam bends about the
width_mm axis (depth = height_mm). σ_y from yield_mpa or a Materials-DB
material. Elastic modulus S = b·h²/6, plastic modulus Z = b·h²/4, shape
factor Z/S = 1.5; yield moment M_y = σ_y·S, fully-plastic moment M_p = σ_y·Z.
support maps the collapse moment to a point load: 'cantilever' (M = P·L) or
'simply_supported' (central, M = P·L/4). With load_n the applied moment and
its margins to M_y / M_p (and the regime: elastic / partially_plastic /
collapsed) are returned. A perfectly-plastic FEM solve caps the surface stress
at σ_y and loses equilibrium at M_p; linear theory climbs past both — that
contrast is the gate. Escalate to fem_set_nonlinear_material for
non-rectangular sections or partial-plasticity fields.
Returns {support, S_elastic_mm3, Z_plastic_mm3, shape_factor, yield_mpa, yield_moment_nmm, plastic_moment_nmm, yield_load_n, collapse_load_n, applied_moment_nmm, margin_to_yield, margin_to_collapse, regime, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| load_n | No | ||
| support | No | cantilever | |
| material | No | ||
| width_mm | Yes | ||
| height_mm | Yes | ||
| length_mm | Yes | ||
| yield_mpa | No |
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 well: it discloses that no solver is invoked, the exact closed-form quantities computed (S, Z, shape factor, M_y, M_p), how `support` maps moment to load, and the returned regime/fidelity/band_pct/warnings/escalate_to behavior. It even explains the physical contrast (perfectly-plastic FEM loses equilibrium at M_p while linear theory climbs past 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?
Purpose and the NO-solver constraint are front-loaded, and the return-key listing at the end is efficient. It is dense and formula-heavy with some redundancy across clauses, but nearly every sentence carries information an agent needs, so little is wasted.
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-parameter analytical tool with no annotations and no output schema, the description enumerates the returned fields inline (S_elastic_mm3 through escalate_to), names the governing assumptions (rectangular section, perfectly plastic), and pins down the escalation path. 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 it does: it defines the bending axis (`width_mm`) vs depth (`height_mm`), the two alternative yield inputs (`yield_mpa` vs Materials-DB `material`), the `support` enum values and their moment formulas ('cantilever' M=P·L, 'simply_supported' M=P·L/4), and the role of `load_n`. Only `length_mm` is left implicit via L in the formulas.
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: closed-form plastic-hinge collapse of a solid rectangular beam, explicitly flagged as NO solver. It also differentiates itself from the sibling FEM path by naming `fem_set_nonlinear_material` as the thing it is gated against, so an agent can distinguish the analytical tool from the FEM tool 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?
Explicitly gives the escalation condition: use `fem_set_nonlinear_material` for non-rectangular sections or partial-plasticity fields. It also frames the tool's role (the closed-form twin the perfectly-plastic FEM solve is validated against), which tells the agent when this tool is the right one rather than the FEM path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plate_checkA
Handbook bending of a uniformly loaded flat plate (NO solver) — the
"do I need FEM at all?" screen. shape: 'rectangular' (a_mm × b_mm, short side
drives; Roark/Timoshenko ν=0.3 coefficients σ=β·q·b²/t², δ=α·q·b⁴/(E·t³),
interpolated in a/b) | 'circular' (diameter_mm; exact closed forms).
support: 'simply_supported' | 'clamped' (all edges). E from youngs_gpa or a
Materials-DB material (which also supplies yield for yield_safety_factor).
Exact within thin-plate theory, and the limits are returned as flags
(thin_plate_ok: span/t ≥ 10; small_deflection_ok: δ ≤ t/2) — a tripped flag
means escalate to the CCX fem_* pipeline (escalate_to='fem_run').
Returns {shape, support, aspect_ratio, beta, alpha, sigma_max_mpa, deflection_max_mm, yield_safety_factor, thin_plate_ok, small_deflection_ok, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| a_mm | No | ||
| b_mm | No | ||
| shape | Yes | ||
| poisson | No | ||
| support | No | simply_supported | |
| material | No | ||
| youngs_gpa | No | ||
| diameter_mm | No | ||
| pressure_kpa | Yes | ||
| thickness_mm | Yes |
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: it declares the analytic nature (no solver), the governing theory (Roark/Timoshenko thin-plate, ν=0.3), the applicability limits (thin_plate_ok span/t ≥ 10; small_deflection_ok δ ≤ t/2), and the escalation behavior when a limit trips. That is unusually complete behavioral 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?
Purpose is front-loaded in the first clause, then the schema mapped compactly. It is formula-dense but every detail (coefficient forms, flag thresholds, escalation target) earns its place for a no-annotation screening 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?
With no output schema, the description enumerates the returned fields (sigma_max_mpa, deflection_max_mm, yield_safety_factor, thin_plate_ok, fidelity, escalate_to, etc.) and explains how to interpret them. Nothing an agent needs to call it correctly or act on its result 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 has to compensate and largely does: it maps shape values to their geometry inputs (a_mm × b_mm for rectangular, diameter_mm for circular), gives support values, and explains material vs youngs_gpa precedence plus that material supplies yield. thickness_mm and pressure_kpa are only implicitly covered, but their names are self-evident.
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 ('handbook bending of a uniformly loaded flat plate') and frames the exact scope ('NO solver', 'do I need FEM at all? screen'). This immediately distinguishes it from the fem_* solver siblings such as fem_run and fem_buckling.
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 both the decision it supports (FEM screening) and the alternative: a tripped validity flag means 'escalate to the CCX fem_* pipeline (escalate_to="fem_run")'. When-to-use and when-to-hand-off are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pocketA
Subtract a pad of length mm from the body. through_all ignores length.
through ('wall'|'body'): preferred over through_all. 'wall' ray-casts the
body to find the first exit boundary and cuts exactly one wall thick —
correct for solids (one wall = full thickness) AND shelled bodies. 'body'
is the legacy ThroughAll; on a shelled body it punches through every wall
and ruins the cavity. Implies direction='into_body'. Result carries
wall_depth_mm so the caller can verify.
direction (preferred over reversed): 'into_body' makes the cut actually
remove material; 'away_from_body' extrudes outside the body. The tool
probes both Reversed values and picks the one matching intent.
reversed: legacy raw flag, used only if neither through nor direction
is set.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| length | No | ||
| sketch | Yes | ||
| through | No | ||
| reversed | No | ||
| direction | No | ||
| through_all | 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 ray-casting, wall thickness behavior, legacy ThroughAll consequences, material removal direction, automatic probing of Reversed values, and that the result carries wall_depth_mm for verification.
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 purpose, then organizes parameter guidance efficiently. Every sentence adds useful operational detail without repetition or 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 7-parameter CAD operation with no annotations and no output schema, this is quite complete on behavior and key parameter semantics. It still omits what the required sketch argument should contain and only briefly mentions the return value.
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 adds rich meaning for length, through, through_all, direction, and reversed, but does not explain the required sketch parameter or the name parameter.
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: 'Subtract a pad of length mm from the body.' It also clarifies the exception for through_all, making the core operation immediately 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?
Explicitly says 'through' is preferred over through_all and explains exactly when each is appropriate, including the failure mode on shelled bodies. It also declares direction as preferred over reversed and explains the intent-matching behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
polar_patternC
Repeat a PartDesign feature around an axis.
axis: 'X'|'Y'|'Z' for body origin axes, or {handle, edge: tag|'EdgeN'}. angle_deg: total swept angle (default 360 = full circle). occurrences: number of copies (>=2). Includes the original.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | Z | |
| name | No | PolarPattern | |
| feature | Yes | ||
| reversed | No | ||
| angle_deg | No | ||
| occurrences | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It explains some parameter behavior such as the default angle and that occurrences includes the original, but it omits mutation/reversibility, feature dependency, permission needs, and what happens to the source feature.
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, compact, and each line adds specific information about parameters or defaults. There is no 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 6-parameter mutation tool with no annotations, no output schema, and 0% schema coverage, the description is incomplete. It does not explain how to specify the required feature, what name or reversed do, or the tool's side effects in the 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. It meaningfully explains axis syntax, angle_deg default, and occurrences semantics, but leaves the required feature parameter, name, and reversed 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: 'Repeat a PartDesign feature around an axis.' This clearly identifies a polar patterning operation, though it does not explicitly distinguish itself from siblings like linear_pattern or mirrored beyond the axis-based operation.
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 no when-to-use guidance, prerequisites, or alternatives. It does not mention linear_pattern, mirrored, or conditions under which polar patterning is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_fit_stressA
Rate an interference (press/shrink) fit via Lamé. p=delta_r E (ro^2-rc^2)/ (2 rc ro^2); hub bore hoop=p(ro^2+rc^2)/(ro^2-rc^2); torque=2pi mu p rc^2 L. interference_mm is diametral.
E comes from material's Materials-DB card; youngs_modulus_mpa overrides it.
Every output is LINEAR in E, so a material the corpus has no modulus for is an
ERROR, not an assumption (#269) — the message names both exits.
pass is THREE-state: the hub yield check needs the card's yield_mpa, and a
card without one (Fused-Silica, Gold, Concrete, ...) leaves the check
unperformed. That returns pass=null with the reason in warnings — an
unperformed check is not a passed one. Test pass is True, not truthiness.
Returns {contact_pressure_mpa, hub_hoop_stress_mpa, torque_capacity_nm, axial_force_n, hub_yield_sf, youngs_modulus_mpa, youngs_basis, hub_yield_basis, pass, warnings}.
| Name | Required | Description | Default |
|---|---|---|---|
| material | No | Steel-A36 | |
| shaft_dia_mm | Yes | ||
| friction_coef | No | ||
| interference_mm | Yes | ||
| hub_outer_dia_mm | Yes | ||
| youngs_modulus_mpa | No | ||
| engagement_length_mm | Yes |
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 richly: it explains the linear-in-E assumption, that a missing modulus is an ERROR not an assumption, the three-state `pass` semantics, the null-pass-with-warning path, and the required `pass is True` test. These are non-obvious failure modes that an agent would otherwise get wrong.
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 formulas and followed by the failure-mode rules; each sentence earns its place. The inline formula block is dense but appropriate for a calculation tool, though it slightly competes with the behavioral rules for attention.
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?
It enumerates the full return object, and covers the two hardest behaviors an agent must handle: the modulus-missing error and the three-state pass with warnings. Given there is no output schema and no annotations, this description supplies exactly the context needed to invoke and interpret 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, and it does for the critical parameters: interference_mm is declared diametral (a non-obvious unit/convention), youngs_modulus_mpa overrides the material card, and material sources E from the Materials-DB. It leaves shaft_dia, hub_outer_dia, engagement_length, and friction_coef to inference, but the unusual ones are 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 (Rate), resource (interference/press/shrink fit), and the method (Lamé). It gives the governing formulas outright, leaving no ambiguity about what is computed, and there is no sibling in the list (fit_check, fit_class, hertz_contact) that does this same interference-fit rating.
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 implies usage via the material-modulus rule and the #269 error behavior, but never explicitly says when to choose this tool over fit_check/fit_class or how it relates to those siblings. The guidance is embedded in behavioral rules rather than a when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_check_referencesA
Reference-integrity guard (issue #143 / D1) — catch a broken cross-file reference before a merge (the chronic PDM failure mode). Loads a project's assembly manifest + item registry and checks every reference resolves: a moved / renamed / missing component file, a dangling item-ref (an unknown id, or a resolved file missing on disk), an instance naming an unknown component, and naming-convention violations.
project: path to the project.json container.
Returns {ok, problems} — ok is True iff every reference is live, so a broken reference is reported here instead of as a cryptic merge failure.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it says the tool loads data and checks references, implying a read-only guard, and explains the return contract {ok, problems} and what ok=True means. It does not discuss permissions, side effects, or performance, but for a local integrity check this is substantial 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 description is front-loaded with purpose, then details, then parameter and return semantics. It is appropriately sized, though the issue-number parenthetical and 'chronic PDM failure mode' aside add some non-essential context.
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 output schema and no annotations, the description supplies the return contract at a high level and enumerates the reference failures it catches. It stops short of fully specifying the shape of individual problem entries, but it is complete enough for an agent to choose and 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 coverage is 0%, so the description must compensate, and it does by documenting the single parameter as 'path to the project.json container.' That is more meaningful than the schema's bare string type. More format detail or examples would push this to 5, but one parameter is adequately clarified.
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: it loads a project's manifest and item registry and checks every reference for integrity. It clearly distinguishes this pre-merge guard from general merge/validation tools by describing the exact failure mode it catches.
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 — run before a merge to catch broken cross-file references before they become cryptic merge failures. It does not explicitly name when-not to use it or point to sibling alternatives such as validate_manifest or merge_assembly, but the intended timing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_resolve_manifestA
Resolve a project's item-ref components to file components and write a merge-
ready manifest (issue #143 / D1, the deferred #140 seam). Each component naming an
item (items.json identity, not a bare path) is lowered to a {file} component
with the CAD artifact resolved from the registry, so merge_assembly consumes the
result unchanged — renaming/moving a file updates the item's files[] in one place
without breaking any reference.
project: path to the project.json container. out: output manifest path (defaults to .resolved.json next to it).
Returns {path, lowered} — the written path and the lowered manifest object; a dangling item-ref fails loudly.
| Name | Required | Description | Default |
|---|---|---|---|
| out | No | ||
| project | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does well: it states that a manifest file is written, gives the default output location, describes the return shape as {path, lowered}, and warns that a dangling item-ref fails loudly. It still does not cover edge cases like overwrite behavior or permissions, so it is not fully 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?
The definition is front-loaded with purpose, then parameters, then return behavior. It is reasonably concise, though the issue references ('issue #143 / D1, the deferred #140 seam') are internal context that does not help an agent invoke 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 two-parameter transformation tool with no annotations and no output schema, the description covers the key operational details: inputs, default output path, return shape, and failure mode. It is largely complete, though additional notes about side effects or overwrite semantics would improve it.
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 both parameters: project is the path to the project.json container, and out is the output manifest path with a default of <manifest>.resolved.json next to it. This adds clear 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 names a specific verb and resource: resolve a project's item-ref components to file components and write a merge-ready manifest. It also differentiates the result from downstream behavior by saying merge_assembly consumes it unchanged, which helps distinguish it from related tools like validate_manifest, project_validate, and merge_assembly.
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 when components name an item and need to be lowered for merge, and it mentions the downstream consumer merge_assembly. However, it does not explicitly state when this tool should be used instead of alternatives such as items_resolve, project_check_references, or validate_manifest.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_validateA
Validate a project.json container (issue #143 / D1): the schema stamp ("ankusdrive.project/1"), the naming convention on the project name, the conventional path fields, and — relative to the project directory — that the referenced manifest + item registry exist, the components directory is present, and a named master/skeleton is a real component of the assembly manifest.
project: path to the project.json container.
Returns {ok, problems, schema, name} — ok is True iff problems is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden: it conveys a read-oriented validation pass and gives the exact return contract (ok true iff problems empty), which is strong disclosure for a checker. It does not state permissions or explicitly confirm no mutation occurs, but the 'validate' framing plus return shape covers most of the behavioral picture.
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 checks, followed by the parameter and the return contract, with each sentence earning its place. The parenthetical issue/design references (issue #143 / D1) add minor noise but little else is wasted.
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 validation tool with no output schema, the description supplies both the check inventory and the return shape {ok, problems, schema, name}, which is largely sufficient. Only the absence of usage/exclusion guidance and permission context leaves a small 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?
With 1 param at 0% schema coverage, the schema only offers the bare title 'Project', so the description must compensate. It does, describing 'project' as the path to the project.json container, which is meaningful semantics beyond 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 (validate) and resource (project.json container) and then enumerates exactly what is checked: the schema stamp, the naming convention, the conventional path fields, existence of manifest/registry, presence of the components directory, and that a named master/skeleton is a real assembly component. This detail distinguishes it from generic siblings like validate_manifest, project_check_references, or items_validate.
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 — validate a project.json before relying on it — but there is no explicit when-to-use guidance, no statement of when it is not appropriate, and no routing to alternatives such as project_check_references or project_resolve_manifest.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_interfaceA
Record a named interface frame on a component so other parts can mate to it — the published "here is where you bolt to me, and how it's oriented".
handle: the component's shaped object. name: interface name (e.g. "lid_seat", "bolt_circle", "bore_axis"). frame: {origin:[x,y,z], z_axis:[...]?, x_axis:[...]?}. z_axis defaults +Z, x_axis +X. Extra keys (e.g. bolt-circle metadata) are stored verbatim.
Persists in the component's .FCStd as a JSON property bag, so merge_assembly can mate against it later. Returns {handle, name, frame, interfaces}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| frame | Yes | ||
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does substantial work: it discloses persistence ('Persists in the component's .FCStd as a JSON property bag') and that extra frame keys are stored verbatim. It also names the return shape. It omits whether authoring an interface conflicts with an existing one or needs specific permissions, but the side-effect profile is well communicated.
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 in the first sentence, then scannable per-parameter bullet notes, then persistence/return. Every sentence earns its place for a 3-param, zero-coverage tool, though the prose is slightly loose rather than tightly compressed.
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-required-param tool with no annotations, no output schema, and 0% schema descriptions, the description covers parameters, persistence semantics, cross-tool consumption, and the explicit return value. 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 coverage is 0%, so the description must compensate, and it does: handle is defined ('the component's shaped object'), name is given with concrete examples, and frame is fully specified with its structure, defaults (z_axis +Z, x_axis +X) and verbatim-extra-keys behavior. This adds meaning far beyond the empty 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 (Record) and resource (a named interface frame on a component) plus the downstream purpose (so other parts can mate to it). The 'here is where you bolt to me, and how it is oriented' framing makes it clearly distinct from siblings like get_interface and merge_assembly.
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 clear context by tying the action to its consumer: 'so merge_assembly can mate against it later.' That tells the agent when this output is consumed, but there are no explicit when-not conditions or named alternative tools for related tasks (get_interface, interface_align_check, register_handle are all siblings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_facesB
Filter faces by a structured predicate. Returns matching descriptors.
Predicate fields (all optional, ANDed):
kind / type: 'planar' | 'cylindrical' | 'conical' | 'spherical' | 'toroidal' | 'spline'
normal_dir: [x, y, z] unit vector for planar faces (with normal_tol)
radius_eq: float, matches cylindrical/conical/spherical (with radius_tol)
area_min / area_max: bounds in mm^2 Optional ordering:
centroid_max / centroid_min: 'x' | 'y' | 'z' (sorts result)
order: 'area_desc' | 'area_asc'
Example: {"type": "planar", "normal_dir": [0, 0, 1], "centroid_max": "z"} finds the topmost +Z-facing face.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| predicate | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It discloses that predicate fields are optional and ANDed and that ordering affects results, but it does not describe return descriptor structure, side effects, permissions, or error behavior beyond 'Returns matching descriptors.'
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, then uses a tight bullet structure for predicate fields and ends with a concrete example. Every sentence and bullet adds useful information for invoking 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 nested-predicate query tool with no annotations and no output schema, the description covers the predicate well but leaves two meaningful gaps: the required handle parameter is undocumented, and the returned descriptor shape is only vaguely described.
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 richly documents the nested predicate object, including kind/type values, normal_dir, radius_eq, area bounds, centroid ordering, and a worked example, though it does not explain the required handle parameter.
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: 'Filter faces by a structured predicate. Returns matching descriptors.' This distinguishes it from siblings like list_faces and resolve_face, but it does not explicitly name an alternative or state why an agent would choose this over list_faces.
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 predicate field documentation and a concrete example that finds the topmost +Z-facing face. There is no explicit when-to-use or when-not-to-use guidance relative to sibling tools such as list_faces or classify_face_sides.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
random_vibrationA
Random-vibration response off a modal run (Miles' equation; closed-form, no
external solver). Provide either analysis (a handle whose fem_modal + fem_run
already produced natural frequencies) or an explicit frequencies_hz list, plus
a base-acceleration PSD psd_profile ([{"hz":20,"g2_hz":0.01}, ...]; log-log
interpolated, and zero outside its band so a mode stiffened above the band
escapes drive). Each mode is an SDOF resonator with amplification q (default
10; rule of thumb Q≈√f_n), combined by SRSS: rms_g = sqrt(Σ (π/2)·f·W(f)·Q).
With modal_stress_mpa_per_g the g response converts to RMS / 3-σ stress; add
allowable_stress_mpa for a pass/fail.
Returns {rms_g, first_mode_hz, dominant_mode_hz, q, psd_band_hz, miles_grms_g, modes: [{mode, frequency_hz, psd_g2_hz, contribution_g, in_band}], rms_stress_mpa, three_sigma_stress_mpa, pass}.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | ||
| analysis | No | ||
| psd_profile | Yes | ||
| frequencies_hz | No | ||
| allowable_stress_mpa | No | ||
| modal_stress_mpa_per_g | No |
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 well: it discloses the method (closed-form Miles), the SDOF resonator model, the SRSS combination rule, the Q default and rule of thumb, and the important behavioral subtlety that a mode stiffened above the band 'escapes drive' because PSD is zero outside its band. It also outlines the pass/fail behavior via allowable stress.
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 and the Returns block is compact and useful. The middle paragraph is dense and equation-laden, but nearly every clause conveys a needed input format or modeling constraint, so little is wasted; only the sheer density 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 complex solver with no output schema and no annotations, the definition is complete: it documents required inputs, alternative input modes, method, model assumptions, and even summarizes the return object's fields. An agent has enough to call it and interpret results 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%, yet the description compensates for every one of the six parameters: `analysis` (handle with frequencies from fem_modal+fem_run), `frequencies_hz` (explicit list), `psd_profile` (documented format [{"hz":20,"g2_hz":0.01}] and log-log interpolation with band limits), `q` (default 10), `modal_stress_mpa_per_g` (g-to-stress conversion) and `allowable_stress_mpa` (enables pass/fail). This is meaning well 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 first sentence states a specific verb and resource ('Random-vibration response off a modal run') and names the method ('Miles' equation; closed-form, no external solver'). An agent can distinguish this from fem_modal, harmonic_response, or beam_modal 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?
It clearly states the two valid input paths ('either `analysis` ... or an explicit `frequencies_hz` list, plus a base-acceleration PSD `psd_profile`'), which tells the agent when this tool is applicable. However, it never contrasts itself against the many sibling solvers (e.g. harmonic_response, fem_modal) or states when NOT to use it, so routing among alternatives 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.
recipeA
Build a registered part recipe into the active document (issue #136): "regenerate with new parameters" = "re-run the recipe." Validates {recipe, inputs} against the declared schema (typed units + ranges) at the door, then runs the deterministic build — geometry + publish_interface + declare_intent. Returns {recipe, schema, inputs, handle, name, interfaces, intent, part}.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | No | ||
| recipe | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations covering this tool, the description carries the full burden and does meaningful work: it discloses that inputs are validated at the door against the declared schema (typed units + ranges), that the build is deterministic, and that the build comprises geometry + publish_interface + declare_intent. It omits permissions/auth and failure/error behavior, keeping it out of the top score.
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 sentences are information-dense with little redundancy. The issue-number reference and the inline quote-equivalence are slightly noisy, but overall it earns 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?
With no output schema and no annotations, the description steps up by enumerating the return object's fields ({recipe, schema, inputs, handle, name, interfaces, intent, part}) and the internal build steps. It is nearly complete for a build tool, missing only error/permission context.
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 that {recipe, inputs} are validated against the recipe's declared schema with typed units and ranges, adding real meaning to 'inputs', but it never specifies the expected format of the required 'recipe' parameter (name vs. id vs. path), leaving a 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 gives a specific verb+resource — 'Build a registered part recipe into the active document' — and spells out the two-stage behavior (validate, then deterministic build). It implicitly distinguishes itself from recipe_validate/recipe_schema by noting it also runs the build, but it never names those siblings explicitly, so differentiation requires 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?
'regenerate with new parameters = re-run the recipe' clarifies the operating concept, and the validate-then-build framing lets an agent infer that recipe_validate is the validate-only alternative. However, there is no explicit when-to-use, when-not-to-use, or named alternative, so the guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recipe_listA
List every registered part recipe — named, parameterized, declared-input build templates (issue #136). Returns {schema, count, recipes} where each recipe maps to {doc, required, optional, emits}; the cheap directory to browse before picking and parameterizing a recipe with recipe_schema / recipe.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 discloses the return envelope {schema, count, recipes} plus each entry's shape {doc, required, optional, emits}. That is substantial behavioral context for a listing tool; it doesn't mention pagination or side effects, but a read-only listing has little more to disclose.
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 the recipe definition are front-loaded, followed by the return shape and the routing hint. It is dense but every clause earns its place; the parenthetical '(issue #136)' is the only piece of marginal 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?
There is no output schema, so the description's explicit return-value documentation is necessary and sufficient. Combined with the sibling routing hint, an agent has everything needed to call this 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 tool takes zero parameters, so the baseline is 4. The description correctly implies no filtering or selector inputs, matching the empty 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 ('List') and resource ('every registered part recipe') and defines what a recipe is ('named, parameterized, declared-input build templates'). It explicitly distinguishes itself from the sibling tools recipe_schema and recipe, 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?
Clearly positions itself as 'the cheap directory to browse before picking and parameterizing a recipe with recipe_schema / recipe,' naming the alternatives and the workflow stage. It stops short of explicit when-not guidance, but the sequencing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recipe_schemaA
Return one recipe's declared INPUT SCHEMA — its driving parameters with
type/unit/default/range. Returns {schema, recipe, doc, inputs:[{name, type,
unit?, default?, min?, max?, required, choices?, doc?}], emits}. recipe names
a registered recipe; an unknown name fails loudly. This is the contract a
parametric regeneration is authored against.
| Name | Required | Description | Default |
|---|---|---|---|
| recipe | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries full burden and does well: it discloses the failure mode ('an unknown name fails loudly') and the return structure. It could go further by stating side-effect/read-only nature and any auth requirements, but the failure semantics are valuable.
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 first, then return shape, then parameter semantics. The inline return-type enumeration is dense but earns its place for a tool with no output schema. Slightly long but no 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?
No output schema exists, so the description correctly details the return object ({schema, recipe, doc, inputs:[...], emits}). Combined with the failure-mode note, an agent has enough to call it correctly, though read-only/authorization context is unstated.
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% with one parameter, so the description must compensate and does: '`recipe` names a registered recipe; an unknown name fails loudly' defines the valid domain and error behavior for the sole argument.
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 (Return) and resource (one recipe's declared INPUT SCHEMA) with the exact scope 'its driving parameters with type/unit/default/range'. An agent can distinguish this from recipe_list (enumerates recipes) and recipe (regenerates) without opening other 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?
Gives implied context via 'This is the contract a parametric regeneration is authored against', which signals it is used to discover inputs before regeneration. However, it never explicitly states when to use this vs recipe/recipe_list/recipe_validate, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recipe_validateA
Validate a recipe reference {recipe, inputs} WITHOUT building it — the cheap front door (mirrors validate_manifest). Catches an unknown recipe, a missing required input, and a wrong-typed / out-of-range / bad-unit / unknown input. Returns {ok, problems} — ok is True iff problems is empty. Run before building or merging to reject a malformed parameterization before geometry is spent.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | No | ||
| recipe | Yes |
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 does well: it discloses that the operation is cheap/non-building, is a pre-check, and enumerates the exact failure classes it catches (unknown recipe, missing required input, wrong-typed/out-of-range/bad-unit/unknown input). It also states the return shape {ok, problems} and the ok-if-empty semantics. It does not state whether it requires an open document/workspace or any auth context, which on a mutation-free validator is the main residual 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?
Three sentences, front-loaded with the verb+resource and the key differentiator ('WITHOUT building it — the cheap front door'). Every clause earns its place: failure modes, return contract, and call-site recommendation. 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 2-param, no-annotation, no-output-schema validator, the description supplies the missing behavioral and return-shape context, so an agent knows what it checks and what it returns. The only omission is the execution prerequisite (does it need an open document/workspace?), which matters in this large stateful 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 description coverage is 0% for both parameters, so the description must compensate — and it does partially by naming the two fields as {recipe, inputs} and implying inputs is the parameterization to check. But it doesn't say what shape inputs must take (the schema's anyOf object/null gives no guidance either) or what a valid input looks like, so the compensation is thin.
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 (validate) and resource (a recipe reference {recipe, inputs}), and explicitly distinguishes itself from the build step ('WITHOUT building it — the cheap front door'). It also names a mirror sibling (validate_manifest), aligning it with a family of validate_* tools. An agent can tell it apart from recipe, items_validate, and merge_assembly 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?
Gives explicit when-to-use ('Run before building or merging to reject a malformed parameterization before geometry is spent') and effectively a when-not (don't use it to build — that's the build tool). It also names the analogous tool validate_manifest for pattern recognition. This is exactly the routing the agent needs across 200+ siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_handleA
Register an existing FreeCAD object into the AnkusDrive handle table. Use after run_script (when auto_register=False) or after open_document to bring objects into the handle ecosystem so subsequent tool calls accept them via handle.
object: the FreeCAD object's .Name (e.g. 'Helix001', 'Cut'). prefix: handle prefix (default 'manual'). Each call returns a fresh handle; registering the same object twice produces two aliases. Returns {handle, name, type, label}.
| Name | Required | Description | Default |
|---|---|---|---|
| object | Yes | ||
| prefix | No | manual |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the load and does well: it discloses the idempotency-relevant trait that 'registering the same object twice produces two aliases' and that each call returns a fresh handle, plus the return shape. It does not discuss permissions or persistence guarantees, but for a registration helper this is strong 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 purpose sentence, then a usage sentence, then two tight parameter lines and a returns line. No wasted words; 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?
For a 2-param, no-annotation, no-output-schema tool, the description supplies purpose, triggers, both parameter semantics, multiplicity behavior, and the return shape. It is essentially complete; only edge cases like error behavior on an unknown object name are 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 coverage is 0%, so the description must compensate. It does: 'object' is explained as the FreeCAD object's .Name with concrete examples ('Helix001', 'Cut'), and 'prefix' is given a default and meaning. Only minor gap is no note on prefix format constraints.
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 ('Register an existing FreeCAD object into the AnkusDrive handle table') and distinguishes itself from siblings by naming the upstream triggers (run_script with auto_register=False, open_document). An agent can tell it apart from get_object or list_objects immediately.
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 gives when-to-use: 'Use after run_script (when auto_register=False) or after open_document' and states the goal (so subsequent tool calls accept them via handle). This is exactly the when/why an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_packageA
Produce the vendor/RFQ deliverable bundle for one item at one revision — STEP + drawings + BOM + inspection package + a checksummed manifest — gated by the item's lifecycle state and stamped with its ECO.
Every piece of this exists as its own tool. What this adds is the guarantee that ties them together: the STEP, the PDF, the BOM and the title block all describe the SAME revision of the SAME item. That is the whole point of a release, and it is enforced BEFORE a single file is written:
the item must be in a releasable lifecycle state (
released), ordraftmust be set — which watermarks EVERY artifact PRELIMINARY (burned into the drawing, and carried as a format-legal comment in the STEP header, the DXF and the CSVs). Anobsoleteitem is refused in both modes.drawing_gatemust pass for every included page — with require_ballooned when the inspection kind is requested.the title block's part number / revision / material must MATCH the items registry. A mismatch is a FAILURE carrying expected-vs-actual, never a silent fix: quietly rewriting the print would destroy the only independent check that it and the model describe the same thing.
A refused release writes NOTHING — no half-populated directory a build script could mistake for a package.
registry / item: the items.json sidecar and the item id being released.
out_dir: where the bundle is written (created if absent).
kinds: any of "step", "drawing_pdf", "drawing_svg", "drawing_dxf", "bom_csv",
"inspection", "manifest_json". Default step/drawing_pdf/drawing_dxf/
bom_csv/manifest_json. manifest_json is always added; inspection
(ballooned print + plan + blank AS9102 form) implies a drawing kind.
draft: cut a PRELIMINARY package from an unreleased item.
rfq: the quote flavour — adds quantity breaks and the cost_estimate rollup as a
quote-COMPARISON baseline (fidelity "correlation", band_pct 100 — trust the
ratios, not the dollars) and drops internal-only artifacts (the inspection
package, which states your acceptance criteria).
eco: the change order this release is cut under; defaults to the item's
metadata.eco. Stamped into the manifest AND the title block's REV cell.
pages: page handles/names/labels (default: every page in the document).
handle / object: the geometry to export (default: the first page's main view
source — literally the solid the drawing dimensions).
process: drawing_gate process ("auto" | "prismatic" | "turned").
density / recursive: BOM options, as in bom_extract.
quantity_breaks / cost_process / material: RFQ pricing inputs (default
[1, 10, 100], "cnc", and the item's declared material).
Determinism: the same item at the same revision produces a BYTE-IDENTICAL package. The exporters' wall-clock header stamps (the STEP FILE_NAME timestamp above all) are scrubbed to a fixed epoch, so a re-released package is diffable by checksum.
Returns {ok, dir, item, part_number, rev, lifecycle, eco, material, draft, watermark, flavor, kinds, dropped_kinds, implied_kinds, pages, files:[{name, kind, bytes, blake2b}], manifest, manifest_path, verify, problems}. ok=False means the gate refused and nothing was written; each problem carries {code, where, field, expected, actual, reason}.
| Name | Required | Description | Default |
|---|---|---|---|
| eco | No | ||
| rfq | No | ||
| item | Yes | ||
| draft | No | ||
| kinds | No | ||
| pages | No | ||
| handle | No | ||
| object | No | ||
| density | No | ||
| out_dir | Yes | ||
| process | No | auto | |
| material | No | ||
| registry | Yes | ||
| recursive | No | ||
| cost_process | No | cnc | |
| quantity_breaks | 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 thoroughly: refusal semantics ('A refused release writes NOTHING'), the PRELIMINARY watermarking behavior of draft mode, title-block mismatch as a hard failure with expected-vs-actual rather than a silent fix, byte-identical determinism with scrubbed timestamps, and the failure shape of `problems`.
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, gates are bulleted, and parameters are grouped in a scannable list. Given 16 parameters the length is largely justified, though a few sentences (e.g. the 'no half-populated directory a build script could mistake for a package' aside) are more colorful 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 high-complexity, 16-parameter tool with no output schema and no annotations, the description still supplies the return contract ({ok, dir, ..., problems} with per-problem fields), the failure modes, and the determinism guarantee. Nothing an agent needs to invoke or interpret 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 16 parameters, yet the description documents essentially every one — registry/item/out_dir, kinds with defaults plus the always-added manifest and inspection implication, draft, rfq, eco defaulting to item metadata, pages, handle/object defaults, process, density/recursive cross-referencing bom_extract, and quantity_breaks/cost_process/material defaults. This fully compensates for the empty schema descriptions.
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 ('Produce the vendor/RFQ deliverable bundle for one item at one revision') and enumerates the exact artifacts included. It explicitly distinguishes itself from siblings by noting 'Every piece of this exists as its own tool' and names the added value: the revision-consistency guarantee across STEP/PDF/BOM/title 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?
Gives clear conditions: the item must be `released` or `draft` must be set, and `obsolete` is refused in both modes. It also explains when to pick `draft` and `rfq` flavors. It stops short of explicitly routing the agent to the single-artifact siblings (e.g. 'use export_drawing if you only want a PDF'), so it is clear context rather than full when/when-not/alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_capabilitiesA
Report which photoreal renderers are usable right now, and whether the FreeCAD Render addon imports — so you can pick a working renderer for render_photoreal instead of discovering availability by trial and error.
Takes no arguments. Resolves each renderer's binary exactly as render_photoreal would (ANKUSDRIVE__PATH env override -> FreeCAD prefs -> PATH -> per-OS install dirs), but renders nothing and changes no settings.
Returns {addon_importable (bool), default_renderer ('Povray'), platform,
available (sorted list of ready renderer names for the renderer= argument),
renderers: {name: {available, param_key, batch, binaries, and either path (the
resolved binary) or install_hint}}, materials (library card names usable as
render_photoreal's material= argument, present only when the addon imports), and
addon_error (present only when the addon does not import)}.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 states that it renders nothing, changes no settings, resolves binaries exactly like render_photoreal (including the fallback chain), and returns a detailed capability report. Side-effect and resolution semantics are fully 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 purpose and usage, then covers resolution behavior and return shape. Every sentence is informative, and no sentence is wasted despite the length, which is justified by the lack of an 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 zero-argument, no-annotation tool with no output schema, the description supplies an unusually complete return contract: the fields, their meanings, and conditional presence. An agent has everything needed to call it and interpret the result 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 tool takes zero parameters and the input schema is empty, so the baseline is 4. The description confirms 'Takes no arguments,' which is sufficient but adds no parameter detail beyond what the schema already conveys.
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: reporting which photoreal renderers are usable and whether the FreeCAD Render addon imports. It explicitly connects the purpose to render_photoreal, so an agent can distinguish it from generic capability/status tools like solve_capabilities or setup_status.
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 exactly when to use it: before render_photoreal, to pick a working renderer instead of discovering availability by trial and error. The alternative behavior is named, and the no-argument constraint is stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_fem_resultsA
Render a completed FEM result's surface, colored by a per-vertex field.
Pulls the result surface (boundary triangulation + per-node field values + displacement vectors) from the worker, then colors it with a viridis colormap (barycentrically interpolated), overlays the deformed shape, and draws a colorbar with the field min/max — the "agent eyes" for a stress / displacement / thermal solve.
field: 'vonmises' (default) | 'displacement' | 'temperature'. view: a preset ('iso'|'top'|'front'|…) or a custom '(azimuth,elevation)' camera passed as e.g. "45,35". deformation_scale: 'auto' scales the peak displacement to ~8% of the model diagonal; a number is used verbatim; '0' disables the deformed overlay.
Returns {png_base64, width, height, field, units, min, max, view, node_count, triangle_count}.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | iso | |
| edges | No | ||
| field | No | vonmises | |
| width | No | ||
| height | No | ||
| analysis | Yes | ||
| deformation_scale | No | auto |
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 it pulls the surface from the worker, its coloring/overlay/colorbar pipeline, and enumerates the return payload (png_base64, width, height, field, units, min, max, view, node_count, triangle_count). It omits any note on failure modes (e.g. what happens if the analysis is incomplete or the worker is down), 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?
Front-loads the one-line purpose, then gives a prose pipeline paragraph and a compact parameter legend. Every sentence adds value, though the prose paragraph is slightly verbose relative to a parameter-focused 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 7-parameter tool with 0% schema coverage and no output schema, the description covers the tricky parameters and spells out the return shape, which is the right load-bearing content. The unexplained required 'analysis' argument is the one notable omission.
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 the three semantically complex parameters well: field enumerations, view preset vs custom '(azimuth,elevation)' with a concrete example, and deformation_scale's 'auto'/number/'0' semantics. The required 'analysis' parameter and width/height/edges are left unexplained, leaving some gaps.
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 and resource ('Render a completed FEM result's surface, colored by a per-vertex field') and even frames its role ('the agent eyes for a stress / displacement / thermal solve'). It is clearly distinct from generic siblings like render_view or render_photoreal. It stops short of explicitly naming which sibling to prefer for non-FEM rendering, so it lands just under 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 word 'completed' implies the precondition that an FEM solve must already have run, and the colormap/solve framing implies the context. But there is no explicit when-to-use/when-not guidance and no mention of alternatives such as fem_results listed among siblings. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_jobA
Poll an async render started by render_photoreal_submit.
Returns {job_id, status} where status is 'running', 'done', or 'failed'. When 'done', also returns {png_base64, png_path, renderer, view, material, width, height}; when 'failed', {error}. The result remains available for repeat polls.
Pass discard=True once you have a terminal result to free the job immediately (drops the cached image and closes its temp document); ignored while running. Jobs are also auto-evicted oldest-first once finished jobs exceed an internal cap.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| discard | 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 enumerates status values, the exact payload returned per terminal state, that results persist for repeat polls, what discard actually destroys (cached image and temp document), and an auto-eviction policy with oldest-first ordering.
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 and return contract, then appends lifecycle details in short parenthetical clauses. Every sentence adds information an agent needs; none 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?
No output schema or annotations exist, yet the description specifies the return shape for every branch (running/done/failed), the durability of results, and cleanup semantics. Nothing required to invoke or interpret a poll 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. It fully explains discard (what it frees, when it is honored vs. ignored) and job_id is implicitly the handle returned by render_photoreal_submit, though it never states the format or where job_id comes from explicitly.
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 (poll) plus the exact resource it polls (an async render started by render_photoreal_submit), naming the sibling that produces the job_id. An agent can tell this apart from job_status/job_result 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?
Gives clear operational guidance: pass discard=True once a terminal result is obtained, and that discard is ignored while running. It doesn't explicitly compare against the other async-status siblings (job_status, job_result), but the pairing with render_photoreal_submit makes the intended context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_photorealA
Photorealistic render of a shaped object via the FreeCAD Render workbench (an external renderer, e.g. POV-Ray) — a presentation-quality "nice picture", unlike render_view's fast software-rasterized preview.
Requires the Render addon and a renderer binary to be installed (see docs/RENDER_WORKBENCH.md); raises with install guidance otherwise. Renders in an isolated temporary document, so the live model is never modified.
view: 'iso' | 'top' | 'bottom' | 'front' | 'back' | 'left' | 'right' | 'side'. material: optional Render material library card — e.g. 'Gold', 'Glass', 'Aluminium', 'GlossyPlastic', 'RoughPlastic', 'Iron', 'Brass'. Omitted gives a neutral default material; an unknown name raises with the full list. Returns {png_base64, png_path, renderer, view, material, width, height}.
Presentation-only: output is not bit-reproducible, so it is kept out of the reliability/golden tests. External renders can take seconds to minutes, so this call uses an extended worker timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | iso | |
| width | No | ||
| handle | Yes | ||
| height | No | ||
| material | No | ||
| renderer | No | Povray |
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: it names the Render addon and renderer binary prerequisites and that it 'raises with install guidance otherwise', states the render happens in an isolated temporary document so 'the live model is never modified', warns output is 'not bit-reproducible', and discloses an extended worker timeout for slow external renders.
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 purpose and the render_view contrast, then layers prerequisites, parameter behavior, and caveats in short dense lines. Every sentence adds information (enum values, error behavior, reproducibility, timeout) with no 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 tool with six parameters and no output schema, it supplies the return dict keys ({png_base64, png_path, renderer, view, material, width, height}) plus install and timeout context, so it is nearly self-sufficient. The remaining gap is not distinguishing itself from render_photoreal_submit and not explaining the required 'handle'.
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: it enumerates the otherwise-undocumented view options ('iso'|'top'|...|'side'), lists concrete material card names with their default and error behavior, and implies renderer via 'e.g. POV-Ray'. The 'handle' and explicit 'width'/'height' semantics are left unexplained (dimensions only appear in the return shape), so 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?
States a specific verb+resource ('photorealistic render of a shaped object') and pins down the mechanism ('via the FreeCAD Render workbench ... an external renderer, e.g. POV-Ray'). It explicitly contrasts itself with the sibling 'render_view's fast software-rasterized preview', so an agent can separate it from the other render tools 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?
Gives clear selection context: choose this when a 'presentation-quality nice picture' is wanted rather than the fast preview offered by render_view. It does not, however, disambiguate the closely-named sibling render_photoreal_submit (the async variant) or state explicit when-not conditions, leaving some routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_photoreal_submitA
Start a photorealistic render asynchronously; returns immediately with {job_id, status} instead of blocking for the whole render.
Use this (rather than render_photoreal) for renders that may take a long time — heavy materials/renderers, large images — so the worker stays responsive. The external renderer runs in the background; poll render_job(job_id) until status is 'done' (then it returns the PNG) or 'failed'. Same arguments as render_photoreal; requires the Render addon + a renderer binary (see docs/RENDER_WORKBENCH.md).
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | iso | |
| width | No | ||
| handle | Yes | ||
| height | No | ||
| material | No | ||
| renderer | No | Povray |
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: it discloses the non-blocking return, that the renderer runs in the background, the terminal status values, the polling contract, and the hard prerequisites (Render addon + renderer binary, docs reference). This is exactly the behavioral context an async submission tool 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 async return, followed by usage routing and then prerequisites — a sensible ordering. It is slightly long, and the 'Same arguments' sentence earns little given the schema gap, but no sentence 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?
For an async job tool with no output schema and no annotations, the description supplies the return shape, the polling path, and prerequisites — nearly everything an agent needs to call it. The remaining weakness is that per-parameter meaning is left to a cross-reference.
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 6 parameters, so the description must compensate. It only offers 'Same arguments as render_photoreal,' deferring all semantics (what handle/view/material/renderer mean and their formats) to a sibling rather than explaining any of them 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+resource ('Start a photorealistic render asynchronously') and immediately identifies the sibling it replaces ('rather than render_photoreal'). The return shape {job_id, status} is named up front, so an agent can distinguish this from the synchronous 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?
Explicitly says when to use this instead of render_photoreal ('long renders — heavy materials/renderers, large images') and why ('keeps the worker responsive'). It also routes the follow-up action precisely: poll render_job(job_id) until 'done' or 'failed'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_viewB
Render an isometric/orthographic view of a shaped object as a PNG.
view: 'iso' | 'top' | 'bottom' | 'front' | 'back' | 'left' | 'right' | 'side'. deflection: tessellation accuracy in mm (smaller = finer mesh, slower). edges: draw triangle edges over filled faces.
Returns {png_base64, width, height, view, vertices, triangles}.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | iso | |
| edges | No | ||
| width | No | ||
| handle | Yes | ||
| height | No | ||
| deflection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add useful behavioral detail: deflection controls mesh fineness and implies a speed/quality tradeoff, edges controls overlay rendering, and the return payload is listed. It omits prerequisites (need a shaped-object handle), whether the operation is read-only, and any failure modes, so it is only partially 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 summary line is front-loaded and the parameter notes are terse and scannable. The return-value list is arguably redundant with a return payload an agent could inspect, but overall there is 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?
For a 6-parameter render tool with no annotations, 0% schema coverage, and no output schema, the description covers the most consequential rendering knobs and the return shape. It still leaves handle, width, and height undocumented in both schema and prose, so it 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%, so the description must compensate, and it explains three of six parameters (view values, deflection meaning/units/tradeoff, edges behavior). It leaves width, height, and the required handle unexplained, so the compensation is partial.
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 (render), resource (view of a shaped object), and output format (PNG). It also enumerates the projection modes, so the agent understands the intent. It does not explicitly distinguish itself from siblings like render_views, section_view, or render_photoreal, 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?
There is no statement of when to use this versus render_views (plural/multi-view), section_view (cross-section), or render_photoreal (photorealistic output). The agent must infer the distinction from the view enum alone. No prerequisites (e.g., a valid shape handle must exist) are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_viewsB
Render multiple views of a single object. Returns {views: {view_name: {png_base64,...}}}. Default views: ['iso', 'top', 'front'].
| Name | Required | Description | Default |
|---|---|---|---|
| views | No | ||
| width | No | ||
| handle | Yes | ||
| height | No | ||
| deflection | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It usefully discloses the return structure ({views: {view_name: {png_base64,...}}}) and default views, which is real behavioral information. It omits whether rendering is expensive/slow, whether it mutates state, and what happens on an invalid handle.
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, front-loaded with the action and immediately followed by the return shape and defaults. Nothing is wasted, though the return-shape detail could have been replaced by documenting the unexplained parameters.
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 compensates by describing the return shape. However, given 5 parameters at 0% coverage and no annotations, the definition is not complete enough for an agent to know what width/height/deflection do or when to prefer this over render_view.
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 5 parameters, and the description only clarifies the 'views' parameter by naming its defaults. The meaning and units of width, height, and especially deflection (0.5 default – deflection of what?) are entirely undocumented, so 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?
States a specific verb (render) and resource (multiple views of a single object), and the word 'multiple' implicitly distinguishes it from the singular render_view sibling. It does not, however, explicitly name that sibling or the photoreal rendering alternatives, 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?
There is no statement of when to use this tool versus render_view, render_photoreal, or add_thumbnail, and no prerequisites (e.g., that the handle must come from register_handle or that an object must be visible). 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.
resolve_edgeC
Resolve an edge tag to the current EdgeN index. Errors on miss or ambiguity.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full behavioral burden. It usefully discloses the error-on-miss/ambiguity contract, which is real behavioral information, but says nothing about permissions, whether the lookup is a pure read, idempotency, or what the resolved index is relative to.
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 with the action front-loaded and no filler. The brevity is appropriate in form, though the economy shades into under-specification given the missing parameter context.
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 tool with no annotations, no output schema, and two undocumented parameters, the description is too thin. It does not tell the agent what a resolved EdgeN index is used for or how it relates to handles, leaving a real gap in how 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 coverage is 0%, so the description must define both required parameters. It partially explains 'tag' as an edge tag, but 'handle' is never mentioned at all, leaving a required parameter entirely 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?
The description gives a specific verb+resource ('Resolve an edge tag') and states the outcome ('to the current EdgeN index'), which is clear enough to separate it from siblings like resolve_face and list_edges without opening a schema. It stops short of explicitly naming the sibling it complements, 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?
It states failure behavior ('Errors on miss or ambiguity') but gives no indication of when to use this over resolve_face, list_edges, or query_faces, and no prerequisites for obtaining a valid edge tag or handle. The use case is only faintly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_faceA
Resolve a face tag to the current FaceN index. Errors on miss or ambiguity.
Use this when you need to pass a (object, 'FaceN') reference into a tool that doesn't accept tags directly (e.g. legacy FEM constraints).
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| handle | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses meaningful behavioral traits: it resolves to the 'current' index and, importantly, errors on miss or ambiguity, telling the agent this is a strict lookup rather than a lenient one. It does not cover permissions or edge cases, keeping it below 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?
Two short sentences with the core action front-loaded and the usage context following. 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?
For a simple two-parameter resolve tool with no output schema and no annotations, the description covers purpose, usage condition, error behavior, and return concept. The main gap is the undocumented handle/tag parameter semantics, but overall it is adequate 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. It maps 'face tag' to the tag parameter and '(object, ...)' plausibly to the handle parameter, and clarifies the return is a current FaceN index. However, it never explicitly defines what handle is or its format, leaving the two parameters only partially documented.
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 (resolve) and resource (a face tag) with the output target ('current FaceN index'), which is clearer than a generic 'get face'. It does not explicitly differentiate itself from close siblings like resolve_edge, query_faces, or list_faces, 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 second sentence gives a concrete when-to-use condition: passing a (object, 'FaceN') reference into tools that don't accept tags, with a concrete example (legacy FEM constraints). It names no explicit when-not or named alternative, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restart_workerA
Kill the current workspace's FreeCAD worker process and spawn a fresh one. Use when the worker is wedged (e.g. App.ActiveDocument desynced from internal state). All open documents, unsaved changes, and handles in THIS workspace are lost — save first if needed. Other workspaces are untouched. Returns {restarted: True, workspace: , freecad: [...]}.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 largely meets it: it discloses the destructive consequence (all open documents, unsaved changes and handles in this workspace are lost), the isolation boundary (other workspaces untouched), and the return payload shape ({restarted, workspace, freecad}). It does not mention required permissions or how long the restart takes / whether it blocks, which are relevant for a process-killing 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?
Four short sentences, each earning its place: action, trigger, destructive warning, scope boundary, return shape. The destructive warning is placed immediately after the action rather than buried, which is the right front-loading for a restart 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?
No output schema exists, yet the description supplies the return shape, and it covers the two things an agent most needs before calling: the trigger condition and the data-loss scope. For a parameterless, irreversible operation this is complete enough to call safely.
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 and there are no parameter semantics the description could add. Nothing is missing or misleading on this dimension.
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 pair: killing the current workspace's FreeCAD worker and spawning a fresh one, with explicit scoping to 'THIS workspace' versus 'other workspaces are untouched'. An agent can distinguish this from siblings like close_workspace or ping 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?
Gives a concrete triggering condition ('Use when the worker is wedged, e.g. App.ActiveDocument desynced from internal state') and a caveat to save first. It does not name an alternative sibling (e.g. whether close_workspace/use_workspace would be a substitute), so it stops short of full when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revolveC
Revolve a sketch around a body origin axis ('X'|'Y'|'Z') by angle deg.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | Y | |
| name | No | Revolution | |
| angle | No | ||
| sketch | Yes | ||
| reversed | 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. It mentions revolving a sketch but does not disclose any behavioral traits such as whether it creates a new body, modifies an existing one, requires a closed sketch, or what happens with self-intersections. This is a significant gap 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 description is a single, front-loaded sentence that efficiently conveys the core operation without unnecessary words.
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 has five parameters, no annotations, and no output schema, the description is incomplete. It omits key details about required inputs (sketch), optional parameters (name, reversed), and behavioral aspects like whether it creates a new feature or modifies the document. More context is needed 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%, and the description only covers two parameters (axis and angle) out of five. It says nothing about sketch, name, or reversed. While it clarifies that axis expects 'X', 'Y', or 'Z', the schema already provides those as strings (though without enum). The description does not compensate for the missing 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?
The description states a specific verb (revolve) and resource (a sketch around an axis), and specifies the axis options ('X'|'Y'|'Z') and the angle parameter. This distinguishes it from siblings like sweep or pad, but it doesn't explicitly name the sibling differences.
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 guidance on when to use this tool versus alternatives like sweep, loft, or pad. The context of creating a revolved feature is implied, but there are no explicit conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rigid_sphere_scatteringA
Exact rigid-sphere plane-wave scattering far-field form function via the Mie
series (NO solver) — the closed-form twin the Bempp exterior-acoustics BEM
scattering solve (acoustic_radiation_submit, problem='scattering') is gated
against. For compactness ka and scattering angle theta_deg (from the forward
direction; 180° is backscatter), f∞(θ) = (2/ika)·Σₙ(2n+1)[−j'ₙ(ka)/h'ₙ(ka)]·
Pₙ(cosθ) — a rigorous spherical-harmonic sum (Neumann ∂p/∂r=0 on the sphere)
truncated past convergence (fidelity='exact'). The backscatter |f∞(π)| → 1 in
the geometric (ka≫1) limit and rises through the resonance region. A BEM
scattered far field must land on |f∞(θ)|.
Returns {ka, theta_deg, a_m, form_function_abs, form_function_re, form_function_im, backscatter_abs, n_terms, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| ka | Yes | ||
| a_m | No | ||
| theta_deg | 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 this is a closed-form analytic computation with 'NO solver', truncation 'past convergence', fidelity='exact', and the physical behavior of the backscatter limit. It also signals diagnostics surface via returned fields (valid_range_ok, warnings, escalate_to), though permission/auth or range-limit behavior is not 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 purpose and the sibling relationship are front-loaded, but the large inline LaTeX Neumann-series formula does little to help an agent select or invoke the tool, and the prose is dense. The formula and physical-limit sentences occupy space that does not earn its place for tool-selection purposes.
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 analytic physics tool with no output schema and no annotations, the description is fairly complete: it lists the returned fields, states the exactness/truncation guarantee, and exposes diagnostics like warnings and escalate_to. Minor gaps remain around valid ranges and the unexplained `a_m` input.
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 3 params, so the description must compensate. It explains `theta_deg` well (measured from the forward direction, 180° is backscatter) and implies `ka` is the size parameter, but `a_m` is only visible in the return list and never defined as an input, leaving one of three parameters 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?
The description states a specific verb+resource — computing the exact rigid-sphere plane-wave scattering far-field form function via the Mie series — and explicitly positions it as the closed-form twin the BEM solve (`acoustic_radiation_submit`, problem='scattering') is gated against. An agent can tell this apart from the solver-based sibling 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?
It establishes the relationship to the BEM scattering solve ('the ... twin the ... BEM solve is gated against') and notes that 'A BEM scattered far field must land on |f∞(θ)|', which implies the verification use case. However, it never states when an agent should call this versus `acoustic_radiation_submit`, or any exclusions — the 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.
run_scriptA
Escape hatch: execute Python in the worker with App/Part/ObjectsFem in scope.
Set __result__ in the script to return a JSON-serializable value.
auto_register (default True): any new shape-bearing object the script
creates is automatically registered into the handle table. The result
includes a registered list of {handle, name, type} entries so the next
tool call (render_view, list_faces, fillet_edges, mass_properties, etc.)
can address script-created objects via handle without a separate
register_handle round-trip.
Returns {result, registered}.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| auto_register | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description bears the full burden and does well: it discloses the arbitrary-code-execution nature, the scope variables available, the __result__ convention, the auto-registration side effect, and the exact return shape {result, registered}. It omits sandboxing/timeout/error-handling behavior, which is the main residual 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-loaded with the defining 'Escape hatch' phrase, then the result convention, then the auto_register behavior. Every sentence earns its place, though the explanation of the registered-list rationale is somewhat verbose relative to its 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?
With no output schema, the description correctly spells out the return value, along with the in-scope names and the handle-registration workaround. For a code-execution tool this is nearly complete; only error/failure semantics and any execution limits are 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 coverage is 0%, so the description must carry parameter meaning. It fully explains auto_register (default True, side effect, resulting `registered` list), and the `code` parameter's contract is conveyed via 'execute Python' plus the `__result__` convention. Only minor gaps (no typing/format rules for code) remain.
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 (execute Python) plus the exact execution context (in the worker with App/Part/ObjectsFem in scope), and frames it as an 'Escape hatch' to distinguish it from the many dedicated feature tools. An agent immediately knows what it does and why it exists.
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 'Escape hatch' label strongly implies this is the fallback when dedicated tools (fillet_edges, pad, etc.) don't cover the case, and the description explicitly names follow-on tools that consume its output. It lacks an explicit when-not statement, but the positioning as a last resort is clear enough to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_documentA
Save the active document to the given .FCStd path.
visibility_hygiene (default True): before saving, hide any object that has been consumed as a producer-input (the Base/Tool of a Cut, the BaseFeature of a Body, every feature inside a Body's Group, etc.). Without this the re-opened doc double-renders intermediates on top of the final shape — a failure mode that looks identical to broken geometry. Pass False to keep explicit set_visibility overrides intact.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| visibility_hygiene | 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. It does well by disclosing a non-obvious side effect: visibility_hygiene hides consumed producer-input objects before saving to prevent double-rendering on reopen, and explains the failure mode. It does not mention overwrite behavior, permissions, or error handling, so it is not complete.
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 structured into a clear parameter explanation with a concrete failure mode. Every sentence contributes useful information, though the explanation is somewhat long, which is justified by the non-obvious behavior.
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 no output schema, the description covers the key purpose and the important visibility side effect thoroughly. It still lacks contextual details about overwriting existing files, permissions, or return behavior, but it is largely complete for an agent 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. It thoroughly explains visibility_hygiene: its default, what it hides, why it matters, and when to pass False. The path parameter is only partially covered as 'the given .FCStd path,' but its meaning is largely inferable from the schema type and 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 description states a specific verb and resource: 'Save the active document to the given .FCStd path.' It is clear what the tool does. However, it does not differentiate itself from similar siblings such as export_shape or close_document, so it misses 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?
There is no explicit guidance on when to use save_document versus alternatives like export_shape, close_document, or transaction_commit. The description only explains a parameter's behavior, not when this tool should be selected over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scaffold_projectA
Lay out a well-formed project in one call (issue #143 / D1) — promote the MULTI_AGENT.md §3/§7 directory convention to a primitive. Creates the convention directories (components/, .dp_lib/), an item registry (items.json, #140), a seed assembly manifest from the supplied components/instances, and the project.json container that ties them together. The result loads clean and merge_assembly consumes it unchanged once its components resolve.
base_dir: the project root directory (created if absent). name: the project id (naming-convention checked). components/instances/shared_parameters: the assembly manifest content. master: optional component id to record as the master/skeleton single-source-of- truth slot (the lean interface-geometry skeleton children mate against). items: optional {item_id: {files?, metadata?}} to seed the item registry with.
Returns the layout {project_file, manifest, registry, components_dir, lib_dir, lockfile, master, dirs}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| items | No | ||
| master | No | ||
| base_dir | Yes | ||
| instances | No | ||
| components | No | ||
| shared_parameters | No |
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 that base_dir is created if absent and that the name is naming-convention checked, which are useful behavioral facts. It does not state whether the operation is idempotent, what happens if files already exist, required permissions, or failure modes for a multi-file creation 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 description is front-loaded with the purpose and a bullet-like listing of parameters, which is good structure. However, it is somewhat verbose with references to internal issue numbers (#143, #140, D1) and MULTI_AGENT.md sections that are opaque to an external agent.
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 seven-parameter, multi-artifact creation tool with no output schema and no annotations, the description does a reasonable job explaining the created layout and parameter meanings. It omits failure handling, idempotency, and interaction with existing project files, leaving gaps an agent would need to know before calling in a non-empty directory.
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 meaningfully annotates five of the seven parameters: base_dir (created if absent), name (naming-convention checked), master (semantics of the master slot), items (expected shape), and components/instances/shared_parameters (assembly manifest content). Only limited detail is given for the exact shapes of components and shared_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 opens with a specific verb and resource ('Lay out a well-formed project in one call') and then enumerates exactly what artifacts it creates (components/, .dp_lib/, items.json, seed assembly manifest, project.json). It clearly distinguishes itself from siblings like merge_assembly and project_validate by describing creation of a project scaffold.
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 hints at downstream usage ('the result loads clean and merge_assembly consumes it unchanged once its components resolve'), which gives some context for when this tool fits in a workflow. However, it never explicitly says when to use this versus alternatives like new_document, open_document, or items_new, nor does it state prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scale_shapeA
Scale a shape uniformly or per-axis, baking a fresh static solid.
Scaling breaks parametric history, so this produces a standalone Part::Feature (not a linked/parametric feature); the source object is hidden since its geometry is consumed into the scaled copy.
handle: source shape handle. factor: scalar for uniform scale, or [sx, sy, sz] for per-axis scale. All factors must be > 0. center: optional [x, y, z] mm pivot to scale about; when omitted the scale is about the world origin (so the shape also moves away from/toward origin). name: object label (default 'Scaled').
Lengths in mm. Returns {handle, name, volume, factor} where factor is the
normalized [sx, sy, sz] applied and volume (mm^3) equals the source volume
times sxsysz.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Scaled | |
| center | No | ||
| factor | Yes | ||
| handle | Yes |
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 that parametric history is broken, the source object is hidden and consumed, the output is a static Part::Feature, omission of center scales about the world origin and moves the shape, and factor values must be greater than zero.
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 critical side effects, then uses a compact parameter list. Every sentence adds necessary information for correct invocation, and the return-value note is concise and useful given the absence of an 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-parameter CAD mutation tool with no annotations, no output schema, and 0% schema description coverage, the description supplies the missing parameter semantics, side effects, unit conventions, and return shape. An agent has enough context 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 description coverage is 0%, so the description must compensate, and it does: handle, factor (scalar or per-axis with positive constraint), center (pivot behavior and default origin behavior), and name (default label) are all explained. It also adds units in mm and clarifies the normalized return factor.
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 (scale) and resource (shape), with the modality 'uniformly or per-axis, baking a fresh static solid.' It also distinguishes the result from linked/parametric features, so an agent can tell it apart from general transform or copy operations 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 gives clear context for when this tool is appropriate by explaining that scaling breaks parametric history and produces a standalone Part::Feature while hiding the consumed source. It does not explicitly name alternatives such as transform or copy_shape, so it falls short of full when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
seal_checkA
Rate an O-ring gland (pairs with oring_groove): squeeze=W-depth, fill= (pi/4 W^2)/(width*depth). Squeeze must sit in the application band (static 15-30%, dynamic 10-20%), fill below max_gland_fill_pct. Returns {squeeze_mm, squeeze_pct, gland_fill_pct, squeeze_range_pct, within_squeeze, within_fill, pass}.
| Name | Required | Description | Default |
|---|---|---|---|
| application | No | static_radial | |
| groove_depth_mm | Yes | ||
| groove_width_mm | Yes | ||
| max_gland_fill_pct | No | ||
| cross_section_dia_mm | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the computation (squeeze=W-depth, fill formula), the pass criteria, and the exact return fields, implying a deterministic read-only check. It stops short of explicitly confirming no side effects, but the behavioral picture is largely 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?
Dense but well front-loaded: purpose, formula, acceptance criteria, then return shape. Nearly every clause earns its place, though the notation is terse enough to require careful reading.
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, but the description enumerates the returned fields (squeeze_mm, squeeze_pct, gland_fill_pct, squeeze_range_pct, within_* flags, pass), which is enough to interpret results. Only the application-selection semantics remain slightly under-specified.
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 explains the squeeze/fill relationships, the meaning of max_gland_fill_pct as a threshold, and supplies valid 'application' bands. It falls short of mapping symbols to exact parameter names like cross_section_dia_mm or groove_depth_mm.
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 ('Rate an O-ring gland') and explicitly names the sibling it pairs with ('pairs with oring_groove'), letting an agent distinguish it from groove-creation tools 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 gives the acceptance bands (static 15-30%, dynamic 10-20%) and mentions pairing with oring_groove, which implies context, but it never states when to call this versus alternatives or what prerequisites (e.g. an existing groove) must hold.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
section_viewA
Cut a solid with a plane and return the cross-section it exposes. This is the best way to "see inside" a part blind: it measures the cut area and its extent, and can optionally emit the section outline as a new object for rendering/export. Units: mm (lengths), mm^2 (areas).
handle: the solid to slice (a AnkusDrive handle). plane: "XY", "XZ", or "YZ" (world datum planes) OR a datum-plane handle. World normals follow FreeCAD: XY -> +Z, XZ -> -Y, YZ -> +X. A datum handle uses its local +Z as the cutting normal. offset: shift of the cutting plane along its normal, in mm (default 0 = the plane through the world origin / datum origin). E.g. plane="XY", offset=10 cuts at z=10. emit_profile: when True, add a Part::Feature holding the section wires to the document, register it, and return its handle (raises if the plane misses the shape). Default False = measure only, no new geometry. name: object name for the emitted profile (only used when emit_profile=True).
Does not modify the input geometry. Returns a dict: plane: str (echoed), offset_mm: float (echoed), normal: [x, y, z] unit cutting-plane normal, section_area_mm2: float — total area of the closed cross-section wires, wire_count: int — number of section wires found (0 means the plane misses the shape), closed_wire_count: int — how many of those wires are closed, bbox: {min:[x,y,z], max:[x,y,z], size:[dx,dy,dz]} of the section, or None when the plane misses the shape, handle: str — handle of the emitted profile (ONLY when emit_profile=True), name: str — its FreeCAD object name (ONLY when emit_profile=True).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Section | |
| plane | No | XY | |
| handle | Yes | ||
| offset | No | ||
| emit_profile | 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 so well: it states the input geometry is not modified, that emit_profile adds a registered Part::Feature to the document, that the call raises when the plane misses the shape, and that wire_count=0 signals a miss. It also declares units (mm, mm^2) and describes the return dict field-by-field.
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 action and units are front-loaded, then parameters, then return shape — a sensible order with labelled blocks. It is long, but with no output schema and no annotations almost every line earns its place; only the exhaustive return-field listing borders on over-specification.
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 geometry tool with zero annotation coverage, no schema descriptions, and no output schema, the description supplies everything an agent needs: purpose, parameter semantics, side effects, error condition, units, and a complete return contract.
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 and it does: every one of the five parameters is explained, including accepted plane values, the FreeCAD world normals for each plane, the semantics of a datum handle's local +Z, the meaning of offset relative to the origin, and that name is only used when emit_profile=True.
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 concrete verb+resource: 'Cut a solid with a plane and return the cross-section it exposes,' which precisely names the operation and output. It is clearly distinct from measurement siblings like bounding_box or mass_properties. However, it never differentiates itself from the sibling add_section_view (a drawing-oriented section tool), leaving an agent to guess which section tool applies.
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 clear use context ('the best way to "see inside" a part blind') and distinguishes the two modes — measure-only (emit_profile=False) vs. emit geometry for rendering/export (emit_profile=True). No explicit exclusions or named alternatives are given, so it stops short of the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_active_documentA
Switch the active document by name (the value returned from new_document/open_document).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
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. 'Switch the active document' clearly communicates a state mutation, but it does not describe what happens to the previously active document, whether the name must reference an existing document, or error/return 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 description is a single, front-loaded sentence with no wasted words. The core action is stated first, and the parenthetical clarifies the parameter source efficiently.
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 state-switch tool, the description covers purpose and parameter origin. However, with no annotations and no output schema, it omits error behavior and what happens to the previously active document, leaving 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?
The schema has 0% description coverage for the single required 'name' parameter, so the description must compensate. It does so by specifying that the value should come from new_document/open_document, adding essential meaning beyond the bare string type.
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: 'Switch the active document.' It also clarifies the required identifier by tying it to the values returned from new_document/open_document, which distinguishes this from document creation or opening tools.
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 identifies the source of the name parameter as the return value of new_document/open_document, implying the prerequisite context. However, it does not explicitly state when to use this tool versus alternatives such as open_document or new_document, nor does it describe conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_propertyB
Set a single property by name on an object. Coerces lists → Vector for Vector properties; other values pass through.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| value | Yes | ||
| handle | Yes |
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 a genuine behavioral trait beyond the schema — list values are coerced to Vector for Vector properties and other values pass through — which is useful. But it omits error behavior, whether the property must pre-exist, permission requirements, and reversibility of a 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?
Two short sentences, front-loaded with the core action and followed by the one non-obvious behavior. No padding, though the brevity is at the edge of under-specification rather than being exemplary economy.
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 zero annotations, no output schema, and 0% schema description coverage needs the description to fill more gaps than it does. Nothing is said about return value, failure modes, or valid object/property states, leaving the agent under-informed for a write 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. It partially does: 'by name' clarifies the name parameter identifies the property, and the coercion sentence explains how the value parameter is interpreted. The handle parameter and value type constraints remain unexplained, so compensation is only partial.
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 ('Set a single property by name on an object') and scopes it to one property per call. It does not, however, name or differentiate from any sibling (e.g., get_object, transform, boolean_op), so the agent must infer where this fits in the CAD/geometry toolset.
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 versus alternatives, no prerequisites (e.g., object must exist or handle must be registered), and no mention of any related tool. The agent gets no routing guidance at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_title_blockA
Populate the drawing's title block. FreeCAD's default template is a bare sheet, so AnkusDrive composes its own block in the bottom-right corner on SVG/PDF export. Scale, sheet size, units, and part name are auto-derived from the page; the fields here override or add to them (a machinist needs material + scale + units to cut from the sheet). Calling this opts the page into rendering the block. Returns {handle, name, fields}.
| Name | Required | Description | Default |
|---|---|---|---|
| rev | No | ||
| date | No | ||
| page | Yes | ||
| part | No | ||
| units | No | ||
| project | No | ||
| drawn_by | No | ||
| material | 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 non-obvious behavior: the block is composed by AnkusDrive rather than the bare default template, it only renders on SVG/PDF export, and calling the tool is what enables rendering. It omits whether the call is idempotent or what happens to previously set 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-loaded with the core action and the export/rendering constraint immediately after; the machinist rationale is a mild flourish but it justifies the field set, and the return-shape note is placed last. Only slight trimming would help.
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 8-parameter tool with no annotations and no output schema, the description covers the important gaps: export-time behavior, auto-derivation vs override semantics, and the return shape {handle, name, fields}. It stops short of explaining required-ness of page or the drawing-workflow prerequisites.
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 8 parameters, so the description must compensate. It adds real meaning by explaining that scale/sheet size/units/part name are auto-derived and that the provided fields override or supplement them, and it names material/units/part explicitly, but rev, date, project, drawn_by and the required page parameter are never characterized.
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 (populate) and resource (the drawing's title block in the bottom-right corner on SVG/PDF export), and the AnkusDrive/FreeCAD framing distinguishes it from the generic drawing siblings like add_annotation or add_dimension.
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?
Clearly states the context of use (a machinist needs material + scale + units to cut from the sheet) and the key condition that calling it opts the page into rendering the block, but never says when NOT to call it or how it relates to export_drawing/fit_page sequencing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_statusA
The machine-readable form of ankusdrive doctor — resolve FreeCAD and every
solver family and report, per item, found/missing with the exact fix. Call this
when the user asks to set up, diagnose, or finish installing AnkusDrive, then walk
them through the per-item fix/install_hint commands for their platform.
Read-only and side-effect-free: nothing is executed or installed and no
environment is mutated (verify_freecad_boot=True additionally boots FreeCAD
once, time-boxed, purely to read back its version — leave it False unless the
user doubts the install actually runs).
Returns {platform: {system, machine}, freecad: {available, path, source,
version?, fix?}, install: {kind, source} (venv | pipx | uv_tool | uvx | mcpb —
the install every fix string is written for), solvers: {available, unwired, prepared_case_only, solvers:
{name: {..., install_hint | wire_hint}}, families: {family: {solvers, available,
unwired, prepared_case_only, any_available}}, extras}} —
families[*].any_available is what gates each *_submit family, and every
unavailable item carries its own fix string. A solver under
prepared_case_only resolves but no AnkusDrive tool can build it a case, so it
does not make its family available (SU2/cfd — issue #237).
| Name | Required | Description | Default |
|---|---|---|---|
| verify_freecad_boot | 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 so well: declares read-only, side-effect-free behavior, explains the verify_freecad_boot side effect (boots FreeCAD once, time-boxed, purely to read version), and warns to leave it False unless the user doubts the install runs.
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-structured with clear sections (purpose, when-to-call, behavioral note, return shape), but the return-shape enumeration is dense and long. Still, every sentence earns its place for a diagnostic tool whose output contract matters.
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 output schema, the description fully documents the return shape including nested solver/family structures and the gating field (families[*].any_available), plus the prepared_case_only nuance with the SU2/cfd issue reference. Complete enough to call and interpret 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% and the single parameter verify_freecad_boot has no schema description, so the description must compensate — and it does, defining the default (False), the exact side effect, and the condition under which to enable it.
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 — 'machine-readable form of ankusdrive doctor' that resolves FreeCAD and solver families and reports found/missing per item. This is clearly distinguished from siblings like ping, version, or solve_capabilities.
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 says 'Call this when the user asks to set up, diagnose, or finish installing AnkusDrive' and describes the follow-up workflow (walk through fix/install_hint per platform). Provides clear when-to-use context with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_visibilityA
Override an object's persistent Visibility flag. By default save_document auto-hides producer-inputs (the Base/Tool of a Cut, features inside a Body) so the re-opened doc shows just the final composition. Use this to override — e.g. to keep a reference primitive visible next to a derived part. Note that the next save_document with visibility_hygiene=True (the default) may re-hide it; pass visibility_hygiene=False to save_document to lock the override in.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| visible | Yes |
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 well: it discloses that the flag is persistent, that save_document auto-hides producer-inputs by default, that a subsequent hygienic save may re-hide the object, and how to lock the override in (visibility_hygiene=False). It omits auth/permission requirements and what happens on an invalid handle, but the key survival-of-visibility behavior is 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?
Three front-loaded sentences with zero waste. The core action comes first, then the default behavior it overrides, then the caveat and remedy. 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?
For a simple two-parameter, no-annotation, no-output-schema tool, the description supplies the important behavioral context an agent needs: the persistence semantics and the re-hiding risk with its workaround. The only real gap is parameter documentation, which the schema also fails to provide.
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 the parameters, and it does not. It never explains that 'handle' identifies the target object, what form a handle takes, or that 'visible' selects the desired state. The surrounding context implies these roles but does not document them, leaving both required parameters semantically bare.
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: 'Override an object's persistent Visibility flag.' Distinguishes itself functionally by tying its purpose to save_document's auto-hide behavior, so an agent can see it is not a generic property setter. It stops short of naming an alternative tool explicitly, but the role 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?
Explicitly says when to use it ('Use this to override — e.g. to keep a reference primitive visible next to a derived part') and warns about the interaction with save_document's default visibility_hygiene=True. It does not state hard exclusions or prerequisites, but the context is clear enough to select it over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_baseA
Start a sheet-metal part: the base flange, a closed straight-sided profile
extruded to thickness_mm. Everything else (flanges, tabs, hems, the flat
pattern, the DXF) hangs off the handle this returns.
profile: [[x, y], ...] in the XY plane, implicitly closed. sketch: alternatively a handle to a closed, planar, straight-sided sketch — on any plane. Arcs are REJECTED rather than silently faceted, because a faceted flat pattern is a wrong flat pattern. material: any Materials-DB name (e.g. "Steel-A36", "AL6061-T6", "SS304"); it selects the K-factor and minimum-bend-radius corpus rows.
IMPORTANT — the profile is the flat face TANGENT TO TANGENT, not the outside dimension. Bends grow OUTWARD from the profile boundary, exactly as a base flange behaves in any sheet-metal CAD, so a U-channel of 100 mm outside width with R = t = 2 starts from a 92 mm profile.
The bend model lives alongside the handle for the life of the worker session, like every other handle: unfolding is a property of the FEATURE TREE, not of the fused solid, so a part reopened from disk in a new session is a solid rather than a sheet part. Cutting one (boolean_op cut, e.g. to drill it) keeps it a sheet part; fusing arbitrary material onto it does not.
Returns {handle, name, volume, thickness_mm, material, profile, area_mm2}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | SheetBase | |
| sketch | No | ||
| profile | No | ||
| material | No | ||
| thickness_mm | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden and does so thoroughly. It explains arc rejection, bend-model session persistence, why reopening from disk loses sheet-part status in a new session, and how boolean cut versus fuse affects the sheet feature.
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 lengthy but appropriately sized for a complex sheet-metal starting feature. It is front-loaded, structured by parameter labels and an IMPORTANT design note, and every paragraph adds distinct 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?
It covers purpose, input alternatives, material selection behavior, critical tangent-to-tangent geometry, session persistence caveats, and return fields. Only the precedence when both profile and sketch are supplied is unstated, which is minor against the description's overall completeness.
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 strongly does for profile, sketch, material, and thickness. It does not explain the name parameter, leaving one of five parameters to its schema default and title.
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: 'Start a sheet-metal part: the base flange' and clarifies this is a closed profile extruded to thickness. It distinguishes itself from sibling sheet-metal features by saying flanges, tabs, hems, the flat pattern, and DXF all hang off the returned handle.
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 explicitly frames this as the starting operation and explains the two input paths: profile or sketch, with sketch arcs rejected rather than faceted. It also specifies material naming and states that downstream sheet-metal features follow from the returned handle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_checkA
Press-brake manufacturability screen for a sheet part — four rules, each with the number it came from:
min_bend_radius — an inside radius below the material's minimum (a corpus value per material: 3t for 6061-T6, 1t for A36, 0.5t for annealed 1100) cracks the outer fibre. min_flange_length — an outer leg under 4t + R has no die shoulder to sit on and dives into the vee. hole_to_bend — a hole whose EDGE is nearer the bend tangent than 2t + R draws into an oval. Holes are read off the real solid, not declared. refold_collision — two features that occupy the same space once folded, found by actually intersecting them rather than by a rule.
A hem is screened as a two-hit hem (bend, then flatten) and exempted from the air-bend radius and flange rules, which would otherwise fail every hem ever drawn. A flat pattern whose feature footprints overlap is a finding too, not a warning dropped on the floor. An unrecognised material degrades to a bend-class fallback WITH an info finding saying so, rather than skipping the rule silently.
min_flange_t / hole_to_bend_t: override the thresholds (multiples of thickness).
fidelity='correlation' with band_pct=None — these are press-brake rules of thumb, thresholds for ranking and gating rather than measured predictions.
Returns {ok, findings, fail_count, rules, min_bend_radius_mm, min_bend_radius_source, flat_size, blank_area_mm2, k_factors, thickness_mm, material, fidelity, band_pct}. Each finding carries {code, severity, message} plus the measured value and the limit it missed.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| k_factor | No | ||
| bend_table | No | ||
| min_flange_t | No | ||
| hole_to_bend_t | 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 richly: it discloses how hems are screened (two-hit, exempted from air-bend rules), that overlapping flat-pattern footprints are reported as a finding rather than dropped, and that an unrecognized material degrades to a bend-class fallback WITH an info finding rather than silently skipping. It also states fidelity semantics ('correlation', band_pct=None means ranking/gating, not measured predictions).
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 long but front-loaded and organized as a labeled rule list followed by exceptions, overrides and the return shape, so each sentence adds information. It is close to the upper bound of acceptable length, with some minor redundancy between the rule bullets and the explanatory paragraph.
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, but the description enumerates the return object fields and the per-finding shape, and it covers rule behavior, exceptions and degradation paths thoroughly. The remaining gaps are the unexplained k_factor/bend_table parameters and the meaning of handle.
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, yet only min_flange_t and hole_to_bend_t are explained ('multiples of thickness'). The non-obvious k_factor and bend_table parameters are left completely undefined, and handle is not described as a part/geometry reference, leaving a substantial gap for a 5-param tool.
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: a 'press-brake manufacturability screen for a sheet part,' and enumerates the four concrete rules (min_bend_radius, min_flange_length, hole_to_bend, refold_collision) it applies. This distinguishes it from generic siblings like dfm_check, plate_check, and the sheet_* geometry family, so an agent can route to 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?
Usage is implied — the tool is a pre-manufacturing screen applied to a sheet part — but there is no explicit when-to-use/when-not guidance or a named alternative (e.g., dfm_check vs this). The description clarifies internal rule conditions and the hem exemption, which is useful, but does not tell the agent when to prefer this tool over its many checking siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_flangeA
Bend a flange off a free edge of a sheet part.
edge: a stable e_* tag from list_edges (or 'EdgeN'/int) on a STRAIGHT free edge
of a flat region — a bend line is the intersection of two planes, so an arc
cannot carry one and is rejected.
angle_deg: the bend angle, i.e. the deviation from flat, so 90 is a right-angle
flange. Must be in (0, 180].
inner_radius_mm: inside bend radius; defaults to the material thickness.
direction: 'up' (toward the region's outward normal) or 'down'.
length_from: what length_mm measures — the number most often misread on a
sheet drawing. 'outer' (default) to the outside virtual apex, which is what
a drawing dimension normally means; 'inner' to the inside apex; 'tangent'
for the straight leg past the end of the bend.
width_mm / offset_mm: narrow the flange to part of the picked edge.
k_factor: pins K for THIS bend only. Leave it unset and the choice defers to
sheet_unfold — the folded solid does not depend on K at all, only the flat
pattern does.
Consumes the input handle (it is hidden, having become part of the result).
Returns {handle, name, feature, kind, volume, angle_deg, inner_radius_mm, leg_tangent_mm, length_from, direction, span_mm, thickness_mm}.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | Yes | ||
| name | No | SheetFlange | |
| handle | Yes | ||
| k_factor | No | ||
| width_mm | No | ||
| angle_deg | No | ||
| direction | No | up | |
| length_mm | Yes | ||
| offset_mm | No | ||
| length_from | No | outer | |
| feature_name | No | ||
| inner_radius_mm | 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 discloses that the input handle is consumed and hidden, lists the exact return object fields, explains that k_factor affects only the flat pattern (deferring to sheet_unfold), and states edge rejection rules. This is unusually rich behavioral disclosure for a CAD feature 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 description is front-loaded with the core action, then organized as a parameter reference, and ends with consumption and return details. Every sentence adds distinct value, and despite its length it remains tightly focused with no 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?
Given 12 parameters, no schema descriptions, no annotations, and no output schema, the description is quite complete: it explains the operation, most parameters, the consumed handle, and the return shape. It still lacks explicit sibling-tool usage guidance and prerequisites (e.g., transaction state), so it is not exhaustive.
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. It gives meanings and constraints for edge, angle_deg, inner_radius_mm, direction, length_from, width_mm/offset_mm, and k_factor. A few parameters (handle, name, feature_name, length_mm itself) are only lightly or indirectly covered, so it is not 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 description states a specific verb and resource: 'Bend a flange off a free edge of a sheet part.' It is clear what the tool does and the domain (sheet metal). However, it does not explicitly distinguish the tool from sibling sheet-metal features like sheet_hem or sheet_tab, 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 provides an implied usage condition: the edge must be a straight free edge of a flat region, and arcs are rejected. This gives useful context for when the tool can be applied. But there is no explicit guidance on when to choose sheet_flange over alternatives such as sheet_hem or sheet_tab, nor any when-not-to-use statement beyond edge validity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_flat_exportA
Write the flat pattern as a LAYERED DXF — the file a laser, punch or press-brake shop actually quotes and cuts from. This is the deliverable the whole sheet-metal family exists to produce.
Three layers, because a flat pattern without them is not a shop deliverable:
CUT carries the closed outer profile and every hole; BEND_UP and BEND_DOWN carry
one centreline per bend, so the operator reads the fold direction off the print
rather than inferring it. DXF R12 ASCII in millimetres, written directly rather
than through TechDraw — a flat pattern is not a drawing view and does not want a
sheet frame, a scale or a title block around it. path must end in .dxf.
Takes the same k_factor / bend_table arguments as sheet_unfold, since the outline it writes IS the development.
Returns {ok, path, size, layers, entities, flat_size, blank_area_mm2, bends (with bend_allowance_mm, bend_deduction_mm, k_factor and k_source per bend), fidelity, band_pct, warnings}.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| handle | Yes | ||
| k_factor | No | ||
| bend_table | 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 much of it: DXF R12 ASCII, millimetre units, writing directly rather than through TechDraw, layer write semantics, and a full return-field breakdown. It does not address file-overwrite behavior, permissions, or failure modes, 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?
Front-loaded with the core verb and artifact, then structured into layer/DXF/parameter/return blocks. A few marketing-flavoured clauses ('the deliverable the whole sheet-metal family exists to produce') are expendable but the bulk 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?
There is no output schema, and the description compensates by enumerating the return object (path, size, layers, entities, flat_size, bends, k_factor, fidelity, warnings). The unresolved gaps are the undocumented `handle` argument and absent overwrite/error behavior, so it is strong but not fully 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 coverage is 0%, so the description must compensate. It adds the .dxf path constraint and cross-references k_factor/bend_table to sheet_unfold, which is useful, but `handle` is never explained and the cross-reference is indirect rather than defining the arguments.
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?
It names a specific verb+resource (write the flat pattern as a layered DXF) and frames the deliverable distinctly from the broader drawing/export siblings such as export_drawing and export_shape. The layer contract (CUT, BEND_UP, BEND_DOWN) further pins down what the artifact is.
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 situates the tool as the terminal deliverable of the sheet-metal family and notes the `path` must end in .dxf, plus that k_factor/bend_table behave as in sheet_unfold. However, it never says when NOT to use it (e.g. versus export_shape for a generic solid export), so exclusions are left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_hemA
Fold a hem back on itself — the 180-degree return that stiffens a free edge and buries the sharp cut line so the part is safe to handle.
kind: 'closed' (inside radius t/2, gap t) or 'open' (radius t, gap 2t). radius_mm / gap_mm: override the style directly; the gap between the returned leg and the parent is exactly 2R, so gap wins as radius = gap/2.
length_mm is ALWAYS the return leg measured from the end of the bend: a 180-degree bend has no virtual apex to dimension to — the outside surfaces are parallel and never meet — so an 'outer' dimension would be infinite. For the same reason a hem reports a bend allowance but no bend deduction, and sheet_check screens it as a two-hit hem (bend, then flatten in a hemming die) exempt from the air-bend radius and flange rules. A teardrop hem wraps past 180 degrees and is out of scope.
Returns the same dict sheet_flange does, plus {hem_kind, gap_mm}.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | Yes | ||
| kind | No | closed | |
| name | No | SheetHem | |
| gap_mm | No | ||
| handle | Yes | ||
| width_mm | No | ||
| direction | No | up | |
| length_mm | Yes | ||
| offset_mm | No | ||
| radius_mm | No | ||
| feature_name | 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 substantial work: it explains that length_mm is always the return leg, that no bend deduction is reported, and that sheet_check treats this as a two-hit hem exempt from air-bend rules. It also states the return shape includes {hem_kind, gap_mm}, though it does not discuss document mutation or handle lifecycle.
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 with the conceptual meaning of a hem, then moves to parameter overrides and geometric consequences. It is dense but each sentence adds domain-specific value, with no obvious 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 an 11-parameter tool with no annotations, no schema descriptions, and no output schema, the description is strong on hem semantics and return values. However, it does not cover several required or common parameters such as handle, edge, width_mm, direction, and offset_mm, leaving meaningful 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%, so the description must compensate. It adds important meaning for kind, radius_mm, gap_mm, and length_mm, but leaves edge, handle, width_mm, direction, offset_mm, name, and feature_name 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?
The description opens with a precise verb and resource: 'Fold a hem back on itself — the 180-degree return...'. It clearly distinguishes this from a generic bend and from siblings by naming sheet_flange and sheet_check, and by declaring teardrop hems out of scope.
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 two supported hem styles, how radius_mm and gap_mm override style, and that a teardrop hem is out of scope. It also situates the tool relative to sheet_check, though it does not explicitly say when to choose a hem over a flange in general.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_refoldA
Fold a flat pattern back up and check it reproduces the part — the other half of the unfold gate.
This does NOT replay the feature model. It reads the flat pattern back: each leg length is measured off the flat outline, walking outward from the bend's attachment past its reported bend allowance to the far edge of that region. So a wrong allowance, angle or bend direction lands the refolded solid somewhere the original is not, and this reports the disagreement instead of hiding it.
handle: a sheet part to unfold and then refold.
flat: alternatively a sheet_unfold report, to refold a development produced
elsewhere (or a deliberately corrupted one, to prove the check bites).
compare: the handle to check against; defaults to handle, and is skipped when
only flat is given.
volume_tol_pct / bbox_tol_mm: agreement tolerances.
Note the round trip that is meaningful and the one that is not: refold-vs-folded must match, but flat-vs-folded VOLUME must not, and does not. Bending preserves neutral-fibre length, not material volume — a bend sector's true volume is angle·t·(R + t/2)·w while its flat footprint is angle·(R + K·t)·t·w, and those agree only at K = 0.5.
Returns {handle, name, volume_mm3, bbox, bends, compare?} where compare is {handle, matches, volume_mm3, volume_error_pct, bbox_max_error_mm, tolerance}.
| Name | Required | Description | Default |
|---|---|---|---|
| flat | No | ||
| name | No | SheetRefold | |
| handle | No | ||
| compare | No | ||
| k_factor | No | ||
| bend_table | No | ||
| bbox_tol_mm | No | ||
| volume_tol_pct | 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 discharges it well: it discloses that this does NOT replay the feature model, that it measures leg lengths off the flat outline, that it reports disagreement rather than hiding it, and it warns about the meaningful vs meaningless round trip (volume must not match). This is unusually rich behavioral disclosure for a mutation/verification 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-loads the purpose in one sentence and uses short paragraphs, each earning its place. It is somewhat long with a dense physics digression, but the structure keeps it navigable and nothing is irrelevant.
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?
Despite no annotations and no output schema, the description spells out the return shape ({handle, name, volume_mm3, bbox, bends, compare?} with the compare sub-fields) and the tolerance defaults. For an 8-parameter tool this is complete enough 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?
Schema coverage is 0%, so the description must compensate, and it adds real meaning for handle, flat, compare, volume_tol_pct, and bbox_tol_mm. However, name, k_factor, and bend_table are never described as parameters (K appears only in the physics aside), leaving three of eight 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 ('Fold a flat pattern back up') and immediately positions it against its sibling as 'the other half of the unfold gate.' An agent can distinguish this from sheet_unfold and sheet_check 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 routes the caller between the two entry modes: pass `handle` for a sheet part, or `flat` for a sheet_unfold report 'produced elsewhere (or a deliberately corrupted one, to prove the check bites).' It also states that `compare` defaults to `handle` and is skipped when only `flat` is given, giving clear when-to-use and how-to-select guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_tabA
Extend a sheet part with a coplanar tab — a flat ear off a free edge with no bend at all (a mounting lug, a weld tab, a snap-off).
Mechanically it is a zero-angle flange and shares that code path exactly:
length_mm is how far the tab reaches past the edge, width_mm/offset_mm
place it along the edge (default: the whole edge). It adds no bend to the bend
report and no bend line to the DXF, but it does grow the flat pattern.
Returns the same dict sheet_flange does (angle_deg 0, inner_radius_mm 0).
| Name | Required | Description | Default |
|---|---|---|---|
| edge | Yes | ||
| name | No | SheetTab | |
| handle | Yes | ||
| width_mm | No | ||
| length_mm | Yes | ||
| offset_mm | No | ||
| feature_name | No |
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 delivers well: it discloses downstream effects (adds no bend to the bend report, no bend line to the DXF, but grows the flat pattern) and the return contract (same dict as sheet_flange with angle_deg 0, inner_radius_mm 0). It does not state whether the operation is reversible or what permissions/state it requires, but the disclosure of side effects is meaningful.
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 concept is front-loaded in the first clause, and the supporting sentences on mechanics and return shape are informative. It is slightly dense but every sentence adds a distinct fact about behavior or output.
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 annotations and no output schema, the description does the heavy lifting, describing side effects, the return dict, and key geometry parameters. It is close to complete for a feature-creation tool, with only the identity parameters (handle, edge) and mutation/reversibility semantics left 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 coverage is 0%, so the description must compensate, and it does for the geometry inputs: length_mm, width_mm, and offset_mm are given clear semantics plus a default ('the whole edge'). The remaining parameters (handle, edge, name, feature_name) receive no explanation, so meaningful value is added but coverage is incomplete.
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 (Extend) and resource (sheet part) with a precise concept: a coplanar tab, defined as a zero-angle flange with no bend. It explicitly names the sibling it shares a code path with (sheet_flange) and characterizes the distinction, so an agent can separate it from sheet_flange and sheet_hem 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?
Gives concrete usage examples (mounting lug, weld tab, snap-off) and explains the relationship to sheet_flange as a zero-angle flange sharing the same code path, which implies when each is appropriate. However, it never explicitly states a conditional rule like 'use sheet_tab when no bend is wanted, use sheet_flange otherwise', leaving the alternative choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sheet_unfoldA
Develop a sheet part into its flat pattern — the blank the part is cut from — and report every bend.
The flat pattern is derived from the bend tree, not reverse-engineered out of the fused solid, so it is exact rather than fitted: each bend contributes its bend allowance BA = angle·(R + K·t), the arc length of the neutral fibre.
k_factor: pins K for every bend. bend_table: a shop's own measured rows [{thickness_mm, inner_radius_mm, angle_deg, allowance_mm | deduction_mm}] — a matching row OUTRANKS the chart, because the shop's press is the ground truth for the shop's press. Without either, K comes from a press-brake corpus keyed by material and r/t. WHICHEVER IT IS, IT IS ECHOED BACK per bend as k_factor + k_source: a flat length whose K you cannot see is a number you cannot check.
build: also create the flat blank as a real solid (holes included) at origin
in the XY plane, so it can be measured, exported or nested.
Fidelity: 'exact' only when EVERY bend's K was supplied or table-derived — BA
given K is pure arithmetic. One corpus-defaulted bend makes the development a
'correlation' with band_pct, and developed_band_mm gives the resulting
millimetre spread of the blank across that K band.
Returns {ok, handle?, name?, volume?, outline, holes, bend_lines, bends,
regions, flat_size, flat_bbox, flat_area_mm2, blank_area_mm2,
blank_volume_mm3, thickness, material, fidelity, band_pct, developed_band_mm,
warnings} — regions being each flat region's polygon, which is what lets the
whole report be handed straight back to sheet_refold. Each
bend row carries angle_deg, direction, inner_radius_mm, leg_tangent_mm,
outer_length_mm, bend_allowance_mm, bend_deduction_mm, outside_setback_mm,
k_factor, k_source, and the bend_line / tangent_start / tangent_end segments in
flat coordinates. ok=False means the blank cannot be cut as drawn — two feature
footprints overlap — with warnings naming which.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | SheetFlat | |
| build | No | ||
| handle | Yes | ||
| origin | No | ||
| k_factor | No | ||
| bend_table | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description carries the full burden well: it explains derivation method (bend tree, not reverse-engineered), K factor precedence (bend_table outranks chart), the echo-back contract (k_factor + k_source per bend), ok=False semantics (overlapping footprints), and the build vs. analysis distinction. This is exactly the behavioral context 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 core action, then sections for K, build, fidelity, and returns. It's dense but each paragraph earns its place. Slightly verbose in the returns list, though that's arguably necessary given 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 6-param, no-annotation, no-output-schema tool, the description is remarkably complete: it documents the derivation algorithm, parameter precedence, output structure (fields enumerated), failure semantics, and interoperability with sheet_refold. Nothing critical is missing 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 meaningfully: k_factor (pins K), bend_table (shop-measured rows, outranks chart), build (creates a real solid at origin in XY plane), origin usage, and name/handle via context. It doesn't cover every one of the 6 parameters explicitly (e.g., name default), but the ambiguous ones are well explained.
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 ('Develop a sheet part into its flat pattern') and immediately scopes it with 'the blank the part is cut from — and report every bend.' Sibling tools (sheet_refold, sheet_flat_export) are named in the body so the agent can route correctly.
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 context for when k_factor vs bend_table vs corpus default applies, and distinguishes 'exact' vs 'correlation' fidelity output. It doesn't state explicit when-not-to-use conditions, but the fidelity rules effectively tell the agent when the result is trustworthy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shell_solidA
Hollow a raw Part solid into a thin-walled shell (the direct-shape
counterpart to thickness, which only works on PartDesign bodies).
handle: handle of the solid to hollow (e.g. a box/cylinder from add_primitive, or any shaped Part::Feature). faces: NON-EMPTY list of the faces to REMOVE — these become the shell's openings. Each entry is a face tag (f_..., from list_faces/query_faces, preferred and edit-stable), a 'FaceN' string, or a 1-based integer index. thickness: wall thickness in mm, must be > 0. The wall is grown INWARD, so the part's outer dimensions are preserved.
The consumed input solid is hidden (its geometry now lives in the shell). Returns {handle (starts 'shell_'), name, volume (mm^3 of the resulting walls), wall_thickness (mm), removed_faces (list of 1-based face indices that were opened)}. Raises if faces is empty, thickness <= 0, an index is out of range, or the offset is too large to produce a valid shell.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Shell | |
| faces | Yes | ||
| handle | Yes | ||
| thickness | Yes |
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 that the input solid is consumed and hidden, that the wall grows inward preserving outer dimensions, what the return object contains, and the specific error conditions (empty faces, non-positive thickness, out-of-range index, invalid shell offset).
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 sibling differentiation, then methodically covers parameters, side effects, returns, and error conditions. Every sentence adds useful information without padding, and the structure is 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?
For a mutation tool with no annotations and no output schema, the description supplies side effects, return shape, and failure modes. It is nearly complete, but the omission of the `name` input parameter leaves a small gap given 0% schema description 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 description coverage is 0%, so the description must document parameters. It thoroughly explains `handle`, `faces` (accepted formats, preferred edit-stable tags, non-empty requirement), and `thickness` (units, positive constraint, inward growth). However, the optional `name` parameter is never described in the input context, leaving one of four parameters 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 description uses a specific verb and resource: 'Hollow a raw Part solid into a thin-walled shell.' It immediately distinguishes itself from the `thickness` sibling by scoping to raw Part solids rather than PartDesign bodies. An agent can identify the operation and its domain 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 explicitly names the alternative (`thickness`) and the condition that selects it: `thickness` only works on PartDesign bodies, while `shell_solid` is the direct-shape counterpart. It also states required usage constraints: `faces` must be non-empty, and `thickness` must be greater than zero.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slice_estimateA
First-order FDM slice estimate (analytic, NO slicer needed; see slice_gcode_submit for the real PrusaSlicer CLI). mass_g = volume·density (Materials DB); deposited = volume·(wall_fraction + infill·(1−wall_fraction)) so at 100% infill filament_g == mass_g; layer_count = ceil(bbox height/layer_height); print_time from nozzle volumetric flow.
material may be any Materials-DB card name (material_list / material_get), or
anything at all if you supply density_g_cc yourself — it overrides the DB
lookup. A generic word like 'polymer' is a CATEGORY, not a card, and 'nylon' is
a near-miss for one, so neither carries a density; the error names both exits.
filament_dia_mm (1.75 default, 2.85 for the older standard) sets the spool
stock the filament length is computed against.
Returns {mass_g, filament_g, deposited_volume_mm3, layer_count, print_time_min, infill_fraction}. Errors on a material with no density and no override, a negative volume, a bbox shorter than [x,y,z], or a non-positive layer height.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox_mm | Yes | ||
| material | No | PLA | |
| nozzle_mm | No | ||
| volume_mm3 | Yes | ||
| density_g_cc | No | ||
| wall_fraction | No | ||
| filament_dia_mm | No | ||
| infill_fraction | No | ||
| layer_height_mm | No | ||
| print_speed_mm_s | 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 discloses the underlying formulas, the override precedence of density_g_cc, the filament_dia_mm default/semantics, and a full list of error conditions (no density + no override, negative volume, short bbox, non-positive layer height). This is far more than a bare 'estimate' statement.
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 dense and packed with formulas, but nearly every clause conveys a fact an agent needs, and the key scope distinction is front-loaded. The nesting of DB-material guidance and error enumeration makes it slightly heavy, but it is 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 10-parameter compute tool with no output schema and no annotations, the description covers inputs, override semantics, the returned object fields, and failure modes. 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 description coverage is 0% across 10 params, so the description must compensate. It meaningfully explains material, density_g_cc (overrides DB), filament_dia_mm (1.75 default, 2.85 legacy), and the roles of volume/infill/wall_fraction/layer_height/nozzle in the formulas, though bbox_mm ordering and print_speed_mm_s behavior are only implied rather than spelled out.
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 ('First-order FDM slice estimate') and immediately distinguishes itself from the sibling slice_gcode_submit by noting it is analytic and requires NO slicer. An agent can tell exactly what kind of estimation this is 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 explicitly routes the agent: use this for analytic estimates with no slicer, and 'see slice_gcode_submit for the real PrusaSlicer CLI' for true slicing. It also clarifies material usage (Materials-DB card vs. supplying density_g_cc), which is precisely the decision an agent must make before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slice_gcode_submitA
Slice a real part with the PrusaSlicer CLI, asynchronous — the external-CLI
upgrade of the analytic slice_estimate: real perimeters, infill patterns,
supports, travel/acceleration, and the slicer's own print-time model.
Requires a PrusaSlicer install ('apt install prusa-slicer' / the AppImage);
when absent this returns {ok:false, reason, install} rather than raising.
Pass a body handle (exported to STL in the modeller) or a prepared
stl_path. infill_fraction is 0..1 (full infill auto-switches the fill
pattern — PrusaSlicer's default refuses 100%); material/density_g_cc set
the filament density used to turn the sliced volume into grams. With a body
the result also carries the analytic estimate and the deposited_ratio
between them (a 20 mm cube at 100% lands ~1.008 — the skirt).
Returns the degradation dict or {job_id, status, cache_hit}; poll job_result for {ok, gcode_path, filament_mm, filament_cm3, filament_g, print_time_s, print_time_text, layer_count, config (the slicer's echoed settings), analytic?, deposited_ratio?}.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| material | No | PLA | |
| stl_path | No | ||
| supports | No | ||
| extra_args | No | ||
| density_g_cc | No | ||
| infill_fraction | No | ||
| layer_height_mm | 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: it declares the tool is asynchronous, discloses the graceful degradation path instead of raising, mentions cache_hit, and explains the new deposited_ratio field with a concrete sanity example (20 mm cube at 100% infill lands ~1.008, the skirt). These are behavioral traits nothing else in the definition supplies.
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 its relationship to slice_estimate, then the install prerequisite, then input modes, then parameter notes, then return shape. The parentheticals are dense but each carries real information (install commands, the 100%-infill quirk, the deposited_ratio example). Slightly long, but little is wasted.
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 annotations and no output schema exist, so the description must cover behavior and returns on its own, and it does: it names the immediate return shape (degradation dict or {job_id, status, cache_hit}) and the full downstream payload from job_result including gcode_path, filament_mm/cm3/g, print_time_s/text, layer_count, echoed config, and the optional analytic/deposited_ratio fields. Nothing essential for correct invocation 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 supply parameter meaning and largely does: body vs stl_path as alternate inputs, infill_fraction is 0..1 with the important quirk that full infill auto-switches the fill pattern because PrusaSlicer's default refuses 100%, and material/density_g_cc control filament density for gram conversion. It leaves supports, extra_args, and layer_height_mm unexplained, but the high-value parameters are covered with semantics beyond 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+resource (slice a real part with the PrusaSlicer CLI) and positions itself against a named sibling: 'the external-CLI upgrade of the analytic slice_estimate'. It also enumerates what makes it different (real perimeters, infill patterns, supports, travel/acceleration, the slicer's own print-time model), so an agent can distinguish it from slice_estimate 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?
Gives clear operating context: it requires a PrusaSlicer install, and when the install is absent it returns {ok:false, reason, install} rather than raising. It also tells the agent how to feed geometry (body handle or prepared stl_path) and to poll job_result afterwards. It stops short of an explicit 'prefer slice_estimate when you only need a fast analytic number' rule, leaving that routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_capabilitiesA
Report which P2 external solvers (CFD/MBD/topology/transient-thermal/optics) are usable right now — so you can pick a working solver for a *_submit family instead of discovering availability by trial and error. The solver twin of render_capabilities.
Takes no arguments. Resolves each solver side-effect-free: a binary by ANKUSDRIVE__PATH env -> PATH -> per-OS install dirs; a pip-wheel solver by importability. It executes nothing and installs nothing.
families[*].any_available is the gate to trust: it means AnkusDrive can actually
DRIVE that family here, not just that a binary resolved. A solver that resolves
but that no AnkusDrive tool can build a case for is listed under the family's
prepared_case_only (with the reason on the solver entry) and does NOT set
any_available — today that is SU2, which only ever runs a case_dir you
prepared yourself (*.cfg + *.su2); every built-in CFD case mode is OpenFOAM-only.
Returns {platform, available (sorted ready solver names), unwired,
prepared_case_only, solvers: {name: {available, kind ('binary'|'wheel'), family,
extra, and either path/module (when available) or install_hint, plus
prepared_case_only when nothing can build it a case}}, families: {family:
{solvers, available, unwired, prepared_case_only, any_available}}, extras:
{extra: [solver names]} for pip install ankusdrive[<extra>]}.
| Name | Required | Description | Default |
|---|---|---|---|
No 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: resolution is side-effect-free, binaries resolve via ANKUSDRIVE_<SOLVER>_PATH then PATH then per-OS dirs, wheels via importability, nothing is executed or installed. It also discloses a subtle semantic trap ('any_available' is the gate to trust, not mere binary resolution) and the SU2 prepared_case_only caveat.
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?
Information-dense and front-loaded, with purpose in the first sentence and the gate/caveat logic clearly separated. It is on the long side and the return-shape enumeration is dense prose, but nearly 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?
There is no output schema, so the description must carry the return contract — and it fully specifies the top-level keys (platform, available, unwired, prepared_case_only, solvers, families, extras) plus per-solver fields. An agent has everything needed to interpret and act on 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?
The tool takes zero parameters, so the baseline is 4; there are no argument semantics for the description to clarify and no undocumented parameters to compensate for.
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 which P2 external solvers ... are usable right now') and situates itself precisely, including the family of submission tools it serves and its explicit analogue 'the solver twin of render_capabilities'. An agent can distinguish this from capability/render 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?
Gives the triggering condition ('so you can pick a working solver for a *_submit family instead of discovering availability by trial and error') and names the alternative approach it replaces. It also states what the tool does NOT do (executes nothing, installs nothing), removing a common misuse path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spring_checkA
Rate a helical compression spring (Wahl). rate k=G d^4/(8 D^3 Na); corrected shear tau=Kw 8FD/(pi d^3). Pass force_n OR deflection_mm. Returns {spring_index, wahl_factor, rate_n_mm, force_n, deflection_mm, shear_stress_mpa, slenderness, buckling_flag, allowable_shear_mpa, shear_sf, pass}.
G and the allowable come from material unless overridden. shear_modulus_mpa
sets G directly; allowable_shear_mpa replaces the 0.45·UTS estimate, which
falls back to 700 MPa (spring steel) for a material carrying no UTS — pass it
explicitly for anything else, since shear_sf and pass scale with it.
| Name | Required | Description | Default |
|---|---|---|---|
| force_n | No | ||
| material | No | Steel-1045 | |
| wire_dia_mm | Yes | ||
| active_coils | Yes | ||
| deflection_mm | No | ||
| free_length_mm | No | ||
| coil_mean_dia_mm | Yes | ||
| shear_modulus_mpa | No | ||
| allowable_shear_mpa | 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 enumerates return fields, documents default derivation of G and allowable, discloses the 700 MPa spring-steel fallback for materials lacking UTS, and warns that shear_sf and pass scale with the allowable. It stops short of stating error behavior (e.g. what happens if both force_n and deflection_mm are given).
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 purpose with the governing equations, then the return contract, then the material/override notes. Dense but every segment earns its place; the formula block is the only arguably expendable portion, and it does inform parameter 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?
No output schema exists, yet the description lists all returned keys, and it covers the highest-risk parameters (G, allowable, force/deflection). With 9 params and 0% schema coverage it is nearly complete, missing only a brief note on the geometry params and mutual-exclusivity/error handling.
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 the force_n/deflection_mm alternative, the meaning of material, and the override semantics of shear_modulus_mpa and allowable_shear_mpa (including the fallback). The remaining params (wire_dia_mm, coil_mean_dia_mm, active_coils, free_length_mm) are only implied by the formula symbols rather than explained.
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 ('Rate a helical compression spring') and grounds it in named methods (Wahl) plus the equations used, so an agent knows exactly what computation this performs. It doesn't explicitly distinguish itself from the sibling add_spring (creation) tool, 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?
Gives one concrete calling rule ('Pass force_n OR deflection_mm') and notes that material supplies G and allowable unless overridden, which is genuine usage guidance. However, it never says when to use spring_check versus add_spring or other check tools, nor states prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
standard_part_designateA
The canonical, orderable designation of a purchased standard part — the string a buyer can actually quote against: "ISO 4762 M4×12 A2", "608-2RS", "AS568-214 NBR70". A BOM row that reads "SocketHeadCapScrew" is not a buyable line; this is what turns it into one.
Three ways in: handle read the designation add_fastener / add_bearing / add_thread stamped on the part when it was built. An object with no stamp reports designation=None plus whether its NAME reads like a purchased part. Nothing is ever inferred from geometry, so a hand-modelled bracket cannot acquire a false designation. designation normalise/parse a string — 'iso4762 m4x12 a2' becomes 'ISO 4762 M4×12 A2', so two spellings of one part can never become two BOM lines. family+spec build one from facts. family is fastener | bearing | oring | threaded_rod, and spec is respectively {kind, size, length, grade} / {designation, seals} / {inner_diameter, cross_section, compound} / {diameter, pitch, length, grade}.
Offline and deterministic — no network, no supplier, no credentials.
Returns the designation card: {ok, family, standard, designation, complete,
reason, purchased, ...family-specific fields}. complete=False means the string is
not yet enough to order against (typically nobody said which material grade),
with reason naming the gap — a missing fact is reported, never defaulted to a
plausible-looking lie.
| Name | Required | Description | Default |
|---|---|---|---|
| spec | No | ||
| family | No | ||
| handle | No | ||
| designation | 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 so well: offline/deterministic, no network/supplier/credentials, never infers designation from geometry, and complete=False is explicitly defined as a gap report with a reason rather than a silently defaulted value. These are exactly the traits an agent needs and that structured fields do not 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 purpose, then a clean labelled list of the three input modes, then the return shape; each block is scannable and earns its place. It is somewhat long and carries rhetorical flourish ('a plausible-looking lie', 'not a buyable line') that costs a little density.
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-optional-parameter tool with no annotations and no output schema, the description covers purpose, all input modes, the return structure (ok/family/standard/designation/complete/reason/purchased) and the safety profile. Nothing the agent needs to call it correctly or interpret output 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 it largely does: it documents handle, designation (with an example normalization), and family+spec including the four family values and their respective spec key sets. It stops short of stating mutual exclusivity or precedence when several modes are supplied, which the schemas (all optional, additionalProperties=true) leave 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?
States a precise verb+resource: producing the canonical, orderable designation string of a purchased standard part, with concrete examples ('ISO 4762 M4×12 A2', '608-2RS'). The BOM-row framing ('SocketHeadCapScrew is not a buyable line') makes the distinction from nearby siblings like designation_check and catalog_search immediately 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?
Explicitly enumerates 'Three ways in' (handle, designation, family+spec) and describes the input each expects, which tells the agent how to call it. It does not, however, name an alternative tool or state when NOT to use this one (e.g. vs designation_check or catalog_check), leaving that routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
study_submitA
Sweep parameters over a sampled design space and record the WHOLE search as a table — the DOE primitive between the parametric layer and the solver catalog.
Without it, exploring a design space means hand-rolling recipe(params) -> solve ->
mutate -> repeat and keeping only the last point, so nobody can tell afterwards
whether the design is good or merely the one you stopped on. A study keeps every
point, with the parameters that produced it.
variables declares the space; each entry is either explicit levels or a range:
{"name": "diameter_mm", "values": [8, 10, 12]}— these and only these{"name": "diameter_mm", "min": 8, "max": 12, "levels": 3}— evenly spaced
sampling picks how they combine:
{"method": "grid"}(default) — full factorial. Exhaustive, and the only thing that can prove a trend, but it is the PRODUCT of the level counts: three variables at five levels is 125 evaluations.{"method": "lhs", "n_samples": 20, "seed": 0}— Latin hypercube. Each variable's range is cut inton_samplesstrata and every stratum used once, so cost is decoupled from dimensionality: 20 points cover 6 variables as well as 2. Use it past 2-3 variables. Both are deterministic fromseed, which is what makes a re-run hit the cache.
responses says how to measure each point, in the same mapping a performance
requirement uses: {"name": "dp", "tool": "cfd_pipe_flow", "metric": "pressure_drop_pa", "conditions": {"diameter_mm": "$diameter_mm", "length_mm": 200}}.
Inside conditions, "$<variable>" is that point's value and "$handle" is the part
it built; an unknown $token is refused up front, because a sweep that silently
measured a literal string at every point returns a flat, plausible, wrong table.
tool can be ANY AnkusDrive tool, including verify_performance — and that is the
interesting case. A response that is a contract verdict carries a band, a trust block
and a pass/fail/indeterminate state, so points stay comparable across fidelity tiers
instead of being bare floats of unknown quality.
recipe (+ fixed_inputs) rebuilds geometry per point; omit it and pass handle
(or nothing) to sweep analysis parameters against fixed geometry. Screening-tier
responses evaluate inline in milliseconds, so thousand-point studies are viable;
solver-tier responses fan out concurrently and one collector job joins them.
Caching IS resumability: identical points hash to the same job content key, so
re-submitting a study after a crash, or widening its grid, re-runs only what is new —
n_cached is what tells you the re-run was free. max_points (default 64) refuses a
sweep larger than you probably meant.
objective — {"response": "dp", "sense": "min"} — additionally reports best.
Returns EITHER the finished table or {job_id, status, points, pending}; poll
job_result for the completed table. A point that failed to build or measure is a row
with ok: false, never an exception. Result: {ok, n_points, n_evaluated, n_cached,
n_failed, sampling, variables, points: [{index, params, handle?, ok, responses:
{name: {ok, value, band_pct?, converged?, state?, job_id?, cache_hit?, detail?}},
warnings}], responses: {name: {n, n_missing, min, max, mean, argmin, argmax}},
best?}.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | No | ||
| recipe | No | ||
| sampling | No | ||
| objective | No | ||
| responses | Yes | ||
| variables | Yes | ||
| max_points | No | ||
| fixed_inputs | 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 richly: unknown $tokens are refused up front, identical points hash to the same content key making caching equivalent to resumability, max_points (default 64) refuses oversized sweeps, and failed points are rows with ok:false rather than exceptions. It also discloses async fan-out behavior (inline screening vs concurrent solver-tier with a collector job).
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 purpose first and each parameter group in its own paragraph, but the length is substantial and a few framing sentences ('and that is the interesting case') are more color than specification. Dense and organized 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?
With no output schema and an async/job-based tool, the description compensates by enumerating the return shape (either the finished table or {job_id, status, points, pending}), the per-point response fields, aggregate summaries, and the failure/exception semantics. Nothing an agent needs to call or interpret 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 description coverage is 0% across 8 params, so the description must compensate, and it does: variables (levels vs min/max/levels with examples), sampling methods and their tradeoffs, responses mapping with $variable/$handle semantics, objective, max_points default, and recipe/fixed_inputs/handle modes are all explained.
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 (sweep parameters over a sampled design space, recording the whole search as a table) and positions it against siblings as 'the DOE primitive between the parametric layer and the solver catalog'. The contrast with hand-rolling recipe->solve->mutate->repeat makes its distinct role 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?
Gives explicit when-to-use rules: grid for exhaustiveness/trend-proving, lhs 'past 2-3 variables', omit recipe to sweep analysis params on fixed geometry, and poll job_result when a job_id is returned. Alternatives (verify_performance) and the reasoning for using them are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
substitutability_checkA
Liskov-substitutability gate — Form/Fit/Function as code (§7.1, #147). Take an assembly that gates green with variant A in a slot, swap in variant B (a different family row, or any part claiming the same interface), and re-run merge_assembly + all the gates. Still green ⇒ B is interchangeable with A — by construction a compatible (MINOR/PATCH) change ⇒ revise the existing part number; a gate now fails ⇒ the swap broke Form/Fit/Function ⇒ a new part number. Purely deterministic (no API, no judgment); the substitutability test #138 (B1 families) and #146 (the interface registry) call.
manifest: path to a manifest that gates green with variant A in slot.
slot: the component id to swap (variant A → variant B).
variant: the replacement component spec — a dict with exactly one of
file/manifest/library (the same one-source rule merge_assembly enforces).
verify_baseline: re-merge the base assembly first and require it green so the
premise is honest (default True).
Function, not just Form and Fit (#261): if the swapped-in variant declares a
PERFORMANCE contract (#226), it is part of the comparison. A contract measured as
NOT met breaks the performance gate like any other. A contract with NO recorded
verdict yields a THIRD answer — substitutable: null, verdict
'performance_unproven' — because an unverified spec is not a passed spec, and
handing an unproven part an existing part number is the silent pass #226 prevents.
Returns {schema, slot, variant, baseline_ok, swap_ok, substitutable (True | False | null), verdict ('substitutable' | 'not_substitutable' | 'baseline_not_green' | 'performance_unproven'), broken_gates (the NAMED gate(s) the swap broke), broken (gate→violations), classification (compatibility/semver/decision), performance? (only when a component declares a contract), reports}.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes | ||
| variant | Yes | ||
| manifest | Yes | ||
| verify_baseline | 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 meets it: it declares the tool is purely deterministic (no API, no judgment), discloses the baseline-verification default, and enumerates the exact outcome space including the subtle third answer (substitutable: null, 'performance_unproven') and the failure verdicts. The unproven-contract rule (#226) is a non-obvious behavior that an agent could not infer 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-loaded with the core concept, then params, then the performance subtlety and return shape. Dense and mostly earning its place, though the parenthetical issue references (§7.1, #147, #261, #226) add some noise an agent doesn't need for invocation.
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, the description fully specifies the return shape (schema, slot, variant, baseline_ok, swap_ok, substitutable, verdict, broken_gates, broken, classification, performance?, reports) and all four params. For a complex multi-outcome gate, nothing needed to call or interpret 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 description coverage is 0%, so the description must compensate and does: it defines manifest (a manifest that gates green with A in the slot), slot (the component id to swap), variant (a dict with exactly one of file/manifest/library, echoing the one-source rule merge_assembly enforces), and verify_baseline (default True, re-merges base first). Every parameter gains 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?
States a precise verb+resource: a Liskov-substitutability gate that swaps a variant into a slot and re-runs the gates. It distinguishes itself from siblings by naming the mechanism (merge_assembly + all gates) and the two outcomes (revise part number vs. new part number). An agent can tell exactly what this does 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 mechanics give clear when-to-use context: an assembly that gates green with variant A, swap in B, re-run. It also identifies the callers (#138 B1 families, #146 interface registry) and notes the performance-contract interplay. It stops short of explicitly contrasting with nearby siblings like component_contract_check, interface_align_check, or verify_performance, so no explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_looseningA
The loosest tolerance that works: which links can give up tolerance for the biggest cost saving while the stack still passes.
Greedy, one IT grade at a time — every trial loosening is re-verified against tolerance_stackup's seeded Monte-Carlo cpk before it is committed, so nothing it suggests can fail the spec. Candidates are ranked by the tolerance_cost_check curve, so the tightest (most expensive) links get opened first. Loosening preserves each link's MEAN, so the stack's nominal does not move.
Two honest refusals: a chain that does not already meet target_cpk returns
ok=False (there is no margin to give away — tighten or re-spec, do not loosen),
and an already-loosest chain returns steps=[] with saving=0 rather than
inventing a saving. stopped says which: 'no_further_move' | 'max_steps'
(re-run on the returned chain to continue) | 'no_margin'.
chain / handle / axis / default_tol / general as in
tolerance_cost_check; spec_min/spec_max default to the chain's own
worst-case bounds. Returns {ok, steps:[{link, index, from_it, to_it,
from_band_mm, to_band_mm, cost_before, cost_after, saving, cpk}], stopped,
chain (the loosened scheme), cost_index_before, cost_index_after, saving,
saving_pct, cpk_before, cpk_after, target_cpk, spec, note, fidelity, band_pct,
basis}.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | +z | |
| seed | No | ||
| chain | No | ||
| handle | No | ||
| general | No | m | |
| process | No | cnc | |
| samples | No | ||
| spec_max | No | ||
| spec_min | No | ||
| max_steps | No | ||
| target_cpk | No | ||
| coarsest_it | No | ||
| default_tol | No | ||
| step_grades | 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: greedy one-grade-at-a-time iteration, re-verification against a seeded Monte-Carlo cpk before committing, ranking via the cost curve, mean preservation, and two documented refusal paths with their stopped codes. This is unusually complete behavioral disclosure for a mutating/analysis 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-loads the core purpose, then details mechanics, refusals, and return shape in logical order. Dense and longer than average, but each paragraph carries information; the exhaustive return-field list is justified since no 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 14-param tool with no annotations and no output schema, it supplies the return shape, the refusal semantics, and the stopped codes, which an agent needs to interpret results. The main gap is the undocumented parameters, which keeps 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% across 14 parameters, so the description must compensate. It only defers five params by reference ('chain/handle/axis/default_tol/general as in tolerance_cost_check') and explains spec_min/spec_max defaulting; seed, process, samples, coarsest_it, and step_grades remain undocumented in either place.
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 and goal ('the loosest tolerance that works', links giving up tolerance for cost saving while the stack passes). It names the sibling tools it composes with (tolerance_stackup, tolerance_cost_check), so an agent can distinguish it from them 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?
Gives a clear when-not condition ('a chain that does not already meet target_cpk returns ok=False — tighten or re-spec, do not loosen') and points to siblings for the shared parameter vocabulary. It never explicitly states the scenario that should select it over the cost/stackup tools, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sweepA
Sweep a profile sketch along a spine sketch (additive pipe).
profile: handle of the cross-section sketch. spine: handle of the path sketch (in the same body). mode: 'Standard' | 'Frenet' | 'Auxiliary' | 'Binormal'. transition: 'Transformed' | 'Right corner' | 'Round corner'.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Standard | |
| name | No | Sweep | |
| spine | Yes | ||
| profile | Yes | ||
| transition | No | Transformed |
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 adds useful constraints like 'additive pipe' and 'in the same body,' but it does not disclose permissions, failure conditions, reversibility, or whether the operation requires an active body/document.
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 and front-loaded: purpose first, then parameter definitions. Every line adds useful information without repetition or 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 5-parameter CAD feature with no output schema and no annotations, the description gives enough to understand the operation and most parameters. It still lacks coverage of the 'name' parameter and broader prerequisites or side effects, but it is largely complete for 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. It defines profile, spine, mode, and transition, including allowed values for mode and transition, but it omits the 'name' parameter entirely.
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 CAD verb and resource: 'Sweep a profile sketch along a spine sketch (additive pipe).' This clearly distinguishes the tool from generic shape operations and identifies the exact input entities.
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 describing the sweep operation and its inputs, but it does not explicitly compare against alternatives such as loft, revolve, or pad. There is no when-to-use or when-not-to-use guidance beyond the operation name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thermal_composite_wallA
Exact series thermal-resistance network of a plane composite wall (NO solver)
— the classic overall-U calculation and the conjugate-heat-transfer family's
closed-form oracle. layers is the in→out list of solid layers, each
{thickness_mm, k | material} (k in W/m·K, or a Materials-DB name); h_in/h_out
are optional convection film coefficients (W/m²K). Per unit area
R = 1/h_in + Σ tᵢ/kᵢ + 1/h_out, U = 1/R, q = U·(t_in − t_out), and every
surface/interface temperature follows exactly.
Returns {u_w_m2k, r_total_m2k_w, q_w_m2, q_w, layer_resistances_m2k_w, interface_temps_c (inner surface → outer surface), t_in_c, t_out_c, area_m2}.
| Name | Required | Description | Default |
|---|---|---|---|
| h_in | No | ||
| h_out | No | ||
| layers | Yes | ||
| t_in_c | Yes | ||
| area_m2 | No | ||
| t_out_c | Yes |
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 so: it discloses the exact per-unit-area relation, that it is analytic and solver-free (so no job submission/queueing), and enumerates every returned quantity. It omits stated limits (steady-state 1D series only, constant k, no radiation/contact resistance), which is the main 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-loaded with the core identity, then a compact layer/coefficient spec followed by the formulas and the return dict. Dense notation is used efficiently, though the parenthetical commentary ('the classic overall-U calculation', 'closed-form oracle') is slightly decorative for a machine reader.
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 output schema and no annotations, the description plugs both gaps by inlining the formulas (R, U, q, interface temps) and listing every returned field, plus the nested layer-item shape. An agent has enough to construct a correct call; only the area_m2 and temperature-unit details are left to inference.
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 most of the 6 params: layers is described as an in→out list with each item {thickness_mm, k | material}, k units declared and DB material names allowed, and h_in/h_out given units and optionality. area_m2 and the temperature-unit convention are left implicit, 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 precise verb+resource: it computes the 'Exact series thermal-resistance network of a plane composite wall'. The '(NO solver)' qualifier and 'closed-form oracle' framing separate it cleanly from the many solver/submit siblings (cht_channel_submit, thermal_transient_1d, fem_thermal_results) an agent might otherwise confuse it with.
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 makes clear this is the instantaneous closed-form path versus the family's solvers, and spells out the exact calculation it performs. However, it never explicitly states when-not to use it (e.g. transient, radiation, 2D effects) or names a specific alternative tool, so selection guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thermal_lumpedA
Lumped first-order transient warm-up (no mesh). ΔT_ss = P/(h·A),
τ = m·c_p/(h·A), T(t) = T_amb + ΔT_ss·(1−e^(−t/τ)). c_p is an explicit
value/quantity-string ('900 J/kg/K') or read from material. Get h_conv from
the h_estimate correlation screen rather than guessing. With duration_s
the temperature + fraction-of-steady reached are returned. A radiation screen
flags when the steady-state radiative HTC exceeds h_conv. Returns
{t_ambient_c, delta_t_steady_k, t_steady_c, time_constant_s, t_final_c,
reached_steady_pct, h_rad_w_m2k, radiation_significant}.
| Name | Required | Description | Default |
|---|---|---|---|
| c_p | No | ||
| h_conv | Yes | ||
| mass_g | Yes | ||
| power_w | Yes | ||
| area_mm2 | Yes | ||
| material | No | ||
| duration_s | No | ||
| emissivity | No | ||
| t_ambient_c | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and discloses the computation method, return fields, and a radiation screening behavior. It does not explicitly state that the tool is read-only and has no side effects, though this is strongly implied. Limiting conditions (e.g., validity of the lumped assumption) are 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 with purpose and formulas, then parameter sourcing, then concrete return fields. The formula and return list are lengthy but directly relevant, and every sentence adds technical substance. Minor verbosity from the full return enumeration.
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 analytical complexity, 9 parameters, no output schema, and no annotations, the description is largely complete: it details the computation, outputs, and a screening behavior. Missing unit clarifications and validity bounds 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 coverage is 0%, so the description must compensate. It explains c_p (explicit value/quantity-string or read from material), h_conv (source from h_estimate), and duration_s (triggers return of temperature and fraction-of-steady). However, mass_g, power_w, area_mm2, emissivity, and t_ambient_c are not described; the formulas partially imply their roles but unit expectations remain 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 analytical operation: lumped first-order transient warm-up with no mesh. Differentiates from mesh-based siblings like thermal_transient_1d and thermal_transient_submit via '(no mesh)'. Gives the exact governing equations, so an agent knows precisely what computation occurs.
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: '(no mesh)' suggests a fast analytical model, and the description explicitly points to h_estimate for obtaining h_conv. However, it does not state when to choose this over thermal_transient_1d or thermal_transient_submit, nor does it list exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thermal_radiation_submitA
Diffuse-gray radiation FEM via Elmer, asynchronous — the radiation sibling of
thermal_transient_submit. Requires ElmerSolver + the ViewFactors binary (apt
elmerfem-csc / conda); when absent this returns {ok:false, reason, install}
rather than raising. Two modes:
Build the two-plate enclosure case (no case prep): pass
t1_c,t2_c(°C) and the two surface emissivitiesemissivity_1/emissivity_2(default 0.8). The handler writes a 2-D pair of parallel plates radiating across an unmeshed vacuum gap, runs ViewFactors then ElmerSolver, and extracts the net radiative exchange — directly gated against the exact two infinite parallel plates oracle q = σ(T₁⁴−T₂⁴)/(1/ε₁+1/ε₂−1) (oracle_ratio≈ 1). Mesh/geometry knobs:width_m,gap_m,plate_thickness_m,n_x,k_plate.Run a prepared
case_dircontaining its.sif+ mesh (ViewFactors is run first when no factor file is present).
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, returncode, solver, case_dir, stdout_tail} plus, for the plate case, {flux_w_m2, q_net_w, two_plate_flux_w_m2, oracle_ratio, t1_c, t2_c, emissivity_1, emissivity_2} (or {scalars_final} for a prepared case).
| Name | Required | Description | Default |
|---|---|---|---|
| n_x | No | ||
| sif | No | case.sif | |
| t1_c | No | ||
| t2_c | No | ||
| gap_m | No | ||
| k_plate | No | ||
| width_m | No | ||
| case_dir | No | ||
| emissivity_1 | No | ||
| emissivity_2 | No | ||
| plate_thickness_m | 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 discloses async execution, the non-raising degradation return ({ok:false, reason, install}), the ephemeral job handle ({job_id, status, cache_hit}), and that results must be polled via job_result. It omits any timeout/rate-limit/resource-cost context, 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 lead sentence carries the essential domain, method, and async nature; the two modes are cleanly bulleted and the return contract is compressed into a single sentence. It is dense but every sentence contributes, with only the inline oracle formula adding slight 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 complex, 11-parameter, no-annotation, no-output-schema tool, the description covers usage modes, preconditions, fallback behavior, and the full async lifecycle including downstream job_result fields (flux_w_m2, q_net_w, oracle_ratio, etc.). Nothing critical an agent needs to call and interpret 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 description coverage is 0%, so the description must supply meaning, and it does for most inputs: physics meaning of t1_c/t2_c (temperatures in °C), emissivity_1/2 (with default 0.8), and the geometry knobs width_m/gap_m/plate_thickness_m/n_x. The `sif` parameter is only indirectly implied via the '.sif' mention and `k_plate` is oddly grouped under 'mesh/geometry knobs' (it is thermal conductivity), leaving minor gaps.
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+method ('Diffuse-gray radiation FEM via Elmer, asynchronous') and immediately differentiates from the sibling thermal_transient_submit by naming the relationship. An agent can identify the tool's domain and its distinction from near-neighbors 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?
Explicitly lays out two operating modes (build the two-plate enclosure case with t1_c/t2_c/emissivities, vs. run a prepared case_dir) with the parameter preconditions for each. It also states the software precondition (ElmerSolver + ViewFactors) and the fallback behavior. It stops short of naming when *not* to use this over alternatives, so it's not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thermal_transient_1dA
Analytic 1-D plane-wall transient conduction (one-term Heisler series), valid
for Fourier ≳ 0.2 — the closed-form transient the Elmer thermal_transient solve is
gated against, and the distributed (spatial-gradient) answer the lumped screen
only approximates. A wall of half-thickness L cools/heats toward ambient by surface
convection: Bi = h·L/k, Fo = α·t/L², α = k/(ρ·cₚ). Pass alpha_m2_s, or k+rho+cp,
or a material (Materials DB: thermal_conductivity/Density/specific_heat); get
h_conv from the h_estimate correlation screen rather than guessing.
As Bi→0 the body is isothermal and this collapses to the lumped exponential exp(−t/τ) (cross-checked via t_center_lumped_c / lumped_agrees). Returns {biot, fourier, eigenvalue_1, c1, t_center_c, t_surface_c, t_center_lumped_c, time_constant_s, one_term_valid, lumped_agrees}.
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| cp | No | ||
| rho | No | ||
| h_conv | Yes | ||
| material | No | ||
| alpha_m2_s | No | ||
| duration_s | Yes | ||
| t_ambient_c | No | ||
| t_initial_c | No | ||
| half_thickness_mm | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden, and it does so well: it discloses the underlying model, its validity range, the limiting collapse to the lumped exponential, and a cross-check flag. It stops short of stating error behavior outside the valid Fourier range beyond implying the one_term_valid flag, leaving a small 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?
Dense but front-loaded: identity of the method, then validity, then sibling relationships, then input guidance, then output keys. Every sentence carries physics or sourcing information; the only cost is density that slightly reduces scannability.
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 no output schema, the description does the heavy lifting by enumerating the returned keys (biot, fourier, t_center_c, t_surface_c, etc.) and covering material/geometry interpretation. It is nearly complete, with only peripheral parameter units/roles left implicit.
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: it maps alpha_m2_s/k+rho+cp/material to their roles, defines α = k/(ρ·cₚ), ties Bi = h·L/k and Fo = α·t/L² to the required inputs, and points h_conv to its source. Minor inputs like t_ambient_c, t_initial_c, and duration_s are left to inference, so it is not fully compensatory.
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 method and resource: 'Analytic 1-D plane-wall transient conduction (one-term Heisler series)'. It explicitly distinguishes itself from two siblings: the Elmer 'thermal_transient solve' it is gated against, and the 'lumped screen' it improves upon via the distributed spatial-gradient answer. An agent can pick it apart from thermal_lumped and thermal_transient_submit 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?
States an explicit validity domain ('valid for Fourier ≳ 0.2') and gives concrete input-sourcing rules: pass alpha_m2_s, or k+rho+cp, or a material, and 'get h_conv from the h_estimate correlation screen rather than guessing.' It also frames when the lumped alternative applies (Bi→0). This is close to full when-to-use/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thermal_transient_submitA
Transient thermal FEM via Elmer, asynchronous. Requires ElmerSolver (apt
elmerfem-csc / conda); when absent this returns {ok:false, reason, install}
rather than raising. Three modes:
Build the analytic-slab case (no solver case prep needed): pass the plane-wall transient —
half_thickness_mm,h_conv(W/m²K),duration_s, and eitherk+rho+cp(SI) or amaterialname, with optionalt_initial_c/t_ambient_cand mesh/step countsn_elements/n_steps. The handler writes the 1-D conduction case (symmetry at the centre, convection at the surface), runs ElmerSolver, and returns the centre/surface temperatures — the same plane-wall BVPthermal_transient_1dsolves analytically, so the two are directly comparable (the kickoff's relative gate).Solve a real FreeCAD solid — the geometry bridge: pass a
bodyhandle plusconvection_faces(1-based indices into the solid's faces; those faces get theh_conv/t_ambient_cconvective BC, every other face is adiabatic), the physics (h_conv,duration_s,k+rho+cpormaterial), and an optionalchar_length_mmGmsh element size andelement_order('1st'|'2nd'). The solid is Gmsh-meshed and solved as a true 3-D body (ElmerGrid + ElmerSolver); the result's {t_max_c, t_min_c} are the interior/convective-surface temperatures (for a slab-like body, directly gateable against thermal_transient_1d). Preferelement_order='2nd'for a sharp transient — quadratic tets resolve the wall gradient accurately even on a coarse mesh.Run a prepared
case_dircontaining its own.sif+ mesh.
Returns the degradation dict, or {job_id, status, cache_hit}; poll job_result for {ok, returncode, solver, case_dir, stdout_tail} plus, for the slab case, {t_center_c, t_surface_c, n_steps_written}, for a body {t_max_c, t_min_c, nodes, tets} (or {scalars_final} for a prepared case).
| Name | Required | Description | Default |
|---|---|---|---|
| k | No | ||
| cp | No | ||
| rho | No | ||
| sif | No | case.sif | |
| body | No | ||
| h_conv | No | ||
| n_steps | No | ||
| case_dir | No | ||
| material | No | ||
| duration_s | No | ||
| n_elements | No | ||
| t_ambient_c | No | ||
| t_initial_c | No | ||
| element_order | No | ||
| char_length_mm | No | ||
| convection_faces | No | ||
| half_thickness_mm | 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 the async job model (returns {job_id,...}, poll job_result), the graceful degradation dict {ok:false, reason, install} when ElmerSolver is absent, and exact return payloads per mode. It doesn't state estimated solve time, resource limits, or cache_hit semantics.
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 key async/degradation facts and cleanly structured with a three-mode list, but it is very long and repeats physics-parameter names and return details in each mode. The density is justified by the 17-param complexity, yet some sentences 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?
For a 17-parameter, no-annotation, no-output-schema async tool, the description covers invocation modes, degradation behavior, and exact per-mode return fields — everything an agent needs to call and interpret 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% across 17 undocumented parameters, so the description must compensate — and it explains the role of nearly every mode-specific parameter (h_conv, k/rho/cp or material, convection_faces as 1-based face indices, char_length_mm, element_order, sif, case_dir). It leaves a few defaults (t_initial_c/t_ambient_c, n_elements, n_steps) to inference, so not a full 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 names a specific verb (submit/solve), resource (transient thermal FEM via Elmer), and explicitly enumerates three distinct modes, including the geometry bridge and the prepared case_dir path. It distinguishes itself from sibling thermal_transient_1d by explaining the analytic-comparability relationship rather than just restating the name.
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 states the three modes and what inputs select each one (slab params, body+convection_faces, or case_dir), and routes to thermal_transient_1d for comparison. It does not explicitly say when NOT to use this vs. other solvers (e.g., cht_channel_submit, fem_modal) or the tradeoffs between modes beyond a mesh-order tip.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thicknessA
Hollow out a solid into a shell.
base: handle of the body's tip feature (the solid to hollow). open_faces: list of {handle, face: tag|'FaceN'} that become the shell's openings. thickness: wall thickness (mm). reversed: True (default) grows the wall INWARD into the solid (the natural "hollow this part" interpretation). False grows outward. join: 'Arc' | 'Intersection'. mode: 'Skin' | 'Pipe' | 'RectoVerso'.
| Name | Required | Description | Default |
|---|---|---|---|
| base | Yes | ||
| join | No | ||
| mode | No | ||
| name | No | Thickness | |
| reversed | No | ||
| thickness | No | ||
| open_faces | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It describes key behavioral aspects: the default 'reversed' behavior grows the wall inward, and 'open_faces' creates openings. However, it omits important details such as whether the operation is destructive to the original solid, what happens to existing features, or any permission/rate-limit considerations. It adds some value but is incomplete 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?
The description is structured as a list of parameter explanations, front-loaded with the core purpose. Each line is concise and directly relevant. It could be slightly more efficient by grouping related parameters, but overall it is well-organized and free of fluff.
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 complexity (7 parameters, no output schema, no annotations), the description covers the essential operational semantics but misses behavioral context such as the operation's effect on the model (e.g., does it create a new feature or modify the existing solid?), error conditions, or expected return values. It is adequate but not fully complete for an agent to invoke correctly without further exploration.
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 provides meaning for most parameters: 'base' is the solid to hollow, 'open_faces' is a list of face handles, 'thickness' is wall thickness in mm, 'reversed' controls inward/outward growth, and 'join' and 'mode' are given example values. The only parameter not explained is 'name', which is likely trivial. This is strong compensation for the lack of schema descriptions.
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 precise verb+resource: 'Hollow out a solid into a shell,' which is a clear, unambiguous statement of what the tool does. This distinguishes it from siblings like 'shell_solid' by emphasizing the hollowing operation, and the rest of the description elaborates on the parameters without diluting the core purpose.
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: the tool is for hollowing a solid, and the parameter descriptions hint at when to use certain options (e.g., 'reversed' for inward vs outward growth). However, there is no explicit guidance on when to choose this tool over alternatives like 'shell_solid' or 'pocket', nor are there any exclusions or prerequisites stated. The description provides adequate context but lacks routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tolerance_cost_checkA
Price a tolerance scheme against the process that has to hold it — the missing link between tolerance_stackup ("what tolerance works") and cost_estimate ("what does it cost").
Per toleranced dimension: its ISO 286 IT grade as a FLOAT (a band between IT6
and IT7 reports 6.4, not 7), the cheapest machining operation that holds that
grade naturally (drilling ~IT11, milling ~IT10, turning ~IT9, reaming ~IT7,
grinding ~IT6), a relative cost index normalised to 1.0 at process's natural
capability, and a verdict: 'ok', 'in_process_tightening' (tighter but reachable
in the same operation), or 'needs_secondary_operation' — the flag, meaning the
part silently acquired an operation nobody costed. pass is false when any link
flags. Cost roughly doubles every 1.5 IT grades tightened below natural
capability; above it only inspection/scrap falls. total_cost_index is the sum,
so two tolerance SCHEMES over the same chain compare directly.
chain is the same [{name, nominal, plus, minus | tol}] tolerance_stackup
takes; instead pass a live handle (+ axis, default_tol, general) and the
chain is derived off the solid the same way. process: cnc | injection |
casting | sheet | fdm | drilling | milling | turning | boring | reaming |
grinding | honing | lapping.
fidelity='correlation', band_pct=50 — the RATIOS are defensible, the absolute index is dimensionless and is not money. Returns {process, links:[{name, nominal_mm, band_mm, it_grade, cost_index, verdict, cheapest_operation, natural_it, note}], n_links, total_cost_index, mean_cost_index, flagged, pass, fidelity, band_pct, basis, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | +z | |
| chain | No | ||
| handle | No | ||
| general | No | m | |
| process | No | cnc | |
| default_tol | No |
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 behavioral burden and does so richly: it defines the three verdict values and what 'needs_secondary_operation' means, explains the cost-doubling-per-1.5-IT-grade behavior, clarifies that ratios (not absolutes) are defensible, and discloses the fidelity='correlation'/band_pct=50 caveat plus the escalate_to hint. This is far more than structured fields provide.
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 dense technical content (IT grade mapping, cost behavior, return fields) is well organized. It is long and prose-heavy with several parenthetical digressions, so it is efficient rather than maximally 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?
For a 6-parameter analysis tool with no output schema, the description supplies the full return shape ({process, links:[...], n_links, total_cost_index, mean_cost_index, flagged, pass, fidelity, band_pct, basis, escalate_to}) and the per-link field semantics (it_grade, cost_index, verdict, cheapest_operation, natural_it). Nothing an agent needs to call or interpret the result 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: it documents `chain` format and its relationship to tolerance_stackup's chain, the live `handle` (+ axis, default_tol, general) alternative, and enumerates all `process` values (cnc | injection | casting | sheet | fdm | drilling | ...). All six parameters are given 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 opening line states a specific verb+resource ('Price a tolerance scheme against the process that has to hold it') and explicitly positions the tool relative to two siblings, tolerance_stackup ('what tolerance works') and cost_estimate ('what does it cost'). An agent can tell exactly what this does and how it differs from neighboring tools.
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 states the context of use — the 'missing link' between tolerance_stackup and cost_estimate — and the metrics paragraph explains when the results matter (`pass` is false when any link flags). It stops short of explicit when-not-to-use guidance or a direct 'use X instead' routing statement, so it falls just below the top.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tolerance_stackupA
Stack a dimension chain. Each chain entry is {name, nominal, plus, minus} with plus/minus the signed upper/lower deviations (plus>=minus; symmetric shorthand {nominal, tol}); add direction:-1 for a subtractive/gap link. method: worstcase | rss | montecarlo (each adds a deeper block). Half-bands are read as 3-sigma; cpk/pct_in_spec use spec_min/spec_max if given, else the worst-case bounds. Returns {nominal, worstcase:{min,max,spread}, rss:{sigma,min_3s,max_3s}, montecarlo:{mean,std,cpk,pct_in_spec,spec}}.
Instead of a hand-built chain, pass a live handle (+ axis, '+z'/'-x'/… or
[x,y,z]) and the chain is derived off the solid: planar step faces
perpendicular to the axis become consecutive station-to-station links (the
stack a height gauge reads off a stepped part). Per-link tolerance:
default_tol (± mm), else the ISO 2768-1 general class ('f'|'m'|'c'|'v',
default 'm' — the drawing-note default for untoleranced dimensions). The
result then echoes the derived chain (+ axis, n_step_faces).
seed fixes the montecarlo draw (12345 default) so the same chain returns the
same cpk/pct_in_spec run to run — that determinism is a contract, so change it
only to check a result is not an artefact of one draw.
| Name | Required | Description | Default |
|---|---|---|---|
| axis | No | +z | |
| seed | No | ||
| chain | No | ||
| handle | No | ||
| method | No | worstcase | |
| general | No | m | |
| samples | No | ||
| spec_max | No | ||
| spec_min | No | ||
| default_tol | 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 that half-bands are read as 3-sigma, that cpk/pct_in_spec fall back to worst-case bounds when spec_min/max are absent, that `general` defaults to ISO 2768-1 class 'm', and that `seed` determinism is a stated contract. It omits any error/edge behavior or whether derived-chain runs differ from manual ones, keeping it below 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?
Dense and front-loaded, opening with the core operation before branching into the derived-chain variant and return shape. Nearly every sentence carries specification. It is somewhat packed, but the information density is justified by the 10-parameter, 0%-covered surface.
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 no-annotation, no-output-schema tool with 10 parameters, the description covers both invocation paths, the return structure, defaults, and the determinism contract, so an agent has what it needs to call it. Minor gaps remain around `samples`, failure modes, and sibling-tool 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 largely does: it defines the chain entry shape {name, nominal, plus, minus}, the plus>=minus constraint, the symmetric shorthand, direction:-1, the method enum values, axis formats, default_tol vs. general, and seed. Only `samples` is left unexplained, which is why this is 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?
States a specific verb and resource ('Stack a dimension chain') and immediately distinguishes its two operating modes (explicit chain vs. live handle-derived chain). The returned object and the tolerancing semantics are concrete enough that an agent can tell it apart from siblings like tolerance_cost_check or gdt_check.
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 routes between the two input modes ('Instead of a hand-built chain, pass a live `handle`...and the chain is derived off the solid'), giving clear conditions for each. It also explains when to deviate from the default seed. It does not, however, say when to prefer this tool over sibling tolerance/DFM tools, so it stops short of full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
topology_optimize_submitA
Minimum-compliance topology optimization (in-house SIMP; NO external solver),
asynchronous because each iteration solves an FE system. Optimizes a 2-D
rectangular design domain (nelx×nely unit cells) — or, when nelz is set, a
3-D nelx×nely×nelz grid of trilinear hexahedra — to the stiffest layout that
holds Σdensity = keep_fraction (the Optimality-Criteria update holds it exactly);
penal is the SIMP penalty (≈3), rmin the cone filter radius. Default BCs
(both): the whole left face clamped + a unit downward load at the right-face
centre. 2-D overrides: fixed_dofs / load=[dof_index, value]. 3-D overrides:
loads=[[i,j,k,axis,value],...] point loads at node grid coords (axis 'x'|'y'|'z'),
fixed_nodes=[[i,j,k],...] clamped nodes, and keep_out/keep_in lists of
half-open element-index boxes [i0,i1,j0,j1,k0,k1] forced void / forced solid
(keep-out regions and must-keep pads).
Returns immediately {job_id, status, cache_hit}; poll job_result for {density
(2-D: nely×nelx grid; 3-D: nelz×nely×nelx voxel field, density[k][j][i] with j=0
at the bottom — this IS geometry), mass_fraction (==keep_fraction), compliance,
compliance_initial, iterations, converged, gray_fraction, solver (3-D: which
linear-solve backend ran)}. Threshold + voxel→solid back in the modeller with
topology_to_solid, then gate with mass_properties (mass ≤
keep_fraction·original) and interference_check vs keep-outs.
| Name | Required | Description | Default |
|---|---|---|---|
| tol | No | ||
| load | No | ||
| nelx | No | ||
| nely | No | ||
| nelz | No | ||
| rmin | No | ||
| loads | No | ||
| penal | No | ||
| keep_in | No | ||
| keep_out | No | ||
| max_iter | No | ||
| fixed_dofs | No | ||
| fixed_nodes | No | ||
| keep_fraction | 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 discloses rich behavior: in-house SIMP with no external solver, asynchronous execution, immediate return of job_id/status/cache_hit, required polling via job_result, default boundary conditions, 2-D vs 3-D overrides, and returned quantities including geometry interpretation.
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 dense and lengthy, but appropriately sized for a complex 14-parameter optimization tool. It front-loads the core purpose, then groups default BCs, 2-D overrides, 3-D overrides, return values, and workflow in a usable order.
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 no output schema, the description supplies the missing return structure and workflow, including job polling and voxel-to-solid post-processing. It covers enough of the parameter space and behavior for an agent 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 description coverage is 0% across 14 parameters, so the description must compensate. It explains nelx, nely, nelz, keep_fraction, penal, rmin, load/fixed_dofs, loads/fixed_nodes, and keep_out/keep_in in useful detail, but does not clarify tol or max_iter 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: minimum-compliance topology optimization using in-house SIMP. It clearly describes the 2-D and 3-D domains and objectives, but does not explicitly distinguish itself from sibling optimization tools such as optimize_submit or study_submit.
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 clear context that it is an asynchronous computational job, tells the agent to poll job_result, and specifies downstream workflow with topology_to_solid, mass_properties, and interference_check. It does not explicitly state when to choose it over alternative optimization tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
topology_to_solidA
Reconstruct a FreeCAD solid from a topology-optimization density field — the
modeller-side close of the loop opened by topology_optimize_submit, whose
density this consumes. 2-D (nely×nelx grid): thresholds (a cell is solid when
density ≥ threshold), run-length-merges each row into solid spans, tiles each
span as a cell_mm box extruded thickness_mm in Z (row 0 at the top). 3-D (a
nelz×nely×nelx voxel field from the nelz mode): greedy-merges solid voxels into
maximal boxes at (i·cx, j·cy, k·cz) — j=0 at the bottom, thickness_mm ignored.
Fuses into one static Part::Feature. cell_mm is a scalar or [cx, cy(, cz)] mm;
thickness_mm defaults to the smaller cell edge; placement is an optional
[x, y, z] mm origin offset; name names the object. Runs synchronously (it builds
geometry — no jobs.py poll).
Returns {handle, name, volume (mm³), solid_cells, total_cells, mass_fraction (== solid_cells/total_cells — must be ≤ keep_fraction within one cell), n_solids (disjoint bodies; >1 means a split load path), threshold, nelx, nely, nelz (None for 2-D), bbox_mm}. Gate it with mass_properties (mass ≤ keep_fraction·original) and interference_check against keep-out regions, per SIMULATION_EXAMPLES §5.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| cell_mm | No | ||
| density | Yes | ||
| placement | No | ||
| threshold | No | ||
| thickness_mm | 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 it delivers: it explains 2-D vs 3-D branches, threshold semantics, run-length vs greedy voxel merging, extrusion convention (row 0 at top, j=0 at bottom), that thickness_mm is ignored for 3-D, and that execution is synchronous ('it builds geometry — no jobs.py poll'). This is unusually rich behavioral disclosure for a mutation-style 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?
Purpose is front-loaded into the first clause, then branches (2-D, 3-D), parameters, returns, and gating follow logically. It is dense and long, but given six undocumented parameters and dual operating modes the length is largely earned; a small amount of the phrasing 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?
Despite no output schema and 0% schema coverage, the description enumerates the full return shape (handle, name, volume, solid_cells, total_cells, mass_fraction, n_solids, threshold, nelx/nely/nelz, bbox_mm) and the validation gates. Nothing an agent needs to call it correctly appears 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: it defines `cell_mm` as scalar or [cx, cy(, cz)] mm, `thickness_mm` default (smaller cell edge), `placement` as an [x,y,z] mm origin offset, `name` as the object name, `threshold` as the density cutoff, and `density` as the consumed field. Every one of the 6 parameters gains meaning beyond 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 and resource — 'Reconstruct a FreeCAD solid from a topology-optimization density field' — and explicitly ties itself to the sibling that produces its input (`topology_optimize_submit`). An agent can distinguish it from reconstruction/CAD siblings 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?
Identifies when to use it (the modeller-side close of the loop opened by topology_optimize_submit), the required follow-up gates (mass_properties, interference_check) and the reference section (SIMULATION_EXAMPLES §5). It gives clear context but does not name an alternative tool or an explicit when-not condition, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transaction_abortA
Roll back the most recent open transaction. Implementation note:
FreeCAD 1.1 headless abortTransaction is unreliable, so the worker
commits then undoes — net effect is a clean rollback.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 discloses a meaningful non-obvious trait: the worker commits then undoes because headless abortTransaction is unreliable, yielding a clean rollback net effect. It does not say what happens when no transaction is open or whether an error is raised, leaving one behavioral 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 sentences, front-loaded with the action, followed by a compact implementation note that is arguably useful for setting expectations about rollback reliability. Slightly more internal detail than strictly required, but no 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 zero-parameter rollback action with no annotations and no output schema, the description covers what it does and the net behavioral effect. Missing only edge-case behavior (no open transaction, error semantics) to be fully 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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate.
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 ('Roll back the most recent open transaction') and adds a scope constraint ('most recent open') that implicitly separates it from transaction_commit and transaction_open. It does not explicitly name those siblings, so the differentiation is present but inferred 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?
Usage is implied by the verb: call this to discard the current open transaction's changes. There is no explicit guidance on when not to use it (e.g. no open transaction), nor a pointer to transaction_commit as the alternative, so an agent must infer the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transaction_commitA
Commit the most recent open transaction; changes are kept.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 the essential write effect ('changes are kept'), which contrasts meaningfully with abort. However, it omits error behavior (what happens with no open transaction), whether nested/multiple transactions are supported, and whether the commit is destructive of the transaction boundary.
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?
A single front-loaded clause with no filler; the effect statement follows the verb immediately. It is efficient, though extremely terse — the brevity edges toward under-specification rather than model concision.
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 parameterless transaction tool with no annotations and no output schema, the description covers the core action but leaves the failure mode (no open transaction) and result/return value unexplained. Adequate to invoke correctly in the happy path, incomplete around edges.
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 of 4 applies. There is no parameter syntax an agent could get wrong; the description only needs to state the (implicit) target of the operation, which it does.
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 (commit), the resource (the most recent open transaction), and the outcome (changes are kept). The phrase 'most recent open transaction' precisely scopes which transaction is affected, which distinguishes it in spirit from transaction_abort, though that sibling is never named.
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: committing presupposes an open transaction created by transaction_open, but the description never states that prerequisite or explicitly points to transaction_abort as the alternate choice. An agent can infer the workflow but gets no explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transaction_openA
Begin an undoable transaction on the active document. Pair with transaction_commit (keep the changes) or transaction_abort (roll back). Transactions nest — the most-recent open is committed/aborted first.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Transaction |
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 by disclosing undoable semantics, rollback via abort, and LIFO nesting behavior. It does not state what happens if no active document exists, whether the call returns an identifier, or any concurrency/error behavior. These are minor gaps for an otherwise transparent 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?
Three sentences, front-loaded with the core action, followed by pairing and nesting details. Every sentence earns its place, and there is no redundant restatement of the tool name or title.
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 transaction lifecycle tool with no annotations and no output schema, the description covers purpose, alternatives, and nesting semantics adequately. The main missing piece is parameter guidance for the optional label, and error/return behavior is left unspecified, but the core invocation scenario 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 document the single optional 'label' parameter. It says nothing about what the label is used for, whether it affects commit/abort messages, or any format constraints. The schema default ('Transaction') is the only clue, leaving the description with no added 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?
The description states a specific verb (Begin) and resource (transaction on the active document), and explicitly distinguishes itself from transaction_commit and transaction_abort by naming them as paired operations. An agent can tell this is the opening step of a transaction lifecycle 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?
It tells the agent exactly when to use this tool and how it relates to alternatives: pair with transaction_commit to keep changes or transaction_abort to roll back. It also clarifies nesting order, so the agent knows how to sequence multiple transactions. No exclusions are needed because the alternatives are fully enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transformA
Move and/or rotate an existing object in place — first-class replacement for hand-poking an object's Placement via set_property.
handle: object to move (any object with a Placement: primitive, body, feature). translate: [x, y, z] translation in mm (default no translation). rotate_axis: rotation axis as a 3-vector [x, y, z] (need not be unit length; default [0, 0, 1], the Z axis). angle: rotation about rotate_axis in DEGREES (default 0 = no rotation). relative: True (default) composes this move ONTO the object's current placement (incremental); False sets it as the ABSOLUTE placement, discarding the object's prior placement.
The same object is moved — NO new handle is created. The rotation is applied about the object's local origin (combine with translate to pivot elsewhere).
Returns {handle, name, placement: {base:[x,y,z] mm, axis:[x,y,z], angle_deg}} describing the object's resulting placement.
| Name | Required | Description | Default |
|---|---|---|---|
| angle | No | ||
| handle | Yes | ||
| relative | No | ||
| translate | No | ||
| rotate_axis | 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 does substantial work: same object is mutated (no new handle), rotation pivots about the object's local origin, relative defaults to incremental composition, and absolute mode discards prior placement. It omits failure modes (invalid handle, no-Placement objects) and any concurrency/transaction expectations, 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?
Front-loaded with the core action and its sibling contrast, then a clean per-parameter block with defaults, then the two behavioral caveats. Every sentence carries information; nothing 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?
There is no output schema, but the description supplies the return shape ({handle, name, placement}) with units, and covers mutation semantics and pivot behavior. For a 5-parameter, unannotated mutation tool, 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%, so the description must compensate, and it does: units for translate (mm), rotate_axis semantics (need not be unit length, default Z), angle in DEGREES with default 0, handle scope ('any object with a Placement: primitive, body, feature'), and relative's true/false meaning are all spelled out. This is fully beyond what the bare schema conveys.
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 and/or rotate an existing object in place') and explicitly positions itself against a sibling: 'first-class replacement for hand-poking an object's Placement via set_property.' An agent can distinguish it from set_property and scale_shape/copy_shape 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?
It clearly names the alternative it supersedes (set_property on Placement) and explains the incremental-vs-absolute choice via the relative flag's default, which is real usage guidance. It stops short of explicit when-not conditions (e.g. when to prefer set_property instead, or prerequisites like the object needing an existing Placement).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_workspaceA
Claim (creating if needed) an isolated workspace and make it the target of subsequent tool calls. Each workspace is its own freecadcmd process with its own ActiveDocument and handle registry — handles do NOT cross workspaces. This is how concurrent agents share one MCP server without clobbering each other's documents: each agent calls use_workspace with a unique name once, up front.
The pool is capped (ANKUSDRIVE_MAX_WORKSPACES, default 4) and idle workspaces are reaped (ANKUSDRIVE_WORKSPACE_IDLE_S, default 900s); claiming a workspace beyond a full pool raises — close an idle one first. Pass "default" to return to the baseline single-agent workspace. Returns {workspace: , freecad: [...], workspaces: [names]}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
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: it discloses process isolation, that handles do NOT cross workspaces, the pool cap env var and default (4), idle reaping timeout (900s), and the raise-on-overflow failure mode. That is unusually rich behavioral context for a stateful 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 core action, then rationale, then limits and return shape. Three short paragraphs, all earning their place, though the concurrency rationale slightly overlaps the opening 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?
No output schema exists, yet the description specifies the return shape ({workspace, freecad, workspaces}), plus env-var configuration and failure behavior. Nothing needed to invoke or recover from this 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 coverage is 0% and the single required param `name` has no description, so the description must compensate — and it does, conveying uniqueness and the reserved "default" value. It stops short of format constraints (allowed characters, length, case sensitivity) for the one input.
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 — claim/create an isolated workspace and make it the target of subsequent calls — and immediately distinguishes it from siblings list_workspaces and close_workspace by explaining that it binds future calls. An agent can tell exactly what this does.
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 says when to call it (once, up front, by each concurrent agent with a unique name), what happens on failure (claiming beyond a full pool raises), and how to exit (pass "default"). The alternative flows are named rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_manifestA
Validate a manifest WITHOUT building it (the cheap front door, RFC §11.7).
Structural + cross-reference checks a JSON shape can't enforce: every component
has exactly one of file/manifest/library; a library carries a tool; every
instance references a known component; every mate/check references a known
instance; a present schema is the known version ("ankusdrive.manifest/1").
manifest: path to the manifest JSON.
Returns {ok, problems, schema, manifest_hash} — ok is True iff problems is empty; manifest_hash fingerprints the contract content (what the lockfile records so a stale contract is detectable). Run this before merge_assembly to reject a malformed contract before any geometry is built.
| Name | Required | Description | Default |
|---|---|---|---|
| manifest | Yes |
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 validation occurs WITHOUT building, describes the check classes, and gives the return contract including ok iff problems is empty and what manifest_hash fingerprints. No side-effecting or mutating behavior is implied.
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 distinction, then adds check details, parameter meaning, return contract, and usage order. The density is justified by the tool's validation complexity, and no sentence 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?
Despite no output schema and no annotations, the description supplies the purpose, sibling distinction, parameter meaning, return shape, and when to call it. An agent has everything needed to select and 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 define the lone parameter, and 'manifest: path to the manifest JSON' supplies the critical missing semantic that this is a filesystem path rather than inline JSON. It could go further on relative-vs-absolute path expectations, but for one required parameter it is substantially compensating.
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 (validate a manifest) and immediately distinguishes it from building via merge_assembly. It also enumerates the concrete structural and cross-reference checks performed, so an agent can tell exactly what this tool is for.
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 explicitly says 'Run this before merge_assembly to reject a malformed contract before any geometry is built,' naming the alternative and the condition that selects this tool. The 'cheap front door' framing further clarifies the intended early-stage use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_contractA
Build-time self-check of a component against its manifest slice (RFC §11.3): a builder calls this on its OWN part before save, so a contract violation is caught locally and cheaply instead of after a fan-in merge (build → merge → gate-fail → rebuild becomes build → self-check → fix). Never raises on a failing check (a failure is a passed=False row), so it is safe to call in a loop. Inspection only; mutates nothing.
handle: the component's shaped object. contract: the component's slice — all keys optional, give at least one: envelope {min:[x,y,z], max:[x,y,z]} the part's LOCAL bbox must fit in it. interfaces {name: {origin:[x,y,z], z_axis?:[x,y,z], tol_mm?, angle_tol_deg?}} each named frame must be PUBLISHED (publish_interface) and within tolerance of the contracted origin (and axis, if z_axis given) — catches "forgot to publish" / "published in the wrong place". features [ {kind, ...} ] per-feature self-checks: {kind:"gear", module_mm, teeth, internal?, tol_mm?} {kind:"bore", diameter_mm, tol_mm?} {kind:"extent", axis:"x"|"y"|"z", length_mm, tol_mm?} intent bool also run verify_intent.
Returns {handle, ok, results:[{check, passed, detail}]} — ok True iff every check passed; check names are envelope / interface: / feature: / intent.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| contract | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden — and it does. It discloses that it never raises on failure (a failure is a passed=False row), that it is inspection-only and mutates nothing, and how each check category behaves (published-frame tolerance, forgot-to-publish detection). This is exactly the extra behavioral context 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 core purpose and workflow rationale, then a well-organized structured breakdown of the contract keys. Dense but every section earns its place given the nested contract object. Slightly long, but justified by the complexity.
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 2-param tool with a deep nested contract object, no annotations, no output schema, and 0% schema coverage, the description is complete: it defines every check category, the optional contract keys, the return shape ({handle, ok, results:[...]}), and the check-name format. An agent can call this correctly without any other source.
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 compensates fully: it explains handle (the shaped object) and contract (the slice, all keys optional, at least one), and documents each sub-key with types and meanings — envelope bbox fitting, interfaces frames with origin/z_axis/tolerances and the publish requirement, feature self-check kinds (gear/bore/extent) with their fields, and the intent flag. This is richer than the schema itself.
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 (self-check of a component against its manifest slice) and disambiguates from the very similar sibling component_contract_check by anchoring it as a build-time, LOCAL pre-save check versus post-fan-in verification. The described workflow (build → self-check → fix vs build → merge → gate-fail → rebuild) makes the distinction concrete.
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 says a builder calls this on its OWN part BEFORE save, and states it is safe to call in a loop. Alternatives are implied by the component_contract_check sibling and the fan-in merge flow. When-to-use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_featureA
Compare a feature's actual volume change against an expected signed delta. Run after each subtractive/additive operation to catch silent failures — Pocket on a curved surface that under-cut, Hole that drilled outside the body, Cut whose Tool didn't intersect the Base.
handle: PartDesign feature (Pad/Pocket/Hole/Revolve/etc.) or Part::Cut. expected_delta_mm3: SIGNED expected change. Subtractive → negative, additive → positive. Wrong sign is its own useful error. tolerance: relative tolerance (default 0.05 = 5%). abs_tolerance: absolute mm³ fallback for tiny expected magnitudes (default 0.01). Pass if EITHER tolerance is satisfied.
Returns {passed, message, actual_delta_mm3, expected_delta_mm3, ratio,
previous_volume_mm3, current_volume_mm3, handle, name}. Does NOT raise
on mismatch — inspect passed to decide whether to abort.
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes | ||
| tolerance | No | ||
| abs_tolerance | No | ||
| expected_delta_mm3 | Yes |
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 the tool does NOT raise on mismatch and that the caller must inspect `passed`, which is the critical behavioral trait. It also explains the two-tolerance pass/fail logic and the accepted handle types. It omits whether it requires an active document or prior volume state, so not quite complete.
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, then failure examples, then parameter semantics, then the return shape. Dense but every block earns its place; the parameter list is slightly verbose but justified given 0% schema coverage.
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 verification tool with no output schema and 0% parameter coverage, the description supplies everything needed: the return keys ({passed, message, actual_delta_mm3, expected_delta_mm3, ratio, previous_volume_mm3, current_volume_mm3, handle, name}), the non-raising contract, and full parameter meaning.
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 one of the four parameters is explained with semantics and defaults beyond the schema — handle accepted types, signed sign convention for expected_delta_mm3, relative tolerance default 0.05, abs_tolerance default 0.01, and the OR-combination rule.
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: 'Compare a feature's actual volume change against an expected signed delta.' This is clearly distinct from sibling measurement tools like mass_properties or check_shape, and the units (mm³) and the signed-delta concept make 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?
Gives a clear trigger ('Run after each subtractive/additive operation to catch silent failures') with three concrete failure scenarios (Pocket under-cut on curved surface, Hole outside body, Cut with non-intersecting Tool). It does not name alternative verification tools (check_shape, verify_intent, bounding_box) or state when *not* to use it, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_intentA
Re-run every invariant declared with declare_intent — the regression gate to run after each edit. Composes check_shape / check_airtight_path / face-role resolution; never raises on a failing invariant (a failure is a passed=False row), so it is safe to call in a loop. Inspection only; mutates nothing.
handle: the part (must have a declared intent contract).
Returns a dict: handle (str) ok (bool) True iff every declared invariant passed results (list) one {invariant, passed, detail} per declared invariant — invariant in {watertight, airtight_path, required_faces}, detail a human-readable summary of what was measured
| Name | Required | Description | Default |
|---|---|---|---|
| handle | Yes |
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 failures never raise (returned as passed=False rows), that it is safe in a loop, that it is inspection-only and mutates nothing, and that the handle must already have a declared intent contract. This is exactly the behavioral context an agent needs to invoke safely.
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 behavior, then the parameter, then the return shape — a sensible progression with no filler sentences. The return block is verbose but justified since no 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?
With no annotations, no output schema, and 0% schema description coverage, the description compensates fully: it specifies behavior, the input precondition, and the exact return structure (handle/ok/results with invariant enumerations). 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 coverage is 0% and the schema itself says nothing about the single parameter, but the description supplies meaning and a precondition: 'handle: the part (must have a declared intent contract).' That materially clarifies the argument beyond the bare string type.
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 — 're-run every invariant declared with declare_intent' — and frames it as 'the regression gate to run after each edit.' It also names what it composes (check_shape / check_airtight_path / face-role resolution), which lets an agent distinguish it from siblings like verify_feature or verify_contract.
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 context: run after each edit, and safe to call in a loop. It does not explicitly name alternatives (verify_feature, verify_contract) or when-not-to-use conditions, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_performanceA
Prove (or fail to prove) every requirement declared with declare_performance — the step that turns "a solver printed 0.29" into a claim with a band and a provenance.
A verdict has THREE states. pass and fail each require the measurement's whole
uncertainty band to sit on one side of the limit; a band that straddles it is
indeterminate, meaning "escalate", not "probably fine". A correlation reading
Cd = 0.28 ± 10 % against a limit of 0.30 spans 0.252–0.308 and has NOT shown the
part passes — collapsing that to a pass is how a spec silently goes unmet.
tier picks the evidence:
'screen'— each requirement's cheap estimator only. Milliseconds, no solver.'solver'— the real solve for every requirement.'auto'(default) — screen first, escalate only what the screen could not decide or what declaresfidelity_floor: 'solver'. This is the ladder that keeps a design loop cheap: cheap measurements eliminate candidates, solves confirm survivors.
Trust is part of the measurement, not a footnote: trust: {converged: true} or a
band_max_pct cap makes an unconverged (or insufficiently mesh-converged) solve
come back indeterminate with the reason, never pass.
Solver-tier measurements are asynchronous, so this returns EITHER the finished verdict (screen-only, or everything already decided) or {job_id, status, pending, results} — poll job_result for the completed verdict. Never raises on a failing requirement; a failure is a row.
Every verdict is also RECORDED on the part, stamped with a geometry signature of
the shape it measured (#261). That record is what merge_assembly,
substitutability_check and component_contract_check consult, since a gate has to
answer synchronously and this may not have: an in-flight solve records rows the
gates read as unverified, and editing the part invalidates the signature so they
read stale — never a pass on either path.
Returns {handle, tier, ok, n_requirements, passed, failed, indeterminate, escalate, results: [{name, tier, metric, state, measured, limit, band_pct, worst_case, best_case, margin, margin_pct, detail, trust_reasons?, screen?, job_id?}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | auto | |
| handle | Yes |
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 extensively: the three-state verdict semantics (including why a straddling band must be indeterminate, not pass), the trust/convergence rule that forces indeterminate rather than pass, the asynchronous solver-tier behavior with a required poll of job_result, and the guarantee that a failing requirement never raises. It also discloses the side effect of recording verdicts on the part with a geometry signature, and that in-flight solves and edits produce unverified/stale reads at downstream gates — exactly the behavioral context annotations would otherwise 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?
The purpose is front-loaded in the first sentence, and the description proceeds in logical blocks (verdict states, tier ladder, trust, async, recording, returns). It is long and occasionally rhetorical ('collapsing that to a pass is how a spec silently goes unmet'), but most sentences convey decision-relevant behavior 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 complex, asynchronous, multi-state verification tool with no annotations, no output schema, and 0% schema coverage, the description supplies everything material: the meaning of each verdict state, the tier ladder, trust/convergence handling, async polling, side effects on the part, and an explicit return shape. 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 so for `tier` with a detailed explanation of each mode and the default. The `handle` parameter, however, is never described — its meaning (the part handle) is only inferable from context. Strong on one of two parameters, silent on the other.
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 — prove or fail to prove requirements declared with declare_performance — and frames the tool as the counterpart to that sibling. It further distinguishes itself by naming the gates (merge_assembly, substitutability_check, component_contract_check) that consume its records rather than perform the verification. An agent can identify this tool 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 `tier` block gives explicit when-to-use guidance for each mode ('screen' for cheap elimination, 'solver' for real solves, 'auto' as the default ladder), and it explains the escalation logic. It also implicitly routes agents to job_result for async polling. It does not contrast with the adjacent verify_intent / verify_contract / verify_feature tools, so the sibling differentiation is partial rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
versionA
Return FreeCAD and bundled Python versions from the worker.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. 'Return' implies a read-only, non-destructive query, but the description does not discuss permissions, side effects, or rate limits. For such a simple diagnostic tool 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?
A single front-loaded sentence with no wasted words. It states exactly what the tool returns and from where.
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-parameter diagnostic tool with no output schema, the description names the exact return values (FreeCAD and bundled Python versions). Nothing further is required 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 tool has zero parameters, so the baseline score is 4. The description adds no parameter detail because none exist.
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, 'Return', and a precise resource, 'FreeCAD and bundled Python versions from the worker'. It is unambiguous and cannot be confused with any sibling tool such as ping or restart_worker.
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 implicitly clear: call this to inspect the worker environment. However, it does not explicitly say when to use it instead of ping, setup_status, or other diagnostic tools, nor does it state any conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
waveguide_cutoffA
Exact rectangular-waveguide cutoff frequency (NO solver) — the closed-form
twin the openEMS FDTD full-wave solve (em_fullwave_submit) is gated against.
Broad wall a_mm, narrow wall b_mm (default a/2, WR convention). mode is
'TE'/'TM'. f_c(m,n) = (c/2√εᵣ)·√((m/a)²+(n/b)²); dominant TE10
reduces to the EXACT f_c = c/(2a√εᵣ). Below f_c the guide is evanescent
(axial β imaginary, nothing transmits), above it propagates with guided
wavelength λ_g = 2π/β. With a probe freq_ghz the regime (propagating /
evanescent), k, β and λ_g are returned. An FDTD drive straddling f_c must
collapse its transmission below the analytic cutoff and rise above it.
Returns {mode, m, n, a_mm, b_mm, eps_r, cutoff_hz, cutoff_ghz, kc_per_m, next_mode_cutoff_ghz, single_mode_band_ghz, probe_freq_ghz, regime, k_per_m, beta_per_m, guided_wavelength_mm, fidelity, band_pct, valid_range_ok, warnings, escalate_to}.
| Name | Required | Description | Default |
|---|---|---|---|
| a_mm | Yes | ||
| b_mm | No | ||
| mode | No | TE10 | |
| eps_r | No | ||
| freq_ghz | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses key behavioral traits: the tool is exact/closed-form, returns regime (propagating/evanescent), k, β, λ_g when freq_ghz is given, and that it is gated against the FDTD solver. It doesn't discuss error handling, rate limits, or assumptions beyond the standard formulas.
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 dense and front-loads the core purpose, then provides formulas, parameter meanings, and return fields. It is longer than typical but every sentence adds value for a physics-heavy tool. A small deduction for the formula notation potentially being intimidating without context.
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 output schema, and 0% schema description coverage, the description fully specifies the math, parameter semantics, and the exact list of returned fields. It leaves little ambiguity for an agent to construct a correct call 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. It does: it defines `a_mm` as broad wall, `b_mm` as narrow wall (default a/2, WR convention), `mode` as 'TE<m><n>'/'TM<m><n>', and `freq_ghz` as an optional probe that triggers extra return fields (regime, k, β, λ_g). This is substantially more informative than the bare parameter names.
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 ('Exact rectangular-waveguide cutoff frequency') and clarifies the scope ('NO solver', closed-form). It explicitly distinguishes itself from the sibling `em_fullwave_submit` by naming it as the FDTD solve it is gated 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?
Makes clear this is the analytic twin to `em_fullwave_submit` and that an FDTD drive straddling f_c must collapse below it. However, it doesn't state when NOT to use this tool or what other alternatives exist for electromagnetic analysis among the many EM siblings (em_skin_depth, em_field, etc.).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wear_estimateA
Estimate sliding wear (Archard): V = k·F·s/H. k (wear_coef) is empirical — pass it, or it's looked up by the material_pair's category pair (order-of- magnitude). H (hardness_mpa) defaults to Tabor 3·σ_y of the softer member. With apparent_area_mm2 a mean depth is reported and gated by max_depth_mm. Returns {wear_coef, hardness_mpa, volume_loss_mm3, depth_loss_mm, coef_basis, hardness_basis, pass}.
| Name | Required | Description | Default |
|---|---|---|---|
| load_n | Yes | ||
| wear_coef | No | ||
| hardness_mpa | No | ||
| max_depth_mm | No | ||
| material_pair | No | ||
| sliding_dist_m | Yes | ||
| apparent_area_mm2 | 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 discloses the empirical fallback for wear_coef (order-of-magnitude lookup from the material_pair category), the Tabor-derived hardness default, the depth gating by max_depth_mm, and even exposes basis/provenance fields (coef_basis, hardness_basis, pass). It stops short of stating units for all inputs or failure behavior when the material lookup misses.
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 compact and front-loaded, leading with the operation and governing equation before parameter behavior and returns. The em-dash-heavy run-on style compresses several facts per sentence, which is efficient but slightly harder to parse than discrete clauses.
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-parameter tool with no annotations and no output schema, the description does strong work: it enumerates the returned object so the agent knows what comes back, and covers every optional input's role. Remaining gaps are minor — the expected shape/type of material_pair and lookup-failure behavior are unspecified.
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: it explains wear_coef (empirical, user-supplied or looked up), hardness_mpa (defaults to Tabor 3·σ_y of the softer member), material_pair (category-pair lookup), apparent_area_mm2, and max_depth_mm. Only load_n and sliding_dist_m go unexplained, though their meaning is evident from the formula.
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 ("Estimate sliding wear") and anchors it with the exact model used (Archard: V = k·F·s/H), so an agent knows precisely what computation this performs. No sibling tool offers wear estimation, so there is no ambiguity to resolve.
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 parameter narrative (pass wear_coef or let it be looked up via material_pair; hardness defaults to Tabor 3·σ_y), which tells the agent how to drive the tool but not explicitly when to prefer it over a full analysis. No when-not conditions 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.
weld_groupA
Rate a planar fillet-weld group by Blodgett's treat-weld-as-a-line method.
segments=[((x1,y1),(x2,y2)),...] (mm); an in-plane force_n=[Fx,Fy] at
load_point_mm=[px,py] gives direct shear f=F/L plus torsional f=Tr/J from the
eccentric moment about the weld centroid, added vectorially at the worst end.
required_leg = f_r/(0.707allowable); given leg_mm, throat stress f_r/(0.707*leg)
is checked vs allowable. Returns {weld_length_mm, centroid_mm, Ix_mm3, Iy_mm3,
J_mm3, direct_shear_n_per_mm, max_shear_n_per_mm, worst_point_mm,
required_leg_mm, throat_stress_mpa?, shear_sf?, pass}. weld_type ('fillet'
default) labels the group and selects the throat convention.
| Name | Required | Description | Default |
|---|---|---|---|
| leg_mm | No | ||
| force_n | Yes | ||
| segments | Yes | ||
| weld_type | No | fillet | |
| load_point_mm | Yes | ||
| allowable_shear_mpa | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does well: it spells out the direct-shear plus torsion superposition, the required_leg formula, the conditional outputs (throat_stress_mpa?, shear_sf? only when leg_mm is supplied), and the pass criterion. It stops short of confirming the operation is a pure side-effect-free calculation and omits the allowable 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?
Front-loaded with the purpose, then mechanics, then the return-keys block; nearly every clause carries load. Density is high but appropriate for a technical calculator, with only minor compression of the units/allowable detail.
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 no annotations, the description supplies both the return-value list and the conditional-output behavior, plus the algorithm. It is largely complete for a 6-parameter calculator, missing only the allowable default, units for allowable, and any error/failure 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 coverage is 0%, so the description has to document all six parameters, and it explains segments tuple syntax, force_n=[Fx,Fy], load_point_mm=[px,py], leg_mm, and weld_type's 'fillet' default with units (mm, N). The allowable_shear_mpa parameter and its default of 96 are not named or explained, leaving one real 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 ('Rate') and resource ('planar fillet-weld group') and names the exact method (Blodgett's treat-weld-as-a-line). No CAD/FEA sibling does stress rating, so it is unambiguous even without a named alternative.
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 makes the use case implicit (feed a segment layout plus load, get a leg sizing/check), but it never states when to reach for this tool versus a FEM or other check, nor any prerequisites. Usage is inferred from the I/O mapping only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
where_usedA
Where-used / impact analysis (issue #142, C3; MULTI_AGENT.md §9): traverse the
lockfile depends_on graph and report every parent that CONSUMES an item — the
blast radius, so exactly those parents re-dispatch when the item changes. The
lockfile records edges consumer -> consumed (lid depends_on housing); where-used
is the reverse reachability of the item (everything that reaches it).
lockfile: path to the lockfile (the JSON assembly_lock wrote). item: the item / component id to query. direct: if true, also surface only the immediate mates separately.
Returns {item, where_used (the full transitive blast radius), direct (the §9 immediate-neighbour layer)} — an unknown item fails loudly, never a silent empty set.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | ||
| direct | No | ||
| lockfile | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so reasonably: it discloses the traversal direction, the edge semantics (lid depends_on housing), the output shape, and an important failure mode ('an unknown item fails loudly, never a silent empty set'). It doesn't cover permissions or performance on large graphs, keeping it below 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?
Structure is front-loaded with the purpose, then parameters, then return shape, and each sentence earns its place. It is a bit dense with cross-references (issue #142, C3, §9) that don't help an agent, slightly reducing efficiency.
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-parameter tool with no annotations and only an inline return-shape note, the description covers purpose, the lockfile item/handling of unknown items, the meaning of direct, and what comes back. Nothing essential for correct invocation 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 largely does: it explains that lockfile is the JSON assembly_lock wrote, that item is the component id to query, and that direct surfaces the immediate-neighbour layer. The direct flag's effect ('surface only the immediate mates separately') is what the schema alone would 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?
The description states a specific verb (traverse the depends_on graph and report parents that consume an item) and clearly names the resource (lockfile dependency graph). It explicitly defines the semantics as 'reverse reachability' versus the lockfile's forward 'consumer -> consumed' edges, making it distinguishable from any graph-editing or assembly-tool sibling.
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 a clear usage context: impact/blast-radius analysis so that exactly those parents re-dispatch when an item changes. It implies when to use it, but doesn't name a concrete alternative tool from the large sibling set (e.g., change_impact, assembly_lock_check) or state exclusions.
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.
281 tool updates
- First observed
acoustic_fem_submit - First observed
acoustic_radiation_submit - First observed
acoustic_screen - First observed
add_annotation - First observed
add_bearing - First observed
add_dimension - First observed
add_fastener - First observed
add_feature_note - First observed
add_gdt_callout - First observed
add_gear - First observed
add_part - First observed
add_primitive - First observed
add_projection_group - First observed
add_pulley - First observed
add_rack - First observed
add_rib - First observed
add_section_view - First observed
add_sketch_constraint - First observed
add_sketch_external - First observed
add_sketch_geometry - First observed
add_spring - First observed
add_sprocket - First observed
add_thread - First observed
add_thumbnail - First observed
annotate_face - First observed
assembly_lock - First observed
assembly_lock_check - First observed
async_demo_submit - First observed
balloon_drawing - First observed
baseline_create - First observed
baseline_verify - First observed
beam_buckling - First observed
beam_modal - First observed
bearing_life - First observed
belt_drive - First observed
bolted_joint_check - First observed
bom_extract - First observed
boolean_op - First observed
bounding_box - First observed
catalog_check - First observed
catalog_nearest - First observed
catalog_search - First observed
cfd_body_drag - First observed
cfd_external_flow_submit - First observed
cfd_internal_flow_submit - First observed
cfd_mesh_independence_submit - First observed
cfd_pipe_flow - First observed
chain_drive - First observed
chamfer_edges - First observed
change_impact - First observed
check_airtight_path - First observed
check_shape - First observed
cht_channel_submit - First observed
cht_graetz_submit - First observed
classify_face_sides - First observed
close_document - First observed
close_sketch - First observed
close_workspace - First observed
cnc_machinability_check - First observed
cnc_time_estimate - First observed
component_contract_check - First observed
contact_setup - First observed
copy_shape - First observed
cost_estimate - First observed
creep_flag - First observed
declare_intent - First observed
declare_performance - First observed
dem_flow_submit - First observed
dem_pack_submit - First observed
designation_check - First observed
dfa_check - First observed
dfm_check - First observed
dipole_resonance - First observed
draft - First observed
drawing_gate - First observed
drawing_legibility - First observed
drop_impact - First observed
eco_create - First observed
eco_validate - First observed
elastica_deflection - First observed
em_conduction_submit - First observed
em_dc_resistance - First observed
em_field - First observed
em_fullwave_submit - First observed
em_induction_heating_submit - First observed
em_induction_submit - First observed
em_skin_depth - First observed
engrave_text - First observed
envelope_check - First observed
export_drawing - First observed
export_shape - First observed
fai_report - First observed
family_materialize - First observed
family_validate - First observed
fatigue_check - First observed
feature_instantiate - First observed
feature_list - First observed
feature_schema - First observed
feature_validate - First observed
fem_add_constraint - First observed
fem_buckling - First observed
fem_buckling_results - First observed
fem_cantilever_demo - First observed
fem_mesh - First observed
fem_mesh_refinement - First observed
fem_modal - First observed
fem_modal_results - First observed
fem_new_analysis - First observed
fem_result_probe - First observed
fem_results - First observed
fem_run - First observed
fem_set_material - First observed
fem_set_nonlinear_material - First observed
fem_set_solver - First observed
fem_thermal_results - First observed
fillet_edges - First observed
fit_check - First observed
fit_class - First observed
fit_page - First observed
fluid_props - First observed
fracture_check - First observed
fsi_channel_pressure - First observed
fsi_interface_balance - First observed
fsi_plate_deflection - First observed
fsi_pressure_plate_submit - First observed
gdt_check - First observed
gear_rating - First observed
get_interface - First observed
get_object - First observed
granular_screen - First observed
grid_convergence - First observed
h_estimate - First observed
harmonic_response - First observed
harmonic_response_submit - First observed
helix - First observed
hertz_contact - First observed
hole - First observed
inspection_plan - First observed
interface_align_check - First observed
interference_check - First observed
items_check_manifest - First observed
items_new - First observed
items_resolve - First observed
items_validate - First observed
job_list - First observed
job_result - First observed
job_status - First observed
laminate_properties - First observed
lifecycle_apply_change - First observed
lifecycle_classify_change - First observed
lifecycle_editable - First observed
lifecycle_transition - First observed
linear_pattern - First observed
list_assembly_parts - First observed
list_documents - First observed
list_edges - First observed
list_face_roles - First observed
list_faces - First observed
list_objects - First observed
list_thread_options - First observed
list_workspaces - First observed
loft - First observed
make_assembly - First observed
make_body - First observed
make_datum_plane - First observed
make_drawing_page - First observed
make_sketch - First observed
mass_properties - First observed
material_get - First observed
material_list - First observed
material_select - First observed
measure_angle - First observed
measure_distance - First observed
mechanism_kinematics - First observed
mechanism_simulate_submit - First observed
merge_assembly - First observed
min_clearance - First observed
mirrored - First observed
moldability_check - First observed
moldability_screen - First observed
molding_fill_submit - First observed
molding_screen - First observed
molding_warpage_submit - First observed
monopole_sphere - First observed
new_document - First observed
open_document - First observed
optics_lens_design - First observed
optics_lens_optimize - First observed
optics_moldability_check - First observed
optics_raytrace - First observed
optics_solid_trace - First observed
optimize_submit - First observed
oring_groove - First observed
pack_check - First observed
pad - First observed
partdesign_chamfer - First observed
partdesign_fillet - First observed
ping - First observed
plastic_collapse - First observed
plate_check - First observed
pocket - First observed
polar_pattern - First observed
press_fit_stress - First observed
project_check_references - First observed
project_resolve_manifest - First observed
project_validate - First observed
publish_interface - First observed
query_faces - First observed
random_vibration - First observed
recipe - First observed
recipe_list - First observed
recipe_schema - First observed
recipe_validate - First observed
register_handle - First observed
release_package - First observed
render_capabilities - First observed
render_fem_results - First observed
render_job - First observed
render_photoreal - First observed
render_photoreal_submit - First observed
render_view - First observed
render_views - First observed
resolve_edge - First observed
resolve_face - First observed
restart_worker - First observed
revolve - First observed
rigid_sphere_scattering - First observed
run_script - First observed
save_document - First observed
scaffold_project - First observed
scale_shape - First observed
seal_check - First observed
section_view - First observed
set_active_document - First observed
set_property - First observed
set_title_block - First observed
set_visibility - First observed
setup_status - First observed
sheet_base - First observed
sheet_check - First observed
sheet_flange - First observed
sheet_flat_export - First observed
sheet_hem - First observed
sheet_refold - First observed
sheet_tab - First observed
sheet_unfold - First observed
shell_solid - First observed
slice_estimate - First observed
slice_gcode_submit - First observed
solve_capabilities - First observed
spring_check - First observed
standard_part_designate - First observed
study_submit - First observed
substitutability_check - First observed
suggest_loosening - First observed
sweep - First observed
thermal_composite_wall - First observed
thermal_lumped - First observed
thermal_radiation_submit - First observed
thermal_transient_1d - First observed
thermal_transient_submit - First observed
thickness - First observed
tolerance_cost_check - First observed
tolerance_stackup - First observed
topology_optimize_submit - First observed
topology_to_solid - First observed
transaction_abort - First observed
transaction_commit - First observed
transaction_open - First observed
transform - First observed
use_workspace - First observed
validate_manifest - First observed
verify_contract - First observed
verify_feature - First observed
verify_intent - First observed
verify_performance - First observed
version - First observed
waveguide_cutoff - First observed
wear_estimate - First observed
weld_group - First observed
where_used
TDQS
Scored across 281 tools
Despite the enormous surface, most tools declare a clearly distinct purpose, and descriptions go out of their way to draw boundaries (render_view vs render_photoreal vs render_photoreal_submit vs render_job; screen vs *_submit twin pairs; check vs verify gates). A few clusters genuinely blur—moldability_screen/moldability_check/optics_moldability_check, dfm_check/cnc_machinability_check, and the many *_check/*_validate gates—but the text usually disambiguates them.
Names are uniformly snake_case with a predictable verb_noun convention (add_*, make_*, list_*, get_*, check_*, verify_*, declare_*, *_submit, *_results) plus consistent family prefixes (fem_*, cfd_*, em_*, sheet_*, items_*, optics_*). Minor deviations exist—single-word domain verbs (pad, hole, pocket, loft) and a mixed verify_/check_ verb style—but the pattern stays readable.
281 tools is an extreme surface, roughly 5–6x the 50-tool threshold the rubric treats as a total mismatch, and far beyond what any agent can navigate without heavy filtering. Even granting the genuinely broad engineering domain (CAD, FEM, CFD, optics, EM, DEM, molding, sheet metal, PLM), the count is overwhelming and unearns its keep at this scale.
The surface is exceptionally complete: full CRUD-style CAD/PartDesign modeling, mesh/FEM solvers across modal, buckling, thermal, nonlinear and contact, CFD, FSI, acoustics, EM, DEM, molding, sheet-metal unfold/refold/DXF, DFM, cost, drawing and manufacturability gates, plus a full PLM layer (items, lifecycle, ECO, baseline, release, project scaffolding). It is hard to identify any obvious missing operation or dead end.
Maintenance
Related MCP Connectors
Agent-first CAD: editable .kcad.ts source, deterministic review, OpenCASCADE kernel.
DXF and PDF/X-4 for AI agents: structured facts, PNG renders, an interactive in-chat viewer.
Package intelligence MCP for AI agents — 22 tools, 19 ecosystems, AGPL SDK, free.
Deterministic reasoning stack for AI agents: simulate, decide & compute, plus cross-domain tools.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server to control FreeCAD from Claude — parametric modeling, sketches, CAM toolpaths, geometry inspection, and more via 33 tools.41GNU Lesser General Public v2.1 only
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to perform CAD operations through FreeCAD, including part conversion, 3D printing slicing, fluid simulation, and structural analysis, with a web dashboard for human interaction.23MIT
- AlicenseCqualityDmaintenanceAllows AI agents like Claude to create, edit, and query 3D models in FreeCAD through natural language.576MIT
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to safely generate parametric CAD parts (STEP/STL) using verified templates and FreeCAD, with validation and assembly support.MIT