Skip to main content
Glama

biz.dfch.SpecMgr

License: AGPL v3 Python Lint and Test Coverage TestPyPI version PyPI version PyPI downloads MCP Registry

An artifact manager for system specifications.

This project is an MCP server that you can use to manage different specification artifacts — see Concepts for the full list of artifact types and how they relate, and MCP Server / docs/MCP.md for the tool/resource/prompt reference.

The MCP server (and the management CLI) are optional. You install them as "extras" (see Installation).

Table of Contents

Related MCP server: OKF Knowledge MCP

Concepts

Every artifact is a plain markdown file with a YAML frontmatter block on disk — git-friendly, diffable, and readable/editable by hand. The filesystem is always the source of truth; the MCP server wraps it with structured, validated read/write/list/status tools (see Usage).

Type

Purpose

QA — Question and Answer

Structured elicitation interview (organized by ISO/IEC 25010 characteristic) capturing stakeholder Q&A; usually where a new spec effort starts

GOL — Goal

High-level business goal — what the organization wants to achieve, above individual requirements

PRB — Problem Statement

Six-Sigma-style problem statement describing the problem a goal/requirement addresses

REQ — Requirement

A single system requirement (EARS-style phrasing), classified by ISO/IEC 25010 characteristic

UC — Use Case

Actor/system interaction describing a specific usage scenario

RSK — Risk

Risk-register entry: cause/trigger/consequence, 5x5 probability/impact assessment (initial + residual), TARA response strategy

DEC — Decision

General-purpose decision record (MADR-style), not limited to architecture

ADR — Architecture Decision Record

Architecture-specific decision record; deprecated, use DEC instead

TSK — Task List

Checklist of implementation tasks, e.g. for a requirement or feature

VCR — Verification Case Record

Verifies exactly one REQ or UC; holds a collection of AC-NNN acceptance criteria (each with a DTAIS verification method) plus one overall coverage outcome (full/partial/none)

SOP — Standard Operating Procedure

Step-by-step operational procedure with RASCI responsibility assignment and approval lifecycle

FEAT — Feature

Development work-unit plan/progress tracking (.specmgr/feat/<id>/README.md)

SYSRS — System Requirements Spec

Aggregates GOL/PRB/QA/UC/REQ/RSK/DEC-ADR/VCR via cross-reference lists into one navigable spec; its structure follows ISO/IEC/IEEE 29148:2018 (Systems and software engineering — Life cycle processes — Requirements engineering), with a few specmgr-only additions (e.g. ## Decisions, ## Risks)

A typical spec effort starts with a QA elicitation interview, which surfaces GOLs (goals) and PRBs (problems). Those inform REQs and UCs, which get risk-assessed (RSK) and backed by DECisions, verified via one VCR per REQ/UC (each collecting its acceptance criteria), and tracked via TSK task lists. A SYSRS ties all of it together into one ISO/IEC/IEEE 29148-structured specification. SOP and FEAT support the process itself rather than sitting in this chain.

QA -> GOL / PRB -> REQ / UC -> RSK / DEC -> TSK, VCR -> SYSRS (aggregates all)

Installation

As a library only (no CLI, no MCP server):

pip install biz-dfch-specmgr

With the CLI:

pip install "biz-dfch-specmgr[cli]"

With the MCP server:

pip install "biz-dfch-specmgr[mcp]"

With semantic-similarity search (find_related/find_similar_text, see Semantic Similarity Search below), add the similarity extra on top of mcp:

pip install "biz-dfch-specmgr[mcp,similarity]"

Or with uv:

uv add "biz-dfch-specmgr[cli,mcp,similarity]"

CLI Usage

With the CLI you can generate schema and documentation. We use these commands in pre-commit hooks and ci.yml.

No domain document-management commands (create/update/status/etc.) exist in the CLI yet — those are currently MCP-only, see MCP Server. The CLI covers version, mcp (below), a handful of cross-cutting/doc-generation commands, and the diagram commands — UC → PlantUML (see UC → PlantUML Diagrams) and reference-graph (see Reference Graph Diagrams) (specmgr --help for the full list).

specmgr version

UC → PlantUML Diagrams

Specmgr can turn UC artifacts into PlantUML diagrams — deterministic use-case and package diagrams, plus sequence diagrams attributed by the agent flow.

Sequence diagrams (agent path). The generate_uc_sequence_diagram MCP prompt (in OpenCode: the self-triggering uc-diagram skill or the /uc-diagram <id> command) runs the frozen rulebook flow: the agent attributes every UNATTRIBUTED message (asking via the question tool when not confident), validates with validate_plantuml, and writes diagrams/uc/<id>.sequence.puml host-natively — no specmgr tool writes .puml files.

Deterministic diagrams + tooling (CLI, deterministic-only — the CLI never creates, overwrites, or diffs the agent-owned *.sequence.puml files):

specmgr diagram uc <id>|all --out <dir> [--check]  # per-UC <id>.usecase.puml + package.puml; --check byte-diffs without writing (exit 0 ok / 1 diff / 2 usage-or-render error)
specmgr plantuml-check <path...>                   # validates any .puml through the chain (exit 0 valid / 1 invalid / 2 source misconfigured-or-unavailable / 3 inconclusive)
specmgr plantuml-encode <path|->                   # offline classic SoWkI… encoding

Validation source. Exactly three env vars, the first one set is the only source used (no fall-through, no PATH discovery, no public default): SPECMGR_PLANTUML_JAR (a plantuml.jar path), SPECMGR_PLANTUML_BIN (an executable speaking the PlantUML CLI contract), SPECMGR_PLANTUML_URL (a PlantUML server base URL). All unset ⇒ offline structure-only validation. Diagram content is never sent to plantuml.com unless you set that URL.

The normative rulebook ships as the specmgr://uc/plantuml resource; the full MCP surface is in docs/MCP.md.

Reference Graph Diagrams

Specmgr can render the deterministic cross-reference network between its artifacts (the <TYPE> <id> tag vocabulary behind the list_references tool) as a PlantUML component diagram — one node per artifact (label = the document title, truncated to the SPECMGR_DIAGRAM_MAX_TITLE limit, default 40), a stereotype + colour per artifact type (a frozen 14-entry palette), nodes grouped into per-domain package blocks, one edge per unique reference ({src} --> {dst} : refers to), every edge that lies on a cycle (self-loops and same-SCC ≥ 2) drawn with a red -[#red]-> arrow, and every reference whose target cannot be resolved on disk drawn as a top-level <<UNRESOLVED>> node. Fully deterministic: the same registry and the same arguments always emit byte-identical source.

MCP tools. get_reference_diagram(type, id, depth=1, reverse=False, include_feat=True, title=None) renders one source document's reference neighbourhood (the forward walk to depth, 1..5; reverse=True adds the direct incoming references, additive and direct-only); get_reference_diagram_all(include_feat=True, title=None) renders the registry-wide graph. Both return the PlantUML source directly (no file writes); the scoped tool accepts all 13 domains (adr included) and returns the non-raising ParseFailureResult for an existing-but-broken source; the registry-wide tool never raises for content.

CLI (writes the artifact, deterministic-only):

specmgr diagram refs <type> <id> [--depth N] [--reverse] [--no-feat] [--title T] [--out diagrams/refs] [--check]  # scoped → <id>.refs.puml
specmgr diagram refs all [--no-feat] [--title T] [--out diagrams/refs] [--check]                                   # registry-wide → reference-graph.puml

--no-feat drops every FEAT node except the explicitly requested source (then every edge touching a dropped node). Exit codes: 0 written / no diff, 1 a --check diff (a missing file counts as differing) or the missing mcp extra, 2 a usage-or-resolution error (wrong-format type/id/depth — a bare feat-NNN is rejected, use list_feat to discover the exact id — a missing source, an existing-but-broken source, all combined with a source). Written artifacts carry no structure-only header (checker-clean by construction).

Validation. specmgr plantuml-check <path...> (or the validate_plantuml MCP tool over the source) validates the diagram through the same strict chain as the UC diagrams (the three SPECMGR_PLANTUML_* source env vars, see UC → PlantUML Diagrams; all unset is the offline structure-only floor).

Label limit. SPECMGR_DIAGRAM_MAX_TITLE (an int, default 40) bounds the resolved-node H1 labels (word-boundary cut + …; a set-but-invalid value falls back to 40); the @startuml diagram title is sanitized but never truncated. Its set/valid/default/resolved status is reported by the diagram section of the specmgr://config resource (the raw value is never disclosed).

The normative rulebook ships as the specmgr://reference-graph resource; the full MCP surface is in docs/MCP.md.

MCP Server

Requires the mcp extra. The server exposes resources, tools, and prompts for document management, plus cross-cutting utilities (e.g. markdown formatting).

The full, up-to-date list of every resource, resource template, tool, and prompt — with parameters, MIME types, and descriptions — lives in docs/MCP.md. That document generated from the live server registration by specmgr mcp-docs and kept in sync by a pre-commit hook and a CI check.

Environment Variables

Every document type stores its .md files in a base directory on disk — the file is always the source of truth, re-read and re-parsed on every tool call, so hand-editing a file between calls is safe.

  • ADRs: base directory defaults to docs/adr, configurable via the SPECMGR_ADR_DIR environment variable. This is ADR-specific and not shared with other document types.

  • Requirements (REQ) and future document types: share one root directory, configurable via the SPECMGR_DOCS_DIR environment variable (default docs), with each type's own subdirectory appended automatically (e.g. docs/req for requirements).

  • Features (FEAT): base directory defaults to .specmgr/feat, configurable via the SPECMGR_FEAT_DIR environment variable. This is FEAT-specific, like ADRs above, and not shared via SPECMGR_DOCS_DIR.

  • PlantUML validation source (UC diagrams): SPECMGR_PLANTUML_JAR (a plantuml.jar path), SPECMGR_PLANTUML_BIN (an executable speaking the PlantUML CLI contract), and SPECMGR_PLANTUML_URL (a PlantUML server base URL) — the first one set is the only source used (no fall-through, no PATH discovery, no public default); all unset is the offline structure-only floor. See UC → PlantUML Diagrams for the how-to.

  • Reference-graph diagram label limit: SPECMGR_DIAGRAM_MAX_TITLE (an int, default 40) — the maximum length of a resolved node's H1 label in the get_reference_diagram / get_reference_diagram_all PlantUML diagrams (word-boundary cut + …; the diagram title itself is never truncated). A set-but-invalid value (empty, non-int, or < 1) falls back to 40. Its set/valid/default/resolved status is reported by the diagram section of the specmgr://config resource (the raw value is never disclosed).

The specmgr mcp command's own transport settings are likewise environment-driven: SPECMGR_MCP_TRANSPORT selects the transport (default stdio; the allowed values are stdio, sse, and streamable-http), and SPECMGR_MCP_HOST (default localhost) and SPECMGR_MCP_PORT (default 8000) are the bind address and TCP port, used only in sse/streamable-http mode. The command's --transport/--host/--port flags take precedence over the variables — see Start the MCP Server below for the options table.

The find_related/find_similar_text tools (semantic-similarity search, requires the similarity extra) are turned off by setting the SPECMGR_SIMILARITY_DISABLED environment variable (any value; presence-based) — see Semantic Similarity Search below for the full behavior (install, the non-blocking background warmup at server startup, the model cache location, and the structured unavailable result both tools return when the feature is disabled or the backend/model fails to load).

The semantic-similarity feature's model cache directory is the FASTEMBED_CACHE_PATH environment variable (the third-party fastembed backend's own variable, not a SPECMGR_* one): an unset or empty value falls back to <tempdir>/fastembed_cache (e.g. /tmp/fastembed_cache on Linux). The resolved directory is reported by the similarity section of the specmgr://config resource — see Semantic Similarity Search below for the full behavior.

The feat domain's two background cache-warming phases (frontmatter and full-parse, run by the same unified server-startup warmup thread as the similarity warmup) are likewise turned off by setting the SPECMGR_FEAT_WARMUP_DISABLED environment variable (any value; presence-based) — see the background warmup paragraph of Semantic Similarity Search below for the thread's full behavior and both opt-out flags.

SPECMGR_TESTS_NO_DOTENV is a presence-based test/CI sentinel (no default; never set outside test runs): set to any value to skip the CLI's module-level default .env load entirely, so a test run sees no local (gitignored) .env configuration whatever the developer's machine has.

All of the base directories above are resolved relative to the MCP server process's own current working directory unless overridden by their env var (or, for the shared SPECMGR_DOCS_DIR root, unless the server was started with --directory/uv run --directory targeting your project). If that CWD is not what you expect — e.g. after adding specmgr to an MCP host per Add to OpenCode below — read the specmgr://config resource to see every domain's actually-resolved absolute base directory and whether its env var is explicitly set, without needing shell access to the server's host.

The find_related and find_similar_text tools rank documents by semantic similarity using local sentence embeddings (no API keys, no network at inference time). find_related(type, id) finds the documents most related to an existing document; find_similar_text(query) finds the documents most similar to a free-form query — e.g. a draft you have not saved yet, for pre-creation dedup/discovery. Both tools always appear in the tool list, regardless of whether the feature is installed or enabled: when it is unavailable, each call returns a structured {available: false, reason, message} result instead of raising.

Install. The tools need the optional similarity extra on top of mcp — the exact commands are in Installation (pip install "biz-dfch-specmgr[mcp,similarity]" or uv add "biz-dfch-specmgr[cli,mcp,similarity]"). The backend is fastembed running BAAI/bge-small-en-v1.5 (CPU-only, ONNX Runtime, 384-dim).

Model download and cache. The model is downloaded once from the Hugging Face Hub the first time it is loaded (network required at that point only; after that, inference is fully offline). It is cached in $FASTEMBED_CACHE_PATH if that environment variable is set, otherwise in <tempdir>/fastembed_cache (e.g. /tmp/fastembed_cache on Linux).

Background warmup at server startup. Unless both SPECMGR_FEAT_WARMUP_DISABLED and SPECMGR_SIMILARITY_DISABLED are set, the server starts a single background daemon thread at startup that runs three warmup phases, strictly in order: the feat frontmatter phase (cheap: frontmatter plus H1 only), the feat full-parse phase (expensive: the full feat corpus), and the similarity phase, which embeds the full document corpus into the in-memory cache. Each phase is independently gated by its own opt-out flag: SPECMGR_FEAT_WARMUP_DISABLED (any value; presence-based) skips the two feat phases, and SPECMGR_SIMILARITY_DISABLED (any value; presence-based) skips the similarity phase, regardless of whether the similarity extra is installed. With the extra missing, or with the model failing to load, the similarity phase runs the availability probe inside itself and exits immediately without cache writes (still never raising). The thread is non-blocking — server startup never waits for it (the model load/download, if needed, happens inside the thread, not on the startup path) — and a mid-warmup failure is logged and swallowed, leaving the cache partially warm. Its purpose is to keep the first tool call fast: against a cold cache, list_feat scans and re-parses the whole feat corpus on the request path, and the similarity tools embed the corpus on demand — both can cost minutes of CPU.

Opt-out. Set SPECMGR_SIMILARITY_DISABLED (any value; presence-based) to disable the feature without uninstalling the extra — e.g. to skip the model download entirely, on a host where the model was never downloaded, or to free the memory the model and cache use. Both tools stay registered either way. Set SPECMGR_FEAT_WARMUP_DISABLED (any value; presence-based) to skip the two feat cache-warming phases without any other effect — e.g. on a host where list_feat/get_feat are rarely called. With both opt-out flags set, no warmup thread is started at all.

Introspection. Read the specmgr://config resource for the feature's static configuration — its similarity section reports whether the similarity extra is installed, whether the opt-out flag is set, the model name, and the resolved cache directory (static facts only; reading the resource never loads the model or creates the cache directory), and its feat_warmup_disabled field reports whether the feat warmup opt-out flag is set — and the specmgr://version resource for the installed fastembed version (null when the extra is not installed).

Start the MCP Server

Start the server with the mcp command:

specmgr mcp

By default it runs over stdio, for MCP hosts that launch it as a subprocess (see Add to OpenCode below). It can also run over SSE/network:

specmgr mcp --transport sse --host localhost --port 8000

Or over the spec-current streamable-http transport, which replaces the legacy/deprecated sse transport for HTTP deployments:

specmgr mcp --transport streamable-http --host localhost --port 8000

Option

Env var

Default

Description

--transport / -t

SPECMGR_MCP_TRANSPORT

stdio

Transport mode: stdio, sse, or streamable-http

--host / -h

SPECMGR_MCP_HOST

localhost

Bind address (SSE/streamable-http mode only)

--port / -p

SPECMGR_MCP_PORT

8000

TCP port (SSE/streamable-http mode only)

Add to OpenCode

To add the specmgr MCP server to your OpenCode configuration:

  1. Open your OpenCode config file (typically ~/.config/opencode/opencode.json or ~/.config/opencode/opencode.jsonc)

  2. Add a configuration to the mcp section (and use it via stdio).

    A bare uvx --from biz-dfch-specmgr[mcp] specmgr mcp command with no --directory and no SPECMGR_*_DIR env vars is unsafe: the server resolves every base directory (docs, docs/adr, .specmgr/feat, ...) relative to its own process's current working directory, which an MCP host is free to launch from anywhere — not necessarily your project root. Pick one of the two options below instead of the plain form:

    Option A — pin the working directory with --directory (a global uv/uvx flag, so it must come before --from):

    "specmgr": {
      "type": "local",
      "enabled": true,
      "command": [
        "uvx",
        "--directory",
        "<path-to-your-project>",
        "--from",
        "biz-dfch-specmgr[mcp]",
        "specmgr",
        "mcp"
      ]
    }

    To also enable the Semantic Similarity Search feature (find_related/ find_similar_text), change [mcp] to [mcp,similarity] in the --from value above — see that section for install/runtime-activation details.

    Option B — set the directory env vars explicitly instead of (or in addition to) --directory:

    "specmgr": {
      "type": "local",
      "enabled": true,
      "command": [
        "uvx",
        "--from",
        "biz-dfch-specmgr[mcp]",
        "specmgr",
        "mcp"
      ],
      "environment": {
        "SPECMGR_DOCS_DIR": "<path-to-your-project>/docs",
        "SPECMGR_ADR_DIR": "<path-to-your-project>/docs/adr",
        "SPECMGR_FEAT_DIR": "<path-to-your-project>/.specmgr/feat"
      }
    }

    The same [mcp] -> [mcp,similarity] change in the --from value applies here too, to enable Semantic Similarity Search.

    Either option (or both together) makes the resolved base directories independent of wherever the MCP host happens to launch the server from. Whichever you choose, you can confirm it worked by reading the specmgr://config resource, which reports the actually-resolved absolute base directory for every domain and whether its env var is explicitly set.

    Option C — run from a local source checkout (development). Options A and B both use uvx (uv tool run), which resolves biz-dfch-specmgr[...] as a named package from the configured index (PyPI by default) into an ephemeral tool environment — they always run the published release, never local/unreleased changes. To instead run the project at a specific directory on disk — using its own pyproject.toml, lockfile, and source tree directly, including unreleased/dev-branch commits — use uv run --directory <path-to-your-checkout> (no --from, not uvx):

    "specmgr": {
      "type": "local",
      "enabled": true,
      "command": [
        "uv",
        "run",
        "--directory",
        "<path-to-your-checkout>",
        "--extra",
        "mcp",
        "--extra",
        "similarity",
        "specmgr",
        "mcp"
      ]
    }

    This is the mechanism for contributors/developers pointing OpenCode at their own git checkout instead of the published package. Repeatable --extra flags (or --all-extras for everything) control which optional dependencies get synced into that local run, independent of what's published on PyPI — drop --extra similarity if you don't need Semantic Similarity Search.

  3. Save the file and restart OpenCode

Usage

Once connected, your AI assistant sees two kinds of tools per document domain: per-domain tools (create_<d>, get_<d>, list_<d>, parse_<d>, plus get_<d>_example/get_<d>_template), and generic dispatch tools that take a type= parameter and behave the same way across every domain: update (whole-body or line-range edits), set_status, set_classification, delete, and validate (ADR is the one exception, predating this pattern, with its own dedicated tools instead). See docs/MCP.md for the full list.

The server also ships prompts (e.g. create_req, update_req, implement_task) — guided, multi-turn interview flows that are the intended way to author documents conversationally, rather than calling tools one by one. Most MCP hosts surface these as slash commands or a prompt picker.

Day to day, you don't need to know any tool names at all — just ask your connected AI assistant in plain language, e.g.:

  • "Create a new goal for reducing customer onboarding time."

  • "List all open risks and show me the high-severity ones."

  • "Draft a task list for requirement <id>."

To resolve the cross-references an artifact already carries, see Referencing Artifacts.

Referencing Artifacts

specmgr documents cross-reference each other via <TYPE> <uuid> lines in the structured locations (VCR's ## Verifies, SYSRS's per-section bullet lists, DEC's ## Related Artifacts) and — anywhere in free-form prose — via any of the reference tags, including a FEAT tag carrying a feature's own id (the full feat-NNN-slug or the bare feat-NNN number; the structured locations above remain uuid-only). The list_references MCP tool resolves those references: point your assistant at any artifact (<type> <id>) and it lists every cross-reference tag in the artifact's body, each resolved to the referenced document's type, id, title (its H1), and on-disk path. Results are paged like every list_* tool; references that do not resolve on disk come back as rows carrying an error (not a failure), and any other free-form or non-conforming text is ignored.

In opencode, the /refs <type> <id> slash command (.opencode/command/refs.md) wraps the same tool: it delegates to the read-only ref-finder subagent (.opencode/agent/ref-finder.md), which calls list_references and reports the rows, flagging any NOT FOUND references. /refs requires opencode — the tool itself is plain MCP, callable directly from any MCP client.

Also in opencode, the project-local specmgr-refs skill (.opencode/skills/specmgr-refs/SKILL.md) is the agent-initiated surface: it loads itself when a task matches reference-retrieval phrasings, routes single-document requests to the list_references tool, the ref-finder subagent, or the /refs command, and codifies the graph, batch, and reverse workflows that /refs and ref-finder do not cover.

Development

Install dev dependencies

uv sync --all-extras

Install pre-commit hooks (one-time)

uv run --frozen pre-commit install

uv sync only installs Python dependencies into the venv — it never registers the hooks from .pre-commit-config.yaml with git, so run this once per clone before your first commit.

Run linters

uv run --frozen ruff format --check
uv run --frozen ruff check
uv run --frozen pylint $(git ls-files '*.py')

Run tests

uv run --frozen pytest -n auto --cov=src --cov-report=

Testing

You can exercise the MCP server directly with the MCP Inspector, in either its CLI (scriptable) or TUI (interactive terminal) client.

Prerequisites

  • The mcp extra installed (see Installation), so .venv/bin/specmgr exists.

  • npx (ships with Node.js, version 22.19.0 or newer) — no separate Inspector install is required, it runs on demand via npx @modelcontextprotocol/inspector.

Point the Inspector at the venv's specmgr binary directly (rather than at uv run specmgr mcp) so none of uv run's own flags (e.g. --frozen) are mistaken for Inspector flags:

npx @modelcontextprotocol/inspector --tui .venv/bin/specmgr mcp
npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp --method tools/list

CLI examples

Each CLI invocation connects, runs one request, prints the result, and exits — useful for scripting or a quick smoke test.

Get the specmgr://version resource:

npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp \
  --method resources/read --uri specmgr://version

List task lists via the list_tsk tool:

npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp \
  --method tools/call --tool-name list_tsk

Get one task list via the get_tsk tool (replace <id> with a real task list id from the list_tsk output above):

npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp \
  --method tools/call --tool-name get_tsk --tool-arg id=<id>

Add --format json to any of the above to get machine-readable output, e.g. piped into jq.

Connecting with the TUI

npx @modelcontextprotocol/inspector --tui .venv/bin/specmgr mcp

This launches the server as an ad-hoc stdio target and opens the terminal UI with it preselected (unlike the CLI, the TUI has no --server <name> flag — it lists whichever servers are available and you pick one, though with a single ad-hoc target there is nothing else to pick). Press c to connect, then use the tabs to explore:

  • t — Tools tab: browse and call tools (e.g. get_tsk) with a form-based input.

  • r — Resources tab: browse and read resources (e.g. specmgr://version, specmgr://iso25010).

  • m — Prompts tab: list and render prompts.

  • p — Protocol tab: raw JSON-RPC request/response history, useful for debugging.

  • o — Console tab: stderr from the connected specmgr mcp process (tracebacks land here).

  • c / d — connect / disconnect; Esc or Ctrl+C — exit.

The TUI requires a real TTY (raw-mode support) and does not run in a headless CI job — use the CLI client there instead.

Make a Release

The normative release procedure is the SOP Perform a release of biz.dfch.SpecMgr (SOP 98537416). Where this section, the script, or the command ever disagree with the SOP, the SOP wins.

/release [X.Y.Z | patch | minor | major] [--dry-run]

The command drives the staged script and performs the SOP's agent-judgment steps: it confirms the resolved version with you, curates the changelog's [Unreleased] section, pauses at the merge gate before dev is merged into main, and triages failures without ever auto-retrying.

Using the script directly

Each SOP step maps to a deterministic, idempotent stage (the SOP carries a manual fallback command for every step):

scripts/release.sh resolve minor         # print the target version (e.g. 0.15.0); no mutation
scripts/release.sh precheck 0.15.0       # fail-fast pre-release checks
scripts/release.sh bump 0.15.0           # pyproject.toml + uv.lock
scripts/release.sh changelog 0.15.0      # [Unreleased] -> dated section
scripts/release.sh commit-push 0.15.0    # 3-file release commit, push dev, wait for CI
scripts/release.sh pr-create 0.15.0      # dev->main release PR, wait for checks (no merge)
scripts/release.sh pr-merge 0.15.0       # ff-only merge (after maintainer go-ahead)
scripts/release.sh tag-push 0.15.0       # tag on main, push the tag, back to dev
scripts/release.sh publish-wait 0.15.0   # the four publish.yml jobs
scripts/release.sh release-notes 0.15.0  # verify the release + set the GH release notes
scripts/release.sh status 0.15.0         # where does this release stand?
scripts/release.sh all 0.15.0            # the whole chain, TTY only (interactive merge gate)

Changelog curation (SOP step 3) is an agent or manual step: the changelog stage only moves the already-curated [Unreleased] section into its dated form.

Manual fallback

Follow the SOP step by step — each step carries a Manual fallback paragraph. The essentials: bump the version in pyproject.toml and move the [Unreleased] section of CHANGELOG.md into a new dated ## [x.y.z] - YYYY-MM-DD section; uv lock; commit exactly pyproject.toml + uv.lock + CHANGELOG.md as chore(release): bump version to vX.Y.Z and push to dev; once CI is green, open the dev → main pull request and merge it fast-forward-only (git merge --ff-only dev — never a merge commit or squash: main must stay a strict ancestor of dev); then create git tag vX.Y.Z on main, push the tag, and wait for the publish workflow.

Note: .github/workflows/publish.yml handles the rest of the release automatically once the tag above is pushed — it builds and publishes the sdist/wheel to TestPyPI then PyPI via Trusted Publishing (OIDC, no stored token), creates the matching GitHub Release with the built artifacts attached, and publishes server.json (repo root, the MCP Registry publisher manifest — see the server.json format spec) to the MCP Registry via mcp-publisher/GitHub OIDC. biz-dfch-specmgr is live on PyPI and in the MCP Registry as of v0.1.0.

License

AGPL-3.0-or-later

Available Tools

103 tools
create_adrCreate ADRB

Create a new ADR: assigns a fresh id, derives a filename from the title, validates, renders, and writes the new document to the ADR base directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
frontmatterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
bodyYes
frontmatterYes

TDQS

B3.4/5.0
Behavior3/5

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 meaningful side effects: a fresh id is assigned, the filename is derived from the title, the document is validated/rendered, and it is written to the ADR base directory. It does not cover failure modes (e.g. what happens if validation fails), overwrite protection, or permissions, leaving part of the mutation contract undeclared.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence naming the action first, then the pipeline in sequence. No filler, no redundancy, appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the parameter meaning lives in the rich $defs descriptions. The description adequately covers the write pipeline for a create tool; only failure/overwrite behavior is left implicit given the absence of annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema coverage is 0% and the description adds no parameter detail. However, the referenced $defs (AdrBody, AdrFrontmatter, AdrOption) carry exhaustive per-field documentation, so an agent reading the schema still gets full parameter meaning; the description itself contributes nothing here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new ADR') and goes further by enumerating the operational pipeline: id assignment, filename derivation, validation, rendering, and write to the base directory. This distinguishes it from read/update siblings, though it does not explicitly differentiate itself from the parallel create_* family (e.g. create_dec).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says what the tool does but never states when to use it versus alternatives such as edit, update, update_section, or the other create_* document tools. No prerequisites, no exclusions, no routing guidance is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_decCreate decisionA

Create a new decision: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the decision base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_dec tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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: filename derivation from H1, body-only validation, a non-raising ValidateResult (valid=False, errors[].message capped at 300 chars) on failure, and the crucial fact that nothing is written in that case. That failure semantics disclosure is exactly what 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded, but the text is padded with internal metadata -- ADR GUIDs, feat-110, GitHub issue #204, 'case 5 of the ADR 519d1206 chain' -- that adds no value for tool selection or invocation. Structure is a single dense run-on, which harms readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still usefully states the return is frontmatter-only (no body) and points to get_dec for the full document, plus covers failure behavior. For a single-param creation tool, 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single 'content' param has no schema description, so the description must compensate -- and it does by clarifying the input is 'body-only content' (not frontmatter), with the H1 title used for the filename. It adds real meaning, though it doesn't specify format/length constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 decision') and then enumerates the concrete internal steps: assigns id, derives filename from the H1 title, validates body-only content, writes to the decision base directory. This clearly separates it from the get_dec/list_dec/parse_dec siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It only gives one routing instruction -- use get_dec afterward to fetch the full document -- which is a follow-up pointer rather than explicit when-to-use vs alternatives guidance. There is no stated condition for choosing create_dec over, say, edit/update, nor any prerequisite guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_featCreate featureA

Create a new feature: assigns a fresh id (caller-chosen via the optional 'id' parameter, or defaulted to feat-0- when omitted -- no max+1 auto-generation), derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the feature base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Content validation runs BEFORE the id-shape ValueError and already-existing-id/folder FileExistsError guards, so a compound failure (invalid content + a malformed or already-existing id) returns the ValidateResult and the guard never runs in that call; each guard still raises whenever the content is valid. Returns the newly created document's frontmatter only (no body); use the corresponding get_feat tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the behavioral burden and then some: it discloses that ids are NOT max+1 auto-generated, that validation failures return a non-raising ValidateResult and write nothing, that validation runs BEFORE the id-shape and FileExistsError guards, and that a compound failure short-circuits the guards. This is unusually rich pre-call context for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded, but the single mega-sentence is bloated with internal traceability an agent cannot use: ADR UUIDs (f14f125e-..., 519d1206), issue numbers (#204, feat-110), and 'case 5 of the ... workaround chain'. This noise crowds out the actionable content and makes the definition hard to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with real complexity (non-raising validation, guard ordering, frontmatter-only return), the description covers creation semantics, error behavior, and the follow-up read tool well. Since an output schema exists it need not document the return shape in detail, and it does not need to; a minor gap is that no permissions/auth context is given.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema gives only bare 'Id'/'Content' titles, so the description must compensate. It thoroughly explains the optional 'id' (caller-chosen, default feat-0-<slug-from-title>, no max+1). 'content' is characterized as body-only content validated against a schema with an H1-derived filename, though the accepted content shape itself is not spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first clause gives a specific verb and resource ('Create a new feature') and immediately elaborates the mechanics: id assignment, filename derivation from the H1, body validation, and the write. It is clearly distinguishable from sibling get_feat and the other create_* tools, since the resource is named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent to the follow-up tool ('use the corresponding get_feat tool to fetch the full document afterward') and frames the return value accordingly. It does not, however, say when to create a feat vs. a tsk/gol/req or any prerequisites for creating a feature document, so no exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_golCreate goalA

Create a new goal: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the goal base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_gol tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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 id assignment, filename derivation from the H1, that a validation failure returns a non-raising ValidateResult and writes nothing, and that only frontmatter (not the body) is returned. The remaining shortfall is the heavy embedding of internal ADR UUIDs and issue numbers (ADR f14f125e..., ADR 519d1206, issue #204, feat-110) that are not actionable for the calling agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operative behavior is front-loaded in the first sentence, but the second sentence is a dense run-on of implementation trivia—ADR UUIDs, GitHub issue numbers, 'case 5 of the ADR 519d1206 non-raising-structured-result workaround chain'—that costs the reader without helping tool selection. Much of this should be dropped or tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is optional, yet the description usefully notes frontmatter-only return and the follow-up get_gol call. The mutation path (nothing written on validation failure) is covered, leaving only parameter-format detail as a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single `content` parameter, so the description must compensate. It partially does by clarifying this is body-only content and that the H1 title drives the filename, but it never names the parameter explicitly or states format constraints (e.g. markdown vs plain text), leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first clause states a specific verb (Create) and resource (goal), and the surrounding detail (assigns id, derives filename, validates body, writes to goal base directory) makes it unmistakably distinct from siblings like get_gol, list_gol, and parse_gol. An agent can identify the operation 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (create a new goal document) and it routes the agent to get_gol for the full document afterward. However, there is no explicit when-to-use guidance relative to the other create_* tools, nor any stated preconditions such as required permissions or where the base directory lives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_prbCreate problem statementA

Create a new Problem Statement: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the problem statement base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_prb tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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 that validation failures return a non-raising ValidateResult (valid=False, errors[].message capped at 300 chars) rather than raising AssertionError/pydantic.ValidationError, and that nothing is written in that case. It also discloses the return shape (frontmatter only, no body).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the primary action and effect chain, then behavior on failure, then return contract. Dense but largely earn-its-place; the internal ADR/issue/feat references are verbose and add noise for an agent deciding whether to call it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-input create tool with an output schema, the description is nearly complete: it covers effects, failure semantics, and return contract. The remaining gap is authoring guidance (no mention of get_prb_template/get_prb_example for body structure), which an agent would likely want.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there is a single parameter, so the description must compensate. It clarifies that content is body-only and that its H1 title is used to derive the filename, which adds real meaning beyond the bare 'content: string' schema. It stops short of specifying expected body format or required sections.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb + resource ('Create a new Problem Statement') and enumerates the concrete effects: fresh id, filename derivation, validation, and write to the base directory. An agent can distinguish it from sibling create_* tools and from get_prb/parse_prb/list_prb 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only routing guidance is a follow-up pointer: use get_prb to fetch the full document afterward. There is no explicit when-to-use versus edit/update/update_frontmatter, nor a pointer to get_prb_template for authoring the body, so context 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.

create_qaCreate QA documentA

Create a new Question and Answer (QA) document: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the QA base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_qa tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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 discloses id assignment, filename derivation from the H1 title, validation of body-only content, write target directory, that nothing is written on validation failure, and the non-raising ValidateResult contract with a capped error message. It also states that only frontmatter (no body) is returned. No annotation contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Core behavior is front-loaded in the first sentence, and the critical return-contract and follow-up tool are stated clearly. The dense parenthetical citing ADR UUIDs, feat-110, and 'case 5 of the ADR chain' adds internal-reference clutter that a calling agent does not need.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with an output schema present, the description covers what is written, what is not written on failure, the failure/result shape, and how to retrieve the full document. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single param is undocumented in the schema, but the description compensates by clarifying that content is 'body-only' and that a filename is derived from its H1 title, implying an H1 is expected. This meaningfully extends beyond the bare 'content: string' schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Create a new Question and Answer (QA) document') and enumerates the distinct operations performed (fresh id, filename derivation, body validation, write to QA base dir). This clearly distinguishes it from the sibling create_* tools for other document types and from get_qa.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly routes the agent to the follow-up tool ('use the corresponding get_qa tool to fetch the full document afterward'), which is genuine guidance. However, it gives no when-not-to-use conditions and does not contrast with siblings like edit, update, or parse_qa.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_reqCreate requirementA

Create a new requirement: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the requirement base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_req tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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 non-raising ValidateResult contract, the exact failure shape (valid=False, single errors[].message capped at 300 chars), and crucially that nothing is written on validation failure. It also states the return is frontmatter-only, which is 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded, but the paragraph is bloated with internal provenance that does not help tool selection: ADR UUIDs, GitHub issue #204, 'feat-110', and 'case 5 of the ADR 519d1206 workaround chain'. Those clauses cost tokens without guiding the agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter creation tool, all decision-relevant information is present: what it writes, how the id/filename are derived, error semantics, the no-write-on-failure guarantee, and what is returned. An output schema exists, yet the description still clarifies the return scope, leaving no gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 add real meaning: content is 'body-only' (frontmatter is derived, not supplied) and must contain an H1 title used for the filename. It stops short of describing validation rules or the expected markdown format, so it is not fully compensating.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (create a new requirement) and enumerates the exact operations performed: id assignment, filename derivation from the body H1, body validation, and write to the base directory. It also distinguishes itself from the retrieval sibling by pointing to get_req for the full document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to get_req after creation to fetch the full document, which is clear follow-up guidance. However, it never states when NOT to use this tool (e.g., when a requirement already exists, or versus parse_req/list_req) or any preconditions, so it falls short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_rskCreate riskA

Create a new risk: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the risk base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_rsk tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

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 does so richly: it discloses the failure mode (non-raising ValidateResult with valid=False, errors[].message capped at 300 chars), that nothing is written on validation failure, and that only frontmatter is returned. This is substantially more than any 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded, but the middle is bloated with internal references – an ADR UUID, feat-110, GitHub issue #204, case 5 of a workaround chain – that are noise for an agent choosing or invoking the tool. These citations dilute an otherwise efficient description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be fully explained, yet the description still usefully clarifies that only frontmatter (no body) is returned and that nothing is written on validation failure. Combined with the filename-derivation and validation disclosure, it is nearly complete; only the precise content format and error payload fields are left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single 'content' parameter, so the description must compensate. It does add real meaning: the content is 'body-only', it is 'submitted body-only content' that gets validated, and its H1 title drives the derived filename – useful semantics the schema lacks. It stops short of describing the exact content format or whether frontmatter is permitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new risk') and enumerates the exact side effects: id assignment, filename derivation from the H1 title, body validation, and write to the risk base directory. An agent can distinguish this from get_rsk and the other create_* siblings 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description routes the agent to the follow-up tool ('use the corresponding get_rsk tool to fetch the full document afterward'), which is explicit. However, it gives no when-to-use guidance for creating a risk versus other document types, and no exclusions or prerequisites for the creation act itself, so 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.

create_sopCreate Standard Operating ProcedureA

Create a new Standard Operating Procedure: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the SOP base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_sop tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the side effects (id assignment, filename derivation, write to the SOP base directory), the exact failure mode (non-raising `ValidateResult` with `valid=False` and a 300-char-capped error message, no write performed), and the return shape (frontmatter only, no body). This is behaviorally rich 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and outcome are front-loaded, but the middle is cluttered with internal identifiers (ADR UUIDs, issue #204, 'case 5 of the ADR... workaround chain', feat-110) that add no decision value for an agent and dilute the actionable content. Several sentences do not fully earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool's behavior, failure path, and return contract are all covered, so an agent has enough to invoke it correctly. Because an output schema already exists, the sentence describing the frontmatter-only return is somewhat redundant, but the coverage is otherwise complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single `content` param is undocumented in the schema, but the description compensates: it specifies the argument is body-only content (no frontmatter) and that its H1 title drives the generated filename. That is meaningful added semantics beyond the bare `string` type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Create a new Standard Operating Procedure') and enumerates the concrete lifecycle steps: id assignment, filename derivation from the H1 title, body validation, and write. It also explicitly names `get_sop` as the complementary tool, so an agent can separate it from the sibling `create_*`/`parse_sop` tools 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear follow-up step ('use the corresponding `get_sop` tool to fetch the full document afterward') but never states when to choose `create_sop` over alternatives such as `parse_sop`, `edit`, or `update_frontmatter`, nor any prerequisites for calling it. 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.

create_sysrsCreate System Requirements SpecificationA

Create a new System Requirements Specification: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the System Requirements Specification base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_sysrs tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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 that content validation failure returns a non-raising ValidateResult (valid=False, errors capped at 300 chars) instead of raising, that nothing is written in that case, and that only frontmatter is returned. This is behavior an agent cannot infer from schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the main purpose well, but parenthetical citations (feat-110, ADR f14f125e-..., GitHub issue #204, ADR 519d1206) are internal-tracking noise that adds length without helping an agent invoke the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value detail is optional, yet the description still notes only frontmatter is returned and points to get_sysrs for the body. For a mutation tool with no annotations, all decision-relevant information an agent needs is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the single content param, so the description must compensate, and it does: it specifies the value is 'body-only content' and that the H1 title drives filename derivation. Minor gap is that content format (markdown structure, size limits) is not spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb (Create) plus resource (System Requirements Specification) and enumerates the internal steps: assigns an id, derives a filename from the H1 title, validates the body, and writes to the base directory. This clearly distinguishes it from sibling creators of other document types and from get_sysrs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs the agent to call get_sysrs afterward to fetch the full document, and indicates the input is body-only content. It stops short of stating exclusions versus the other create_* tools, but the routing context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_tskCreate task listA

Create a new task list: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the task list base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_tsk tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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 invalid content returns a non-raising ValidateResult with a 300-char cap on error messages, that nothing is written in that case, and that only frontmatter is returned. It does not cover permissions, overwrite behavior, or id-collision handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single very long run-on sentence packed with internal ADR hashes (f14f125e...), a GitHub issue number, and a feat-110 tag. The routing guidance ('use get_tsk') is buried at the end, and the traceability jargon is not actionable for an agent selecting or invoking the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a single required param, no annotations, and an existing output schema, the description covers the essential operational facts: validation behavior, what is returned, and the follow-up tool. An output schema existing means return values need not be explained, which the description respects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (content) with 0% schema description coverage. The description clarifies that content is 'body-only' and validated, and that the H1 title drives the filename, which adds real meaning beyond the bare schema. But it doesn't specify accepted formats or validation rules that the agent could anticipate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 task list) and enumerates concrete sub-steps: fresh id assignment, filename derivation from the body's H1, content validation, and document write. This clearly distinguishes create_tsk from the many sibling get_/list_/parse_/create_ tools across other artifact types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to use get_tsk afterward to fetch the full document, since only frontmatter is returned. However, it gives no guidance on when to prefer create_tsk over create_* siblings for other artifact types, or any preconditions (e.g., where the body must come from).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_ucCreate use caseA

Create a new use case: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the use-case base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_uc tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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 id assignment, filename derivation, validation of body-only content, the non-raising ValidateResult on failure (valid=False, capped error message) instead of raising AssertionError/ValidationError, that nothing is written on failure, and that only frontmatter is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, but the middle sentence is a dense run-on laden with internal identifiers (ADR UUIDs, feat-110, GitHub issue #204, case numbers) that add little for an agent selecting or invoking the tool. Those references inflate length without improving the call decision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be detailed, yet the description still helpfully notes frontmatter-only returns. For an unannotated mutation tool it covers creation and failure behavior well, though it omits overwrite/permission behavior and whether the body requires a title.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 clarify that content is the complete body-only content (no frontmatter) and that its H1 title is used to derive the filename. It does not state format requirements (e.g., whether an H1 is mandatory), leaving a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 use case') and enumerates the concrete mechanics (fresh id assignment, filename derivation from the H1 title, validation, write to the use-case base directory). An agent can distinguish it from get_uc, parse_uc, and edit/update 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to get_uc for fetching the full document after creation, which is genuinely useful follow-up guidance. However, it gives no guidance on when to prefer create_uc over parse_uc/edit/update, and the creation context itself is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_vcrCreate verification case recordA

Create a new verification case record: assigns a fresh id, derives a filename from the body's H1 title, validates the submitted body-only content, and writes the new document to the verification case record base directory. A content-validation failure of the submitted body returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); nothing is written in that case. Returns the newly created document's frontmatter only (no body); use the corresponding get_vcr tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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 id generation, filename derivation from the H1 title, that nothing is written on validation failure, and the non-raising `ValidateResult` (`valid=False`, `errors[].message` capped at 300 chars) instead of `AssertionError`/`pydantic.ValidationError`. It does not cover other operational traits such as permission/auth requirements, behavior on filename collisions, or I/O error surfaces, so it is strong rather than complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded in sentence one, but the middle sentence is bloated with internal identifiers ('feat-110', ADR UUIDs, 'GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain') that an invoking agent cannot act on. Trimming those would preserve all usable meaning in roughly half the tokens.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description still adds value by stating the return is frontmatter-only with no body and pointing to get_vcr for the full document. Given a single-parameter mutation tool with no annotations, this covers calling behavior adequately; the remaining gap is failure handling outside the validation path.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 bare `content` string. It does: 'submitted body-only content' clarifies frontmatter must be excluded, and it explains that the H1 title inside the content drives the generated filename. It stops short of stating whether an H1 is mandatory or what format/encoding is expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 verification case record') and enumerates the concrete side effects: fresh id assignment, filename derivation from the H1 title, validation, and write to the VCR base directory. An agent can distinguish this from sibling create_* tools and from get_vcr/parse_vcr/list_vcr without opening anything else.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the follow-up alternative: 'use the corresponding `get_vcr` tool to fetch the full document afterward,' which resolves the natural next-step question after a write. However, it never states prerequisites or when NOT to use this (e.g., when to prefer parse_vcr or how a failed validation should be handled by the caller beyond noting nothing was written).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deleteDelete documentA

Permanently delete an existing document from disk across the whole-body domains (type is one of req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs; adr is not supported). Resolves the document by id, takes the domain lock, and removes it: the single *.md file for every flat domain (every whole-body domain except feat), or the entire <base>/<id>/ folder for feat. Returns the deleted path as a string. An invalid id (path-injection attempt or wrong format) is a ValueError raised before any file access; a missing document is the domain's own XNotFoundError; an I/O failure is a DeleteError. This is the sole delete entry point -- the former per-domain delete_<d> tools are removed.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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 domain lock acquisition, destructive permanence, the differing removal semantics for flat vs. feat domains, and three distinct error classes (ValueError raised before any file access, XNotFoundError, DeleteError). That is unusually rich behavioral context 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the destructive action and scope come first, then resolution mechanics, then error taxonomy. Every clause carries information, though the parenthetical enum recital partially duplicates the schema enum and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with no annotations, the description covers what gets destroyed, how lookup and locking work, the return value, and all failure modes. With an output schema present, it need not expand further on response shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 the accepted type values, explicitly excludes `adr`, and explains that `id` is resolved with validation against path-injection and wrong formats before file access. Both parameters gain meaning beyond the bare enum and string type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Permanently delete an existing document') plus the domains it applies to and the exact filesystem effect (single .md file vs. whole <base>/<id>/ folder). An agent can distinguish this from the many create_/get_/list_/parse_ 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as 'the sole delete entry point -- the former per-domain delete_<d> tools are removed', which resolves routing against siblings. There is no when-not-to-use guidance, but since no alternative delete path exists there is nothing to disambiguate further.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

editEdit documentA

Surgical, exact-match string replacement of an existing document's frontmatter-stripped body across the whole-body domains (type is one of req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs; adr is not supported -- an explicit pre-dispatch ValueError, unlike update's inherited KeyError). Read the current body via the corresponding get_<d>(id, raw=True) first -- the read-before-edit step is a client convention, not server-enforced. Use edit for a surgical string replacement within an existing body; use the generic update tool for a whole-body or line-range replacement instead. The YAML frontmatter is never addressable (body only). The edit is 2-fold: stage 1 requires old_str to match the on-disk body byte-exactly -- uniquely, unless replace_all is true, in which case every exact occurrence is rewritten -- and stage 2 validates the edited body as a whole document; the document is written to disk only if both stages pass, and nothing is written on any failure (the file stays byte-unchanged). An empty new_str is a pure deletion (legal iff stage 2 validates). Matching is pure byte-exact with no line-ending normalization (an old_str containing \n will not match a CRLF body), no BOM handling, and no fuzzy/regex fallback. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising the domain's not-found error -- its error text is byte-identical to the domain's list_<d> failed row's error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c) -- and a truly-absent id still raises the domain's not-found error. A stage-2 content-validation failure on the post-edit result returns a non-raising ValidateResult (valid=False, errors=[{message}]) with the message capped at 300 chars as the generic validate tool caps it, instead of raising AssertionError/pydantic.ValidationError (ADR b8c9bfea-6dcf-4158-bfc5-4ec17abb842f, GitHub issue #170 -- case 4 of the ADR 519d1206 non-raising-structured-result workaround chain). Stage-1's not-found/multiple-matches guards and every caller-usage ValueError (invalid id shape, unknown or adr type, identical input, empty old_str) still raise. An invalid id (path-injection attempt or wrong format for type) is a ValueError raised before any file access. Returns the updated frontmatter only (no body; updated bumped) on success; use the corresponding get_<d> tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes
new_strYes
old_strYes
replace_allNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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 thoroughly: two-stage matching/validation, atomic disk write with byte-unchanged file on failure, non-raising ParseFailureResult and ValidateResult vs. raised ValueErrors/not-found errors, and explicit byte-exact rules (no line-ending normalization, no BOM, no fuzzy/regex fallback). This is exceptional behavioral disclosure for an unannotated 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and the update-vs-edit distinction before diving into mechanics, and every clause arguably carries needed behavior (atomicity, error taxonomy, matching rules). It is nonetheless a dense single block that is far longer than typical, bordering on overwhelming, which is the only structural weakness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Fully complete for a 5-param mutation tool: success return ('updated frontmatter only, no body, `updated` bumped'), all failure modes, atomicity guarantees, and guidance to fetch the full document via get_<d> afterwards. Even though an output schema exists, the description still rounds out the operational picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: `old_str` must match byte-exactly and uniquely unless `replace_all` is true, `new_str` empty means pure deletion, `replace_all` rewrites every occurrence, `id` shape is validated before any file access, and `type` enumerates the supported domains while excluding `adr`.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('surgical, exact-match string replacement of an existing document's frontmatter-stripped body') and immediately names the sibling it is not ('the generic `update` tool for a whole-body or line-range replacement'). An agent can distinguish edit from update 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative tool (`update`) and the condition that selects it, plus the read-before-edit step via the corresponding `get_<d>(id, raw=True)` and the caveat that it is a client convention, not server-enforced. When-to-use and when-not-to-use are both stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_similar_textFind documents similar to textA

Find the documents most semantically similar to a free-form query text (for pre-creation dedup/discovery checks), ranked by cosine similarity of local sentence embeddings (fastembed/bge-small, the similarity extra). By default every whole-body domain is searched (req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs; adr is excluded structurally) -- restrict with target_types. Returns up to top_k (default 10, validated 1..100) hits as {type, id, title, status, path, score} rows, sorted by score descending; min_score (default: no filter) is an inclusive cosine lower bound. An unparseable candidate still appears, embedded from its full raw text, with id = null and the <failed to parse> marker title/status. When the embedding feature is unavailable (SPECMGR_SIMILARITY_DISABLED present, or the backend/model fails to load), returns the structured {available: false, reason, message} result instead of raising. A bad target_types/top_k is a ValueError before any filesystem access.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo
min_scoreNo
target_typesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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: default domain coverage with adr structurally excluded, the fallback `{available: false, reason, message}` result when the embedding feature is disabled or fails to load, the unparseable-candidate behavior (id=null, `<failed to parse>` marker), and that bad target_types/top_k raises ValueError before any filesystem access.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then progressively adds ranking method, scope, return shape, and failure modes. Every clause carries information, but the single long paragraph with heavy parenthetical nesting is denser than ideal for scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter search tool with no annotations, the description covers scope, ranking, defaults, return fields, and error/fallback behavior. An output schema exists, yet the description still gives the row shape without over-explaining, leaving nothing 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.

Parameters5/5

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: query is free-form, top_k defaults to 10 and is validated 1..100, min_score is an inclusive cosine lower bound with no filter by default, and target_types restricts the enumerated domain list. This adds real meaning beyond the bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: find documents most semantically similar to a free-form query text, ranked by cosine similarity of local embeddings. This distinguishes it cleanly from the get_*/list_*/find_related siblings, which retrieve by identity or reference rather than semantic similarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit context ('for pre-creation dedup/discovery checks'), telling the agent when this tool is the right choice. However, it never names an alternative or a when-not condition (e.g. versus find_related or list_*), so routing 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.

get_adrGet ADRA

Read, parse, and return a full ADR document (frontmatter and body) by its id. An invalid id (path-injection attempt or wrong format) is a ValueError raised before any file access.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
bodyYes
frontmatterYes

TDQS

A3.5/5.0
Behavior3/5

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 an error trait ('An invalid id ... is a ValueError raised before any file access'), confirming read-only access and failure semantics, but says nothing about permissions or how the read behaves on a valid-but-missing id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste, front-loading the core action and following with the notable failure mode. Nothing is padded or repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value details are unnecessary, and the description covers purpose plus error behavior for a one-parameter getter. The main gap is the absence of usage/routing guidance relative to the many sibling get_* tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 add meaning: the single 'id' identifies a specific ADR and must be a valid format (rejecting path-injection). This goes beyond the bare 'Id' string in the schema, though it stops short of documenting the id's accepted format or source.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read, parse, and return a full ADR document (frontmatter and body) by its id'), and the '(frontmatter and body)' detail clarifies scope versus a lighter-weight read. It does not explicitly differentiate itself from siblings like list_adr or validate_adr, 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies you fetch a single document 'by its id' but gives no when-to-use guidance, no prerequisites, and never names an alternative such as list_adr or validate_adr. An agent must infer the retrieval context on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_decGet decisionA

Read, parse, and return a full decision document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_dec -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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: invalid ids raise ValueError before any file access, out-of-range offset/limit clamp (offset > N returns empty string), parse failures return a ParseFailureResult rather than raising, and note/body numbering never restarts under windowing. It also discloses cross-tool consistency of error text, which exceeds typical disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core is front-loaded in sentence one, but the rest is a single dense paragraph packed with asides — an ADR UUID, a note about a trailing pydantic documentation line, byte-identical error text across tools. These details crowd out scannability and do not all earn their place for an agent trying to call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-shape explanation is optional, yet the description still covers the meaningful output variants (raw body, numbered lines, ParseFailureResult). For a 5-parameter tool with zero schema descriptions, 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.

Parameters5/5

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: id (lookup by id), raw (frontmatter-stripped verbatim mode), offset (1-based, default 1), limit (line count, default through end), numbered (prefix format '<n>: ', absolute body-line numbers). Defaults, units, and interaction rules are all stated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a precise verb+resource+identifier: 'Read, parse, and return a full decision document (frontmatter and body) by its id.' The raw=True branch is also defined as a distinct mode. However, it never contrasts itself with nearby siblings such as parse_dec, get_dec_template, or get_dec_example, so the agent must infer the boundary from the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear conditional guidance: use raw=True for verbatim frontmatter-stripped body text, offset/limit for windowed reads, numbered when line numbers are needed for `update`'s offset. The 'when-not' is present for parameter combinations (numbered/offset/limit with raw=False raise ValueError) and for feeding numbered output into content/old_str. No explicit alternative-tool routing among siblings, 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.

get_dec_exampleGet DEC exampleA

Return a complete, valid sample decision document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the burden alone. It does disclose meaningful traits: the output is raw markdown with both frontmatter and body, it is complete and valid, and it 'exercise[s] every section' — telling the agent the sample is exhaustive rather than minimal. It stops short of saying whether the sample is static or parameterized, but the zero-parameter schema makes that moot.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the verb and resource, with the qualifiers ('frontmatter and body', 'every section') placed as trailing detail. Every clause earns its place and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure need not be restated, and the description adds the useful fact that the content is markdown with frontmatter plus an exhaustive section set. Complete enough to call correctly, though a note on whether the example is a fixed canned file would remove the last ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters (0 params, 0 required), so there is nothing for the description to disambiguate. Baseline of 4 applies; the description correctly avoids inventing parameter talk.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Return') and resource ('sample decision document') plus the exact payload shape ('raw markdown -- frontmatter and body'). This cleanly separates it from sibling get_dec (a real document), get_dec_template (a blank skeleton), and create_dec, without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'For use as a learning example' implies the usage context but never states when to prefer this over get_dec, get_dec_template, or get_dec_example's many sibling example tools. No exclusions or prerequisites are given; an 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.

get_dec_templateGet DEC templateA

Return a DEC document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new decision.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden and does a fair job: it specifies the output is raw markdown, contains both frontmatter and all body fields, and that the body is filler ('blind text') rather than real content. It omits stating that the call is side-effect free and static, but nothing here misleads.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and payload, and the 'blind text' parenthetical clarifies the placeholder nature without padding. Nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description needn't spell out the return structure, and it doesn't have to (no params either). What it does provide — content shape and intended use — is enough for an agent to call it correctly; only the sibling differentiation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero input parameters, so there is no parameter semantics to convey and nothing for the description to compensate for. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return a DEC document template') and details exactly what the payload contains: frontmatter plus every body field with placeholder text, as raw markdown. It does not differentiate itself from the near-identically named sibling get_dec_example, but the purpose 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear intended context ('for use as a starting point when drafting a new decision'), which implies when to reach for it. However, it never names alternatives or exclusions, so an agent must infer the template-vs-example-vs-get_dec distinction from the naming alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_featGet featureA

Read, parse, and return a full feature document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; get_feat always fully parses, so its error text is the full-fidelity authority for this document -- byte-identical to list_feat's own failed-row error for the same file once list_feat's background warmup (or this very call) has fully parsed it; before that (or under SPECMGR_FEAT_WARMUP_DISABLED), list_feat's row may carry a transiently-healthy or dirty-stage-specific error instead (ADR 3982712a-a46b-4b2b-809f-9c6925a49b44, time-qualifying ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c for feat only; every other domain's list/get error byte-identity stays unconditional). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_feat -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

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 add substantive context: parse failures return a ParseFailureResult rather than raising, invalid ids raise ValueError before file access, out-of-range offset/limit clamp, and conflicting parameters raise ValueError. The dense ADR cross-references and warmup-qualification discussion (ADR 3982712a, ADR 9080b37c) are far more detail than any agent needs and dilute the useful signal, 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core content is front-loaded correctly (purpose and raw mode first), but the middle section balloons with ADR identifiers, warmup timing, and byte-identity qualifiers that serve maintainers rather than an agent selecting or invoking the tool. Substantial trimming would preserve all actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param read tool with an output schema (so return values need not be re-explained), the description covers modes, parameter interactions, failure modes, and cross-tool round-tripping warnings adequately. The completeness is undermined only by the inclusion of internal ADR/warmup detail that doesn't 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.

Parameters4/5

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 raw, offset/limit semantics (1-based, defaults, clamping, interaction with raw=False), and numbered (line-number prefix format, offset-relative numbering, only valid with raw=True). The only required param, id, gets modest treatment (described mainly via its ValueError failure modes), leaving a small gap that prevents a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: read, parse, and return a full feature document (frontmatter and body) by id, plus the raw=True variant returning the frontmatter-stripped body verbatim. It's clear what the tool does, but it doesn't distinguish itself from sibling getter tools like parse_feat or list_feat beyond the incidental listing of list_feat's error behavior, 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied through mode/parameter descriptions (use raw=True for verbatim body, offset/limit for windowing, numbered=True for line numbers) rather than explicit when-to-use/when-not guidance. The description repeatedly names alternatives (list_feat, update, create_feat, edit) but mostly as caveats about error text or round-tripping, not as routing guidance for choosing this tool over parse_feat or list_feat.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_feat_exampleGet FEAT exampleA

Return a complete, valid sample feature document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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 the return format (raw markdown with frontmatter and body, exercising every section) and implies a read-only, parameterless fetch, but it says nothing about whether the output is static or whether it costs anything to call. It covers the essentials without richness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that identifies the action, the format, and the purpose with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not explain return values, and it still characterizes the payload as complete raw markdown covering every section. For a zero-parameter sample getter this is nearly everything an agent needs, with sibling differentiation the only real gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource (return a sample feature document) and states the artifact's shape (frontmatter plus body, every section). The phrase 'for use as a learning example' implicitly distinguishes it from get_feat/get_feat_template, but the description never names those alternatives, so 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'for use as a learning example' implies the intended context, but there is no explicit when-to-use guidance and no statement of when to prefer get_feat_template or get_feat instead. Adequate but inferential.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_feat_templateGet FEAT templateA

Return a FEAT document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new feature.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does disclose meaningful behavior: the exact return shape (raw markdown, frontmatter plus all body fields) and that the content is placeholder 'blind text' rather than real data. It never explicitly states this is a non-mutating read with no side effects, which is the only notable gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that opens with the verb and resource. The parenthetical gloss on 'blind text' is slightly indulgent but the sentence remains efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema already defining the return structure, the description is essentially complete: it covers what is returned, in what format, and for what purpose. Only the missing sibling differentiation keeps it from being fully airtight.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema baseline of 4 applies. There is nothing parameter-level for the description to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return a FEAT document template') and details the payload (frontmatter plus every body field, placeholder content, raw markdown). It does not, however, distinguish itself from the closely named sibling get_feat_example, leaving the template-vs-example boundary implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'for use as a starting point when drafting a new feature' gives a clear context for use, but there is no guidance on when not to use it or why an agent would pick this over get_feat_example or get_feat. Usage is implied rather than explicitly routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_golGet goalA

Read, parse, and return a full goal document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_gol -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior5/5

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: parse failures return a ParseFailureResult instead of raising, invalid ids raise ValueError before file access, out-of-range offsets clamp to empty string, and mutually exclusive flag combinations raise ValueError. It even documents cross-tool error-text consistency, far beyond what 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, but the body is a dense run-on block of extremely long compound sentences with parenthetical clause stacking and an ADR citation, which hurts scanability. The detail is proportionate to a 5-parameter tool, but structure and sentence length could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is not required, and the description still adds error/edge-case semantics that the schema cannot express. It is essentially complete for this read tool, with only minor gaps such as id format specifics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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: raw, offset (1-based, default 1), limit (default through end of body), and numbered (format '<n>: ', numbers do not restart after windowing) are all explained with defaults and interactions. Only the id parameter's format is left partly implicit ('path-injection attempt or wrong format').

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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: 'Read, parse, and return a full goal document (frontmatter and body) by its id.' That is unambiguous and actionable. It stops short of explicitly distinguishing itself from siblings like parse_gol or get_gol_template, so it is clear but not sibling-differentiating.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives conditional usage for parameters (raw=True for frontmatter-stripped body; numbered only meaningful with raw=True) and warns where the output must not be reused. However it never states when to choose get_gol over parse_gol/list_gol, so the when-to-use-this-vs-alternative 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.

get_gol_exampleGet GOL exampleA

Return a complete, valid sample goal document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and discloses the return format ('raw markdown -- frontmatter and body') and content scope ('exercising every section'). It does not explicitly state read-only safety or side effects, but the verb 'Return' strongly implies a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that states the action, output format, content scope, and intended use without any wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, an output schema, and no annotations, the description is complete enough. It explains what the example contains and its learning purpose, leaving return-value details to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds no parameter meaning because none exists, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Return a complete, valid sample goal document as raw markdown.' It also distinguishes this tool from sibling get_gol, get_gol_template, and create_gol by clarifying that the output is a fully populated learning example exercising every section.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for use as a learning example' gives clear context for when to call this tool. It does not explicitly name alternatives or exclusions, but the intended use is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_gol_templateGet GOL templateA

Return a GOL document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new goal.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden and does well: it discloses the return format (raw markdown), the content shape (frontmatter + every body field, all populated), and the placeholder nature of the content. It does not mention safety/permissions or that repeated calls yield identical output, but for a read-only template fetch those are minor omissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the outcome front-loaded and the qualifying details (format, placeholder content, intended use) trailing. No redundancy or filler; every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter template retrieval tool with an output schema, the description fully covers what an agent needs: what is returned, in what format, and why it would be called. Return-value details are already backed by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. The description correctly implies there is nothing to configure by describing a static template with no inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (GOL document template) plus the exact payload: frontmatter and every body field filled with placeholder 'blind text'. The phrase 'template ... populated with placeholder content' distinguishes it functionally from the sibling get_gol_example (filled real content) and get_gol (an existing goal) without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description names the use case explicitly: 'for use as a starting point when drafting a new goal'. That is a clear trigger condition, but it does not name the alternatives it should be chosen over (get_gol_example, get_gol) or state exclusions, 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.

get_prbGet problem statementA

Read, parse, and return a full problem statement document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_prb -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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 does disclose parse-failure behavior (returns ParseFailureResult instead of raising), ValueError conditions for invalid ids and parameter combinations, clamping of out-of-range offsets, and the numbered-line caveat about not feeding output back into content. That is substantial behavioral disclosure, though it could mention permissions or file-access timing more explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single very dense, run-on paragraph that is difficult to parse. Multiple unrelated behaviors (parse failure representation, id validation, numbered line format, update/content feedback warnings) are packed into one block without front-loading the primary use case. It is thorough but lacks structural separation, hurting readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters, no annotations, and the presence of an output schema, the description is mostly complete: it covers return-shape variations, error modes, parameter interactions, and cross-tool usage warnings. It omits any note about when the output schema applies versus raw=True, and does not mention potential rate limits or performance considerations, but those are minor given the tool's apparent nature.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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: offset is defined as 1-based first body line, limit as line count, raw as frontmatter-stripped toggle, and numbered as a line-prefix option meaningful only with raw=True. It explains default and interaction semantics for all four optional parameters, though it does not fully specify the format of id (`id` is only described by example).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Read, parse, and return a full problem statement document (frontmatter and body) by its id.' It distinguishes the tool from siblings like parse_prb and list_prb by specifying that it returns the parsed document, and clearly states the alternative behavior with raw=True (stripped body verbatim).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains when raw=True should be used (to get stripped body text) and when offset/limit apply, but it does not explicitly say when to choose get_prb over alternatives like parse_prb or get_prb_template, nor does it state any prerequisites. Usage is implied by the parameter interactions rather than an explicit when-to-use rubric.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_prb_exampleGet PRB exampleA

Return a complete, valid sample problem statement document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the burden, and it discloses the output shape (raw markdown, frontmatter plus body, exercising every section) and implies a safe, side-effect-free read via 'Return'. It could be more explicit that this is a read-only, non-mutating retrieval, but for a zero-parameter tool the behavioral profile is largely covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence that states the return content, format, and intended use with no filler. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, and the description still summarizes them. For a simple no-arg read tool this is complete, though the sibling relationship to get_prb_template is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading or missing parameter guidance is present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (complete, valid sample problem statement document as raw markdown with frontmatter and body). It conveys the artifact well, but does not distinguish itself from close siblings like get_prb_template or get_prb, leaving the agent to infer the difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The trailing clause 'for use as a learning example' implies when to reach for it, but there is no explicit when-to-use, when-not, or named alternative (e.g. get_prb_template for scaffolding, get_prb for real data). 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.

get_prb_templateGet PRB templateA

Return a PRB document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new problem statement.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the behavior burden alone. It usefully discloses that the returned markdown is placeholder/'blind text' rather than real data, which prevents misuse, but it says nothing about size, whether the content is static, or any side effects (a read-only generator is implied but never stated).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the purpose ('Return a PRB document template') arrives immediately. The em-dash parenthetical about placeholder content is slightly heavy but still earns its place by clarifying the payload.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not enumerate return values, and it doesn't attempt to. For a zero-parameter template getter it is nearly complete; the only missing piece is disambiguation from get_prb_example and get_prb_template's role in the create/draft workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. The description correctly implies no input is required to obtain the template.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return a PRB document template ... as raw markdown') and describes the exact payload: frontmatter plus every body field filled with placeholder content. What it does not do is distinguish itself from the sibling get_prb_example, which an agent could easily confuse with a template getter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is implied usage ('for use as a starting point when drafting a new problem statement'), which gives some context. However, no alternative is named or excluded — notably get_prb_example and get_prb — and there is no guidance on when a drafting agent should pull the template rather than an existing record or example.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_qaGet QA documentA

Read, parse, and return a full QA document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_qa -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and does so thoroughly: parse failures return a ParseFailureResult instead of raising, invalid ids raise ValueError before any file access, offset/limit out-of-range values clamp, and combining offset/limit/numbered with raw=False raises ValueError. It even documents the anti-pattern of feeding numbered output back into content or edit old_str.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and most content earns its place, but the whole definition is a single dense paragraph riddled with nested parentheticals, an ADR UUID, and low-value detail about byte-identical pydantic trailing lines. Bullet points or shorter clauses would convey the same constraints with far less parsing effort.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters, a required id, an output schema, and no annotations, the description covers everything an agent needs: mode selection, windowing semantics, error/exception behavior, and cross-tool constraints. Return-value shape is partly handled by the output schema, so no meaningful gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: raw is defined as a verbatim frontmatter-stripped mode, offset is 1-based with default 1, limit is a line count defaulting to end-of-body, and numbered is defined only under raw=True with absolute line numbers that do not restart at 1. This is far beyond the bare type/default information in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb (read/parse/return) and resource (full QA document, frontmatter and body) keyed by id, which is unambiguous. It also names two modes (raw=False default vs raw=True). However it never explicitly contrasts itself with the adjacent siblings parse_qa or get_qa_template, so an agent still has to infer which sibling is appropriate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear in-tool usage context: pass raw=True for frontmatter-stripped body text, use offset/limit to window raw reads, and use numbered=True only with raw=True, including the routing hint that numbered line numbers can be fed back into update's offset. It does not, however, state when to choose this tool over the sibling parse_qa/list_qa/get_qa_template tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_qa_exampleGet QA exampleA

Return a complete, valid sample QA document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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 meaningful traits: the return is raw markdown, includes both frontmatter and body, and is guaranteed complete and valid with every section exercised. That is well beyond a bare restatement, though it says nothing about read-only safety or size/cost of the payload.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the action and the return shape front-loaded, then the qualifiers (frontmatter, body, every section) and the intended use. Every clause earns its place with no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and it already characterizes the payload's format and completeness. For a zero-parameter example tool this is nearly complete; the only omission is an explicit tie-breaker against get_qa_template and the other get_*_example siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 baseline for a no-parameter tool is 4. The description adds no parameter detail, but none is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Return a complete, valid sample QA document') and specifies the exact output shape (raw markdown, frontmatter and body, every section exercised). It is clearly distinct in spirit from the many sibling example tools, but it never names the closest sibling alternative, get_qa_template, which a reader must infer is the fill-in-the-blank counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for use as a learning example' implies a usage context, but there is no explicit when-to-use, when-not-to-use, or alternative routing. An agent choosing between get_qa, get_qa_template, and get_qa_example gets only an implied signal rather than a stated rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_qa_templateGet QA templateA

Return a QA document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new QA document.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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 the return format (raw markdown), that all fields are present, and that content is placeholder blind text -- useful non-obvious details. But it says nothing about whether the template is static, whether it reads any source, or its safety/read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single dense sentence with the resource front-loaded and the output format and placeholder nature all earned. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and an output schema present, the description needn't explain return values structurally. It states the format and placeholder nature, which is enough to call correctly; only the static/read-only nature is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline of 4 applies; the description appropriately focuses on the return payload instead. Nothing further to document.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (QA document template) and precisely describes what content is returned: frontmatter, every body field, and placeholder blind-text content, as raw markdown. Draws a clear line against get_qa (an existing document) and get_qa_example (an example) among many sibling template tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the use case -- as a starting point when drafting a new QA document -- which disambiguates it from get_qa and get_qa_example. No explicit when-not-to-use or alternative routing, though the sibling set makes the intent fairly clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reference_diagramGet the reference diagram of one documentA

Render and return the deterministic PlantUML component diagram of one source document's reference neighbourhood (the frozen rulebook specmgr://reference-graph §2–§5): one node per artifact (label = the document title, truncated to SPECMGR_DIAGRAM_MAX_TITLE, default 40), a stereotype + colour per artifact type, nodes grouped into per-domain packages, one edge per unique reference ({src} --> {dst} : refers to, the referenced item carries the incoming arrow), every edge lying on a cycle (SCC-based) drawn with the red -[#red]-> arrow, and every reference whose target cannot be resolved on disk drawn as a top-level <<UNRESOLVED>> node. type is the source document's domain (one of adr, req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs) and id the source's own identifier; depth (1..5, default 1) is the forward BFS depth; reverse=True is additive (the forward expansion to depth plus the direct incoming references to the source, direct-only on the incoming side); include_feat=False drops every FEAT node except the explicitly requested source (then every edge touching a dropped node); title overrides the diagram title (default: the source's H1; sanitized but never truncated). Guard order: id (path-injection attempt or wrong format -- for type="feat" the full feat-NNN-slug only; a bare feat-NNN is rejected, use list_feat to discover the exact id) and depth are both a ValueError raised before any filesystem access; a missing source raises the source domain's own XNotFoundError; an existing-but-broken source returns the non-raising ParseFailureResult (error/path/id, the error text byte-identical to the domain's list_<d> failed-row error for the same file (ADR 9080b37c) for the 12 whole-body domains -- time-qualified by ADR 3982712a for feat; for adr (whose list_adr carries no failed row: broken ADRs are skipped), the leg-read AdrParseError's own text). Returns PlantUML source (not a specmgr document) -- run it through specmgr plantuml-check (CLI) or the validate_plantuml tool for a validation verdict.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes
depthNo
titleNo
reverseNo
include_featNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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 guard order (id/depth ValueError raised before any filesystem access), the exact error taxonomy (XNotFoundError, ParseFailureResult with byte-identical error text per ADR references), and the non-raising failure path. 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and every clause carries information, but the whole body is a single dense wall of text laced with ADR codes and specmgr:// URI jargon. Bullet-separating the per-parameter semantics would improve scannability without losing content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter, no-annotation, complex rendering tool, this is complete: it covers purpose, all parameter semantics, error behavior, guard ordering, and the post-call validation step. With an output schema present, the return contract is adequately signaled by the explicit note that the result is PlantUML source.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 type (the source's domain with all 13 enum values implied), id (the source's own identifier, with format constraints for feat), depth (1..5 forward BFS depth), reverse (additive forward + direct-only incoming), include_feat (drops FEAT nodes and touching edges), and title (overrides H1, sanitized, never truncated).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Render and return the deterministic PlantUML component diagram of one source document's reference neighbourhood'. The scope ('one source document') implicitly distinguishes it from the sibling get_reference_diagram_all, and the output type (PlantUML source, not a specmgr document) is stated explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational guidance: use list_feat to discover the exact feat id, and run the result through validate_plantuml or specmgr plantuml-check for a verdict. It does not, however, explicitly state when to prefer this tool over sibling diagram tools such as get_reference_diagram_all, get_uc_diagram, or get_use_case_package_diagram.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reference_diagram_allGet the registry-wide reference diagramA

Render and return the deterministic PlantUML component diagram of the whole reference registry (the frozen rulebook specmgr://reference-graph §2–§5, the registry-wide construction of §3.3): one node per parseable document across all 13 domains (broken documents are skipped -- the render never fails for content), one edge per unique reference ({src} --> {dst} : refers to, the referenced item carries the incoming arrow), every edge lying on a cycle (SCC-based) drawn with the red -[#red]-> arrow, and every reference whose target cannot be resolved on disk drawn as a top-level <<UNRESOLVED>> node. Node labels are truncated to SPECMGR_DIAGRAM_MAX_TITLE (default 40). include_feat=False drops every FEAT node (then every edge touching a dropped node); title overrides the diagram title (default: Reference Graph; sanitized but never truncated). Returns PlantUML source (not a specmgr document) -- run it through specmgr plantuml-check (CLI) or the validate_plantuml tool for a validation verdict.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
include_featNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries the full burden and does so thoroughly: broken documents are skipped and 'the render never fails for content', truncation limit SPECMGR_DIAGRAM_MAX_TITLE (default 40) is disclosed, title is 'sanitized but never truncated', and it clarifies the return is PlantUML source, not a specmgr document. That is exactly the behavioral detail an agent needs to call and consume this tool safely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph that is front-loaded with the primary purpose, but the long clause chain listing diagram construction rules (cycles, unresolved nodes, edge syntax) is hard to parse and could be tightened. Every element is arguably useful, but the density hurts scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description correctly focuses on what the output IS (PlantUML source, not a specmgr document) and how to validate it — the one thing the schema can't convey. Combined with parameter behavior and rendering guarantees, an agent has everything needed to invoke and consume this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and both parameters lack schema descriptions, so the description must compensate — and it does, explaining include_feat (drops FEAT nodes and touching edges) and title (overrides default 'Reference Graph', sanitized not truncated). This adds real meaning beyond the bare schema. Minor deduction because defaults are stated for title but include_feat's default is left implicit in prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Render and return) plus a precisely scoped resource (the whole reference registry, all 13 domains) and output format (PlantUML source). Clearly distinguished from the sibling get_reference_diagram, which operates on a narrower scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Tells the agent what to do with the result — 'run it through specmgr plantuml-check (CLI) or the validate_plantuml tool' — which is a real next-step routing. However, it doesn't explicitly state when to prefer this registry-wide variant over the narrower get_reference_diagram sibling, beyond the implied scope difference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reqGet requirementA

Read, parse, and return a full requirement document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_req -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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 parsing failure behavior (returns ParseFailureResult rather than raising), invalid id raising ValueError before file access, offset/limit clamping semantics, and the error text being byte-identical to the list tool's failed-row error. It does not describe authentication, rate limits, or output schema details, but output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loads the core purpose, then layers optional behavior in a logical order. It is longer than ideal, with some redundancy around raw=True semantics and numbered output warnings, but each sentence adds distinct information that an agent needs to invoke correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, 0% schema coverage, no annotations, but an existing output schema, the description covers input semantics, failure modes, constraint interactions, and downstream tool contract warnings. It is complete enough for correct invocation without needing to inspect the schema or other tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must fully compensate. It documents raw (frontmatter-stripped body verbatim), offset (1-based, default 1, first body line), limit (line count, default through end), numbered (prefixes lines with absolute body-line number, meaningful only with raw=True), and the coordinate constraints that raise ValueError.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Read, parse, and return a full requirement document (frontmatter and body) by its id.' It immediately distinguishes itself from siblings like get_req_template or parse_req by stating what it returns and how raw mode changes behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use raw=True vs raw=False, when offset/limit apply, when numbered applies, and what combinations raise ValueError. Names the downstream tools (update, create_req, edit) that must not receive numbered output, giving clear when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_req_exampleGet REQ exampleA

Return a complete, valid sample requirement document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden, and it does say the output is raw markdown containing both frontmatter and body, and that the sample exercises every section. That is genuinely useful context, but for a parameterless static fetch there is little more to disclose (no auth, pagination, or side effects are mentioned, and none are implied by "Return").

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence with the return format front-loaded ("raw markdown") and the purpose trailing. No filler or redundancy, though the em-dash aside slightly loosens an otherwise tight line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not enumerate return contents, and with no parameters and no annotations there are few behavioral facts to cover. It supplies the format and the sample-completeness guarantee, leaving only sibling routing unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the schema has nothing to document and the description cannot add parameter meaning. Baseline 4 applies for a parameterless definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a concrete verb ("Return") and a specific resource ("sample requirement document"), and the phrase "for use as a learning example" separates it from near-name siblings like get_req_template and get_req. It stops short of naming those alternatives explicitly, so an agent must infer the distinction from the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"For use as a learning example" hints at the intended situation, but the description never states when to pick this over get_req, get_req_template, or the parallel *_example tools, and lists no exclusions. 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.

get_req_templateGet REQ templateA

Return a REQ document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new requirement.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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 the shape and nature of the output: raw markdown containing frontmatter plus every body field, populated with placeholder content. It implies a read-only, non-mutating operation (Return), though it never explicitly confirms absence of side effects or auth needs, 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence that front-loads the action and resource, with the useful clarification about placeholder ('blind text') content embedded compactly. No filler and nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only template tool with an output schema present, the description covers what is returned, in what format (raw markdown), and the intended use. An agent has everything needed to select and call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 arguments to explain and the description correctly says nothing misleading about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Return) plus a precise resource (a REQ document template) and an explicit statement of what the content is (frontmatter + every body field with placeholder text). An agent can immediately distinguish it from the sibling get_req_example and get_req without opening either.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the use case clearly: 'for use as a starting point when drafting a new requirement,' which tells the agent when to reach for this tool. It does not explicitly name the alternative (get_req_example) 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.

get_rskGet riskA

Read, parse, and return a full risk document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_rsk -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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 unusually well: parse failures return a ParseFailureResult (with error/path/id fields) rather than raising, its error text is byte-identical to list's failed-row error, invalid ids raise ValueError before any file access, out-of-range offset clamps to empty string, and offset/limit/numbered combined with raw=False raise ValueError. These are exactly the failure-mode and constraint disclosures 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in sentence one and every clause is substantive, but the heavy em-dash/parenthetical nesting (e.g. the ADR reference and the nested numbered-output warning) makes it dense to parse. It is long yet largely justified by the tool's genuine complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter read tool with a full output schema, the definition covers the input contract, error paths, clamping, and cross-tool interactions (update, create_rsk, edit) completely. 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must define all five parameters, and it does: raw toggles frontmatter stripping, offset is 1-based with default 1, limit defaults through end of body, numbered prefixes '<n>: ' with non-restarting absolute numbers. The only gap is that `id`'s expected format is left as 'wrong format' without a concrete example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a precise verb+resource+scope: 'Read, parse, and return a full risk document (frontmatter and body) by its id.' This clearly separates it from siblings like get_rsk_template (template), list_rsk (enumeration), parse_rsk (validation) and create_rsk (mutation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit conditions for each mode: use raw=True for the frontmatter-stripped body, offset/limit only make sense with raw=True, numbered only with raw=True. It even explains how numbered output round-trips into the generic `update` tool. However, it never names an alternative tool for the non-raw case (e.g. parse_rsk for validation or get_rsk_template for the skeleton), so sibling routing 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.

get_rsk_exampleGet RSK exampleA

Return a complete, valid sample risk document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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 traits: it is a read-only retrieval returning raw markdown with frontmatter and body, complete and valid, covering every section. It does not discuss auth, caching, or whether the sample is static, but for a zero-arg example fetch that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single information-dense sentence, front-loaded with the action and result, with the purpose clause last. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and there are no parameters to document. The description covers what the example contains and why to fetch it, though it stops short of routing between the sibling example/template/get tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline of 4 applies. The empty schema leaves nothing to disambiguate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return), resource (sample risk document), format (raw markdown), and scope (frontmatter and body, every section). The 'learning example' framing distinguishes it from get_rsk (real document) and get_rsk_template (blank skeleton) without the agent 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'for use as a learning example' hints at the intended context, but there is no explicit when-to-use vs when-not guidance and no named alternative (e.g., get_rsk_template for scaffolding, get_rsk for real data). 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.

get_rsk_templateGet RSK templateA

Return a risk document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new risk.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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 (raw markdown) and the exact content structure (frontmatter, every body field, placeholder text), which is valuable behavioral context. It does not mention read-only status, permissions, or side effects, but for a template retrieval this is a minor omission.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the return action and content, followed by the use case. 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, yet the description still summarizes them. Given the zero-parameter, read-only nature and the output schema, the description is complete 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline score of 4 applies per the rules. No parameter semantics are needed or provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Return') and resource ('risk document template'), and specifies the exact content type (frontmatter, every body field, placeholder 'blind text') and format (raw markdown). This implicitly distinguishes it from get_rsk (actual risk) and get_rsk_example (example content) among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear use case: 'for use as a starting point when drafting a new risk.' It does not name alternative tools or state when not to use it, but the context for use is explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sopGet Standard Operating ProcedureA

Read, parse, and return a full SOP document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_sop -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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 documents the ParseFailureResult return shape instead of raising, byte-identical error alignment with the list tool, ValueError on path-injection id before any file access, out-of-range clamping, and the cross-tool contract with update's offset. This is unusually deep 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is front-loaded with the core read behavior, but the single dense paragraph runs long and buries operational warnings (numbered output not to be fed back verbatim, list-tool error parity, ADR reference) mid-stream. Much of it earns its place, yet structure suffers from cramming distinct concerns into one wall of text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters with zero schema documentation, no annotations, and a complex dual-mode contract, the description covers parameter semantics, error behavior, clamping, numbering, and cross-tool usage. The existence of an output schema reduces the need to describe return values, and it covers the exception cases (ParseFailureResult) anyway.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema has only bare titles, so the description must compensate entirely. It defines raw, offset (1-based, default 1), limit (line count, default through end), and numbered (1-based absolute numbering, clamped-offset semantics, raw-only) with exact interaction rules and error conditions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb chain (read, parse, return) and the resource (a full SOP document by id), and distinguishes the raw=True mode. It does not explicitly differentiate itself from sibling get_sop_example or parse_sop, but the dual-mode behavior is clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when to use raw=True vs raw=False and how offset/limit/numbered interact, and explicitly warns against feeding numbered output back into update/create_sop. Lacks a direct comparison to sibling parse_sop or list_sop, so it stops short of explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sop_exampleGet SOP exampleA

Return a complete, valid sample Standard Operating Procedure document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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 disclose the return shape (raw markdown, frontmatter plus body, complete and valid) and that it is static sample content. Read-only, non-destructive behavior is clearly inferable, though it does not mention any auth or rate-limit characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler; the essential scope (sample, markdown, frontmatter+body, every section) is packed in without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, yet the description still characterizes the payload usefully. For a zero-parameter static fetcher with an output schema, the definition is essentially complete; only the template-vs-example routing nuance is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the baseline the schema has nothing to document and the description correctly adds no parameter detail. Nothing is missing on this dimension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (a complete, valid sample SOP document) plus its distinguishing trait: it is a filled-in example exercising every section, not the real document. This implicitly separates it from get_sop and get_sop_template, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"For use as a learning example" gives an implied context for use, but the description never says when to prefer this over get_sop_template or get_sop, nor any exclusions. Usage is inferable but not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sop_templateGet SOP templateA

Return a SOP document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new Standard Operating Procedure.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it does disclose meaningful traits: output is raw markdown, frontmatter plus all body fields are included, and content is deliberately placeholder text rather than real data. It says nothing about permissions or limits, but for a zero-parameter, side-effect-free template getter that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the return value and its format before the purpose clause. The em-dash parenthetical is dense but each element (frontmatter, body fields, placeholder content, markdown) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description still summarizes format and content. For a zero-param, annotation-free tool this is close to complete; the only omission is an explicit pointer to get_sop_example as the contrasting sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. Schema description coverage is listed at 100% but the schema is empty, so no param explanation is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (SOP document template) and describes the content precisely as 'frontmatter and every body field present, populated with short placeholder ("blind text") content ... as raw markdown.' That implicitly separates it from get_sop_example, but it never names the sibling 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'for use as a starting point when drafting a new Standard Operating Procedure' gives a clear use context. It does not, however, name alternatives such as get_sop_example or get_sop, nor state any when-not-to-use condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sysrsGet System Requirements SpecificationA

Read, parse, and return a full System Requirements Specification document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_sysrs -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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 a good job: it explains ParseFailureResult behavior for unparseable documents, ValueError for invalid ids raised before file access, and the fact that numbered read of parse-failing doc returns ParseFailureResult. It lacks detail on permissions/auth or whether the read is safe (read-only implied but not stated).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with core purpose but becomes quite long and dense, with multiple nested clauses and parentheticals. While information-rich, it violates conciseness by packing many behavioral rules into a single paragraph without clear structural separation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given output schema exists, return value explanations aren't strictly necessary, and the description does not need to enumerate return fields. It is fairly complete for a read tool with complex parameter interactions, covering edge cases, error modes, and tool interop. Minor gap: no mention of authentication/permissions or rate limits.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: raw toggles frontmatter stripping, offset is 1-based first body line (default 1, clamps out-of-range), limit is line count (default through end), numbered prefixes lines with absolute body-line numbers meaningful only with raw=True. It also explains ValueError conditions from incompatible combinations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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, parse, and return a full System Requirements Specification document (frontmatter and body) by its id.' This clearly distinguishes get_sysrs from siblings like list_sysrs and parse_sysrs by emphasizing full document retrieval by id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use raw=True (to get frontmatter-stripped body text verbatim) and how offset/limit/numbered interact with raw mode. It even describes how numbered output connects to the `update` tool's offset parameter. However, it does not explicitly state when to choose get_sysrs vs. parse_sysrs or list_sysrs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sysrs_exampleGet SYSRS exampleA

Return a complete, valid sample System Requirements Specification document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does reasonably well: it discloses the return is raw markdown including frontmatter and body, that the sample is complete and valid, and that it exercises every section. It is implicitly a no-side-effect read, though it never states read-only status or that it takes no inputs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence that states action, format, content, and purpose with no filler. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value structure need not be restated, and the description covers the key facts an agent needs (sample document, markdown format, all sections exercised). The only shortfall is the missing contrast with the template/get siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case. The description correctly implies a no-argument fetch and adds no spurious parameter claims.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Return) + resource (a complete sample SYSRS document) plus the output format (raw markdown with frontmatter and body). It never names the obvious alternative get_sysrs_template, so the example-vs-template distinction is only implied by 'exercising every section'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for use as a learning example' gives implied usage, but there is no explicit when-to-use/when-not guidance and no reference to siblings like get_sysrs_template or get_sysrs. An agent must infer the difference between an example and a template on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sysrs_templateGet SYSRS templateA

Return a SYSRS document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new System Requirements Specification.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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 returned content is deliberately placeholder ("blind text") rather than real requirement text, that every field is present, and that the output is raw markdown. The main omission is any note on permissions or whether the template reflects the current document schema version.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, with the qualifying detail in a parenthetical clause. It is slightly overloaded with nested em-dash material, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required, and there are no parameters to document. What remains is fully covered: what the template contains, that it is placeholder text, and its intended use. Only the relationship to the example/get variants is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. It correctly implies the tool is argument-free by describing a single unconditional return.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ("Return") plus specific resource ("a SYSRS document template") with the exact composition spelled out: frontmatter, every body field, blind-text placeholders, raw markdown. This is clearly distinguishable from create_sysrs (writes), get_sysrs (fetches a real artifact), and get_sysrs_example (which would hold real-world content rather than placeholders).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"for use as a starting point when drafting a new System Requirements Specification" gives a genuine use context, but the sibling set contains get_sysrs_example and get_sysrs, and the description never states when to pick the template over those. 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.

get_tskGet task listA

Read, parse, and return a full task list document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_tsk -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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: parse failures yield a ParseFailureResult instead of raising, invalid ids raise ValueError before file access, out-of-range windows clamp, and numbered output must never be fed back verbatim. 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and mode selection, but the body is dense and over-specified, embedding an ADR UUID and a 'byte-identical error including the trailing pydantic documentation line' claim that add little decision value and blunt readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with an output schema, the description need not explain return values, yet it still documents the ParseFailureResult shape and all error paths. Given 0% schema coverage and no annotations, 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.

Parameters5/5

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: raw, offset (1-based default 1), limit (default through end), and numbered are each explained with defaults, interaction rules, and edge cases. Only the id format is lightly covered ('path-injection attempt or wrong format').

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'Read, parse, and return a full task list document (frontmatter and body) by its id.' This clearly separates it from siblings like list_tsk and parse_tsk, and the two modes (full document vs raw body) are stated up front.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context for choosing raw=True vs raw=False and warns when combinations (raw=False with offset/limit/numbered) are invalid. It references related tools (update, create_tsk, edit, list) for workflow, though it never explicitly says when to prefer get_tsk over parse_tsk or list_tsk.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tsk_exampleGet TSK exampleA

Return a complete, valid sample task list document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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 it does state the concrete behavioral traits that matter here: the payload is raw markdown, includes both frontmatter and body, and exercises every section (i.e., it is a maximal rather than minimal sample). It does not explicitly confirm the call is side-effect free or put no-parameter behavior in words, but 'Return' plus the content description covers the essentials.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the action and the artifact, then qualifies the format and purpose. Every clause earns its place and nothing is repeated from the name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be enumerated, and the description adds the useful framing that the sample is exhaustive ("exercising every section"). For a zero-parameter getter this is nearly complete; the only gap is that it does not help the agent choose between this and get_tsk_template.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters (schema coverage 100% trivially), so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter-level detail is missing or needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description pairs a specific verb (Return) with a specific resource (a complete, valid sample task list document) and states the exact form (raw markdown, frontmatter and body). It is clear what comes back, but it never distinguishes itself from the near-identical sibling get_tsk_template, which is the main ambiguity in this cluster of *_example/*_template tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"For use as a learning example" implies the intent (consult it to see what a fully-populated TSK document looks like), but there is no explicit when-to-use vs. when-not, and no mention of get_tsk_template or get_tsk as the alternatives. The agent must infer the routing from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tsk_templateGet TSK templateA

Return a TSK document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new task list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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: the result is raw markdown, it is a read-only style retrieval with no parameters, and the content is deliberately short blind text rather than real task data. It does not explicitly state that the call is side-effect free or static, which is the only 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and result type, with the parenthetical efficiently clarifying the nature of the placeholder content. No filler or redundant restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be re-explained, and with zero parameters and no annotations there is little else to cover. The description supplies the content shape and intended use, which is everything an agent needs to select and call it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 nothing for the description to disambiguate. The none-argument nature is implicitly confirmed by the absence of any parameter reference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Return a TSK document template") and defines exactly what the payload contains (frontmatter plus every body field, placeholder content, raw markdown). It does not distinguish itself from the close sibling get_tsk_example, so an agent must infer the template-vs-example difference, keeping it out of 5 territory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly frames the use case: "for use as a starting point when drafting a new task list," which tells the agent when this is the right call versus fetching an existing document. It names no exclusions or explicit alternatives (e.g. get_tsk_example, create_tsk), 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_ucGet use caseA

Read, parse, and return a full use-case document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_uc -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior5/5

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 unusually well: it discloses that parse failures return a ParseFailureResult rather than raising, that invalid ids raise ValueError before any file access, that offset/limit clamp silently, and which parameter combinations raise ValueError. These are exactly the edge behaviors an agent needs and none are available 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, but the body is a dense wall of run-on sentences with stacked parentheticals and cross-references that are hard to parse on first read. The information largely earns its place, yet structure (e.g., bullets per parameter/mode) would make it far more scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still pre-empts the key return-value question by naming the ParseFailureResult and its fields. For a read tool with no annotations, the coverage of modes, error paths, and downstream-usage pitfalls leaves nothing 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.

Parameters5/5

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: raw switches to frontmatter-stripped body, offset is 1-based with default 1, limit defaults through end of body, out-of-range values clamp, and numbered only makes sense with raw=True. Interaction rules and ValueError conditions between parameters are spelled out explicitly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource — 'Read, parse, and return a full use-case document (frontmatter and body) by its id' — which an agent can act on immediately. It does not, however, explicitly differentiate itself from siblings like parse_uc, list_uc, or get_uc_template, leaving that distinction to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description thoroughly explains how to drive the tool's modes (raw, offset/limit, numbered) and warns about feeding numbered output back into update/create_uc/edit, which is useful cross-tool guidance. But it never states when to choose get_uc over parse_uc or list_uc, so tool-selection 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.

get_uc_diagramGet the per-UC usecase diagramA

Render and return the deterministic PlantUML usecase diagram for one use case (the frozen rulebook specmgr://uc/plantuml §2.5): one usecase node (title + level stereotype), one actor node per distinct cleaned actor label, plain associations. Read-only: the id is path-safety-guarded (a wrong-format id is a ValueError before any file access) and the document is read cache-aware; a document that exists but fails to parse returns the non-raising ParseFailureResult (error/path/id, the feat-150 precedent), and a truly absent id raises the domain's not-found error. Returns PlantUML source (not a specmgr document) -- run it through the validate_plantuml tool for a validation verdict.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

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 richly: read-only, path-safety-guarded id that raises ValueError before any file access, cache-aware reads, parse failures returning a non-raising ParseFailureResult with error/path/id, and a raised not-found error for truly absent ids. This is far more than the annotations would have supplied and covers failure modes, safety, and caching explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and scope are front-loaded in the first sentence and every clause conveys substantive information. It is dense with parenthetical references (specmgr://uc/plantuml §2.5, feat-150 precedent) that assume internal context, keeping it short of a clean 5 but without wasted filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param read tool with an output schema, the description covers everything needed: what it returns (PlantUML source, explicitly not a specmgr document), the guarded id contract, cache behavior, and both failure-mode outcomes. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one parameter (id) at 0% schema coverage, but the description compensates by explaining that the id is path-safety-guarded and that a wrong-format id raises a ValueError before any file access. That adds real meaning about format expectations and failure behavior beyond the bare 'string' schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (render/return), resource (PlantUML usecase diagram), and scope (for one use case), which cleanly distinguishes it from siblings like get_use_case_package_diagram and get_uc_sequence_skeleton. An agent can tell exactly what artifact this produces without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear follow-up path by directing the agent to run the output through validate_plantuml for a validation verdict, which is genuine when-to-use-next guidance. However it never explicitly contrasts this tool against the sibling diagram/example tools (e.g., get_use_case_package_diagram or get_uc_plantuml_template), so the alternative-selection guidance 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.

get_uc_exampleGet UC exampleA

Return a complete, valid sample use case document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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 meaningful traits: the return is raw markdown, includes both frontmatter and body, and is guaranteed complete and valid by exercising every section. What it does not say -- whether the sample is static or generated, and its approximate size -- is minor for a zero-parameter read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with no filler, front-loading the action and output type before the purpose clause. Every phrase ('complete, valid', 'frontmatter and body', 'every section', 'learning example') carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be re-explained, and the description correctly focuses on what the sample contains and why. The only gap is the absence of any statement about how this differs from the template and get siblings in this large family.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 clarify beyond the schema. Baseline 4 applies; no parameter semantics are missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return a complete, valid sample use case document as raw markdown') and pins down the output form ('frontmatter and body -- exercising every section'). It implicitly separates itself from siblings like get_uc_template via 'for use as a learning example', but never names an alternative explicitly, so the differentiation is inferential 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for use as a learning example' hints at the intended context, so usage is implied rather than stated. There is no explicit when-to-use versus get_uc_template, get_uc_example-style counterparts for other artifact types, or get_uc, and no exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_uc_plantuml_exampleGet the PlantUML sequence-diagram exampleA

Return the complete, fully attributed PlantUML sequence diagram for the packaged 'Buy Goods' example UC as raw PlantUML source, verbatim -- the model for the generate_uc_sequence_diagram prompt flow (rulebook §2.9 attribution, every UNATTRIBUTED marker resolved). The file is not markdown and not a specmgr document (no frontmatter, not validate-able). Reads the packaged data file fresh on every call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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 payload is raw PlantUML, verbatim, not markdown, not a validate-able specmgr document (no frontmatter), and that it reads the packaged file fresh on every call. It omits permission/error behavior, but the format and freshness disclosures are substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core verb+object, and every clause adds information (format, attribution state, non-validate-ability, freshness). It is a dense single sentence with a parenthetical, slightly heavy but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param getter with an output schema, the description covers what is returned, its exact format, and its non-validate-able nature. Nothing an agent needs in order to call it is missing, though it could route more explicitly among the many uc example/template siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 parameter-wise to clarify and the description correctly does not invent arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (PlantUML sequence diagram for the packaged 'Buy Goods' example UC) with clear format scoping (raw PlantUML source, verbatim). It explicitly distinguishes itself from the markdown/specmgr siblings and the template/skeleton variants by describing what the artifact is and is not.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It signals its role as 'the model for the generate_uc_sequence_diagram prompt flow', which implies when it is useful, but it never names an alternative (e.g., get_uc_plantuml_template, get_uc_sequence_skeleton, get_uc_diagram) or states when not to use it. Usage 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.

get_uc_plantuml_templateGet the PlantUML sequence-skeleton templateA

Return the packaged PlantUML sequence-skeleton template (placeholder participants and mapping comments -- the shape get_uc_sequence_skeleton emits, rulebook §2.9) as raw PlantUML source, verbatim. The file is not markdown and not a specmgr document (no frontmatter, not validate-able). Reads the packaged data file fresh on every call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the load, and it does disclose real behavioral traits: output is raw PlantUML verbatim, it is not markdown, has no frontmatter, is not validate-able, and the packaged data file is read fresh on every call. 'Return'/'Reads' imply read-only but that is never stated outright, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the identity of the resource and followed by the format caveats. Dense but each sentence carries information (shape, output format, freshness); the rulebook §2.9 citation is the only slightly noisy element.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No parameters plus an existing output schema means the description only owes format and lifecycle context, and it supplies both (raw PlantUML verbatim, non-validatable, read fresh each call). Nothing essential is missing, though an explicit neighbor-pointer would make it fully self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 is nothing further for the description to disambiguate. It correctly avoids inventing argument semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a precise verb ('Return') and resource ('the packaged PlantUML sequence-skeleton template'), and pins the resource down further as placeholder participants plus mapping comments matching the shape get_uc_sequence_skeleton emits. The 'template vs example' framing lets an agent distinguish it from the many get_*_example and get_uc_plantuml_example 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It relates the template to get_uc_sequence_skeleton's output shape, which is useful context, but it never states when to reach for this tool versus get_uc_plantuml_example, get_uc_template, or get_uc_example. Usage is only implied by the word 'template', so an agent has to infer the selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_uc_sequence_skeletonGet the sequence-diagram skeletonA

Render and return the deterministic PlantUML sequence-diagram skeleton for one use case (the frozen rulebook specmgr://uc/plantuml §2.9): participants, the preconditions note, the trigger (virtual step 0, receiver fixed to the system), the ordinal steps, the alt fragments, the final notes -- and every message the §2.9.3 attribution rule cannot pre-fill as one of the three frozen UNATTRIBUTED marker lines. Read-only: the id is path-safety-guarded (a wrong-format id is a ValueError before any file access) and the document is read cache-aware; a document that exists but fails to parse returns the non-raising ParseFailureResult (error/path/id, the feat-150 precedent), and a truly absent id raises the domain's not-found error. The skeleton is the starting point of the generate_uc_sequence_diagram prompt flow (the agent attributes the markers, validates via validate_plantuml, and writes the .puml file host-native; no specmgr tool writes .puml).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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 extensive behavioral traits: path-safety-guarded id with ValueError for wrong format, cache-aware reads, ParseFailureResult for unparseable docs, and not-found error for absent ids. This is rich behavioral context beyond what an agent would otherwise know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single long sentence packed with dense, parenthetical references and jargon ('the feat-150 precedent', 'specmgr://uc/plantuml §2.9'). While front-loaded with the purpose, the density and nested clauses hinder readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a complex tool: covers behavior, error modes, the broader workflow context, and explicitly notes that no specmgr tool writes .puml. The output schema exists so return values need not be described in detail. An agent has enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 id validation behavior (path-safety-guarded, wrong-format id raises ValueError before file access), which adds important semantic meaning beyond the bare schema. However, it does not describe the id format itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Render and return the deterministic PlantUML sequence-diagram skeleton for one use case'. The description clearly distinguishes this from siblings like get_uc_diagram, get_uc_plantuml_template, and validate_plantuml by specifying it produces the skeleton starting point.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it: 'the starting point of the generate_uc_sequence_diagram prompt flow (the agent attributes the markers, validates via validate_plantuml, and writes the .puml file host-native; no specmgr tool writes .puml)'. Names alternatives and disambiguates the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_uc_templateGet UC templateA

Return a UC document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new use case.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does reasonably well: 'Return' signals a read-only, side-effect-free operation, and it discloses output format (raw markdown) and the placeholder nature of the content. It omits any note about idempotence or how placeholder text should be treated, but nothing an agent needs to call it safely is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with the verb and resource front-loaded, followed by the content guarantee and the intended use. The parenthetical '(blind text)' is the only embellishment and it clarifies an unusual term, so every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Zero parameters, a 100% covered schema, and an output schema that already defines the return shape. The description adds the one thing the structured fields cannot convey: that the returned content is placeholder material meant as a drafting starting point rather than canonical data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. Baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return), resource (UC document template), and the exact scope of the content: frontmatter plus every body field, populated with placeholder blind text, delivered as raw markdown. This lets an agent distinguish it from get_uc (existing document), get_uc_example (filled example), and create_uc (mutation) 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The trailing clause 'for use as a starting point when drafting a new use case' gives clear situational context. It stops short of explicitly naming alternatives or exclusions (e.g., 'use get_uc_example instead when you want realistic content'), so routing 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.

get_use_case_package_diagramGet the multi-UC package diagramA

Render and return the deterministic PlantUML package diagram for a set of use cases (the frozen rulebook specmgr://uc/plantuml §2.7): one usecase node per document in the given order, the deduplicated actor union, and the <<include>>/<<extend>>/superordinate edges from Related Use Cases. ids=None = every UC in list_uc order (list_uc failed rows -- existing-but-broken documents -- become skipped slots); an id missing on disk or existing-but-broken becomes the same skipped slot, and any reference that does not resolve to a parsed slot in the package (including legacy UC-NNN tokens) takes the deterministic 'Unresolved UC reference' note -- the render never fails on an id or a reference. Read-only: every given id is path-safety-guarded (a wrong-format id is a ValueError before any file access) and the documents are read cache-aware. Returns PlantUML source -- run it through the validate_plantuml tool for a validation verdict.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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: read-only status, path-safety guarding with a ValueError on malformed ids before any file access, cache-aware reads, skipped slots for missing/broken documents, deterministic 'Unresolved UC reference' notes, and an explicit guarantee the render never fails on an id or reference.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and information-dense, but the single sprawling paragraph with stacked parentheticals and em-dashes is harder to parse than it needs to be. No fluff, though every clause carries real detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex rendering tool this covers output type (PlantUML source), the next step (validate_plantuml), failure semantics, and id defaults. An output schema exists, so return-shape explanation is not required, and 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (the single 'ids' param is undocumented in the schema), so the description must compensate, and it does: it defines the None default semantics, the ordering source (list_uc order), how missing/broken ids degrade to skipped slots, and how unresolved references behave.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Render and return the deterministic PlantUML package diagram for a set of use cases'. It anchors the output to a frozen spec (specmgr://uc/plantuml §2.7) and distinguishes the artifact (one usecase node per document, actor union, include/extend/superordinate edges), so an agent can tell it apart from get_uc_diagram or get_reference_diagram.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context: ids=None renders every UC in list_uc order, and the downstream step is explicitly routed ('run it through the validate_plantuml tool'). It does not, however, explicitly state when to prefer this over sibling diagram 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.

get_vcrGet verification case recordA

Read, parse, and return a full verification case record document (frontmatter and body) by its id. Pass raw=True to return the frontmatter-stripped body text verbatim instead. With raw=True, optional read-style offset/limit window the raw read: offset (1-based, default 1) is the first body line to return, limit (line count, default through end of body) how many; out-of-range values clamp (offset > N returns the empty string), and coordinates with raw=False raise ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising; its error text is byte-identical to the domain's own list tool's failed-row error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c). An invalid id (path-injection attempt or wrong format) is also a ValueError, raised before any file access. With raw=True, an optional numbered=True prefixes every returned body line with its 1-based absolute body-line number in the "<n>: " form (plain decimal, no padding) -- under offset/limit windowing the numbers start at the clamped offset and never restart at 1, so a number seen in the output can be fed straight back into the generic update tool's offset. numbered is meaningful only with raw=True: combining it with raw=False raises ValueError (like offset/limit), and a numbered read of a document that fails to parse returns the ParseFailureResult described above, never numbered text. Numbered output must never be fed back verbatim into content for update or create_vcr -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
rawNo
limitNo
offsetNo
numberedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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 thoroughly: it discloses parse-failure behavior (ParseFailureResult on unparseable docs), that invalid ids raise ValueError before file access, clamping semantics for out-of-range offsets, and cross-tool coupling with the update create_vcr tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and logically ordered, but it is dense with parenthetical caveats, an ADR reference, and repeated restatements of the byte-identical error behavior, which slows scanning for an agent needing only the core call semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param read tool with output schema coverage, the description is nearly complete: it covers mode selection, windowing, numbering, error behavior, and safety warnings. The main omission is an explicit statement of when to use this tool versus the many get_vcr* siblings, which leaves a small routing gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 raw, offset (1-based default 1), limit, and numbered, including defaults and error conditions. Minor gaps remain: the exact id format isn't specified beyond 'wrong format', and the interaction between raw=False and offset/limit beyond the ValueError is thin.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Read, parse, and return a full verification case record document (frontmatter and body) by its id.' It distinguishes the dual modes (raw=False vs raw=True) precisely and even names the affected sibling ('update') in the routing guidance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear conditional usage is given for raw=True, offset/limit, and numbered, including which combinations raise ValueError. However it never explicitly tells the agent when to prefer this over get_vcr_example, get_vcr_template, or parse_vcr siblings, so cross-sibling routing 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.

get_vcr_exampleGet VCR exampleA

Return a complete, valid sample verification case record document as raw markdown -- frontmatter and body -- exercising every section, for use as a learning example.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the burden, and it discloses two meaningful traits: the output is raw markdown (frontmatter plus body) and covers every section. It doesn't state whether the data is live or static, but otherwise covers what an agent needs to know about the return.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence front-loads the verb and resource, then qualifies format and scope with no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value details needn't be spelled out. The description supplies the key missing context — markdown format and exhaustive section coverage — good enough for a static example tool, though it could note that the output is not real record data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so parameter semantics is trivially complete. Baseline 4 for no-params tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (return a sample VCR record document) and describes the content ('exercising every section'). It clearly distinguishes itself from get_vcr (the actual record) and get_vcr_template (the blank template), though the prefixed naming convention already signals this.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for use as a learning example' implies the when-to-use context (study/learn format vs. fetch real data), but there are no explicit exclusions or named alternatives like get_vcr or get_vcr_template.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vcr_templateGet VCR templateA

Return a VCR document template -- frontmatter and every body field present, populated with short placeholder ('blind text') content -- as raw markdown, for use as a starting point when drafting a new verification case record.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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 specifies the return format is raw markdown, the template includes frontmatter and all body fields, and the content is placeholder 'blind text'. It does not discuss permissions or side effects, but for a read-only getter that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-structured sentence. It front-loads the return action and then compactly covers format, content, and intended use, with no wasted clauses.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity, zero-parameter template getter with an output schema present, the description is complete. It tells the agent what will be returned and when to use it, and does not need to re-document return values already covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain. The empty schema is consistent with the description, which correctly does not introduce any arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: it returns a VCR document template, not a VCR record or example. It also defines the template contents as frontmatter plus every body field populated with placeholder text, making the tool's purpose concrete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the intended context: use it as a starting point when drafting a new verification case record. It does not explicitly name alternatives such as get_vcr_example or get_vcr, but the placeholder-content framing sufficiently distinguishes it from those siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_adrList ADRsA

Ids, titles, statuses, and refs of ADRs in the configured ADR base directory (SPECMGR_ADR_DIR), one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use get_adr with it instead. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.4/5.0
Behavior4/5

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 pagination semantics (default 25, capped at 100) and the non-obvious clamping behavior ('out-of-range values are clamped, not errored'). It omits ordering guarantees and any permission/base-directory failure behavior, 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded — the return fields and scope come first, then the 'ref' caveat, then paging. Every clause carries information, though the em-dash aside about 'ref' makes the opening sentence long and slightly harder to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and both parameters are fully covered. The remaining gap is minor: no statement of ordering or what happens when the base directory is unset/unreadable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: offset/max_results are explained as paging controls, with a stated default page size and a hard cap. This is meaning beyond the bare integer schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (ADRs) plus exactly what is returned: ids, titles, statuses, refs. It also scopes the source (SPECMGR_ADR_DIR) and distinguishes itself from the sibling get_adr by saying it is for context 'before addressing one by id'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for use ('for context before addressing one by id') and routes the ambiguous 'ref' case to get_adr explicitly. It does not, however, say when to choose this over other list_* siblings or note any prerequisite state.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_decList decisionsA

Ids, titles, statuses, and refs of decisions in the configured decision base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_dec tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the decisions whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.7/5.0
Behavior5/5

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 pagination defaults (25, capped at 100), that out-of-range values are clamped rather than errored, that glob=None lists everything while an empty string matches nothing, and that matching is case-insensitive. It also warns that 'ref' is an opaque identifier and not a disk filename, preventing a likely misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource and returned fields, then the ref caveat, then filtering, then paging. Every clause earns its place, though the single dense paragraph packs several distinct ideas (return shape, ref semantics, glob rules, paging) that could be marginally easier to scan as separate sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be enumerated, yet the description still names the key fields. Combined with complete filtering and paging semantics, nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must define all three parameters, and it does: glob semantics (case-insensitive id match, default None vs empty string), and offset/max_results as paging controls with documented defaults and caps. This adds substantial meaning beyond the bare anyOf integer/string schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('decisions') plus the exact fields returned (ids, titles, statuses, refs) and the scoping ('in the configured decision base directory'). It also distinguishes itself from the by-id sibling ('for context before addressing one by id') and from get_dec for ref-based lookups, so an agent can separate it from the many list_*/get_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use context (get an overview before addressing a decision by id) and names the alternative for a specific case ('use it with the get_dec tool instead' for refs). It stops short of stating when NOT to use this tool or why to prefer it over other list_* siblings, but the primary routing decision is covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_featList featuresA

Ids, titles, statuses, and refs of features in the configured feature base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_feat tool instead. An optional glob pattern (e.g. 'feat-7*') filters the listing to the features whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored. The request path never fully parses a document's body (GitHub issue #187): a folder's row is resolved from its frontmatter+H1 alone until a background warmup (or an on-demand get_feat read) has fully parsed it, so a body-level parse failure may transiently appear healthy, and a missing/wrong-shape H1's error text may transiently differ from get_feat's -- both converge to get_feat's exact error once that file has been fully parsed. Set SPECMGR_FEAT_WARMUP_DISABLED to turn the background warmup off entirely (convergence then depends solely on on-demand reads).

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.8/5.0
Behavior5/5

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 exceptionally well. It discloses non-obvious behaviors: out-of-range paging values are clamped not errored, case-insensitive glob matching, the request path never fully parses a document body (GitHub issue #187), transient parse inconsistencies that converge over time, and an environment variable to disable warmup. This is rich, implementation-level transparency an agent cannot 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loaded with purpose, but it becomes lengthy with the warmup/parse convergence caveat spanning multiple clauses. While the information is valuable, the structure could be improved by separating the primary usage from the edge-case transparency, as the current mix of concerns makes it harder to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite a rich output schema existing (so return value details aren't needed), the description covers all other essential context: paging, filtering, ref semantics, and the non-trivial caching/parse behavior with environment variable control. For a list tool in a complex system, this is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates. It explains glob as an optional pattern (with example, case-insensitivity, None vs empty string behavior), and defines max_results/offset as paging controls with default page size 25 and a cap of 100, plus clamping of out-of-range values. Every parameter gets meaningful semantic detail absent from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (features), names the exact fields returned ('Ids, titles, statuses, and refs'), and gives the location (configured feature base directory). It also distinguishes itself from get_feat by explaining the 'ref' handling and routing to get_feat for addressing by id, making it clearly differentiable from its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the purpose is 'for context before addressing one by id' and directs to 'get_feat' for retrieving a document once its ref is known. It also clarifies glob semantics (None vs empty string) and paging defaults, leaving no ambiguity about when and how to use the tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_golList goalsA

Ids, titles, statuses, and refs of goals in the configured goal base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_gol tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the goals whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: pagination defaults (25, capped at 100), clamping instead of erroring on out-of-range values, case-insensitive glob matching, and the explicit warning that 'ref' is an opaque extensionless identifier rather than a disk filename. These are non-obvious traits 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what is returned and why before the operational details, and every sentence adds distinct information. It is dense, running several clauses together, but nothing is redundant or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return shape need not be explained, yet the description still names the returned fields; combined with complete parameter semantics, paging behavior, and the ref/get_gol routing, 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.

Parameters5/5

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 all three parameters: glob (pattern matching the id, case-insensitive, None default lists everything, empty string matches nothing), plus max_results/offset paging semantics with defaults and clamping behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (goals), enumerates the returned fields (ids, titles, statuses, refs), and scopes it to the configured goal base directory. An agent can distinguish it from get_gol and the other list_* siblings 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames the use case ('for context before addressing one by id') and routes the ref case to get_gol ('use it with the get_gol tool instead'). It stops short of stating what it is not for beyond that single case, but the primary when-to-use and one alternative are clearly named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_prbList problem statementsA

Ids, titles, statuses, and refs of problem statements in the configured problem statement base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_prb tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the problem statements whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and does so well: it discloses scoping to a configured base directory, paging behavior (default 25, capped at 100, out-of-range clamped not errored), and glob semantics (case-insensitive, None lists all, empty string matches nothing). These are non-obvious behaviors an agent could not infer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource, return fields, and purpose, then moves to ref semantics, glob, and paging. Dense but well-ordered; the ref clarification is slightly run-on, but each clause carries distinct, useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, yet the description still names the returned fields. Filtering, paging, and the ref/id distinction are all covered, leaving nothing an agent needs in order to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: glob is documented with matching target, case-insensitivity, and the None-vs-empty-string distinction; max_results/offset are documented with defaults, cap, and clamping. Every parameter's runtime meaning is explained beyond the bare typed schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (problem statements), and enumerates exactly what is returned: 'Ids, titles, statuses, and refs.' It clearly distinguishes itself from the sibling get_prb by framing itself as 'context before addressing one by id.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('for context before addressing one by id') and explicitly routes the 'ref' case to the alternative tool ('use it with the get_prb tool instead'). Both the intended use and the boundary against a sibling are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_qaList QA documentsA

Ids, titles, statuses, and refs of QA documents in the configured QA base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_qa tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the QA documents whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.5/5.0
Behavior4/5

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 explains that ref is an opaque, extensionless identifier (not a disk filename), that glob case-insensitively filters on id, and that paging defaults to 25/caps at 100 with out-of-range values clamped rather than errored. Read-only nature is implied by 'list' but not stated, and no permission/auth details 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded, leading with what is returned before the ref caveat and paging mechanics. Every sentence adds real information, though the single long paragraph is slightly heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary; the description instead covers the filtering, paging, and ref semantics an agent needs to call it correctly. Complete for a filtered, paginated list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: glob is explained with a concrete example, case-insensitivity, the None default, and the empty-string edge case; max_results/offset are documented with default page size, cap, and clamping behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (QA documents) and enumerates the fields returned (ids, titles, statuses, refs). It clearly distinguishes this multi-document listing from the single-document get_qa sibling, so an agent can tell them apart without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Frames the use case ('for context before addressing one by id') and explicitly routes ref-based retrieval to the get_qa tool ('use it with the get_qa tool instead'). Clear context and one named alternative, though it does not spell out when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_referencesList referenced artifactsA

Cross-references of one source document, resolved and paged. type is the source document's domain (one of adr, req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs) and id the source's own identifier. The tool scans the source's frontmatter-stripped body for reference tags (the shared reference-tag vocabulary in general.tools._references: the UUID tags GOL/PRB/QA/UC/REQ/RSK/DEC/ADR/VCR/SYSRS, each carrying a canonical uuid id, plus FEAT, carrying the full feat-NNN-slug id or the bare feat-NNN number; case-insensitive tag, space/tab/dash separator, anywhere in a line), dedupes repeated occurrences (first-occurrence order preserved), and resolves each unique reference to the referenced document in its own target domain. Returns a PagedResult of one ReferenceRow per unique reference: type, id, title (the referenced document's H1), and path (the referenced document's resolved absolute file path). A reference that cannot be resolved on disk is a row with null title/path and the target domain's not-found message in error -- it never raises. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored. An invalid id (path-injection attempt or wrong format for type) is a ValueError raised before any file access; a missing source document is the source domain's own XNotFoundError.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.2/5.0
Behavior5/5

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 exceptionally: it discloses that unresolvable references return null title/path plus an error message rather than raising, that paging values are clamped, that an invalid id raises ValueError before any file access, and that a missing source raises the domain's XNotFoundError. 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, but the body is one dense run-on paragraph loaded with internal implementation detail ('frontmatter-stripped body', the internal module path general.tools._references, the full tag vocabulary) that does not help the agent decide or call. Some of that earns its place; the module reference and tag internals do not.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still sketches the returned ReferenceRow shape, and it fully covers inputs, resolution semantics, paging, and both failure modes. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 `type` as the source document's domain (enumerating all values), `id` as the source's own identifier, and specifies that `max_results`/`offset` page results with a default of 25 and a cap of 100, with out-of-range values clamped. Every parameter gains meaning 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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening clause states a specific verb+resource pair — cross-references of one source document, resolved and paged — which an agent can act on. It never names a sibling (e.g., find_related or get_reference_diagram) to differentiate itself from the other relationship-oriented tools, so it is clear but not sibling-disambiguated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by 'cross-references of one source document,' but there is no explicit when-to-use, when-not, or alternative selection guidance against sibling tools like find_related, find_similar_text, or get_reference_diagram. The heavy detail is about mechanics, not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_reqList requirementsA

Ids, titles, statuses, and refs of requirements in the configured requirement base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_req tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the requirements whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.5/5.0
Behavior4/5

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 paging defaults (25, capped at 100), that out-of-range values are clamped rather than errored, that glob matching is case-insensitive, that glob=None lists everything, and that an empty string matches nothing. Auth/error behavior beyond clamping is not covered, keeping it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource and returned fields, then parameters and paging; every sentence is informative. The ref explanation is slightly verbose but earns its place by preventing a filename-vs-identifier misuse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value documentation is not required, yet the description still names the returned fields. Combined with full parameter and paging semantics, 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.

Parameters5/5

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: glob is defined by matching target, case-insensitivity, an example ('dead*'), None vs empty-string semantics; max_results/offset are explained as paging controls with defaults and clamping behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (requirements), and enumerates the returned fields (ids, titles, statuses, refs) plus the source directory, making it immediately distinguishable from get_req. An agent can tell what this does and what it yields 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('for context before addressing one by id') and routes the 'ref' case explicitly to the get_req tool. It stops short of stating negative cases (e.g. do not use this to retrieve full requirement content), so it is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_rskList risksA

Ids, titles, statuses, and refs of risks in the configured risk base directory, one page at a time, for context before addressing one by id. Each line also carries the initial/residual 5x5 zone levels, the TARA strategy word, the first ## Scope entry, and the residual-risk coordinates (residual_probability/residual_impact/residual_product). 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_rsk tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the risks whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.7/5.0
Behavior5/5

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 paging defaults (25, capped at 100), that out-of-range offset/max_results are clamped rather than errored, that glob=None lists everything while an empty string matches nothing, that matching is case-insensitive against ids, and that 'ref' is an opaque extensionless identifier rather than a filename. These are exactly the edge cases an agent would otherwise discover by failure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and the paging/filtering semantics are front-loaded, so the agent gets the essentials immediately. The middle sentence enumerating every returned column is dense and slightly run-on, though each element (zone levels, TARA strategy, Scope entry, residual coordinates) is substantive rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values did not need explaining, yet the description still labels the non-obvious columns (zone levels, TARA strategy word, residual_* coordinates) that an agent would otherwise misread. Combined with complete parameter and edge-case coverage, nothing needed to call this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry all three parameters, and it does: glob semantics (optional, case-insensitive id match, example 'dead*', None vs empty-string behavior), and max_results/offset paging with defaults, cap, and clamping behavior. No parameter is left undescribed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first clause names a specific verb (list) and resource (risks in the configured risk base directory) and enumerates the returned fields (ids, titles, statuses, refs). It also carves out the boundary against the sibling get_rsk by stating list output is 'for context before addressing one by id' and that 'ref' should be consumed via get_rsk instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear use context ('for context before addressing one by id') and routes the agent to get_rsk for the 'ref' case, which is genuine sibling differentiation. It stops short of an explicit when-not-to-use this tool (e.g. when you already have the id and want full detail), so it is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sopList Standard Operating ProceduresA

Ids, titles, statuses, and refs of Standard Operating Procedures in the configured SOP base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_sop tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the Standard Operating Procedures whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.7/5.0
Behavior5/5

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: paging is one page at a time with default 25, cap 100, and out-of-range values clamped rather than errored. It also discloses the non-obvious semantic that 'ref' is an opaque extensionless identifier, not a disk filename.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but every sentence earns its place, and the key scoping/count information is front-loaded. Slightly long, but the length is driven by genuinely needed parameter and behavior detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is unnecessary; combined with full parameter coverage and paging behavior, the description is complete enough for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 all three parameters: glob is a case-insensitive id filter with None listing everything and empty string matching nothing; max_results/offset control paging with stated defaults and clamping behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (Standard Operating Procedures) plus the exact fields returned (ids, titles, statuses, refs) and the scope (configured SOP base directory). An agent can immediately separate it from get_sop, which it explicitly positions as the by-id counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use context ('for context before addressing one by id') and routes the 'ref' case to get_sop instead. It does not state an explicit when-not-to-use, but the alternative path for ref-based retrieval is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sysrsList System Requirements SpecificationsA

Ids, titles, statuses, and refs of System Requirements Specifications in the configured System Requirements Specification base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_sysrs tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the System Requirements Specifications whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden and does well: it discloses page size defaults (25) and cap (100), that out-of-range values are clamped rather than errored, that glob=None lists everything while an empty string matches nothing, and that refs are opaque extensionless identifiers not disk filenames. Read-only safety is only implied by 'list', and no auth/permission requirements are mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the resource and returned fields, then semantics; every sentence carries information. It is dense and slightly long, but no sentence is filler or redundant with structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the description covers filtering, paging, and the ref/id distinction adequately. It could still note ordering of results or that it is a read-only operation, but 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.

Parameters5/5

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: glob semantics (case-insensitive id match, e.g. 'dead*', None default, empty-string behavior) and max_results/offset paging behavior with defaults, cap, and clamping are all spelled out beyond anything the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (System Requirements Specifications), names the exact fields returned (ids, titles, statuses, refs), and scopes it to the configured base directory. It also distinguishes itself from the sibling get_sysrs by explaining that 'ref' is not an id and must be resolved via that tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear use context ('for context before addressing one by id') and routes the ref case explicitly to get_sysrs. It does not state any exclusion such as when to prefer parse_sysrs or a full read instead, so it stops short of full 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.

list_tskList task listsA

Ids, titles, statuses, and refs of task lists in the configured task list base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_tsk tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the task lists whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.5/5.0
Behavior4/5

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 'ref' is opaque and not a filename to read from disk, documents paging behavior with default and cap, and states that out-of-range values are clamped rather than errored. Missing only auth/permission requirements and any note on total-count or ordering behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One densely packed paragraph, front-loaded with what is returned, then the ref caveat, then the filtering and paging rules. Every sentence carries information, though the middle 'ref' clause is slightly long-winded and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the description nonetheless covers filtering, paging, defaults, clamping, and the opaque-ref handoff to get_tsk. Nothing an agent needs in order to call this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must fully compensate, and it does: glob semantics (case-insensitive, matched against id, None=all, empty=nothing, worked example 'dead*'), and max_results/offset (default page size 25, hard cap 100, clamping). Every parameter is documented beyond the schema's bare types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('List task lists') plus the exact fields returned (ids, titles, statuses, refs) and the base directory they come from. It also implicitly distinguishes itself from get_tsk by framing itself as the tool for browsing 'before addressing one by id'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the use context ('for context before addressing one by id') and routes the agent to get_tsk for the 'ref' case, naming the alternative tool by name. It stops short of an explicit 'do not use this to fetch a single task list' exclusion, but the routing guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ucList use casesA

Ids, titles, statuses, and refs of use cases in the configured use-case base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_uc tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the use cases whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.7/5.0
Behavior5/5

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 paging defaults (25, capped at 100), that out-of-range values are clamped rather than errored, glob matching is case-insensitive, glob=None lists everything while an empty string matches nothing, and that 'ref' is an opaque extensionless identifier rather than a disk filename.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the returned fields and scope, and every clause carries information. It is a dense, run-on single paragraph, however, which makes the glob and paging rules harder to scan than they need to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing (so return values need not be explained), the description still summarizes the returned fields, and it fully covers filtering, paging, and identifier semantics. Nothing an agent needs to call this list tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: glob semantics (case-insensitive, None vs empty string), and max_results/offset paging behavior with defaults and caps are all explained. Each of the three parameters gains meaning not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('list use cases in the configured use-case base directory') and enumerates exactly what is returned (ids, titles, statuses, refs). It also differentiates itself from the get_uc sibling by framing the listing as context 'before addressing one by id'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context ('for context before addressing one by id') and routes the agent to the alternative for retrieval: use the 'ref' with get_uc instead. It does not state explicit when-not conditions (e.g., when to prefer a targeted lookup over listing), but the alternative is named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_vcrList verification case recordsA

Ids, titles, statuses, and refs of verification case records in the configured verification case record base directory, one page at a time, for context before addressing one by id. 'ref' is an opaque, extensionless identifier -- not a filename to read from disk -- for documents that have no assigned id; use it with the get_vcr tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the verification case records whose id matches it, case-insensitively; glob=None (the default) lists everything, and an empty string matches nothing. max_results/offset control paging (default page size 25, capped at 100); out-of-range values are clamped, not errored.

ParametersJSON Schema
NameRequiredDescriptionDefault
globNo
offsetNo
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
offsetYes
resultsYes
truncatedYes
error_countNo
max_resultsYes

TDQS

A4.5/5.0
Behavior4/5

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 does so well: it discloses pagination defaults (25), the 100 cap, and that out-of-range values are clamped rather than errored. It also explains that 'ref' is opaque and not a disk filename. It doesn't mention auth/permission requirements, a minor gap for a 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool returns, then parameter semantics, then edge cases — every sentence carries information. It is a dense, clause-heavy single block that could be broken up for scannability, but there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, yet the description still conveys the key returned fields and the meaning of the otherwise opaque 'ref'. Combined with pagination and glob edge-case handling, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 all three parameters: glob is case-insensitive, matches against id, default None lists everything while an empty string matches nothing; max_results/offset control paging with default 25, cap 100, and clamping behavior. This is behavior the bare schema cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (verification case records), names the directory it reads from, and enumerates the returned fields (ids, titles, statuses, refs). It clearly distinguishes itself from get_vcr by describing itself as a listing done 'for context before addressing one by id'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('for context before addressing one by id') and routes the agent to the alternative explicitly: refs should be used with get_vcr, not list_vcr. It lacks an explicit statement of when NOT to list, but the alternative routing is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mdformatFormat markdown documentA

Format a markdown file in place, preserving any YAML frontmatter. Returns True if the file was changed, False if already formatted.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the key traits: this mutates the file in place, it preserves YAML frontmatter, and it returns a change/no-change boolean. It stops short of error behavior (missing file, permission failures) or formatting scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the action and preservation guarantee front-loaded, and the return semantics packed into the same breath. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter formatting tool with an output schema present, the description covers purpose, mutation semantics, and return meaning. The remaining gap is failure/error behavior, which is minor at this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'path' parameter has 0% schema description coverage, so the description must compensate. It implies the path points to a markdown file, but adds no format, relative-vs-absolute, or existence requirements beyond that inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Format a markdown file in place') plus a distinguishing behavioral detail (YAML frontmatter preserved). The operation is unique among the many get_/create_/parse_ siblings, so an agent can select it without confusion, though it never explicitly names an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the 'Returns True if changed, False if already formatted' clause suggests an idempotent normalization step, but there is no explicit when-to-use, when-not-to-use, or routing to siblings like validate or update.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

option_createCreate ADR OptionB

Append a new 'Option N: ...' sub-section (plan §5), returning its assigned full title.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
valueYes
partial_titleYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose that the operation is additive ('append') and that it returns the assigned full title, which is useful. However, it omits whether an existing ADR/id must already exist, permission requirements, and any side effects on numbering or existing options.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the action verb first and no wasted words. The return-value note is folded in efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return format need not be explained. But for a three-parameter mutation tool with 0% schema coverage and no annotations, the description is too thin: it leaves every parameter's meaning and all preconditions unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and all three parameters (id, value, partial_title) are undocumented in both schema and description. The phrase 'assigned full title' loosely hints that partial_title is expanded into 'Option N: ...', but id and value are entirely unexplained, so the description does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Append a new Option N sub-section', which distinguishes it from the sibling option_update/option_delete/option_read/option_list operations by implying creation. It also names the return value (assigned full title). It does not explicitly name alternative tools, but the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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 prerequisite guidance is given. The domain reference '(plan §5)' implies the ADR context but does not tell the agent when this tool should be chosen over option_update or option_list. Usage is only inferable from the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

option_deleteDelete ADR OptionC

Remove the option named full_title (plan §5), returning the remaining full titles.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
full_titleYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.6/5.0
Behavior2/5

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. 'Remove' implies a destructive, likely irreversible mutation, yet nothing is said about reversibility, required permissions, or confirmation. It does disclose the return payload (remaining full titles), which is the one piece of added context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no padding, but the cryptic '(plan §5)' reference is dead weight that does not earn its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with zero annotations and 0% schema coverage on two required params, the description leaves major gaps: what 'id' identifies, whether deletion is reversible, and under what conditions the option cannot be removed. The presence of an output schema excuses it from explaining return values, but the invocation-critical context is still thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so both parameters are undocumented in structured fields. The description clarifies that full_title is the option's name, but 'id' is never explained — an agent cannot tell whether it is the ADR id or the option id, which is critical for correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (remove) and resource (ADR option) and names the affected entity via full_title. It is readily distinguishable from option_create/option_read/option_update siblings. However the parenthetical '(plan §5)' is an unexplained internal reference that adds no clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No indication of when to use this versus option_update or the generic delete/edit tools, and no prerequisites or conditions stated. Usage must be entirely inferred from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

option_listList ADR OptionsC

Full titles of every current 'Option N: ...' sub-section, in document order (plan §5).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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 discloses almost nothing beyond return shape. It does not state that this is a read-only, non-mutating operation, does not mention auth or scoping needs, and does not say what happens for an ADR with no options.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence with no padding. The only structural weakness is that it is a fragment rather than a full statement, but it wastes no words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so explaining the returned titles is largely redundant, and the space is instead spent on that rather than on the undocumented 'id' parameter or any usage context. For an agent to call this correctly it still needs to guess what to pass as 'id'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single required parameter 'id' has 0% schema description coverage, and the description never mentions it or clarifies whether it is an ADR id, file path, or document identifier. With low coverage the description is expected to compensate, and it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact resource it returns — the 'Option N: ...' sub-section titles of an ADR, in document order — which is specific enough to distinguish it from option_read or list_adr in substance. However it is a bare noun phrase with no explicit verb and never contrasts itself with the closely-named option_* siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use, when-not, or alternative-tool guidance. An agent must infer that this is a lightweight index versus option_read for full option content, and nothing states when listing options is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

option_readRead ADR OptionC

Return the current content of the option named full_title (plan §5).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
full_titleYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. "Return the current content" implies a read-only operation, but it says nothing about error behavior for a missing option, the id-vs-full_title resolution, or whether previous versions are retrievable despite the word "current."

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence is appropriately front-loaded, but the parenthetical "(plan §5)" is an internal document reference that costs tokens without helping an agent invoke the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema covers return values, so that gap is excused. What remains missing is significant for a two-required-parameter tool with no annotations: the relationship between id and full_title, the failure mode when the option is absent, and any routing guidance to sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for two required parameters. The description mentions full_title only by restating the parameter name ("named full_title") and never explains the required `id` at all, so it compensates for only half the gap and adds almost no semantic meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Return the current content of the option" gives a clear verb (read/return) and resource (option content), which is more specific than a tautology. However, it never distinguishes itself from the numerous siblings (option_list, option_update, option_delete), and the phrase "named full_title" sits awkwardly against the schema, which also requires an unexplained `id`.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no when-to-use guidance and names no alternative. There is no hint that option_list should be used to discover options or that option_update is the counterpart, so the agent must infer routing from the sibling names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

option_updateUpdate ADR OptionB

Full-content replace of the option named full_title (plan §5), returning the new content.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
valueYes
full_titleYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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 that this is a full-content replace (not a partial update) and that it returns the new content, which is useful. However, it omits permissions, idempotency, and what happens if the option does not exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single, compact sentence with the key operation front-loaded. It wastes little space, though it could be slightly clearer about the return value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

It has an output schema, so return values need not be explained. But with zero annotation and zero schema coverage, the description leaves gaps about parameter roles and update semantics, making it only minimally adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 only explains that 'full_title' identifies the option; it does not clarify 'id', 'value', or the relationship between id and full_title, leaving two of three parameters semantically unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Full-content replace of the option') and names the mechanism (plan §5). It clearly differentiates from siblings like option_read or option_list, though the 'full_title' naming is idiosyncratic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance. The description does not indicate when to prefer option_update over option_create or option_delete, nor any preconditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_decParse decisionA

Parse a decision markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.dec.models.v1.DecDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

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 richly: it discloses that parse failures return a non-raising ValidateResult with a 300-char error cap instead of raising exceptions, that missing files still raise OSError-family errors, and cites ADR and issue references. This is exceptionally transparent for a parser.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, information-dense sentence that front-loads the purpose and then adds important behavioral details. It is slightly long and parenthetical, but every clause adds useful context and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple one-parameter parser tool with an output schema already describing the return type, the description covers the key behavioral edge cases (parse failure vs. missing file) and result shape. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter (`path`) and the schema description coverage is 0%, meaning the schema provides no explanatory text. The description states that parsing is from disk and references `Path.read_text()`, which implies `path` is a filesystem path, but it does not explicitly define the parameter's meaning or format beyond that. With only one simple parameter, this is adequate but not maximal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Parse) and resource (decision markdown file), and describes exactly what the file is composed of (YAML frontmatter + body) and the output type (DecDocument). It is clearly distinguishable from siblings like parse_tsk or parse_gol by naming the dec document model.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explain when to use parse_dec versus alternatives like get_dec or list_dec; it only describes the parsing behavior. An agent could infer that this tool loads from disk, but there is no explicit guidance on when this is preferable to other dec-reading tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_featParse featureA

Parse a feature markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.feat.models.v1.FeatDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior5/5

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 precisely: parse failures on an existing file return a non-raising ValidateResult (valid=False, single errors[].message capped at 300 chars), whereas an absent/unreadable path still raises the OSError family (FileNotFoundError/PermissionError/OSError) from Path.read_text(). This is exactly the failure-mode disclosure 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, but the text is dense with ADR UUIDs, GitHub issue numbers, and a parenthetical provenance chain that adds little for an agent deciding whether to call it. Every clause carries some information, but the identifiers make it heavier than needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be re-explained, and the description correctly focuses on the exception/no-exception contract. It is nearly complete, missing only explicit guidance on how this differs from sibling parse_* and get_* tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter 'path' has 0% schema description coverage, so the description must compensate. It clarifies the path points to a markdown file read from disk via Path.read_text() and what happens if it is missing/unreadable, which gives useful meaning, but it never states expected format or path-relative details beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (parse) and resource (feature markdown file with YAML frontmatter + body, from disk into a FeatDocument). It's clear what it does, though it never contrasts itself with the sibling get_feat or the other parse_* tools, so sibling 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by 'from disk' – there is no explicit when-to-use, no statement of when to prefer parsing over get_feat, and no prerequisites. The agent must infer the scenario rather than being routed to it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_golParse goalA

Parse a goal markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.gol.models.v1.GolDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior5/5

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 does so thoroughly: a parse failure on an existing file yields a non-raising ValidateResult (valid=False, single 300-char error message) rather than exceptions, while an absent/unreadable path still raises OSError-family errors. This precisely tells the agent what to expect on success and every failure path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence, and the error-behavior detail genuinely earns its place. But the ADR UUIDs, feat-110, GitHub #204, and 'case 5 of the ADR ... workaround chain' references are implementation provenance that adds length without helping an agent select or call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is not needed, and the description still usefully explains the failure-shaped return. Combined with the exception taxonomy it is largely complete for correct invocation; only path-format expectations remain unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter (path) is documented only as 'string'. The description indirectly clarifies that path is a filesystem path read via Path.read_text(), which adds some meaning, but it does not state format, relative-vs-absolute expectations, or extensions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Parse) plus resource (a goal markdown file with YAML frontmatter + body) and names the exact output type (GolDocument). An agent can immediately distinguish it from the many sibling parse_* tools (parse_tsk, parse_prb, parse_req, etc.) purely by document type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: use it to read a goal file off disk into a structured object, as opposed to get_gol (in-memory/retrieval) or create_gol. However, no alternative is named and no explicit when/when-not condition is given, so the agent has to infer the file-path vs other-source distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_prbParse problem statementA

Parse a problem statement markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.prb.models.v1.PrbDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior4/5

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 this well: it discloses the non-raising ValidateResult contract on parse failure (valid=False, single 300-char errors[].message), names the specific exceptions avoided, and specifies that absent/unreadable paths still raise FileNotFoundError/PermissionError/OSError. It omits side-effect (read-only) confirmation and permission/auth needs, but this is unusually rich error-contract detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense but front-loaded sentence: purpose first, then failure behavior. Every clause carries information (result shape, exception families, ADR references), though the parenthetical IDs and issue numbers add bulk that could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values need not be explained, and the description thoroughly covers the non-obvious failure contract. The main gap is that it says nothing about when to choose this parser over sibling retrieval/validation tools, and the path argument's expected form is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description never names the path parameter explicitly, so it does not add format/syntax detail. However, by describing what happens for 'a truly-absent or unreadable path', it implicitly conveys that path must reference an existing, readable file on disk, which is some semantics beyond the bare string type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource ('Parse a problem statement markdown file ... from disk into a structured PrbDocument'), so the agent knows exactly what the tool does. It does not explicitly contrast with siblings like get_prb, create_prb, or validate, which keeps it from a 5, but the resource 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus get_prb, list_prb, or validate. The word 'parse' implies loading a file into a model, but no conditions, alternatives, or prerequisites are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_qaParse QA documentA

Parse a QA document markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.qa.models.v2.QaDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers strong failure-mode disclosure: parse failures return a non-raising ValidateResult (valid=False, single errors[].message capped at 300 chars) while missing/unreadable paths still raise FileNotFoundError/PermissionError/OSError. It does not state the read-only nature or side-effect profile, 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded well, but the remaining text is bloated with internal ADR/GitHub/feat references (ADR f14f125e..., issue #204, case 5 of the ... chain, feat-110) that consume space without helping an agent invoke the tool. Half the content could be trimmed without losing actionable meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is not required, and the description usefully covers the error contract anyway. For a one-parameter read/parse tool it is essentially complete, minus an explicit read-only/mutation statement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% on the single 'path' parameter, but the description supplies context ('markdown file ... from disk') that implies a filesystem path to a QA markdown file. It adds only marginal meaning, no format/allowed-value detail, so baseline 3 is fair.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Parse a QA document markdown file ... into a structured QaDocument.' The 'from disk' scoping and the target type clearly separate this from create_qa/get_qa/validate, though it never names a sibling directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (parse an on-disk markdown file) rather than stated as explicit when/when-not guidance. There is no instruction on when to prefer this over get_qa or validate, so the agent must infer the fit from the verb.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_reqParse requirementB

Parse a requirement markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.req.models.v1.ReqDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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 a parse failure yields a non-raising ValidateResult (valid=False, 300-char capped message) rather than an exception, while an absent/unreadable path still raises the OSError family. This is exactly the kind of error-contract detail an agent needs; only the read-only/no-side-effect nature is left implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, but the second sentence is an enormous run-on salted with internal traceability noise (ADR UUIDs, GitHub issue #204, 'case 5 of the ADR 519d1206 non-raising-structured-result workaround chain') that adds no value for an agent selecting or invoking the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, and the description thoroughly covers the success and failure semantics. The remaining gap is tool-selection context against get_req/validate, which is the only thing missing for a one-parameter parse tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single 'path' parameter is undocumented in the schema. The description adds meaning by implying the path targets a markdown file on disk and by specifying that unreadable paths raise file-access errors, but it omits path format constraints (relative/absolute, extension requirements).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (parse) and resource (requirement markdown file with YAML frontmatter + body) and names the exact output type (ReqDocument). It does not, however, differentiate itself from the many sibling retrieval tools such as get_req, list_req, or validate, so an agent must infer which one applies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never states when to use this tool versus get_req, create_req, or validate, nor any precondition for calling it. It describes error outcomes but gives no routing guidance, leaving the agent to guess from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_rskParse riskB

Parse a risk markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.rsk.models.v1.RskDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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 non-raising ValidateResult on parse failure (valid=False, error message capped at 300 chars) and that missing/unreadable paths still raise OSError-family errors. What it omits is that this is a read-only, side-effect-free operation, and 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavior is front-loaded in the first clause and the error-handling detail is genuinely useful, but ADR hashes, GitHub issue numbers, 'feat-110' and a fully-qualified class path are noise that inflates a one-sentence contract into a dense paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shapes need no explanation, yet the description usefully adds the non-standard non-raising failure contract that the schema alone would not reveal. The remaining gap is the path parameter's expected form, which neither schema nor description pins down.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% with a single parameter, so the description must compensate; 'from disk' plus the reference to Path.read_text() does convey that path is a filesystem path, not an ID or slug. However it does not state relative-vs-absolute expectations or the expected filename/extension, leaving the schema's bare 'path: string' only partially clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb (Parse) and resource (a risk markdown file, YAML frontmatter + body) and names the resulting type, RskDocument. It does not explicitly differentiate itself from the many sibling parsers (parse_tsk, parse_gol, etc.), but the resource binding is specific enough that an agent can distinguish risk-parsing from the other parse_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains failure semantics in depth but never states when to call this tool versus get_rsk, list_rsk or create_rsk, nor any prerequisite (e.g. file must already exist on disk). Usage must be inferred from 'from disk'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_sopParse Standard Operating ProcedureA

Parse a Standard Operating Procedure markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.sop.models.v1.SopDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and does so exceptionally: a parse failure on an existing file returns a non-raising ValidateResult (valid=False, errors[].message capped at 300 chars) rather than raising AssertionError/ValidationError/YAMLError, while an absent or unreadable path still raises the OSError family from Path.read_text(). This is exactly the raise-vs-return distinction an agent must know before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is correctly front-loaded, but the single run-on sentence is bloated with internal identifiers (feat-110, ADR f14f125e..., GitHub issue #204, case 5 of the ADR 519d1206 chain) that add no actionable value for an agent. The genuinely useful behavioral content is buried inside that noise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with an output schema, the description covers purpose, input source, return shape on both success and validation failure, and the raise boundary. 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single 'path' parameter, so the description must compensate. It does add meaning ('from disk', 'truly-absent or unreadable path', Path.read_text()), confirming path is a filesystem path to an existing file, but it gives no format details such as relative vs absolute or expected extension handling.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Parse), a precise resource (a Standard Operating Procedure markdown file with YAML frontmatter + body), and the source (from disk), plus the return type (SopDocument). The document-type qualifier cleanly separates it from the many parse_tsk/parse_gol/parse_req siblings 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the description makes clear this parses an on-disk file into a model, which differentiates it from get_sop/list_sop/create_sop in spirit, but it never explicitly says when to reach for parse_sop versus those siblings or state preconditions. An agent can infer the context 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.

parse_sysrsParse System Requirements SpecificationA

Parse a System Requirements Specification markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.sysrs.models.v1.SysrsDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

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: it specifies that a parse failure yields a non-raising ValidateResult (valid=False, single errors[].message capped at 300 chars) rather than AssertionError/ValidationError/YAMLError, while an absent/unreadable path still raises the OSError family. This is exactly the exception-vs-structured-result distinction 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence, but the remainder is over-stuffed with internal references (ADR UUIDs, feature/issue numbers, 'case 5 of the ... workaround chain') that add noise rather than selection value. The signal is good but diluted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure needn't be re-explained, and the description fully covers the failure-mode contract for a single-parameter parse tool. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single 'path' property has no description, so the description must compensate. It does: it establishes the path points to a markdown file read from disk via Path.read_text() and explains the behavioral split between an unparseable-but-present file and a missing/unreadable path.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb (parse) and resource (System Requirements Specification markdown file with YAML frontmatter + body) and names the concrete return type (SysrsDocument). This distinguishes it cleanly from sibling parsers like parse_tsk, parse_gol, and parse_req, and from the get_sysrs/list_sysrs readers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the description — you call it to turn on-disk SysRS markdown into a structured document — but it never explicitly contrasts with siblings such as get_sysrs or the generic validate tool, nor states when not to use it. The mention of validate is about message-length parity, not tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_tskParse task listA

Parse a task list markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.tsk.models.v1.TskDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior5/5

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: parse failures return a non-raising ValidateResult (valid=False, single errors[].message capped at 300 chars) while absent/unreadable paths still raise the OSError family. This exception-vs-return contract is exactly the behavior an agent must know before invoking, and it is stated explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is correctly front-loaded, but the second sentence is an overloaded run-on stuffed with internal references (feat-110, ADR UUIDs, GitHub issue #204, 'case 5 of the ADR ... workaround chain') that add provenance noise rather than agent-usable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and the description goes further by explaining the error-return semantics. For a single-parameter parser the definition is nearly complete, with the only real gap being guidance on when to prefer it over the sibling get/validate tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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: 'from disk' and the Path.read_text() reference establish that 'path' is a filesystem path to an existing file. It adds no detail on relative vs absolute paths or expected extension, leaving gaps the schema does not fill.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Parse a task list markdown file') plus input format (YAML frontmatter + body) and output type (TskDocument). An agent can distinguish it from the parallel parse_* family and from get_tsk/list_tsk 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.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description never says when to choose this over alternatives like get_tsk, validate, or list_tsk, nor any prerequisite for calling it. Usage is only implied by the purpose statement; there are no exclusions or routing hints despite a crowded sibling set of near-identical parse_* tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_ucParse use caseB

Parse a use-case markdown file (YAML frontmatter + body) from disk into a structured document. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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 a parseable-but-invalid existing file returns a non-raising ValidateResult (valid=False, errors[].message capped at 300 chars) while a missing/unreadable path still raises OSError-family exceptions. That exception contract is exactly the kind of behavioral detail an agent needs and cannot get from the schema. It stops short of stating read-only/side-effect and permission context beyond file access.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and the sentence count is low, but the second sentence is an over-stuffed run-on packed with ADR UUIDs, issue numbers, feat-110, and 'case 5 of the ADR ... workaround chain' provenance that does not help an agent select or invoke the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not required, and the description still documents the two distinct failure modes. With one required parameter and a clear read-from-disk purpose, the only real omission is when to prefer this over sibling parse/get/list tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single `path` parameter, so the description must compensate. It does add meaning by implying a filesystem path read via Path.read_text() ('from disk', 'Path.read_text()'), which rules out slug/ID interpretation, but it gives no format detail (absolute vs relative, extensions). Modest but real compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (parse), resource (use-case markdown file), source (from disk) and output (structured document), plus the expected file shape (YAML frontmatter + body). It implicitly separates itself from get_uc/list_uc/create_uc by being a disk-to-structure parser, but it never explicitly contrasts with the many parse_* siblings or names an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use / when-not-to-use guidance and no routing to alternatives such as get_uc, list_uc, or the generic validate tool. The only sibling mention ('the generic validate tool caps it') is about error formatting, not about choosing between tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

parse_vcrParse verification case recordA

Parse a verification case record markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.vcr.models.v1.VcrDocument. An existing file that fails to parse returns a non-raising ValidateResult (valid=False, a single errors[].message capped at 300 chars as the generic validate tool caps it, feat-110) instead of raising AssertionError/pydantic.ValidationError/yaml.YAMLError (ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain); a truly-absent or unreadable path still raises the OSError-family file-access error (FileNotFoundError/PermissionError/OSError) from Path.read_text().

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly: it discloses that a malformed existing file yields a non-raising ValidateResult (valid=False, message capped at 300 chars) while an absent/unreadable path still raises OSError-family errors. This is exactly the failure-mode context an agent needs and is not derivable 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, which is good, but the body is a dense run-on sentence packed with internal identifiers (ADR UUIDs, GitHub issue #204, feat-110) that add little for an agent selecting or invoking the tool. The error-semantics content earns its place; the ADR/issue citations do not.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description still covers the behavioral contract (non-raising result vs raised exceptions) that structured fields omit. For a one-parameter parse tool with no annotations, this is complete enough 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single required parameter with 0% schema coverage, so the description must compensate. It does add meaning: 'from disk' and the explicit discussion of what a 'truly-absent or unreadable path' triggers tells the agent how the path argument behaves on failure. It never states the expected path format (relative vs absolute), keeping it just short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Parse), a concrete resource (a verification case record markdown file with YAML frontmatter + body), and the return type (a VcrDocument), and clarifies it reads 'from disk'. This distinguishes it from siblings like get_vcr (retrieval) and parse_tsk/parse_gol (other document types) 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the 'from disk' phrasing and the parse_* sibling pattern, but the description never states when to prefer parse_vcr over get_vcr, list_vcr, or validate. No explicit exclusions or prerequisites for callers are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plantuml_encodeEncode text to the PlantUML classic URL encodingA

Encode PlantUML (or any) text to the PlantUML classic URL encoding (custom-base64 0-9A-Za-z-_ over the raw-deflate stream of the text's UTF-8 bytes, no prefix -- the SoWkI... form, rulebook §5.1). Returns the encoding itself, i.e. the {enc} payload of GET {base}/svg/{enc} -- the tool takes no base URL, so prepend the configured server base (SPECMGR_PLANTUML_URL for the url source) to build the renderable URL. Fully offline: no source, subprocess, or network is involved. Decode it back with the library's decode_puml (round-trip lossless).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior5/5

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 specifies the exact encoding algorithm, that it returns the {enc} payload itself with no base URL, that no source/subprocess/network is involved ('fully offline'), and that round-trips with decode_puml are lossless. This is rich behavioral context beyond a simple 'encode text' claim.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and structured into useful clauses, but it is dense and includes parenthetical algorithm details and rulebook references that could be trimmed for a simple encode tool. It earns most of its length through actionable information, yet the density slightly harms readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the presence of an output schema (so return values need not be explained), and the absence of annotations, the description is complete: it covers what the tool does, how to use the output, offline behavior, and round-trip decoding. No critical information for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage for the single 'text' parameter. The description says 'Encode PlantUML (or any) text' and references 'the text's UTF-8 bytes', which confirms the input is text interpreted as UTF-8, but it does not explicitly define the parameter's expected content beyond that. The description adds marginal meaning but does not fully compensate for the schema's silence.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Encode PlantUML (or any) text to the PlantUML classic URL encoding'), and the parenthetical algorithm detail distinguishes it from any sibling that might also manipulate PlantUML. An agent can immediately tell this is a pure encoding utility, not a validator or example fetcher.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the context for using the output: 'prepend the configured server base ... to build the renderable URL', and mentions decoding via decode_puml for round-trips. However, it does not explicitly compare against alternatives like validate_plantuml or say when not to use it, leaving usage slightly inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_classificationSet document classificationA

Replace the free-text classification frontmatter field of an existing document across the whole-body domains (type is one of req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs; adr is not supported), also bumping updated and leaving the body and every other frontmatter field untouched. classification is fully free-text -- no closed vocabulary; a blank or whitespace-only value clears it back to None/absent. No create_* tool accepts a classification argument at all -- this is the sole classification-change entry point. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising the domain's not-found error (a truly-absent id still raises) -- its error text is byte-identical to the domain's list_<d> failed row's error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c; ADR b8c9bfea-6dcf-4158-bfc5-4ec17abb842f, GitHub issue #170 -- case 4 of the ADR 519d1206 non-raising-structured-result workaround chain). An invalid id (path-injection attempt or wrong format for type) or an unknown type is a ValueError raised before any file access; type="adr" passes the id validation (a well-formed UUID id) and raises the plain KeyError inherited from the dispatch-table lookup instead. Returns the updated frontmatter only (no body) on success; use the corresponding get_<d> tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes
classificationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

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: `updated` is bumped while the body and all other frontmatter are untouched, blank/whitespace clears to None, parse failures return a ParseFailureResult instead of raising while a truly-absent id raises, and ID/type validation errors surface as ValueError (or a KeyError for type='adr'). This is exactly the behavioral disclosure a mutation 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core behavioral facts are front-loaded and useful, but the middle sprawls with ADR UUIDs, GitHub issue numbers, and a workaround-chain aside that add little for an agent trying to call the tool. Sentences are long and nested rather than scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists (so return-value shape need not be explained), and the description still covers success return ('updated frontmatter only, no body'), failure modes, and side effects. 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.

Parameters4/5

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 `classification` as fully free-text with blank-valued clearing semantics, lists the supported `type` domains and the unsupported 'adr', and characterizes `id` validation (path-injection or wrong format raises). Only the concrete id format is left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (replace) and resource (the free-text `classification` frontmatter field of an existing document), scoped to the whole-body domains. The agent can distinguish it from update_frontmatter and set_status, which are the nearest siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly claims to be 'the sole classification-change entry point' since no create_* tool accepts a classification argument, and routes the agent to get_<d> to fetch the full document afterward. It stops short of contrasting with update_frontmatter, which one might otherwise reach for to edit frontmatter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_feat_idRename feature idA

Rename an existing feature's id: validates new_id's feat-NNN-slug shape, refuses if new_id's folder already exists, renames // to /<new_id>/, rewrites the README frontmatter id to new_id, bumps updated, and leaves the body byte-identical. Does not update or search for references to the old id in any other document. Returns the renamed document's frontmatter only (no body); use the corresponding get_feat tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
new_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
typeNo
statusNo
createdNo
updatedNo
versionNo
classificationNo

TDQS

A4.7/5.0
Behavior5/5

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 validation of new_id, the refusal condition (folder already exists), the exact mutations (folder rename, frontmatter id rewrite, updated bump), what stays byte-identical (body), and what is deliberately omitted (reference updates). This is unusually complete behavioral disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action, then sequences side effects and caveats in a single dense but scannable passage; every clause conveys a distinct behavior (validation, refusal, rename, rewrite, bump, immutability, return scope) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description adds the useful note that only frontmatter is returned and points to get_feat for the full document. Combined with the mutation and refusal semantics, 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.

Parameters4/5

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 that `id` is the existing id and that `new_id` must match the feat-NNN-slug shape, adding real semantic constraint beyond the bare schema. It doesn't describe length limits or exact slug character rules, so not a full 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Rename an existing feature's id') and enumerates the exact operations performed (validate, refuse, rename folder, rewrite frontmatter). It is clearly distinguishable from siblings like create_feat, get_feat, and edit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the precondition for new_id (feat-NNN-slug shape) and that references elsewhere are NOT updated or searched, which steers the agent away from assuming repo-wide consistency. It names get_feat as the follow-up to fetch the body, though it doesn't name an alternative tool for updating references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_statusSet document statusA

Replace the status of an existing document across every domain (type is one of adr, req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs), also bumping updated (the whole-body domains) and leaving the body untouched. When status (or, for type="adr" with superseded_by given, the composed "superseded by X" value) already equals the document's current status, this is a no-op -- no write, no updated bump -- and still returns the same value shape a changed-status call would (issue #109). The new status must be one of the domain's own closed vocabulary values (see the domain's XFrontmatter.status field); an out-of-vocabulary status does NOT raise -- it returns a structured, non-raising InvalidStatusResult ({valid: false, type, status, allowed_values, message}) instead, so the allowed-values detail survives MCP clients that truncate error content. superseded_by is accepted only for type="adr" -- it composes the status as "superseded by {superseded_by}"; with any other type it is a ValueError. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising the domain's not-found error (a truly-absent id still raises, and the out-of-vocabulary-status InvalidStatusResult check above still runs first, pre-lock/pre-load) -- its error text is byte-identical to the domain's list_<d> failed row's error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c; ADR b8c9bfea-6dcf-4158-bfc5-4ec17abb842f, GitHub issue #170 -- case 4 of the ADR 519d1206 non-raising-structured-result workaround chain). Neither create_* nor the generic update tool accepts a status argument at all -- this is the sole status-change entry point. An invalid id (path-injection attempt or wrong format for type) is a ValueError raised before any file access. Returns the updated frontmatter only (no body, except for the unchanged adr branch) on success; use the corresponding get_<d> tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes
statusYes
superseded_byNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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: no-op semantics when status is unchanged, the `updated` bump behavior, non-raising `InvalidStatusResult` for out-of-vocabulary status, `ValueError` for a bad `id` before any file access, `ParseFailureResult` for unparseable documents, and exactly what is returned (frontmatter only). This is far beyond what a structured field 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, but the body is one very dense paragraph packed with parentheticals, ADR UUIDs, GitHub issue numbers, and byte-identity guarantees that an agent does not need to invoke the tool. Every core fact earns its place, but the reference-bookkeeping clutter and lack of paragraphing hurt readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with zero annotation coverage and 0% schema description coverage, the description supplies everything needed: preconditions, failure modes, no-op semantics, and return shape (with an output schema also present). 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, yet all four parameters are given meaning: `id` (invalid format or path injection raises `ValueError`), `type` (the 13 domain enum, mirroring the schema), `status` (must be the domain's own closed vocabulary, out-of-vocab does not raise), and `superseded_by` (accepted only for `adr`, composes 'superseded by X'). The description fully compensates for the absent schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource ('Replace the status of an existing document across every domain') and enumerates the domains via `type`. It explicitly distinguishes itself from siblings by stating that neither `create_*` nor `update` accepts a `status` argument, so an agent can identify this as the sole status-change entry point without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the exclusive role ('this is the sole status-change entry point') and names the alternatives that cannot do this job (`create_*`, generic `update`), plus the correct follow-up tool (`get_<d>`) for retrieving the full document. It also scopes `superseded_by` to `type="adr"` only, so the conditions for correct invocation are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

updateUpdate documentA

Whole-body or line-range replace of an existing document's content across the whole-body domains (type is one of req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs), preserving its id/type/status/created/version; only updated changes. With no offset/limit, content is the full replacement body (body markdown only, no frontmatter block). With offset, content replaces the body line(s) starting at 1-based line offset of the current on-disk body: limit is the number of lines to replace (offset..offset+limit-1; limit omitted = through the last body line, limit=0 = pure insert), and offset=N+1 (one past the last body line) appends after it; the spliced result is validated as a whole document before anything is written. offset/limit address the frontmatter-stripped body, never the raw on-disk .md file: the YAML frontmatter block is variable-length, so a raw file read's line numbers are never the same as body-line coordinates -- the only safe source of coordinates is a get_<d>(id, raw=True) read, never a raw file read minus an assumed constant. A get_<d>(raw=True, numbered=True) read's numbered output must never be fed back verbatim into content -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str). status is never settable -- use the generic set_status tool. A document that exists but fails to parse returns a ParseFailureResult (error/path/id) instead of raising the domain's not-found error -- its error text is byte-identical to the domain's list_<d> failed row's error for the same file (identical field path and cause, including the trailing pydantic documentation line; ADR 9080b37c-82b3-4f63-81f1-79641d0bf14c) -- and a truly-absent id still raises the domain's not-found error. A content-validation failure on the submitted new content (or, in range mode, on the spliced result) returns a non-raising ValidateResult (valid=False, errors=[{message}]) with the message capped at 300 chars as the generic validate tool caps it, instead of raising AssertionError/pydantic.ValidationError (ADR b8c9bfea-6dcf-4158-bfc5-4ec17abb842f, GitHub issue #170 -- case 4 of the ADR 519d1206 non-raising-structured-result workaround chain). An invalid id (path-injection attempt or wrong format for type) or misused range coordinates (limit without offset) is a ValueError raised before any file access. Returns an UpdateResult: frontmatter, the updated frontmatter (no body) of the dispatched domain, plus snippet -- in range mode, the before/after window of the touched range (dropped lines numbered pre-splice, inserted lines numbered post-splice, up to 2 unchanged context lines per side, each line <marker> <n>: <line text>); snippet is None in whole-body mode and for the whole-body-equivalent range (offset=1 with limit omitted). Use the corresponding get_<d> tool to fetch the full document afterward.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYes
limitNo
offsetNo
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and delivers: id/type/status/created/version are preserved and only `updated` changes; the spliced result is validated before any write; parse failures return a non-raising `ParseFailureResult`; validation failures return a non-raising `ValidateResult`; and invalid ids/coordinates raise `ValueError` before file access. This is rich, specific disclosure well beyond what 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core replace semantics, but the remainder is a dense wall of em-dash-heavy clauses, repeated warnings about numbered output, and multiple ADR/issue citations that add length without much actionable value for an agent. The information is largely necessary, yet structure could be tightened considerably.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a 5-parameter mutation tool spanning 12 domains with 0% schema coverage and no annotations, the description covers modes, coordinate semantics, error/result shapes, and the follow-up read. Despite the output schema existing, it still explains `UpdateResult` fields (`frontmatter`, `snippet` and its `None` cases), leaving no major gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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: `offset` is 1-based over the frontmatter-stripped body, `limit` is the line count (`limit=0` is a pure insert, omitted means through the last line), and `offset=N+1` appends. It also warns that coordinates come only from a `get_<d>(raw=True)` read. 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and scope: 'Whole-body or line-range replace of an existing document's content across the whole-body domains', and enumerates the `type` domain values. An agent can distinguish this from `edit` (old_str replacement) and `update_section` without opening another schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear mode-selection guidance (omit `offset`/`limit` for full-body replace vs. use `offset` for range), routes `status` changes to `set_status`, and tells the agent to re-fetch with `get_<d>` afterward. It implicitly steers away from `edit` by warning that numbered output is never valid `old_str`, but does not explicitly name `edit` as the alternative to choose instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_frontmatterUpdate ADR FrontmatterB

Whole-object replace of an ADR's frontmatter (plan §3), preserving its existing id.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
frontmatterYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
bodyYes
frontmatterYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden; it does convey that this is a destructive full replacement and that the existing id survives, which usefully resolves the schema's "omit a key to drop it" ambiguity for the id key. It says nothing about validation, error behavior, required permissions, or side effects on the file.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no padding — the replace semantics come first, which is the most important fact. The parenthetical "(plan §3)" is internal-doc noise an agent cannot act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the nested frontmatter schema covers field-level detail. What is missing is anything about the required top-level `id`, failure modes, or how this differs from the other ADR mutation tools, leaving meaningful gaps for a destructive operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema description coverage is 0% and the description adds almost no parameter meaning beyond the note that the id is preserved. The nested AdrFrontmatter $defs happens to document its fields richly, but the tool description itself does not explain the required top-level `id` (resolution key) or the replacement semantics of the `frontmatter` object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Whole-object replace of an ADR's frontmatter") and even pins the update contract, so it is distinguishable from a partial editor. It does not, however, distinguish itself from siblings like `update`, `update_section`, `set_status`, or `set_classification`, which all also mutate an ADR.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "whole-object replace" implicitly warns against using this for partial edits, but there is no explicit when-to-use, when-not, prerequisite, or named alternative among the many sibling mutation tools. An agent must infer the choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_sectionUpdate ADR SectionD

Whole-section replace/delete of one AdrBody field (plan §4).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
keyYes
valueYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
bodyYes
frontmatterYes

TDQS

D1.8/5.0
Behavior2/5

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 hints at destructive semantics ('replace/delete') and whole-field granularity, but omits required permissions, irreversibility, interaction with frontmatter, and failure modes 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence with no padding, so it is concise, but it is under-specified rather than front-loaded with actionable information. The '(plan §4)' citation is wasted words for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool takes three required params at 0% coverage, mutates content destructively ('replace/delete'), has no annotations, and has a rich sibling set to be distinguished from. An output schema exists, so return values need not be described, but the description still falls well short of enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain what 'id', 'key', or 'value' mean. 'key' clearly designates an AdrBody field, and 'value' its content, yet neither is defined; the undocumented 3-param contract leaves the agent guessing about valid keys or value format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description restates the name ('update' = replace/delete) and adds only 'of one AdrBody field' as scope. It does not clearly distinguish this tool from siblings like 'update', 'edit', or 'update_frontmatter', and the odd reference '(plan §4)' provides no agent-usable meaning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

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 guidance is present. With siblings such as update, edit, and update_frontmatter, the agent has no basis to select this tool over them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validateValidate document contentA

Disk-free, id-free dry run validating document content across the whole-body domains (type is one of req, uc, tsk, qa, prb, gol, rsk, dec, sop, feat, vcr, sysrs; adr is not supported -- use validate_adr instead). full=False (default) validates body-only content (no frontmatter); full=True validates a complete document (frontmatter + body). Never raises for a content-validation failure: always returns {valid: bool, errors: list[{message: str}]} -- errors is empty when valid is True, and each message is truncated to at most _MAX_VALIDATE_ERROR_CHARS (300) characters (plus an "... (truncated)" suffix when truncation occurred) rather than returned verbatim without limit. A full/content-shape mismatch, or an unsupported type, is a caller-usage error and still raises ValueError before any validation runs. This is the sole validate entry point for these domains -- the former per-domain validate_<d> tools are removed; validate_adr remains a separate, unchanged, id-based tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNo
typeYes
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes
errorsYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full behavioral burden and does so well: it discloses that content-validation failures never raise, the exact return shape ({valid, errors}), that errors is empty on success, and the 300-char truncation with suffix. It also states precisely when ValueError IS raised (full/content-shape mismatch or unsupported type) before validation runs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and alternative routing, then detail. It is dense and a few parentheticals (the truncation mechanics, the _MAX_VALIDATE_ERROR_CHARS reference) run long, but nearly every clause carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values need not be spelled out, yet the description still clarifies them. Combined with the error/exception boundary and domain coverage, an agent has everything required to call it correctly without opening other tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 `full` (default body-only vs complete document) and `type` (enumerates domain semantics and the adr exclusion). `content` is left implicitly understood as the document text, which is the only minor gap in an otherwise strong compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('dry run validating document content'), names the supported domains, and explicitly distinguishes itself from both the removed per-domain tools and the still-separate validate_adr. An agent can immediately tell this is the single entry point for body-content validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: adr is unsupported here and directs to validate_adr, and it explains the full=False body-only vs full=True frontmatter+body choice. The 'sole validate entry point for these domains' note removes any ambiguity about redundancy with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_adrValidate ADRB

Re-read and re-parse an ADR by id, letting the models' own Pydantic validators run.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It usefully discloses the mechanism (re-reads from disk, runs Pydantic validators), which is behavior beyond the schema, but it does not state whether anything is mutated, what happens on validation failure, or whether the ADR file is touched.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the action and mechanism front-loaded; nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. However, for a validation tool with no annotations and no usage context, the description leaves the agent unclear about when to prefer it over get_adr/parse_adr, leaving a clear gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single 'id' parameter, and the description only says 'by id', adding minimal meaning (it is the ADR identifier). With one required param and a thin description, the schema plus this phrase is barely adequate but not compensatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (re-read/re-parse) plus resource (ADR by id) and adds the mechanism (Pydantic validators run). This distinguishes it from the plain get_adr sibling, though the word 'validate' in the name is only implicitly matched by the description's 'validators run' phrasing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to call this versus get_adr or parse_adr, nor any precondition such as when an ADR might be stale or need re-validation. The agent must infer the use case entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_plantumlValidate PlantUML diagram textA

Validate PlantUML diagram text through the strict validation chain (the frozen rulebook specmgr://uc/plantuml §3): the structure check always runs first (on a structure red the parser is never called -- no subprocess, no network), then the single configured source (the first set of SPECMGR_PLANTUML_JAR/SPECMGR_PLANTUML_BIN/SPECMGR_PLANTUML_URL; no fall-through -- a set-but-unavailable source is a hard failure with reason + fix hint), and the all-unset state degrades to the structure-only floor. A PlantUML server crash page (200 + the embedded Java-exception trace -- the recognised 1.2026.8 crash line of the rulebook §5.2 matrix, the known self-message/note-left shape bug) is a recognised INVALID row: valid=false with the line-0 crash finding carrying the exception class and a fix hint pointing at the rulebook §2.9 anchored notes. Content-based: pass the diagram text (a CLI reads the file and passes its text). Never raises for validation content -- returns the non-raising §3.6 result model: structure_ok, valid/rendered (None = not run, never run-and-failed), checked_by (jar/bin/url/structure), errors and warnings (1-based line + message + fix hint), source_state (ok/misconfigured/unavailable/inconclusive/none), available, reason, fix_hint.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes
errorsYes
reasonNo
fix_hintNo
renderedYes
warningsYes
availableNo
checked_byYes
source_stateNo
structure_okYes

TDQS

A4/5.0
Behavior5/5

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 richly: it discloses the always-first structure check with no subprocess/network on a structure red, the single configured source with no fall-through, the all-unset structure-only floor, the recognised crash-page handling, and the 'never raises' contract. This is exactly the behavioral context an agent needs 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and ordering constraint are front-loaded, which is good, but the bulk is a single dense run-on sentence overloaded with parentheticals and semicolons. The long enumeration of the return model is also largely redundant given an output schema exists, so several clauses do not earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool whose output schema already documents the result model, the description still covers the full validation flow, all source states, and failure modes, leaving no ambiguity about what the call does or how it behaves. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the single 'text' parameter, so the description must compensate, and it does by specifying that the input is the diagram text itself (content-based), not a file path. That resolves the main ambiguity around the one parameter, though it stops short of format or length guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (validate) and resource (PlantUML diagram text) and precisely delineates the validation chain it runs. It does not, however, explicitly distinguish itself from the sibling tools 'validate' and 'validate_adr', so an agent must infer the boundary from the resource name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Content-based: pass the diagram text (a CLI reads the file and passes its text)' clause gives a concrete invocation cue, and the chain description implies when full strict validation is needed. But there is no explicit when-to-use vs. when-not, nor any routing to sibling validators, so guidance remains 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 103 tool updatesv0.36.0
    • First observedcreate_adr
    • First observedcreate_dec
    • First observedcreate_feat
    • First observedcreate_gol
    • First observedcreate_prb
    • First observedcreate_qa
    • First observedcreate_req
    • First observedcreate_rsk
    • First observedcreate_sop
    • First observedcreate_sysrs
    • First observedcreate_tsk
    • First observedcreate_uc
    • First observedcreate_vcr
    • First observeddelete
    • First observededit
    • First observedfind_related
    • First observedfind_similar_text
    • First observedget_adr
    • First observedget_dec
    • First observedget_dec_example
    • First observedget_dec_template
    • First observedget_feat
    • First observedget_feat_example
    • First observedget_feat_template
    • First observedget_gol
    • First observedget_gol_example
    • First observedget_gol_template
    • First observedget_prb
    • First observedget_prb_example
    • First observedget_prb_template
    • First observedget_qa
    • First observedget_qa_example
    • First observedget_qa_template
    • First observedget_reference_diagram
    • First observedget_reference_diagram_all
    • First observedget_req
    • First observedget_req_example
    • First observedget_req_template
    • First observedget_rsk
    • First observedget_rsk_example
    • First observedget_rsk_template
    • First observedget_sop
    • First observedget_sop_example
    • First observedget_sop_template
    • First observedget_sysrs
    • First observedget_sysrs_example
    • First observedget_sysrs_template
    • First observedget_tsk
    • First observedget_tsk_example
    • First observedget_tsk_template
    • First observedget_uc
    • First observedget_uc_diagram
    • First observedget_uc_example
    • First observedget_uc_plantuml_example
    • First observedget_uc_plantuml_template
    • First observedget_uc_sequence_skeleton
    • First observedget_uc_template
    • First observedget_use_case_package_diagram
    • First observedget_vcr
    • First observedget_vcr_example
    • First observedget_vcr_template
    • First observedlist_adr
    • First observedlist_dec
    • First observedlist_feat
    • First observedlist_gol
    • First observedlist_prb
    • First observedlist_qa
    • First observedlist_references
    • First observedlist_req
    • First observedlist_rsk
    • First observedlist_sop
    • First observedlist_sysrs
    • First observedlist_tsk
    • First observedlist_uc
    • First observedlist_vcr
    • First observedmdformat
    • First observedoption_create
    • First observedoption_delete
    • First observedoption_list
    • First observedoption_read
    • First observedoption_update
    • First observedparse_dec
    • First observedparse_feat
    • First observedparse_gol
    • First observedparse_prb
    • First observedparse_qa
    • First observedparse_req
    • First observedparse_rsk
    • First observedparse_sop
    • First observedparse_sysrs
    • First observedparse_tsk
    • First observedparse_uc
    • First observedparse_vcr
    • First observedplantuml_encode
    • First observedset_classification
    • First observedset_feat_id
    • First observedset_status
    • First observedupdate
    • First observedupdate_frontmatter
    • First observedupdate_section
    • First observedvalidate
    • First observedvalidate_adr
    • First observedvalidate_plantuml

TDQS

B3.2/5.0

Scored across 103 tools

Disambiguation4/5

Tools follow a clear per-domain verb pattern (create_X/get_X/list_X) plus distinct cross-cutting verbs (update, edit, delete, validate, set_status), so purposes are mostly separable. The main friction is that get_X and parse_X overlap heavily (both read-and-parse a document from disk), and the sheer number of near-identical per-domain variants raises misselection risk.

Naming Consistency4/5

The dominant convention is consistent snake_case verb_noun (create_feat, get_feat, list_feat, find_related, validate_plantuml). Minor deviations exist in the ADR option verbs (option_create/option_read/option_update, noun-first) and the diagram readers (get_uc_diagram, get_use_case_package_diagram), but overall the pattern is predictable.

Tool Count1/5

103 tools is an extreme mismatch for a spec-management server. The count balloons because each of ~13 document domains gets its own near-identical set of create/get/list/parse/template/example tools, so the surface is a large, repetitive matrix rather than a well-scoped set.

Completeness4/5

Coverage is broad and deep: create/read/list/update/edit/delete/set_status/validate exist for nearly all whole-body domains, plus examples, templates, reference graphs, similarity search, and PlantUML tooling. Only minor gaps appear, e.g. delete/validate explicitly exclude ADR and rely on separate ADR-specific tools.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for managing an OKF markdown knowledge base, enabling AI agents to query, read, write, and auto-sync architectural decisions and rules via Git.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    This MCP server enables AI agents to manage artifacts across sessions by providing tools for searching, retrieving, and registering entries in a persistent ledger, ensuring consistency and traceability of agent outputs.
    MIT