biz.dfch.SpecMgr
Provides a tool to fetch content from Confluence instances using bearer-token authentication, with requests filtered to a configured base URL.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@biz.dfch.SpecMgrlist all architecture decision records"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
biz.dfch.SpecMgr
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 |
SOP — Standard Operating Procedure | Step-by-step operational procedure with RASCI responsibility assignment and approval lifecycle |
FEAT — Feature | Development work-unit plan/progress tracking ( |
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. |
TXT — Free-Form Text | Generic, minimally structured catch-all for unstructured markdown that does not warrant a dedicated domain (ad hoc notes, meeting minutes, review/audit write-ups, scratch analysis); free body (any markdown, incl. H2..H6) plus a mandatory newest-first |
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, and TXT is the free-form catch-all that likewise sits outside it (any markdown that does not warrant a dedicated artifact type).
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-specmgrWith 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
specmgr lint [paths]... [--type T [--dir D]] [--all] [--skip-unrecognized] # in-tree spec artifact parseability gate: full model-level parse of the paths (type inferred from the layout, --type overrides) or a --type/--all sweep (exit 0 parsed / 1 parse failure or missing mcp extra / 2 usage-or-resolution)specmgr lint requires the mcp extra, like specmgr diagram (the
decoupling is tracked as issue #238).
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… encodingValidation 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 15-entry palette),
nodes grouped into per-domain curly component "TYPE" { … } domain groups,
one label-free edge per unique reference ({src} --> {dst}), every edge
that lies on a cycle (self-loops and same-SCC ≥ 2) drawn with a red
label-free -[#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 14 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 theSPECMGR_ADR_DIRenvironment 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_DIRenvironment variable (defaultdocs), with each type's own subdirectory appended automatically (e.g.docs/reqfor requirements).Features (FEAT): base directory defaults to
.specmgr/feat, configurable via theSPECMGR_FEAT_DIRenvironment variable. This is FEAT-specific, like ADRs above, and not shared viaSPECMGR_DOCS_DIR.PlantUML validation source (UC diagrams):
SPECMGR_PLANTUML_JAR(a plantuml.jar path),SPECMGR_PLANTUML_BIN(an executable speaking the PlantUML CLI contract), andSPECMGR_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, default40) — the maximum length of a resolved node's H1 label in theget_reference_diagram/get_reference_diagram_allPlantUML diagrams (word-boundary cut +…; the diagram title itself is never truncated). A set-but-invalid value (empty, non-int, or < 1) falls back to40. Its set/valid/default/resolved status is reported by thediagramsection of thespecmgr://configresource (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.
Semantic Similarity Search
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 mcpBy 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 8000Or 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 8000Option | Env var | Default | Description |
|
|
| Transport mode: |
|
|
| Bind address (SSE/streamable-http mode only) |
|
|
| TCP port (SSE/streamable-http mode only) |
Add to OpenCode
To add the specmgr MCP server to your OpenCode configuration:
Open your OpenCode config file (typically
~/.config/opencode/opencode.jsonor~/.config/opencode/opencode.jsonc)Add a configuration to the
mcpsection (and use it viastdio).A bare
uvx --from biz-dfch-specmgr[mcp] specmgr mcpcommand with no--directoryand noSPECMGR_*_DIRenv 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 globaluv/uvxflag, 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--fromvalue 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--fromvalue 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://configresource, 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 resolvesbiz-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 ownpyproject.toml, lockfile, and source tree directly, including unreleased/dev-branch commits — useuv run --directory <path-to-your-checkout>(no--from, notuvx):"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
--extraflags (or--all-extrasfor everything) control which optional dependencies get synced into that local run, independent of what's published on PyPI — drop--extra similarityif you don't need Semantic Similarity Search.Save the file and restart OpenCode
Installing the specmgr Harness Files
Beyond the MCP server itself, this repo ships its agent harness files —
every markdown file under .opencode/{agent,command,skill}/ (the
subagents, slash commands, and skills the commands above drive) — as a
single packaged bundle: the specmgr://harness-bundle MCP resource
(application/json), an instructions field carrying the complete
install protocol plus a files array with each file's path (relative
to .opencode/), sha256, and verbatim content. The bundle is
generated from the repo's own tree by the specmgr harness-bundle CLI
command and drift-guarded by a pre-commit hook and a CI check, so the
published bundle always matches the released .opencode/ files
exactly. The Add to OpenCode section above covers
the MCP server setup the harness files pair with — it is not repeated
here.
Agent-driven install (recommended). Ask your agent to install the
specmgr harness files: it reads specmgr://harness-bundle (discoverable
via the MCP host's resource listing) and follows the bundle's
instructions field — picking its harness config root via the harness's
own configuration skill (OpenCode: customize-opencode), writing every
file byte-exact (skipping sha256-identical ones, asking you via the
question tool before overwriting a differing one), re-verifying every
write, and reporting installed/skipped/updated/failed per file. The
install never reads, writes, or merges opencode.json.
What gets installed. Every .opencode/agent/*.md subagent,
.opencode/command/*.md slash command, and .opencode/skill/*/SKILL.md
skill of the published package — the bundle is all-inclusive on purpose,
since the commands' dependency closure (e.g. /implement-feature
driving phase-orchestrator → phase-implementer) needs the existing
agents too.
Manual / Claude Code path. Claude Code's structurally similar
.claude/agents/*.md and .claude/commands/*.md conventions (one
markdown file per agent/command, YAML frontmatter plus prose body) make
the bundle's files hand-portable: copy each file's frontmatter and body
into the matching .claude/ file, translating the permission model. The
two models do not map one-to-one — OpenCode carries per-pattern
bash/edit/read permission rules (last matching rule wins), while
Claude Code's frontmatter takes a coarse tool allow-list (tools:) — so
a hand-ported file is a simplified equivalent, not an automatic
translation:
# .claude/agents/ref-finder.md -- hand-ported from the bundle's
# agent/ref-finder.md: the description and the prose body are unchanged,
# and the OpenCode per-pattern permission rules (read/glob/grep/list
# allowed, edit/write/task/bash denied) collapse to a coarse read-only
# tool allow-list.
---
name: ref-finder
description: >-
Lists and resolves the artifacts a single specmgr document references --
its `<TYPE> <id>` cross-reference lines -- by calling the `list_references`
MCP tool and reporting each referenced artifact's `type`/`id`/`title`/`path`,
flagging any that could not be resolved on disk. Read-only -- never edits,
writes, or commits.
tools: Read, Grep, Glob, mcp__specmgr__list_references
---
<the file's prose body, unchanged>OpenCode's skills (.opencode/skill/*/SKILL.md) have no Claude Code
counterpart with the same self-triggering semantics; keep them as plain
reference documents if you need their content.
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/skill/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.
Multi-Language Artifacts
The same artifact can exist in several languages. English is the default
and keeps its location (docs/<type>/); every other language is a
docs/<type>/<language>/ subfolder (<language> is a lowercase
two-letter code such as de) that holds the variant under the exact
same file name as its English source, with the same id and the
identical frontmatter and body structure. The language lives in the
file's location only — there is no language frontmatter field. It
applies to the twelve domains req, uc, tsk, qa, prb, gol,
rsk, dec, sop, vcr, sysrs and txt.
feat and adr are always English, permanently: no feat or adr
tool, resource or prompt takes a language, and the generic tools reject a
non-default language for those two types (language="en", the default,
is accepted and behaves as before).
Reading and writing.
get_<d>,list_<d>andcreate_<d>, and the genericupdate,edit,set_status,set_classificationanddeletetools take an optionallanguage(default"en"; leaving it out behaves exactly as before).list_<d>(language="de")lists only the German variants. A variant is created from an existing English document:create_<d>(content, language="de", id=<id of the EN source>).validatestays English-only.Headings. A translated heading is mapped back to its canonical English heading through a per-language table, so a variant is checked against the exact same schema as the English document. The file keeps its translation. Closed-vocabulary values (
status,classification, RSKStrategy/Probability/Impact, VCRCoverageandAC-NNN (Method),Option N:/Step N:tokens,[ ]/[x], cross-reference tags, SOP lifecycle values) are never translated, and neither is the PRBproblem_statementsentence.Translating. The MCP prompt
translate_artifact(type,id,language, optionalsource_language) drives the translation; the resourcesspecmgr://i18nandspecmgr://i18n/headings/{language}document the rules and return a language's heading table. In opencode: thetranslate-artifactskill and/translate <type> <id> <language> [source_language]. No tool translates by itself — the model does the translating around the deterministic tools.Status and drift.
list_languages(type, id)reports the languages an artifact exists in.check_translation_drift(type, id, language)reports structural drift (missing, extra or reordered sections) and staleness (the English source is newer than the translation). In opencode: thetranslation-statusskill and/translation-status <type> <id> [language].English-only search and references.
find_related,find_similar_text,list_referencesandget_reference_diagram(_all)never see a language variant: a hit or a resolved reference is always the English document.Adding a language. Add one file,
src/biz/dfch/specmgr/general/data/headings/<language>.json— a flat JSON object{"<translated heading>": "<canonical English heading>"}that covers exactly the fixed-text headings of the document models, with distinct values. No code change is needed. The drift testtests/general/models/test_heading_table_drift.pychecks every shipped table and names each missing or surplus heading. Without a table file a language code is rejected when a document of that language is read or written.Titles and headings. Only the section headings (levels 2-6) are mapped through the table. The document title (the level-1
#line) is free text in every language and is never looked up or rewritten, even when it equals a table entry (a German titleQuellestaysQuelle).
Development
Install dev dependencies
uv sync --all-extrasInstall pre-commit hooks (one-time)
uv run --frozen pre-commit installuv 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
mcpextra installed (see Installation), so.venv/bin/specmgrexists.npx(ships with Node.js, version 22.19.0 or newer) — no separate Inspector install is required, it runs on demand vianpx @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/listCLI 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://versionList task lists via the list_tsk tool:
npx @modelcontextprotocol/inspector --cli .venv/bin/specmgr mcp \
--method tools/call --tool-name list_tskGet 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 mcpThis 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:stderrfrom the connectedspecmgr mcpprocess (tracebacks land here).c/d— connect / disconnect;EscorCtrl+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.
Using the OpenCode command (recommended)
/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, incl. the feat closeout gate and the previous-release branch cleanup
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)precheck ends with two sub-items added by feat-233 (issue #233): the
feat closeout gate — every .specmgr/feat/feat-*/ folder shipped in
the current release window (since the last tag) must be closed out to
status: done in its README frontmatter, and a violation fails the
precheck with one actionable line per offending feat (remediation: close
out the named feats to done on dev, commit, re-run precheck); and
the previous-release branch cleanup — stale feat-*/fix/* branches
from the previous release or older are deleted on the local and origin
side, each deletion proven by the branch's merged PR and guarded by four
hazard checks (--dry-run makes this sub-item report-only: the
would-delete/would-keep table, no ref is deleted).
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
Available Tools
124 toolscheck_translation_driftCheck a translation for structural drift and stalenessA
Read-only. Compare a translated language variant with its source document (the 'en' source by default) and report both drift kinds in one structured, non-raising TranslationDriftResult. type is one of req, uc, tsk, qa, prb, gol, rsk, dec, sop, vcr, sysrs, txt (feat and adr documents are always English and are rejected with a ValueError); id the artifact's id (shared by both languages); language the translated variant (never 'en'); source_language (default 'en') the language compared against. STRUCTURAL drift: every section heading of both documents is mapped back to canonical English through the language's heading table (the free text of Option N:/Step N:/Extension N./AC-NNN (Method): headings is ignored, only the schema-constant token is compared; timestamp-led update entries are not compared) and structural lists each missing (a source section the variant lacks), extra (a variant section the source lacks) and reordered section with its canonical heading, path, level and positions; a document that fails to parse is an unparseable finding carrying the parse error (byte-identical to list_'s failure text), never raised. STALENESS: stale is true iff the source's frontmatter updated is strictly newer than the variant's (compared as offset-aware datetimes; equal is not stale), with both timestamps, the signed source_ahead_by_seconds, and staleness_error when a timestamp is missing or unparseable. in_sync is true iff there is no structural finding, the variant is not stale and staleness could be determined. Wording, prose, frontmatter values and prb's English problem_statement are never compared. A source or variant that does not exist at all raises the domain's not-found error; invalid type/id/language (path-injection, wrong shape, a language without a heading table, language 'en', equal languages) is a ValueError raised before any file access. It writes, creates and invalidates nothing; to translate or update a variant use the translate_artifact prompt.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| language | Yes | ||
| source_language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| type | Yes | |
| stale | Yes | |
| in_sync | Yes | |
| language | Yes | |
| structural | Yes | |
| source_path | Yes | |
| variant_path | Yes | |
| source_updated | Yes | |
| source_language | Yes | |
| staleness_error | Yes | |
| variant_updated | Yes | |
| source_ahead_by_seconds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: read-only and writes nothing, parse failures surfaced as non-raising 'unparseable' findings, not-found errors raised, ValueErrors raised before any file access, and strict-vs-equal staleness semantics with offset-aware datetimes. It also enumerates what is deliberately not compared.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the read-only statement and the core action, and every clause carries substantive information. The density is high, though — a long semicolon-chained paragraph covering schema tokens, timestamp comparison and error modes would scan better with light structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters, no annotations and an output schema, the description covers input constraints, comparison rules, error behavior and the shape of the result categories. An agent has everything needed to call it correctly and interpret failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and does: it explains that type is one of twelve enumerated artifacts (with feat/adr excluded), id is shared across languages, language must never be 'en', and source_language defaults to 'en' and is what the variant is compared against.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: compare a translated language variant with its source document and report structural drift and staleness. No sibling tool performs translation-drift checking, and the description makes the scope unambiguous, including that it is read-only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly routes mutation intent elsewhere ('to translate or update a variant use the translate_artifact prompt') and states which document types are rejected (feat and adr) plus the invalid-input conditions. It stops short of an explicit 'use this when you suspect a variant is out of date' framing, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_adrCreate ADRA
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. There is deliberately no specmgr://adr/schema resource -- this tool's own typed input parameters (frontmatter: AdrFrontmatter, body: AdrBody) are the authoritative ADR structure reference.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| frontmatter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | |
| frontmatter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full disclosure burden and does well: it states that an id is server-assigned, a filename is derived from the title, input is validated and rendered, and a file is written to the ADR base directory. It omits failure/conflict semantics (e.g. what happens if the derived filename already exists) and permission expectations, so not quite a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The action and its side effects are front-loaded, and the non-obvious note about the intentionally absent schema resource is placed second where it reads as a clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the rich nested schema covers field semantics. What remains thin is pre-call guidance on conflicts, required-vs-optional expectations at the call site, and how this differs from the update tools—minor but real gaps for a file-writing mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema description coverage is 0%, but the description compensates by asserting that the two parameters (frontmatter: AdrFrontmatter, body: AdrBody) are themselves the authoritative ADR structure reference, and the nested $defs carry exhaustive per-field documentation (mandatory vs optional, defaults, rendering). The description adds the key routing insight rather than repeating field rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource and even enumerates the internal pipeline (assign id, derive filename, validate, render, write to ADR base directory), so the agent knows exactly what a call does. It stops short of explicitly differentiating from the ADR mutation siblings (update_section, update_frontmatter, option_create), which keeps it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the second sentence tells the agent where the authoritative structure reference lives (the typed frontmatter/body params, not a missing resource), which is a genuine usage instruction. But there is no explicit 'use this when starting a new ADR; use update_section/update_frontmatter to modify an existing one' routing among the many ADR siblings.
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. The structure reference is the get_dec_schema tool (the generated JSON Schema); the get_dec_template/get_dec_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_dec tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/dec/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing decision instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else DecNotFoundError), and the variant is written to docs/dec/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: content-validation failure yields a non-raising ValidateResult with valid=False and a 300-char-capped errors[].message, nothing is written in that case, and it discloses FileExistsError on existing variants, DecNotFoundError for a missing source, and ValueError for malformed language/missing id/extra id before any file access. It also states precisely what is persisted (content verbatim) and that variants start as status draft.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence is front-loaded and efficient, but the body is one dense paragraph laced with internal traceability noise ('feat-110', 'ADR f14f125e-...', 'GitHub issue #204 -- case 5 of the ADR 519d1206 ... chain') that gives an agent no actionable signal. The information is valuable but the structure would be far more usable as short labeled sections for the two modes and the error cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description still usefully notes that only frontmatter is returned and points to get_dec for the body. Modes, id/language interaction, error types, and write targets are all covered; the only shortfall is that the dense prose structure makes the completeness harder to extract than it should be.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for all three parameters: content is the body-only validated content whose H1 supplies the filename; id is optional-null for the default language (must be omitted) but required for a translation and must match the existing EN source id; language defaults to 'en' and must be a lowercase ISO 639-1-shaped two-letter code with a packaged heading-mapping table. This goes well beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a new decision') and enumerates the concrete effects: fresh id, filename derived from the body's H1 title, validation, write to the decision base directory. It also distinguishes the two operating modes (flat docs/dec document vs. translation variant) and names the sibling tools for schema/template and post-creation retrieval, so an agent can separate it from create_prb/create_req and from get_dec.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_dec_schema for structure and get_dec_template/get_dec_example for authoring samples, and tells it to call get_dec afterward to fetch the full document since only frontmatter is returned. It also states the conditions that select each mode: omit language for a new document, supply a non-'en' code to create a translation of an existing id.
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. The structure reference is the get_feat_schema tool (the generated JSON Schema); the get_feat_template/get_feat_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_feat tool to fetch the full document afterward.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it explains caller-chosen vs default id behavior, no max+1 generation, filename derivation from the H1 title, content validation before id/existence guards, non-raising ValidateResult on invalid content, nothing written on failure, and that only frontmatter is returned. These are substantive details beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in the first sentence, but the description is a dense, overlong paragraph with many parenthetical references (ADR UUIDs, GitHub issue numbers, feat-110) that may not help an agent select or invoke the tool. It is informative but not tightly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity, low schema documentation, absence of annotations, and presence of an output schema, the description is complete enough: it covers creation, id semantics, validation failure behavior, guard ordering, write conditions, and retrieval follow-up. Return value explanation is present even though output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the optional 'id' parameter's caller-chosen behavior and default format, and describes 'content' as submitted body-only content that is validated before writing, adding meaning not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Create a new feature') and immediately explains the core mechanics: id assignment, filename derivation, validation, and writing to the feature base directory. It also distinguishes related siblings such as get_feat_schema, get_feat_template, get_feat_example, and get_feat for retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates this is for creating a new feature and points to get_feat_schema, get_feat_template, and get_feat_example for structure and authoring reference, plus get_feat for fetching the full document afterward. It does not explicitly contrast create_feat with edit/update_frontmatter or set_feat_id, so the when-not guidance is slightly incomplete.
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. The structure reference is the get_gol_schema tool (the generated JSON Schema); the get_gol_template/get_gol_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_gol tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/gol/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing goal instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else GolNotFoundError), and the variant is written to docs/gol/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discharges it: it discloses the non-raising ValidateResult on validation failure, that nothing is written in that case, that existing variants are never overwritten (FileExistsError), that a missing source is GolNotFoundError, that malformed languages are ValueErrors raised before any file access, and that only frontmatter is returned. This is substantially more than annotations would typically convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and substantive, but it is delivered as one very long block dense with internal provenance markers ('feat-110', 'ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 ... chain', 'feat-197-i18n') that add no decision-relevant meaning for an agent. Splitting the default-creation and translation-variant behaviors into separate structures would materially improve scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with an output schema present, the description covers everything an agent needs: preconditions, failure modes, the translation path, overwrite protection, and an explicit pointer to fetch the body via get_gol since the return is frontmatter-only. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: `language` semantics (default 'en', ISO 639-1 lowercase shape, must have a packaged heading-mapping table), `id` semantics (must be omitted for default language, required and shared for translation variants), and `content` semantics (body-only, validated through the language's heading table, persisted verbatim) are all spelled out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Create a new goal') plus concrete sub-behaviors: fresh id assignment, filename derivation from the body's H1, content validation, and the write target directory. An agent can distinguish this from create_prb/create_req/create_tsk because the description is scoped entirely to goal documents and their base directory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given for related tools: get_gol_schema for the structure reference, get_gol_template/get_gol_example for authoring, and get_gol afterward for the full body. It also states precise when-to-use branches ('omitted/'en'' vs 'a non-default ISO 639-1-shaped code') and the preconditions that select each one.
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. The structure reference is the get_prb_schema tool (the generated JSON Schema); the get_prb_template/get_prb_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_prb tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/prb/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing problem statement instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else PrbNotFoundError), and the variant is written to docs/prb/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden and does so thoroughly: validation failures return a non-raising ValidateResult with no file written, successful calls return only frontmatter, translations require an existing EN source with shared id, and overwrite attempts raise FileExistsError. It also specifies PrbNotFoundError and pre-file-access ValueError conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and logically ordered, but it is a dense single paragraph with implementation references such as feat numbers, ADR UUIDs, and GitHub issue identifiers that do not help an agent invoke the tool. The validation-error explanation is also repeated with excessive internal detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex creation tool with no annotations and an output schema, the description covers the important gaps: return shape, validation behavior, translation workflow, file paths, id assignment, and error cases. An agent has enough information to call it correctly in both default and translation modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must define all three parameters, and it does: content is body-only validated content with an H1 title, id is optional for default EN documents but required for translation variants, and language defaults to 'en' with detailed translation semantics. This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: creating a new Problem Statement, including id assignment, filename derivation, validation, and persistence. It clearly distinguishes itself from get_prb, get_prb_schema, get_prb_template, and get_prb_example by naming those alternatives and their roles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong usage context: use get_prb_schema for structure, get_prb_template/example for authoring, and get_prb afterward to fetch the full body. It also explains the default versus translation-mode conditions for the language parameter, though it does not explicitly state when not to create a new problem statement.
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. The structure reference is the get_qa_schema tool (the generated JSON Schema); the get_qa_template/get_qa_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_qa tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/qa/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing QA document instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else QaNotFoundError), and the variant is written to docs/qa/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden: it discloses that validation failures return a non-raising ValidateResult with nothing written, that existing language variants are never overwritten (FileExistsError), that missing/non-existent sources raise QaNotFoundError, and that malformed language or id mismatches raise ValueError before file access. It also states the return is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the content is accurate, but it is a single dense block studded with internal references (feat-110, ADR UUIDs, GitHub issue #204, feat-197-i18n) that add noise for an agent selecting a tool. Bullet-pointing the language branches and dropping ticket/ADR identifiers would improve scannability without losing substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given three parameters, a mutation, an exotic language/translation branch, and an output schema, the description covers everything an agent needs: creation effects, error semantics, no-overwrite behavior, what is returned (frontmatter only), and where to go for the full document and schema. Nothing critical is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: 'content' is body-only and validated per-language; 'id' must be omitted for default language but is required (shared EN source id) for a translation; 'language' defaults to 'en' and otherwise must be an ISO 639-1 lowercase two-letter code with a packaged heading-mapping table. This adds substantial meaning absent from the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a new Question and Answer (QA) document') and enumerates the concrete effects: fresh id, filename derived from H1, body-only validation, write to QA base directory. It explicitly distinguishes itself from get_qa (fetch full document) and points to get_qa_schema/template/example, so an agent can separate it from the many sibling create_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing is given: use this to create, then use get_qa to read the full document; use get_qa_schema for structure and get_qa_template/example for authoring. It also states the precise when-to-use branch for language (omitted/'en' vs non-default code creating a translation of an existing doc), including prerequisites like the EN source having to exist.
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. The structure reference is the get_req_schema tool (the generated JSON Schema); the get_req_template/get_req_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_req tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/req/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing requirement instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else ReqNotFoundError), and the variant is written to docs/req/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden and does so thoroughly: the non-raising ValidateResult path (valid=False, one errors[].message capped at 300 chars), the guarantee that nothing is written on validation failure, FileExistsError for existing variants, ReqNotFoundError for a missing EN source, and ValueError raised before any file access for malformed input. It also discloses the partial 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in the first clause, which is good, but the remainder is a single dense block punctuated by internal identifiers (feat-110, feat-197-i18n, ADR UUID f14f125e..., GitHub issue #204, ADR 519d1206 case 5) that add noise an invoking agent cannot act on. The behavioral facts are valuable; the provenance citations and nested parentheticals make it harder to scan than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with an output schema and no annotations, this covers everything an agent needs: preconditions, error taxonomy, whether files are written or overwritten, the translation-mode branch, and confirmation that only frontmatter is returned with a pointer to get_req for the body. Nothing material is left for the caller to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it does: `language` is defined as a lowercase ISO 639-1-shaped code defaulting to 'en' with a large behavioral fork (flat docs/req/ vs docs/req/{language}/ translation with status draft), `id` is described as either forbidden or required depending on that fork and as shared with the EN source, and `content` is described as body-only content validated against the language's heading-mapping table and persisted verbatim. This adds meaning well beyond bare type declarations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Create a new requirement') and immediately enumerates the concrete side effects: fresh id assignment, filename derivation from the body H1, validation, and write to the requirement base directory. It also names sibling tools (get_req_schema, get_req_template, get_req) that serve adjacent purposes, so an agent can distinguish it from list_req/parse_req/validate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States explicitly what to do afterward ('use the corresponding get_req tool to fetch the full document') and where to get structure guidance (get_req_schema vs get_req_template/get_req_example). It also gives conditional routing rules: omit `id` with default language, supply `id` only when creating a translation in a non-default language. Exclusions and required preconditions are spelled out rather than implied.
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. The structure reference is the get_rsk_schema tool (the generated JSON Schema); the get_rsk_template/get_rsk_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_rsk tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/rsk/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing risk instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else RskNotFoundError), and the variant is written to docs/rsk/{language}/ under the EN source's exact file name with status open; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full burden and does so thoroughly: it discloses the non-raising ValidateResult on content failure, that nothing is written in that case, FileExistsError on an existing language variant, RskNotFoundError for a missing EN source, and ValueError for malformed language/missing id/id-supplied-for-default — all before any file access. It also states the return shape is frontmatter only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a genuinely useful first sentence, but the single dense paragraph is polluted by references that mean nothing to an agent — ADR UUIDs, `feat-110`, `feat-197-i18n`, GitHub issue #204, case 5 of an ADR workaround chain. The translation branch would be far clearer as a short list rather than nested parentheticals.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a non-obvious dual mode (create vs. translate), three undocumented-in-schema parameters, and no annotations, the description covers creation, validation, error paths, file placement, overwrite policy, and return shape. Since an output schema exists, it does not need to enumerate return fields, and correctly limits itself to noting frontmatter-only.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and largely does: `language` is explained as an ISO 639-1-shaped lowercase code that toggles between fresh-document and translation semantics, `id` is explained as required-for-translation / forbidden-for-default, and `content` is described as body-only content validated against a per-language heading-mapping table. Minor gaps remain (exact accepted shape of `id`, what "body-only" permits regarding an H1) but the meaning added far exceeds the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a new risk") and immediately enumerates the concrete side effects: fresh id assignment, filename derivation from the body H1, body validation, and writing to the risk base directory. It also contrasts itself with the read/authoring siblings (get_rsk, get_rsk_schema, get_rsk_template, get_rsk_example), so an agent can distinguish write-vs-read without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to get_rsk_schema for structure, get_rsk_template/get_rsk_example for authoring, and get_rsk afterward to retrieve the full document — clear alternative-tool guidance. What it lacks is any statement of when *not* to call it (e.g. to modify an existing risk, use edit/update_frontmatter instead), even though `update`/`edit`/`update_section` are siblings.
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. The structure reference is the get_sop_schema tool (the generated JSON Schema); the get_sop_template/get_sop_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_sop tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/sop/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing Standard Operating Procedure instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else SopNotFoundError), and the variant is written to docs/sop/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses id assignment, filename derivation, validation failure behavior (non-raising ValidateResult, no write), translation-mode file paths, overwrite protection for variants, and specific error classes such as FileExistsError, SopNotFoundError, and ValueError.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and key behavior are front-loaded, but the description is a single dense paragraph with internal ADR UUIDs, issue numbers, and feature tags that add little for an invoking agent. The complexity justifies substantial detail, but the structure could be clearer and some references trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, lack of annotations, 0% schema description coverage, and the presence of an output schema, the description is complete. It explains both default creation and translation modes, validation outcomes, write behavior, error conditions, and what is returned, leaving no major invocation question unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameters, and it does: content is body-only content whose H1 title drives the filename; id is optional for default English creation but required for translation mode; language defaults to 'en' and switches to translation behavior when set to a supported non-default two-letter code.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Create a new Standard Operating Procedure.' It then enumerates the concrete actions (assigns a fresh id, derives a filename from the H1 title, validates body-only content, writes the document) and names related SOP tools, so an agent can distinguish it from get_sop, edit, update, and the create_* tools for other document types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context: use get_sop_schema for the structure reference, get_sop_template/get_sop_example for authoring aids, and get_sop afterward to fetch the full document. It also explains when the language parameter switches to translation mode and when id must be omitted or required, though it does not explicitly say to use edit/update rather than create_sop for existing SOPs.
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. The structure reference is the get_sysrs_schema tool (the generated JSON Schema); the get_sysrs_template/get_sysrs_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_sysrs tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/sysrs/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing System Requirements Specification instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else SysrsNotFoundError), and the variant is written to docs/sysrs/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it discloses that validation failures return a non-raising ValidateResult with nothing written, that an existing variant is never overwritten (FileExistsError), that a missing EN source raises SysrsNotFoundError, and that malformed arguments raise ValueError before any file access. It also notes new variants get status draft and are written verbatim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, which is good, but it devolves into a single dense run-on paragraph salted with internal references (feat-110, ADR f14f125e-..., GitHub issue #204, 'case 5 of the ADR 519d1206 ... chain') that add no decision value for an agent. The same content could be roughly half the length with bulleted mode descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an i18n branch, several failure modes, and a partial-return contract, the description covers creation, translation, validation, persistence, and error behavior. An output schema exists and the description still usefully notes the return is frontmatter only, so an agent knows to call get_sysrs for the body.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must supply all meaning, and it does: `id` is required only for non-default languages and must be omitted for 'en'; `language` defaults to 'en', must be an ISO 639-1-shaped lowercase two-letter code with a packaged heading-mapping table; `content` is body-only and validated through the language-specific heading table. This is well beyond what the bare schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Create a new System Requirements Specification") and immediately enumerates the concrete side effects: fresh id assignment, filename derived from the body's H1, body-only validation, and write to the sysrs base directory. This cleanly separates it from the many sibling create_* tools for other document types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to companions: get_sysrs_schema for structure, get_sysrs_template/get_sysrs_example for authoring aids, and get_sysrs afterward for the full body. It also spells out the two mutually exclusive usage modes for `language` (default vs. translation of an existing id). It stops short of stating when *not* to use this tool (e.g., use `update`/`edit` to modify an existing spec), which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. The structure reference is the get_tsk_schema tool (the generated JSON Schema); the get_tsk_template/get_tsk_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_tsk tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/tsk/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing task list instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else TskNotFoundError), and the variant is written to docs/tsk/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so thoroughly: validation failures return a non-raising ValidateResult with nothing written, only frontmatter is returned, translation variants are never overwritten, and TskNotFoundError/FileExistsError/ValueError cases are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and most of the content is relevant, but the single dense paragraph contains internal traceability noise such as long ADR UUIDs, issue #204, and feat tags. The complexity justifies substantial length, but tighter structure and removal of internal references would improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations, three parameters, translation-mode branching, and an existing output schema, the description covers creation, validation, persistence location, return shape, and error outcomes. No material invocation detail appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description fully compensates by defining all three parameters: content is body-only validated content with an H1-derived filename; id is optional for default creation but required as the shared source id for translations; language defaults to 'en' and selects translation behavior with heading mapping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'Create a new task list' and specifies id assignment, filename derivation from the body's H1 title, body validation, and writing to the task list base directory. The resource is unambiguous against sibling create tools such as create_prb and create_req.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes structure consultation to get_tsk_schema/get_tsk_template/get_tsk_example and full document retrieval to get_tsk. It also distinguishes default creation (language omitted or 'en', id omitted) from translation mode (non-default language, existing id required) and describes the error conditions that select each path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_txtCreate free-form textA
Create a new free-form text 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 free-form text 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. The structure reference is the get_txt_schema tool (the generated JSON Schema); the get_txt_template/get_txt_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_txt tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/txt/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing free-form text document instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else TxtNotFoundError), and the variant is written to docs/txt/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so thoroughly: it discloses the non-raising ValidateResult on validation failure (valid=False, single errors[].message capped at 300 chars) and that nothing is written in that case, the exact error types (TxtNotFoundError, FileExistsError, ValueError raised before any file access), and that an existing variant is never overwritten. It also states the return shape (frontmatter only, no body) and the on-disk path for translation variants.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, but the text is one very long paragraph dense with internal provenance citations (feat-110, ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204, ADR 519d1206 workaround chain, feat-197-i18n) that add no decision-relevant meaning for an agent. Splitting the two modes and the error contract into separate sentences would materially improve scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no annotations, the description covers every decision point: mode selection, id requirements per mode, validation and failure semantics, error types, file placement, overwrite protection, and the fact that only frontmatter is returned (with an output schema present, no further return-value detail is needed).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: 'id' is explained as the required shared id of the EN source for a non-default language and as forbidden for the default language, 'language' is constrained to a lowercase ISO 639-1-shaped two-letter code with 'en' as default, and 'content' is described as body-only, validated against the language's heading-mapping table, and persisted verbatim.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause gives a specific verb and resource ("Create a new free-form text document") and immediately enumerates the concrete effects: fresh id assignment, filename derived from the H1 title, validation of body-only content, and write to the free-form text base directory. It is clearly distinguishable from siblings like create_prb/create_req and from the read-side get_txt family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to the right companion tools (get_txt_schema for structure, get_txt_template/get_txt_example for authoring, get_txt to fetch the full body afterward) and draws an explicit line between the two modes: omit 'language' for a new document, pass a two-letter code to create a translation. What is missing is any when-not-to-use guidance versus the many other create_* tools and versus 'edit'/'update' when the intent is to modify rather than create.
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. The structure reference is the get_uc_schema tool (the generated JSON Schema); the get_uc_template/get_uc_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_uc tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/uc/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing use case instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else UcNotFoundError), and the variant is written to docs/uc/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: validation failures return a non-raising ValidateResult (valid=False, nothing written), return value is frontmatter-only, missing source raises UcNotFoundError, existing variant raises FileExistsError, and malformed/mismatched language or id raises ValueError before any file access. That is exactly the safety and failure-mode context an agent needs before a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The operation is front-loaded in the first sentence, but the text is a single dense block bloated with internal process artifacts (ADR UUIDs, 'GitHub issue #204 -- case 5 of the ADR 519d1206 non-raising-structured-result workaround chain', 'feat-110', 'feat-197-i18n') that add no decision value for an agent. The substantive language/id rules are useful but could be trimmed and structured into bullets for faster parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no annotations, the description covers inputs, validation semantics, all error conditions, side effects on disk paths, and return shape (frontmatter only, with an output schema present so body details are rightly deferred). Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: `content` is body-only, validated and persisted verbatim (and validated against the language's heading-mapping table for translations); `id` is the shared EN source id, required for non-default languages and forbidden for 'en'; `language` defaults to 'en', must be an ISO 639-1-shaped lowercase code, and requires a packaged heading-mapping table. All three parameters gain meaning not present in the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence names a specific verb (create), the resource (use case document), and the concrete effects: fresh id, filename derived from H1, body validated, written to the use-case base directory. It also distinguishes the dual mode (new EN doc vs. translation) and points to get_uc for retrieval, so an agent can separate it from get_uc / create_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear routing guidance: get_uc_schema for structure, get_uc_template/get_uc_example for authoring inputs, get_uc afterward for the full body. The language/id coupling is spelled out explicitly (omit id for 'en', id required otherwise). However, it never states when to use this versus the sibling edit/update tools for an existing use case, so a modification-vs-creation decision is left implicit.
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. The structure reference is the get_vcr_schema tool (the generated JSON Schema); the get_vcr_template/get_vcr_example tools return the authoring template and a complete sample. Returns the newly created document's frontmatter only (no body); use the corresponding get_vcr tool to fetch the full document afterward. The optional language parameter (default 'en', feat-197-i18n) selects the language to create the document in: omitted/'en' = a new flat docs/vcr/ document with a fresh id, exactly the default behavior (id must then be omitted); a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') creates a TRANSLATION of an existing verification case record instead: id -- the shared id of the existing EN source document -- is then required (no fresh id is assigned; the variant carries the same id), the EN source must exist (else VcrNotFoundError), and the variant is written to docs/vcr/{language}/ under the EN source's exact file name with status draft; content is validated through that language's heading-mapping table (translated headings are accepted) and persisted verbatim. An existing variant of that id and language is never overwritten (FileExistsError). A malformed language, one with no packaged heading-mapping table, a missing id for a non-default language, or an id given for the default language is a ValueError raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so richly: validation failure returns a non-raising ValidateResult with valid=False and errors[].message capped at 300 chars and writes nothing; malformed language, missing/forbidden id, or absent heading-mapping table raise ValueError before any file access; an existing variant raises FileExistsError; a missing EN source raises VcrNotFoundError. It also discloses that translations get status draft, that content is persisted verbatim, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the body is a single dense paragraph salted with internal identifiers (feat-110, ADR f14f125e-eaad-..., GitHub issue #204, case 5 of ADR 519d1206) that add noise rather than invocation value. The parameter branching deserves the length, but the ticket/ADR references and nested parentheticals could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter creation tool with branching language behavior, the description is complete: it covers what is written, what is returned, error conditions, overwrite protection, and where related tools fit. An output schema exists, and the description still usefully notes that only frontmatter is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: it documents `language` (default 'en', ISO 639-1-shaped two-letter code, selects a heading-mapping table), `id` (must be omitted for default language, required as the shared EN source id for translations), and `content` (validated against the language's heading table, persisted verbatim). This goes well beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb + resource ("Create a new verification case record") and enumerates the concrete steps: assigns a fresh id, derives filename from the body's H1 title, validates content, and writes to the base directory. It further distinguishes itself from siblings by naming get_vcr_schema, get_vcr_template, get_vcr_example, and get_vcr with their respective roles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly routes the agent: use get_vcr_schema for the structure reference, get_vcr_template/get_vcr_example for authoring, and get_vcr afterward to fetch the full body since only frontmatter is returned. It also spells out the two mutually exclusive branches (default vs non-default language, with id required/omitted accordingly). It does not explicitly compare against edit/update for modifying an existing record, leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, txt; 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. The optional language parameter (default 'en', feat-197-i18n) selects the language variant to delete: omitted/'en' = the flat default-language document, exactly the default behavior; a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs//{language}/ (found by id-scan of that subdirectory), deleting that variant file ONLY -- the EN file stays untouched. Every whole-body type except feat supports a non-default language; for feat (always English) a non-default language raises a ValueError, as does a malformed language or one with no packaged heading-mapping table -- all raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses permanence, that a domain lock is taken, that a single file vs an entire folder (`feat`) is removed, the language-variant scoping (only that variant file, EN untouched), and the exact error taxonomy (ValueError before file access, XNotFoundError, DeleteError). This is unusually rich behavioral context for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then organized into resolution, deletion mechanics, and error/language behavior. It is long and the language paragraph is dense, but nearly every clause adds decision-relevant information; a slight trim would sharpen it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a destructive, unannotated 3-parameter tool, the description covers mechanics, scope, return value, and failure modes thoroughly. The note that it 'Returns the deleted path as a string' mildly duplicates the output schema but is harmless, and nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description fully compensates: it explains `id` resolution and its invalid-format/path-injection failure, expands on the `type` enum including the `adr` exclusion and `feat`'s folder semantics, and gives precise meaning for `language` (default 'en', ISO 639-1 lowercase shape, per-language subdirectory, malformed or unsupported code raises ValueError).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently delete an existing document from disk'), enumerates the valid `type` values, and explicitly excludes `adr`. An agent can distinguish this from create_*/get_*/edit/update 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly declares itself 'the sole delete entry point -- the former per-domain `delete_<d>` tools are removed', which routes the agent away from nonexistent alternatives. It lacks an explicit statement of when deletion is inappropriate versus e.g. `edit` or `set_status`, so it falls 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.
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, txt; 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. The optional language parameter (default 'en', feat-197-i18n) selects the language variant to edit: omitted/'en' = the flat default-language document, exactly the default behavior; a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs//{language}/ (found by id-scan of that subdirectory), matched against and written to that file ONLY -- the EN file's content and updated timestamp stay untouched -- with the stage-2 validation going through that language's heading-mapping table. Every whole-body type except feat supports a non-default language; for feat (always English) a non-default language raises a ValueError, as does a malformed language or one with no packaged heading-mapping table -- all raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| new_str | Yes | ||
| old_str | Yes | ||
| language | No | en | |
| replace_all | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does: two-stage execution, atomicity ("nothing is written on any failure (the file stays byte-unchanged)"), byte-exact matching with no line-ending/BOM/fuzzy fallback, and which failures raise versus return structured results (`ParseFailureResult`, non-raising `ValidateResult`). Return-shape behavior (frontmatter only, no body, `updated` bumped) is also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the strongest sentence, but the remainder is one massive run-on paragraph dense with internal references (ADR UUIDs, GitHub issue #170, ADR chain citations) that do not help an agent select or invoke the tool. Length and embedding of critical facts mid-paragraph (e.g. the `language` scope rules) make it hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no annotations, everything an agent needs is present: preconditions, matching semantics, failure modes and their exact result shapes, atomicity guarantee, return value, and language-variant scoping. With an output schema present, it correctly does not re-describe the success payload beyond noting no body is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description fully compensates for all six parameters: `old_str` (byte-exact, must be unique unless `replace_all`), `new_str` (empty = pure deletion, legal only if stage 2 validates), `replace_all`, `id` (invalid shape/path injection = pre-dispatch `ValueError`), `type` (`adr` unsupported, enum-consistent), and `language` (default 'en' = flat file, non-default = docs/<type>/{language}/ only, `feat` raises). No parameter is left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Surgical, exact-match string replacement of an existing document's frontmatter-stripped body" names a specific verb (replace), the resource (document body), and the exact matching contract. The scope restriction ('body only', frontmatter never addressable) and the explicit contrast with `update` lets an agent distinguish it from the ~100 siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between siblings: "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." It also states the read-before-edit convention and flags that it is a client convention, not server-enforced, plus the `adr` exclusion which tells the agent when this tool is unavailable.
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, txt; 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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No | ||
| min_score | No | ||
| target_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: default domain coverage with adr structurally excluded, ranking and sort order, top_k range validation, min_score as an inclusive cosine bound, degraded-mode behavior ({available:false, reason, message}) when embeddings are unavailable, and that invalid args raise ValueError before any filesystem access. This is unusually complete behavioral disclosure for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded before the mechanics, and every clause carries information. It is still a single dense paragraph with heavy parenthetical nesting, which costs some scannability against an ideal structured layout.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter read tool with an output schema, the definition covers invocation semantics, ranking, filtering, edge-case rows (id=null for unparseable candidates) and failure modes. Even the return-row shape is summarized, leaving no gap an agent would need before calling it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it defines query as free-form text, top_k's default 10 and validated 1..100 range, min_score's default (no filter) and inclusive lower-bound meaning, and target_types' restriction role against the full default domain list. Every parameter gains meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find) and resource (documents most semantically similar to a free-form query), plus the mechanism (cosine similarity of local sentence embeddings) and the intended purpose (pre-creation dedup/discovery). An agent can distinguish this semantic-similarity search from keyword/metadata lookups like list_* or get_* without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes usage to 'pre-creation dedup/discovery checks', which tells the agent when this tool is the right choice. It does not name a specific alternative (e.g. find_related) or state when-not to use it, so it falls short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adrGet ADRB
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | |
| frontmatter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a useful behavioral trait: an invalid id raises ValueError before any file access, which signals input validation ordering. It does not say what happens when a well-formed id matches no existing ADR (missing file vs. empty result), nor does it explicitly confirm the operation is a pure read with no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the core action front-loaded in the first, with the error-path caveat second. Every clause adds information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained. For a single-parameter read tool without annotations, the remaining gap is the not-found case and the id format, which an agent needs in order to call it correctly the first time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and only partially does: it establishes that 'id' identifies an ADR document and that malformed or path-injection ids are rejected. It never states the expected id format (e.g., ADR-001 style), which is exactly what the undocumented parameter leaves ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set and resource: 'Read, parse, and return a full ADR document (frontmatter and body) by its id.' This clearly separates it from list_adr (enumeration). It does not, however, distinguish itself from the sibling parse_adr, leaving the reader to guess how 'get' and 'parse' differ.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this instead of list_adr, parse_adr, or validate_adr. The only conditional statement concerns invalid ids, not tool selection, so an agent gets no routing help.
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. The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/dec/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/dec/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. 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) -- for a language variant, against list_dec(language=...) on the same file. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: language variants are shape-validated before any file access, missing heading tables are rejected up front with actionable ValueErrors, parse failures return a ParseFailureResult rather than raising, and out-of-range offset/limit clamp to an empty string. It even documents cross-tool invariants (error text byte-identical to list_dec, numbered output must be stripped before feeding update/create_dec/edit).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded, but the body is a single ~330-word paragraph of chained em-dashes and parentheticals that is hard to scan. Some content is repeated ('before any file access' appears twice) and the ADR hash reference is noise for an invoking agent, though the underlying behavioral facts do earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, 0%-schema-coverage, unannotated tool this is close to complete: modes, validation ordering, error shapes, clamping, and cross-tool constraints are all covered, and the existing output schema relieves it of explaining return values. The only substantive omission is the accepted format of `id`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must supply all parameter meaning, and it does for language (default 'en', docs/dec vs docs/dec/{language}/), raw, offset (1-based, default 1), limit (default through end), and numbered ("<n>: " prefix, absolute numbering that survives windowing). The required `id` parameter gets only error behavior (path-injection/wrong format → ValueError) but never states the expected id format, leaving one gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource+scope: 'Read, parse, and return a full decision document (frontmatter and body) by its id.' It also makes the boundary against related tools explicit by naming list_dec, update, create_dec and edit and describing how their outputs/inputs interact with this tool's.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance for the main modes: use raw=True for verbatim body text, raw=False for the parsed structured model, and offset/limit/numbered only with raw=True (with the stated ValueError otherwise). It never states the plain 'use this instead of list_dec when you know the id' routing rule, so the sibling-selection guidance 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_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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are 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.
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.
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.
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.
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.
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_schemaGet DEC schemaA
Return the DEC domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_dec_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does add useful context: the schema is generated by `specmgr schema`, kept current by a pre-commit hook/CI step, and includes a `$comment` version marker for detecting shape changes. It does not explicitly state that the operation is read-only or describe failure behavior if the schema is unavailable, but the core behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the return type and dialect, then gives usage guidance and generation details. It is somewhat long but every sentence carries useful information -- return format, alternative, usage conditions, and freshness marker. It could be tightened slightly, but it does not waste space on restating schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values in detail. It covers purpose, alternatives, usage conditions, and the freshness/version-marker behavior. For a zero-parameter schema retrieval tool, nothing important is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to explain and the baseline is 4. The description appropriately does not invent parameter details. The empty input schema is consistent with the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb-resource pair: it returns the DEC domain's generated JSON Schema in 2020-12 dialect as raw text. It also distinguishes this from the markdown/template view by naming `get_dec_template` as the alternative for authoring. An agent can tell exactly what this tool produces versus its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names when to fetch it: constraint discovery, structural questions, or unresolved validation errors. It also gives a negative instruction -- never as a mandatory pre-authoring fetch -- and points to `get_dec_template` for the authoring starting point. This is clear when/when-not guidance with an explicit alternative.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: parse failures return a ParseFailureResult instead of raising, invalid ids raise ValueError before file access, out-of-range offset/limit clamp, and incompatible flag combinations raise ValueError. It even discloses the warmup/caching nuance that affects error fidelity relative to list_feat, which is behavior no schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical points are front-loaded, but the description is bloated with ADR identifiers and a long, self-referential digression on byte-identity with list_feat's error rows. That parity detail is tangential to calling this tool and inflates the middle of an otherwise efficient definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter read tool with an output schema, the description covers the mutation-adjacent edge cases an agent actually needs: failures return a structured result, flag conflicts raise, and numbered output is not round-trippable into write tools. Nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: `raw` semantics, `offset` (1-based, default 1), `limit` (default through end of body), clamping behavior, and `numbered` (prefix format, numbering continues from clamped offset, only valid with raw=True). That is meaning well beyond the bare types and defaults in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource: read, parse, and return a full feature document (frontmatter and body) by id. It immediately distinguishes the raw variant, so an agent knows exactly what it gets without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the raw=True mode switch and warns against feeding numbered output back into `content` for `update`/`create_feat` or using it as `edit` `old_str`, which is actionable guidance. However, it never says when to prefer this tool over siblings such as `parse_feat`, `list_feat`, or `get_feat_example` for discovery, so the alternative-selection story is implicit.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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_schemaGet FEAT schemaA
Return the FEAT domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_feat_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does well: it explains provenance (`specmgr schema`, pre-commit hook/CI refresh) and that the document includes a `$comment` layout-version marker for detecting shape changes. It omits how the raw text is delivered (size, pagination/truncation) or whether the fetch has side effects, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and resource, then the disambiguation and usage rules in priority order. It is a single dense sentence with several parentheticals; nothing is wasted, but the length slightly taxes readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-value explanation is unnecessary. Given a zero-parameter, no-annotation tool, the description covers what it is, what it returns, where it comes from, when to call it, when not to, and which sibling to use instead — nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no semantics to disambiguate and the baseline of 4 applies. The description correctly adds no spurious parameter talk.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the FEAT domain's generated JSON Schema ... as raw text') and immediately contrasts it with the markdown view and with `get_feat_template`. An agent can distinguish it from get_feat_template, get_feat_example, and the sibling *_schema tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit positive triggers ('constraint discovery, structural questions, or an unresolved validation error') and an explicit prohibition ('never as a mandatory pre-authoring fetch'). It also names the alternative tool to use for authoring start, so the routing decision is fully specified.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/gol/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/gol/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_gol(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses that invalid ids and path-injection payloads raise ValueError before any file access, that unparseable documents return a ParseFailureResult rather than raising, that out-of-range offset/limit values clamp, and that mixing offset/limit/numbered with raw=False raises ValueError. It even warns that numbered output is not valid input for update 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is valuable but delivered as one unbroken ~400-word block with no paragraphing or bullets, so the default raw=False path is buried behind secondary raw=True windowing details. The byte-identical ParseFailureResult claim (including a full ADR UUID) is stated twice, once in the middle and again in the final sentence, which is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with an output schema and zero annotation coverage, the description covers everything an agent needs: parse-failure shape, error paths, parameter interactions, and language-variant parsing semantics. Nothing material about calling it correctly is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet every non-trivial parameter is fully specified: offset is 1-based with default 1 and clamping behavior, limit defaults to through-end-of-body, numbered emits "<n>: " 1-based absolute line numbers that continue past a windowed offset, and language defaults to 'en' with the flat path versus docs/gol/{language}/ variant rule. This compensates entirely for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource+scope: "Read, parse, and return a full goal document (frontmatter and body) by its id," and immediately contrasts that with the raw=True body-text mode. An agent can tell this apart from list_gol, parse_gol, and create_gol without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditions for the major modes: raw=True for verbatim frontmatter-stripped body, offset/limit only meaningful with raw=True, numbered only with raw=True, and language variants selected via ISO-shaped codes. It never explains when to pick this over the sibling parse_gol tool, which is the one remaining routing ambiguity.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_schemaGet GOL schemaA
Return the GOL domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_gol_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does real work: it discloses the output is raw text not rendered markdown, that content is generated by `specmgr schema` and kept current by a pre-commit hook/CI, and that a `$comment` version marker enables shape-change detection. It doesn't discuss permissions or caching, but read-only retrieval is implied and the freshness/source disclosure is well beyond typical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is returned before the usage guidance and the version-marker detail. It is a single dense paragraph and slightly overstuffed, but each clause (raw text vs markdown, source, freshness, $comment marker) carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema, the description covers purpose, selection, format, provenance, and freshness, which is everything an agent needs before invoking it. Return-value detail can safely be deferred to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is no parameter semantics to add. The description appropriately spends none of its space restating an empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the GOL domain's generated JSON Schema as raw text') and explicitly disambiguates from the markdown view and from get_gol_template. An agent can distinguish it from the many get_*_schema and get_*_template siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggers ('constraint discovery, structural questions, or an unresolved validation error') and an explicit exclusion ('never as a mandatory pre-authoring fetch'), plus names the alternative for authoring. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/prb/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/prb/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_prb(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations the description carries the full burden and does so richly: it discloses that a broken document returns a ParseFailureResult instead of raising, that invalid ids and path-injection payloads raise ValueError before any file access, that offset/limit clamp out of range, that unsupported language codes are rejected up front, and that raw=True preserves translation while raw=False maps headings to canonical text. It also warns that numbered output must be stripped before reuse in content/old_str, which is exactly the kind of behavioral context annotations would otherwise supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the body is a run-on of em-dash-chained clauses that repeats itself: the byte-identical ParseFailureResult error claim appears twice, and the ValueError conditions for offset/limit/numbered are restated. Dense as it is, an agent must parse one very long paragraph to extract the several distinct modes, when short bullets or a mode table would convey the same content far more efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated, and against that lower bar the description covers error paths, language variants, windowing, and numbered output thoroughly for a 6-parameter tool. The only real gap is the missing distinction from the sibling parse_prb, which occupies the same parse-the-document niche and is never mentioned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 6 parameters, so the description must compensate, and it documents every one: offset is 1-based with default 1, limit defaults to end-of-body, out-of-range values clamp and offset > N yields the empty string, offset/limit/numbered are only valid with raw=True, and language defaults to 'en' mapping to docs/prb/ versus docs/prb/{language}/. It also states that numbered emits a 'n: ' prefix whose numbers start at the clamped offset, which is meaning no schema could convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a precise verb+resource: 'Read, parse, and return a full problem statement document (frontmatter and body) by its id', and names the sibling behaviors it is not (update, create_prb, edit) when warning about feeding numbered output back. It never distinguishes itself from the equally-named sibling parse_prb or from list_prb beyond error-text parity, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says when to use the two modes ('Pass raw=True to return the frontmatter-stripped body text verbatim instead') and when offset/limit/numbered apply, including that they raise ValueError with raw=False. It gives no guidance at the tool level, however: nothing says when to call get_prb versus parse_prb, list_prb, or get_prb_example.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_schemaGet PRB schemaA
Return the PRB domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_prb_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: it discloses the output is raw text rather than parsed objects, the provenance (generated by `specmgr schema`, refreshed by pre-commit hook/CI), and the `$comment` version marker for detecting layout changes. That is meaningful context beyond a bare "get".
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then usage routing, then provenance. Dense but nearly every clause carries information; the CI/pre-commit sentence is slightly more than an agent needs to select the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema is present, so return-value detail is not required, and the description covers format, provenance, versioning, and sibling routing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate beyond implying no filtering/targeting is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Return") and resource ("PRB domain's generated JSON Schema, 2020-12 dialect, as raw text") and explicitly distinguishes itself from the markdown view and from get_prb_template. An agent can pick this over get_prb_template without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives positive triggers ("constraint discovery, structural questions, or an unresolved validation error") and a negative one ("never as a mandatory pre-authoring fetch"), plus routes to the sibling get_prb_template for the authoring starting point. Both when and when-not are covered.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are 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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/qa/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/qa/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_qa(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that parse failures return a ParseFailureResult rather than raising, that invalid ids and incompatible parameter combinations raise ValueError before any file access, and that out-of-range offset/limit clamp. It stops short of explicitly stating the operation is read-only and side-effect free, which would matter more given the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded correctly in sentence one, but the body is a dense run-on paragraph dense with em-dashes and nested parentheticals. Detail like the ADR UUID, the repeated "byte-identical" guarantees, and the trailing pydantic documentation line note add length without changing how an agent would call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter tool with no annotations and a declared output schema, this is complete: failure modes, validation ordering, language-variant resolution, and cross-tool data-flow hazards (never feed numbered output into content or old_str) are all covered. Return-value shape is rightly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate entirely, and it does: every one of the six parameters gets meaning beyond its type — raw's body-only behavior, offset's 1-based default and clamping, limit's through-end default, numbered's "<n>: " format and absolute numbering under windowing, language's flat-vs-subdirectory resolution and shape validation, and id's path-injection rejection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: "Read, parse, and return a full QA document (frontmatter and body) by its id," which is immediately actionable. It does not, however, distinguish itself from the sibling parse_qa tool, which an agent would reasonably consider interchangeable given the word "parse" in the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It thoroughly explains the mode-selection logic for raw, offset/limit, numbered, and language, which is genuinely useful usage guidance. But it never routes between siblings: parse_qa is unmentioned, and list_qa/update/create_qa appear only as error-message or data-flow references, not as alternatives with a stated selection rule.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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_schemaGet QA schemaA
Return the QA domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_qa_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses the output is raw text (not parsed JSON or markdown), that content is generated by `specmgr schema` and kept current by a pre-commit hook/CI, and that a `$comment` version marker allows shape-change detection. It stops short of stating read-only safety or whether the response is a snapshot versus live generation, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and what it is not, then the when-to-use clause, then provenance. It is a single dense paragraph with heavy em-dash nesting, which slightly reduces scannability, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description still clarifies the raw-text form and version marker. Provenance and anti-pattern guidance are both present; 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It correctly implies the tool takes no scoping arguments by describing the QA domain as the fixed subject.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (return the QA domain's generated JSON Schema, 2020-12 dialect), and immediately distinguishes the artifact from the markdown view authored via get_qa_template. An agent can tell exactly what this returns versus its many siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggers (constraint discovery, structural questions, unresolved validation error), an explicit exclusion (never a mandatory pre-authoring fetch), and names the alternative tool for the authoring path. This is the when/when-not/alternative pattern done correctly.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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 curly-brace component groups (one per non-empty domain, closed with } -- the 2026-10-15 corrected form), one label-free edge per unique reference ({src} --> {dst}, the referenced item carries the incoming arrow), every edge lying on a cycle (SCC-based) drawn with the red label-free -[#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, txt) 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 13 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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| depth | No | ||
| title | No | ||
| reverse | No | ||
| include_feat | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: guard order and which checks raise ValueError before any filesystem access, missing source raising the domain's XNotFoundError, broken source returning the non-raising ParseFailureResult with its error/path/id shape, byte-identical error text guarantees, and the adr exception. It also states the return is PlantUML source, not a specmgr document, and names the validation path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information density is high and the primary purpose is front-loaded, but the body is one unbroken paragraph of nested parentheticals with spec citations ('specmgr://reference-graph §2–§5', 'the 2026-10-15 corrected form', ADR hashes) that add bulk without changing how an agent calls the tool. It is sized for the complexity but poorly structured for scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter render tool with an output schema already present, every decision an agent must make is covered: domain/id format, depth semantics, reverse and include_feat interactions, title override, error taxonomy, and the follow-up validation step. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it does for every parameter: type is given as the source's domain with the enum spelled out, id is the source's own identifier with the feat full-slug-vs-bare-id trap and the list_feat escape hatch, depth is bounded 1..5 with default 1, reverse is described as additive forward-plus-direct-incoming, include_feat defines cascading edge removal, and title defines default and sanitization/no-truncation behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource: 'Render and return the deterministic PlantUML component diagram of one source document's reference neighbourhood', and enumerates exactly what the diagram contains (nodes per artifact, per-domain groups, edges, cycle edges, UNRESOLVED nodes). It scopes to 'one document', which implicitly separates it from the get_reference_diagram_all sibling, but never names that sibling or otherwise routes between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the scoping ('one source document') and by the closing instruction to run the output through specmgr plantuml-check or validate_plantuml, which is genuinely actionable. However there is no explicit when-to-use/when-not guidance and no comparison to the near-identical get_reference_diagram_all or to list_references, so the 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.
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 14 domains (broken documents are skipped -- the render never fails for content), one label-free edge per unique reference ({src} --> {dst}, the referenced item carries the incoming arrow), every edge lying on a cycle (SCC-based) drawn with the red label-free -[#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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| include_feat | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so richly: it discloses that broken documents are skipped, rendering never fails for content, cycle edges are red, unresolved references become top-level nodes, labels are truncated by environment default, include_feat drops FEAT nodes and touching edges, and title is sanitized but not truncated. It also clarifies that the return value is PlantUML source, not a specmgr document.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and every part carries relevant information, but it is dense and packs many clauses into long sentences. The spec references and parenthetical details are useful for determinism but add reading burden.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex rendering tool with an output schema, no annotations, and 0% schema description coverage, the description is complete enough to call correctly. It covers scope, node and edge construction, special cases, both parameters, return type, and validation path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for both parameters. It explains that include_feat=False drops every FEAT node and every edge touching a dropped node, and that title overrides the default Reference Graph title while being sanitized but never truncated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: render and return a deterministic PlantUML component diagram of the whole reference registry. It clearly differentiates the registry-wide scope from the sibling get_reference_diagram by describing one node per parseable document across all 14 domains and every unique reference edge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context by saying it covers the whole registry and returns PlantUML source rather than a specmgr document, with guidance to validate via specmgr plantuml-check or validate_plantuml. It does not explicitly name get_reference_diagram as the alternative or state exclusions, so it falls short of full when-to-use routing.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/req/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/req/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_req(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: parse failures return a ParseFailureResult rather than raising, invalid ids and path-injection payloads raise ValueError before file access, out-of-range offsets clamp to empty string, and coordinate/language-table rejections are specified. These are exactly the behavioral traits an agent needs to avoid broken call sequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the text is an undifferentiated block well past what the tool needs: the ParseFailureResult/byte-identical-to-list_req claim is restated twice (once with an ADR UUID), and the numbered-output warning is repeated for update, create_req, and edit in successive clauses. Structure is dense run-on rather than layered, which raises the cost of extracting the offset/limit and language rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Six parameters, no annotations, an output schema that carries the return shape. The description covers the non-obvious interactions (raw×offset/limit×numbered, language×raw parse behavior, error parity with list_req) that no structured field expresses. Only the valid `id` format is left unstated, a minor omission given the output schema handles returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and largely does: raw, offset (1-based default 1), limit (default through end), numbered ("<n>: " prefix, absolute numbering under windowing), and language (default 'en', ISO 639-1 shape, heading-table requirement) are all given meaning beyond their names. The `id` parameter is only described by validation failure mode ('wrong format') without stating the expected id shape, which is the one semantic left thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Read, parse, and return a full requirement document (frontmatter and body) by its id', then immediately contrasts the raw=True variant ('frontmatter-stripped body text verbatim'). This distinguishes get_req from list_req/parse_req/update, which are named later in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection rules for the option variants: raw=True for verbatim bodies, offset/limit only with raw=True, language for translation variants, numbered only with raw=True. It also routes the agent away from misuses (numbered text into update/create_req/edit). It does not explicitly state when to prefer get_req over list_req or parse_req, which is the remaining gap.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_schemaGet REQ schemaA
Return the REQ domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_req_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it discloses output format (raw text vs parsed/markdown), provenance (`specmgr schema` generation), freshness guarantees (pre-commit hook/CI keeps it current), and a `$comment` version marker for detecting shape changes. It stops short of stating that the call is a side-effect-free read and says nothing about failure modes when the schema file 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence establishes what is returned and what it is not; the second carries usage guidance; the third carries provenance and the version-marker detail. Every clause earns its place and there is no repetition of schema or title content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema already present, the description only needs purpose, routing, and behavioral context — all three are supplied, including the staleness/version-marker mechanism an agent would otherwise not know about.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly spends no space restating an empty input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return the REQ domain's generated JSON Schema (2020-12 dialect) as raw text") and explicitly contrasts itself with the markdown view and with `get_req_template`. An agent can distinguish it from the sibling template/example/schema tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names concrete triggers ("constraint discovery, structural questions, or an unresolved validation error") and an explicit exclusion ("never as a mandatory pre-authoring fetch"), plus the alternative to reach for instead. This is the when/when-not/alternative triad at full strength.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/rsk/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/rsk/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_rsk(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it discloses parse-failure return behavior, invalid-id ValueErrors before file access, clamping semantics, invalid option combinations, and language validation failures. It also warns that numbered output must not be fed back verbatim into update or create_rsk, which is valuable safety context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, but the body becomes a dense wall of edge-case prose with some repeated parse-failure and ValueError details. Most content is useful for correct invocation, yet the lack of paragraphing and the compression of many conditions into long sentences make it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, no schema descriptions, no annotations, and an output schema that handles return structure, the description is complete enough for correct invocation. It covers the important behavioral edge cases an agent would otherwise have to discover by trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must define all six parameters, and it does: id, raw, offset, limit, numbered, and language each receive concrete semantics including defaults, 1-based line numbering, clamping behavior, and valid combinations. The detail on numbered line numbers and language variant paths goes well beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb, resource, and scope: read, parse, and return a full risk document by id, with the raw=True alternative explicitly contrasted. An agent can distinguish the structured read from the raw-body read without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains when to use raw=True versus the default structured read, how language variants are selected, and when offset/limit/numbered apply. It does not explicitly route the agent among sibling tools such as list_rsk or parse_rsk, but the retrieval-by-id context is otherwise clear.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_schemaGet RSK schemaA
Return the RSK domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_rsk_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it does so well: it discloses that the schema is generated by `specmgr schema`, kept current by a pre-commit hook/CI step, and includes a `$comment` version marker for detecting shape changes. It doesn't discuss permissions, but this is clearly a read-only retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return value, then usage guidance, then provenance. It is dense with parentheticals and em-dash asides, but each sentence carries useful information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described in detail. The description covers purpose, usage exclusions, provenance, freshness guarantees, and a version-detection mechanism, leaving no significant gap for a zero-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. There is nothing parameter-related for the description to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: return the RSK domain's generated JSON Schema as raw text. It explicitly distinguishes itself from the markdown view and from get_rsk_template, which handles authoring starting points.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use cases (constraint discovery, structural questions, unresolved validation error) and an explicit when-not (never as a mandatory pre-authoring fetch). It also points to the alternative sibling, get_rsk_template, for the authoring case.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/sop/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/sop/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_sop(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full load and does so: it states that a malformed document returns a ParseFailureResult rather than raising, that an invalid id raises ValueError before any file access, that out-of-range offset/limit clamp, and that invalid flag combinations raise ValueError. It even warns that numbered text must never be fed back into content/old_str, which is exactly the kind of destructive-misuse context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the remainder is one long run-on block with nested parentheticals, ADR citations, and a byte-identical-error guarantee that could be compressed. Almost every sentence carries real information, yet scannability suffers for a getter with six parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with a large parameter surface, no annotations, and an output schema that handles return values, the description covers the risky edges: parse failures, injection validation ordering, clamping, and flag-combination errors. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for five of six parameters: raw, offset (1-based, default 1, clamping), limit (line count, default through end), numbered ("<n>: " prefix, absolute numbering that continues across windows), and language (ISO 639-1 shape validation, variant path, heading-table requirement). Only `id`'s format is left as an unelaborated "wrong format".
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Read, parse, and return a full SOP document (frontmatter and body) by its id" gives a specific verb, resource, and scope, and the raw=True branch defines the alternate output precisely. An agent can tell what it gets (parsed model vs verbatim body) without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description spells out selection conditions well: default parses, raw=True returns the body, offset/limit only apply under raw=True, numbered only with raw=True, language='en' vs a two-letter variant. It never contrasts get_sop with sibling parse_sop or list_sop directly, which is the remaining gap.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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_schemaGet SOP schemaA
Return the SOP domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_sop_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose meaningful traits: provenance (generated by `specmgr schema`), freshness guarantees (kept current by pre-commit hook/CI), the presence of a `$comment` layout-version marker, and that the payload is raw text rather than parsed/markdown. It stops short of stating the read-only/no-side-effect profile explicitly, but the omission is minor for a schema getter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and return type, then usage routing, then provenance — a sensible ordering. Slightly dense, with 'raw text' and 'machine-readable, parsed-JSON view ... not the markdown view' partially restating the same point, which keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described; the description adds the things the schema cannot express — provenance, freshness, version marker, and the tempting-but-wrong pre-authoring use case. Nothing an agent needs in order 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is no parameter semantics to explain; baseline is 4. The description correctly spends no words on parameters and instead invests in output-format distinctions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Return) plus a precisely scoped resource (the SOP domain's generated JSON Schema, 2020-12 dialect, raw text). It explicitly contrasts itself with the markdown view and names get_sop_template as the sibling for the authoring starting point, so an agent can route correctly without opening either tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use triggers (constraint discovery, structural questions, an unresolved validation error) and an explicit when-not ('never as a mandatory pre-authoring fetch') with the alternative that should be used instead (get_sop_template). Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/sysrs/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/sysrs/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_sysrs(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the entire behavioral burden and does so thoroughly: parse failures return a ParseFailureResult rather than raising, its `error` is byte-identical to the sibling list tool's failed row, invalid ids and path-injection payloads raise ValueError before any file access, and language shape validation and heading-table rejection both occur up front. It even distinguishes raw-variant reads (translation preserved) from parsed-variant reads (canonical headings). Nothing material about failure modes or side effects is left undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core operation is front-loaded and nearly every clause carries real information, but the body is a single dense paragraph of em-dash-chained run-ons that is hard to scan. The ADR identifier and the repeated restatement of the ParseFailureResult error-equivalence add bulk relative to their decision value. Structure is the weak point of an otherwise informative definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter read tool with an output schema, the description supplies everything the agent needs: mode interactions, clamping semantics, failure representation, validation ordering, and cross-tool constraints. Despite the output schema existing, it still characterizes the ParseFailureResult shape, which removes ambiguity about non-raising failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must supply all parameter meaning, and it does: `offset` is 1-based with default 1 and clamps out-of-range (offset > N yields empty string), `limit` defaults through end of body, `raw` toggles frontmatter-stripped verbatim output, `numbered` prepends absolute 1-based line numbers that do not restart under windowing, and `language` defaults to 'en' with variants at docs/sysrs/{language}/. It also states the invalid combinations that raise ValueError.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence gives a specific verb-plus-resource: 'Read, parse, and return a full System Requirements Specification document (frontmatter and body) by its id.' The sibling distinction is implicit but strong, since the raw/numbered/language semantics clearly separate it from list_sysrs and parse_sysrs. An agent can identify the operation and its scope immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is explicit about mode selection (raw=True vs default, numbered only with raw, language variants) and names the ValueError conditions that gate each mode. It also warns about the concrete downstream flows: numbered output must not go into `content` or `edit` `old_str`, and numbers can be fed back into `update`'s `offset`. It stops short of stating outright when to prefer list_sysrs/parse_sysrs instead, which is the only gap.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_schemaGet SYSRS schemaA
Return the SYSRS domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_sysrs_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden and does well: it discloses provenance (generated by `specmgr schema`, refreshed by a pre-commit hook/CI step) and a `$comment` version marker for detecting shape changes. Minor ambiguity in the phrasing 'as raw text -- the machine-readable, parsed-JSON view', which leaves the exact serialized form slightly unclear, costs it a point.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then usage rules, then provenance — a sensible order, with no filler sentences. It is dense with parentheticals and em-dash clauses in a single long paragraph, which slightly reduces scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the description still characterizes the content ($comment layout marker, dialect version) and the freshness guarantee. Nothing an agent needs in order to decide whether to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing to document and the baseline is 4. The description appropriately spends no space on parameter semantics and instead invests in output description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — return the SYSRS domain's generated JSON Schema (2020-12 dialect) — and immediately disambiguates it from the markdown view and from get_sysrs_template. An agent can tell exactly which of the schema/template/example siblings to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete positive triggers (constraint discovery, structural questions, an unresolved validation error) and an explicit negative one ('never as a mandatory pre-authoring fetch'), routing pre-authoring intent to get_sysrs_template. Both when and when-not are stated with the alternative named.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/tsk/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/tsk/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_tsk(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: parse failures return a ParseFailureResult instead of raising, invalid ids and path-injection payloads raise ValueError before file access, unsupported language shape-valid codes raise actionable ValueErrors up front, and invalid parameter combinations (numbered/offset/limit with raw=False) raise ValueError. It also warns that numbered output must be stripped before being reused in content/old_str, which is non-obvious operational guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded, which helps, but the remainder is a single dense block that mixes parameter semantics, error contracts, downstream tool interactions, and an ADR UUID reference. Details such as the error being 'byte-identical ... including the trailing pydantic documentation line' and the cited ADR hash exceed what an agent needs to select or invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still explains the ParseFailureResult shape and the failure-vs-raise contract, plus language-variant parse semantics (canonical heading text on parse, translated text on raw). For a six-parameter tool with variant handling, nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: raw, offset (1-based, default 1), limit (default to end), clamping behavior (offset > N returns empty string), numbered format ('<n>: ', absolute line numbering under windowing), and language ('en' = flat docs/tsk/, other two-letter codes = docs/tsk/{language}/). Only `id` is left without format detail beyond the invalid-id error rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Read, parse, and return a full task list document (frontmatter and body) by its id', and immediately contrasts the raw=True mode as returning 'the frontmatter-stripped body text verbatim'. An agent can distinguish it from list/parse siblings, though it never explicitly names parse_tsk or get_tsk_example/get_tsk_schema, which are the closest alternative reads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: use default mode for structured frontmatter+body, raw=True for verbatim body, numbered=True only with raw=True, and language for non-EN variants. It also routes downstream behavior (numbered line numbers can be fed into update's offset). It lacks an explicit 'enumerate ids with list_tsk first' or 'use parse_tsk if you only want parsing' routing statement.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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_schemaGet TSK schemaA
Return the TSK domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_tsk_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the load, and it does: it discloses the raw-text return form, provenance (`specmgr schema` plus pre-commit hook/CI freshness), and a `$comment` layout-version marker for detecting shape changes. It stops short of stating that calls are read-only/no side effects, which is implied but not declared.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is returned and its format, then the alternative, then usage conditions, then provenance — a logical order with no filler. It is a dense, somewhat run-on sentence chain rather than cleanly separated statements, but every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described; combined with the zero-parameter input, the description covers format, provenance, and usage fully. Nothing an agent needs to call it correctly or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is little semantics to convey beyond the empty argument object, which the schema already covers at 100% coverage. Baseline 4 applies; the description adds nothing further because nothing further is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return) and resource (the TSK domain's generated JSON Schema) plus its exact format (raw text, 2020-12 dialect). It explicitly distinguishes itself from the markdown view and from get_tsk_template, so an agent can separate it from the many sibling schema/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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit positive triggers (constraint discovery, structural questions, an unresolved validation error) and an explicit negative rule (never a mandatory pre-authoring fetch), then routes the alternative case to get_tsk_template. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_txtGet free-form textA
Read, parse, and return a full free-form text 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_txt -- strip the "<n>: " prefix from each line first (it is likewise never a valid edit old_str). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/txt/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/txt/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_txt(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the behavioral burden: it discloses that unparseable documents return a ParseFailureResult instead of raising, that invalid ids and language shape violations are ValueErrors raised before any file access, that out-of-range offset/limit clamp rather than error, and that missing heading tables are rejected up front. It even specifies byte-level error parity with list_txt's failed rows, which is unusually rich disclosure for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior is front-loaded in sentence one, but the remainder is a single dense paragraph of em-dash-nested clauses with an embedded ADR hash, and the ParseFailureResult contract is restated twice (once generally, once for variants). The information earns its place, but the lack of bullet/segment structure makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter read tool with an output schema, the description covers the remaining gaps thoroughly: failure modes, clamping, validation ordering, language variant resolution, and cross-tool contract parity. An agent has everything needed to call it correctly and to interpret a ParseFailureResult; return-value shape is covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must supply all parameter meaning, and it does: id validity rules (path-injection/wrong format), raw's effect on returned payload, offset as 1-based first body line with clamping behavior, limit as line count defaulting through end of body, numbered's exact "<n>: " format and non-restarting numbering under windowing, and language's ISO 639-1 shape plus docs/txt/{language}/ path semantics. Every one of the six parameters gains meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: "Read, parse, and return a full free-form text document (frontmatter and body) by its id," and immediately distinguishes the raw read variant, which separates it from a plain parse/read flow. It also names the sibling it interacts with (list_txt for error-payload parity, update/create_txt for the numbered-output caveat).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete selection rules at the parameter level: raw=True for verbatim body, raw=False for parsed structured model, language variants explained, and explicit prohibitions (numbered only with raw=True, never feed numbered text into content or edit old_str). What it lacks is a direct statement of when to prefer get_txt over parse_txt or get_txt_example/get_txt_schema siblings, so the alternative-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_txt_exampleGet TXT exampleA
Return a complete, valid sample free-form text document as raw markdown -- frontmatter and body -- exercising the free-form body (free H2/H3 headings, a list, a free-floating reference line) and the mandatory ## Updates log with two ordered entries, for use as a learning example.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the disclosure burden. It does state the return format ('raw markdown -- frontmatter and body') and the structural content of the payload, which is genuinely useful. It does not say the operation is side-effect free or that the sample is static, but for a zero-argument retrieval of a canned document those are low-stakes omissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and return format, then the content detail. The dense parenthetical listing is doing real work by telling the agent what the example demonstrates, so nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and zero parameters, the description needn't explain return values, and it nonetheless characterizes the sample's shape. What it leaves out is the relationship to the sibling template, schema, and CRUD tools, which is the one thing an agent might still puzzle over.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline of 4 applies. The description correctly implies nothing is configurable, and the agent need not reason about arguments at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Return a complete, valid sample free-form text document as raw markdown -- frontmatter and body'. It goes further, enumerating the content the sample exercises (free H2/H3 headings, a list, a reference line, a mandatory `## Updates` log with two ordered entries), so an agent knows exactly what will come back. It does not name the neighbouring `get_txt_template` or `get_txt_schema` to draw the contrast, which keeps it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for use as a learning example' implies the intended context, but it is stated as a rationale rather than as an instruction. There is no explicit 'use this when you need to see a valid document' versus 'use get_txt_template when you need a skeleton to fill in'. The distinction from the many sibling example/schema/template tools is left to be inferred from the names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_txt_schemaGet TXT schemaA
Return the TXT domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_txt_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does add real context: provenance (`specmgr schema`), a freshness guarantee (kept current by a pre-commit hook/CI step), and a `$comment` layout-version marker for detecting shape changes. It does not state that the call is side-effect free or discuss size/caching of a full schema document, and the 'raw text' vs 'parsed-JSON view' phrasing is mildly self-tensioned. Solid but not complete for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then disambiguation, then when-to-use, then provenance — a sensible ordering where every clause carries information. It is a single dense, em-dash-heavy paragraph, so it reads as a run-on and would scan better as two or three sentences, but little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema already declaring the return shape, the description supplies exactly the missing pieces: what the artifact is, its dialect, its freshness, and when to reach for it. Nothing an agent needs in order to call it correctly or avoid misusing it is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies no arguments are needed by framing the call as a deterministic fetch of a single known artifact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Return the TXT domain's generated JSON Schema (2020-12 dialect) as raw text') and explicitly bounds it against siblings by naming `get_txt_template` and contrasting the markdown view with the machine-readable one. An agent can distinguish it from `get_txt`, `get_txt_example`, and `get_txt_template` without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete triggering conditions ('constraint discovery, structural questions, or an unresolved validation error') and an explicit exclusion ('never as a mandatory pre-authoring fetch'), plus routes the authoring case to a named alternative. This is the when/when-not/alternative triad done properly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_txt_templateGet TXT templateA
Return a TXT 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 free-form text document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full disclosure burden and does reasonably well: it says the content is placeholder 'blind text', that all body fields are present, and that the output is raw markdown rather than a rendered document. It does not explicitly state that the call is side-effect-free or non-persistent, which a mutation-sensitive agent would want confirmed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and the deliverable, then qualifies the content and format. The parenthetical "('blind text')" is slightly redundant with the surrounding 'short placeholder' phrasing but is not costly enough to warrant trimming criticism.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is trivially simple — no parameters, no nested objects, and an output schema that already documents the return shape. The description covers what the agent needs before calling: what comes back, in what format, and for what purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline applies. Nothing in the description misrepresents the (empty) input contract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: returns a TXT document template as raw markdown, and enumerates what it contains (frontmatter plus every body field with placeholder content). It is clear, but it never explicitly separates itself from the adjacent get_txt_example and get_txt_schema siblings, leaving the agent to infer the distinction from the nouns alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trailing clause 'for use as a starting point when drafting a new free-form text document' gives an implied when-to-use context. There is no explicit exclusion (e.g. 'not for reading existing documents — use get_txt') and no mention of when get_txt_example or get_txt_schema would be the better call, so routing is left partly to inference.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/uc/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/uc/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_uc(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it discloses that parse failures return a ParseFailureResult rather than raising, that invalid ids and path-injection payloads raise ValueError before any file access, that out-of-range offset/limit clamp, and that cross-parameter combinations (numbered with raw=False, coordinates with raw=False) raise ValueError. It also flags the real hazard of feeding numbered text back into content/old_str, which no structured field conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is correctly front-loaded in sentence one and the content is substantive, but the prose is dense and over-stuffed for a read tool: the byte-identical ParseFailureResult claim is made twice (default and variant), the ADR id and the trailing-pydantic-documentation detail add little to tool selection, and the parenthetical '(like offset/limit)' restatements recur. Several sentences could be consolidated without losing behavioral signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter read tool with a language-variant dimension and three distinct failure modes, the description covers what an agent needs: mode selection, windowing, numbering semantics, variant resolution and its pre-access validation, plus the shape of ParseFailureResult. An output schema exists, so the description is not obliged to document success payloads, and the extra error-shape detail is a bonus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across six parameters, so the description must compensate and largely does: raw, offset (1-based default 1), limit (default through end), numbered (with its "<n>: " format and non-restarting numbering), and language (default 'en' vs a lowercase two-letter variant path) are all given semantics the schema lacks. Only `id`'s accepted format is described negatively ('wrong format' → ValueError) rather than positively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Read, parse, and return a full use-case document (frontmatter and body) by its id') and immediately names the sibling behavior it is not (raw body extraction). It also names the related tools an agent might otherwise confuse it with (list_uc, update, create_uc, edit), so it is distinguishable from 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a strong decision rule between the two operating modes (raw=False for the parsed document, raw=True for frontmatter-stripped verbatim body) plus windowing, and explains when numbered output is useful (feeding line numbers back into update's offset). What it does not state explicitly is when to prefer get_uc over list_uc/parse_uc for retrieval — that is left to inference from 'by its id'.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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_schemaGet UC schemaA
Return the UC domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_uc_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly does: it discloses provenance (`specmgr schema` generation, pre-commit/CI freshness) and a `$comment` layout version marker for detecting shape changes. What it omits is failure behavior — e.g., what happens if no UC document exists yet — which is a minor but real gap for an annotation-free tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and return format, then the sibling disambiguation and usage rules. It is dense and slightly run-on across em-dashes, but essentially every clause (dialect, raw text vs markdown, template exclusion, provenance, version marker) conveys actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are covered elsewhere, and the description supplies what the schema cannot: dialect, text-vs-parsed distinction, sibling routing, and generation freshness. Only the error/prerequisite case is unaddressed, which keeps it just short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description correctly adds no parameter noise.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return the UC domain's generated JSON Schema ... as raw text") and explicitly contrasts with both alternatives: the markdown view and get_uc_template. An agent can distinguish this from get_uc_example, get_uc, and get_uc_template without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives named use cases (constraint discovery, structural questions, unresolved validation error) and an explicit exclusion ("never as a mandatory pre-authoring fetch"). This is the when/when-not/alternative pattern at full strength.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided so the description carries the 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the 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.
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.
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.
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.
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.
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). The optional language parameter (default 'en') selects the language variant to read: omitted/'en' = the flat docs/vcr/ document, exactly the default behavior; any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs/vcr/{language}/ (the EN source's exact basename). The language is shape-validated before any file access (a path-injection-shaped payload is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError, also before any file access. A raw=True read of a variant returns the variant's on-disk body verbatim (translation preserved); a raw=False read parses it through the variant's heading table, so the structured model holds canonical heading text. The ParseFailureResult error of a broken variant is byte-identical to list_vcr(language=...)'s failed row for the same file.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| raw | No | ||
| limit | No | ||
| offset | No | ||
| language | No | en | |
| numbered | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it discloses that unparseable documents return a ParseFailureResult rather than raising, that invalid ids and path-injection payloads raise ValueError before any file access, that language is shape-validated and rejects untabled codes up front, and which parameter combinations raise ValueError. It even guarantees error-text byte-identity with list_vcr's failed row, which is unusually precise behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the raw/windowing semantics are front-loaded, which is good, but the description is one dense run-on paragraph with repeated digressions. The byte-identical ParseFailureResult claim is restated three separate times, and an embedded ADR UUID adds length without decision value for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, zero schema coverage, and a mutation-adjacent read surface, the description covers everything an agent needs to call it correctly, including failure modes and the numbered-output pitfall. An output schema exists, so the description is not obliged to explain return shapes further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all six parameters, and it does: `offset` is 1-based and clamps out-of-range, `limit` defaults to end-of-body, `numbered` uses an unpadded `"<n>: "` prefix that continues from the clamped offset, and `language` defaults to 'en' with a documented variant path layout. Only `id` is left thin (format is only described negatively, as "wrong format" raising ValueError).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb pair and resource: "Read, parse, and return a full verification case record document (frontmatter and body) by its id." It is immediately distinguishable from sibling list_vcr (enumeration), parse_vcr (parsing only), and the read-style variants of 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly routes parameter choices: raw=True for the verbatim body, raw=False for the parsed model, offset/limit only with raw=True, numbered only with raw=True, and language for translated variants. It also warns that numbered output must not be fed back into `update`/`create_vcr` `content` or `edit` `old_str`, which is genuine anti-pattern guidance. The one gap is that it never explicitly contrasts the tool with parse_vcr for the same record, leaving that sibling choice implicit.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, 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.
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.
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.
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.
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.
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_schemaGet VCR schemaA
Return the VCR domain's generated JSON Schema (2020-12 dialect) as raw text -- the machine-readable, parsed-JSON view of the document structure, not the markdown view (call get_vcr_template for the authoring starting point). Fetch it for constraint discovery, structural questions, or an unresolved validation error -- never as a mandatory pre-authoring fetch. Generated by specmgr schema and kept current by a pre-commit hook/CI step; includes a $comment schema-layout version marker for detecting a shape change without diffing the whole document.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does well: it discloses that the schema is generated by `specmgr schema`, kept current by a pre-commit hook/CI step, and includes a `$comment` layout-version marker. It does not explicitly state read-only/side-effect behavior or access requirements, but the retrieval nature and provenance are clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: the return value comes first, then the differentiation from `get_vcr_template`, then usage guidance, then provenance/freshness details. Every sentence adds operational value, including the version-marker note for detecting schema shape changes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema, the description provides enough context to select and invoke it correctly: it names the returned artifact, dialect, format, provenance, freshness mechanism, and intended use cases. Return-value details are backed by the output schema, so no further description of response shape is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema describes none, so parameter semantics are not a source of ambiguity. The description appropriately focuses on the returned resource rather than adding parameter detail that does not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it returns the VCR domain's generated JSON Schema as raw text. It explicitly distinguishes this machine-readable schema view from the markdown/authoring starting point by naming `get_vcr_template` as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: constraint discovery, structural questions, or an unresolved validation error. It also gives an explicit when-not-to-use rule: never as a mandatory pre-authoring fetch, and routes authoring to `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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does real work: it discloses the configured base directory, the default page size of 25, a hard cap of 100, and that out-of-range values are clamped rather than errored. It does not state result ordering, whether non-ADR files in the directory are skipped, or the read-only/no-side-effect guarantee explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with no filler; the payload and scope come first, then the ref caveat, then paging limits. Every clause conveys information an agent needs before calling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is correctly omitted, and the description covers the two real risks of a paged list tool: page sizing and out-of-range behavior. Missing only minor operational context such as sort order and how to detect that more pages remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: both parameters are described as paging controls with a stated default (25) and cap (100) plus a clamping rule. It still doesn't say whether offset is 0-based or counted in records versus pages, and the nullable/default-null typing is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the exact payload (ids, titles, statuses, refs), the source (ADRs in SPECMGR_ADR_DIR), and the paging nature ('one page at a time'), which unambiguously separates it from get_adr. It also pre-empts a likely confusion by defining 'ref' as an opaque identifier rather than a filename.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for use ('for context before addressing one by id') and explicitly routes the agent to get_adr when it has a ref instead of an id. It stops short of stating any when-not condition (e.g., repos too large to enumerate, or when the id is already known and a direct get_adr would be cheaper).
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/dec/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/dec/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses validation-ordering (shape-checked before any file access), two distinct ValueError paths including the missing heading-mapping table, clamping rather than erroring on out-of-range paging, and the page-size default and 100 cap. It stops short of describing ordering of results or the response envelope, but the output schema covers the latter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return fields, and no sentence is filler, but the language clause is a dense multi-clause run-on with nested parentheticals that would read faster as a short bulleted breakdown. Slightly overlong for a four-parameter list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with a rich description and an output schema, nothing an agent needs in order to call it correctly is missing: when to use it, how refs differ from ids, directory scoping, filtering, paging, and failure modes are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely and it does: `glob` is case-insensitive on id, glob=None lists everything, empty string matches nothing; `language` is an ISO 639-1-shaped lowercase code selecting a directory; `max_results`/`offset` default to 25 and are clamped at 100 rather than errored. Every one of the four parameters gains meaning not present in the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the returned fields ("Ids, titles, statuses, and refs of decisions in the configured decision base directory") and immediately positions itself against the by-id sibling: "for context before addressing one by id." An agent can distinguish list_dec from get_dec and parse_dec without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the triggering scenario (survey the base before addressing one by id) and routes the 'ref' case explicitly to get_dec. It also sets the boundary conditions for `language` (omitted/'en' = flat docs/dec/, other code = that language's subdirectory), and pre-empts a common wrong assumption by declaring there is deliberately no 'all languages' mode.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so 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.
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.
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.
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.
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.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/gol/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/gol/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: paging defaults (25, capped at 100), tolerated out-of-range values (clamped, not errored), glob semantics including case-insensitivity and the empty-string edge case, and the two distinct validation failure modes for `language` (shape check before file access, missing heading-mapping table rejected up front). This is unusually rich disclosure of errors and limits for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and nearly every clause carries real information, but it is delivered as one dense run-on paragraph with nested parentheses and backticked terms, making it hard to scan. Phrases like 'the default behavior, unchanged' and 'there is deliberately no ... mode' edge toward editorializing, and bullets or short segmented sentences would deliver the same facts more efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value format need not be explained, yet the description still names the returned fields and covers paging, filtering, and both validation failure paths. The only residual gap is that ordering of results and what an empty page looks like relative to the clamping behavior are not stated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does for all four parameters: glob (semantics, case-insensitivity, None vs empty string difference, example), offset and max_results (default page size 25, 100 cap, clamping), and language (default 'en', which directory is scanned, ISO 639-1 shape, validation behavior). The subtle None-vs-empty-string distinction is exactly the kind of meaning a bare schema cannot convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the exact fields returned ('Ids, titles, statuses, and refs of goals in the configured goal base directory'), and explicitly separates itself from get_gol by saying the 'ref' is an identifier to pass to get_gol rather than a filename. An agent can distinguish list_gol from the many sibling list_*/get_* tools without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear motivating context ('for context before addressing one by id') and names the follow-up tool for ref-based retrieval (get_gol), plus states that there is deliberately no 'all languages' mode so the agent won't hunt for one. It stops short of contrasting with other list_* siblings or saying when not to list at all (e.g. when an id is already known).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_languagesList the languages an artifact exists inA
Read-only. Report the language codes one artifact currently exists in. type is one of req, uc, tsk, qa, prb, gol, rsk, dec, sop, vcr, sysrs, txt (feat and adr documents are always English and are rejected with a ValueError) and id the artifact's id, shared by every language variant. Returns a LanguageListResult: languages -- 'en' first when the EN source exists (it is never invented: an id with variants but no EN source lists no 'en'), then every other language holding a variant, sorted by code -- and one entries row per language with language, path (the resolved absolute file path), parseable, and error; a variant that exists but fails to parse is listed with parseable=false and the parse error (byte-identical to the domain's list_/get_ failure text for that file), never dropped and never raised. Only .md documents under docs/{type}/ (EN) and docs/{type}/{language}/ participate; non-.md siblings and directory names that are not a two-letter lowercase language code are ignored. An id that exists in no language raises the domain's own not-found error; an unknown type or a path-injection/wrong-format id is a ValueError raised before any file access. It writes, creates and invalidates nothing. To translate use the translate_artifact prompt; to compare a variant with its source use check_translation_drift.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| type | Yes | |
| entries | Yes | |
| languages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden and meets it: it declares read-only status twice ('It writes, creates and invalidates nothing'), specifies that unparseable variants are listed with parseable=false and never raised or dropped, and distinguishes the error classes (domain not-found vs. ValueError before any file access). It also discloses scoping rules for what files participate, which an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the essential statement and the return semantics follow a logical order. However, it is a single dense paragraph in which the parameter rules, file-scoping rules, and error taxonomy are packed together, so it could be broken up for scanability without losing any content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with an output schema and no annotations, nothing an agent needs is missing: invocation preconditions, failure modes, and the non-obvious 'en is never invented' rule are all stated. The return-value prose partly overlaps the output schema, but it adds semantics the schema cannot express.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema's property titles are bare 'Id' and 'Type', so the description must compensate, and it does: it enumerates the accepted type codes, singles out the two that are rejected with ValueError (feat and adr), and explains that `id` is shared by every language variant. That is meaning well beyond the enum in the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Report the language codes one artifact currently exists in.' That is clearly distinguishable from the dozens of sibling list_<type> tools, which enumerate artifacts rather than variants of one artifact, and it explicitly routes comparison work to check_translation_drift.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names two alternatives with the condition that selects each: 'To translate use the translate_artifact prompt' and 'to compare a variant with its source use check_translation_drift.' That is clear routing rather than just context. It never states the inverse exclusion (for example, that this is the prerequisite call before translating), so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/prb/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/prb/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
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 so well: it documents paging defaults and caps, that out-of-range values are clamped rather than errored, and that invalid language shapes and unbacked languages produce ValueErrors before any file access. The one meaningful omission is result ordering — for a paginated list, an agent cannot tell whether offset pages are stable or what the sort key is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is correctly front-loaded and nearly every clause is load-bearing, but the remainder is delivered as one long semicolon-chained paragraph with nested parentheticals, which pushes it toward reference-manual density. Splitting the glob, paging, and language semantics into discrete structure would preserve the content while improving scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-field documentation is not required, and the description covers the remaining surface: all four parameters, the default directory behavior, the language subdirectory behavior, and the error paths. For a filtered, paginated listing tool that is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must do all the work, and it does: glob is explained with syntax example, case-insensitivity, and the non-obvious boundary cases (None lists all, empty string matches none); offset/max_results get defaults and the 100 cap with clamping; language gets its default, its directory-mapping semantics, and its validation rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Ids, titles, statuses, and refs of problem statements'), states the scope ('in the configured problem statement base directory'), and immediately distinguishes the tool from get_prb by explaining that a 'ref' must be resolved via get_prb rather than read from disk. An agent can tell what this returns and what it does not without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the use case ('for context before addressing one by id') and routes the agent to the correct sibling for the one gap it creates: refs must go through get_prb. It also closes off a plausible wrong assumption by noting there is deliberately no 'all languages' mode, and explains when to omit language versus when to pass a code.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/qa/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/qa/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses clamping instead of erroring on out-of-range paging, that an invalid-shaped language or one lacking a heading-mapping table raises an actionable ValueError, and that there is deliberately no 'all-languages' mode. The main omission is result ordering and whether the listing is a pure read, which is only implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return fields, then parameter behavior in descending importance. It is dense and runs as one long block, and a couple of parenthetical asides (e.g. 'the default behavior, unchanged') could be trimmed, but nearly every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter listing tool with an output schema, the description covers purpose, filtering, paging, language scoping, and error behavior – everything an agent needs to invoke it correctly without trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does for all four parameters: glob semantics (case-insensitive, extensionless refs excluded, None lists all, empty string matches nothing), offset/max_results (default page size 25, capped at 100, values clamped not errored), and language (default 'en', ISO 639-1 shape validation, subdirectory selection, rejection of unsupported languages).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource plus the returned fields ('Ids, titles, statuses, and refs of QA documents'), and explicitly separates itself from get_qa ('for context before addressing one by id' / 'use it with the get_qa tool instead'). An agent can distinguish this from get_qa and the create/parse siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case (gather context before fetching a single document by id) and routes ref-holders to get_qa. It does not state explicit exclusions or contrast with list-style siblings such as list_req/list_languages, but the context in which to reach for it is unambiguous.
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, txt) 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/TXT, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| offset | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the scan algorithm (frontmatter-stripped body, tag vocabulary, separators, case-insensitivity), dedupe order, per-row resolution against disk, and the exact failure contract (unresolvable reference yields null title/path plus an error string and never raises; invalid id raises ValueError before file access; missing source raises XNotFoundError). Paging clamping behavior is also stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is well front-loaded, but the rest is two enormous run-on sentences with nested parentheticals that are hard to parse on first read. The enumerated 14-value type list duplicates the enum already present in the schema, costing space without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter read tool with no annotations, the definition covers inputs, algorithm, dedupe/ordering, per-row failure handling, and paging limits. Return structure is described even though an output schema exists, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and it does: `type` is defined as the source document's own domain, `id` as the source's own identifier (with format/injection validation semantics), and max_results/offset get defaults (25), a cap (100), and clamping rather than erroring. That is meaningful semantics the bare schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: "Cross-references of one source document, resolved and paged." An agent immediately knows this is not a document fetch (get_*) nor a corpus-wide search, and the scan/resolve behavior distinguishes it from link-oriented siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by "of one source document" and the required type/id pair, and the error contract tells the agent what happens on bad input. But there is no explicit when-to-use guidance and no routing against nearby siblings such as find_related or get_reference_diagram, so the agent must infer which tool surfaces which relationship view.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/req/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/req/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: paging defaults (25, capped at 100), clamping rather than erroring, glob case-insensitivity and the None vs empty-string distinction, language directory behavior with no 'all languages' mode, and two distinct ValueError conditions with validation ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the useful core (what is returned, paging) before the ref/language caveats. Dense but tightly packed into a few long sentences; the language sentence in particular could be split or trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return shape need not be described. For a 4-parameter read tool with error-prone glob and language options, the definition covers defaults, edge cases, error behavior, and cross-tool handoff completely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet every parameter is given meaning beyond its name: glob semantics and examples, max_results/offset paging and clamping, and language selecting docs/req/ vs docs/req/{language}/ with shape validation and heading-table rejection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Ids, titles, statuses, and refs of requirements'), names the base directory, and immediately separates itself from get_req by explaining that 'ref' is an identifier for use with that tool rather than something to read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('for context before addressing one by id') and routes the ref case to get_req. It does not explicitly compare itself against sibling list_* tools or say when to prefer parse_req, but the resource scope is unambiguous.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/rsk/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/rsk/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden and does so well: it discloses paging semantics (default 25, cap 100, clamping instead of erroring), case-insensitive glob matching, that an empty string matches nothing, and that invalid-shaped languages or missing heading-mapping tables raise ValueError before any file access. It does not mention permission requirements or whether reads are side-effect free, which leaves a small gap for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return fields before the parameter detail, and nearly every clause adds information. It is a single dense run-on block, though, and asides like 'there is deliberately no "all languages" mode' and '(the default behavior, unchanged)' add length without much decision value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four undocumented-in-schema parameters, no annotations, and moderate complexity, the description covers behavior, filtering, paging, language directory selection, and error conditions. An output schema exists, so the absence of a return-format section is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet the description defines all four parameters: glob (pattern semantics, None default, empty-string edge case, case-insensitivity), max_results/offset (paging, defaults, cap, clamping), and language (default 'en', which directory it selects, shape validation, and the absence of an 'all languages' mode). This is more than the schema provides and fully compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('list ... risks') plus the exact fields returned (ids, titles, statuses, refs, zone levels, TARA strategy, scope, residual coordinates) and the scoping ('configured risk base directory, one page at a time'). It also distinguishes itself from the sibling get_rsk by positioning 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.
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 explicitly routes the opaque 'ref' identifier to get_rsk rather than disk access. It explains when to use the glob filter and when to use the language parameter, but stops short of explicit when-not-to-use guidance or naming list_rsk's relationship to parse_rsk/list_languages.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/sop/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/sop/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full behavioral burden and does so: default page size 25, cap at 100, out-of-range values clamped rather than errored, and validation ordering (language shape-validated before any file access, missing heading-mapping table rejected up front). It also discloses that an invalid-shaped language raises ValueError 'like an invalid id', which is exactly the failure-mode detail an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the get_sop hand-off are front-loaded, and every sentence adds distinct information. The single semicolon-chained paragraph is dense and would scan better split by parameter or bulleted, but there is no padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, paging, filtering, error behavior, and per-language directory semantics for a 4-parameter read tool. Return values need not be described because an output schema exists, so the remaining surface an agent needs before calling is fully covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and does for all four parameters: glob (case-insensitive id match, example 'dead*', glob=None vs empty string matching nothing), offset/max_results (paging with defaults and clamping), and language (default 'en' = flat docs/sop/, other ISO 639-1 codes = docs/sop/{language}/). This is substantially more than the bare schema types convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource and enumerates what is returned ('Ids, titles, statuses, and refs of Standard Operating Procedures'), scoped to the configured SOP base directory. It immediately differentiates the listing from the by-id retrieval path by naming get_sop for opaque 'ref' handles.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context ('for context before addressing one by id') and routes the 'ref' case to the get_sop sibling instead. It also rules out an 'all languages' mode and explains per-language scoping, but never states a positive when-not-to-use case (e.g. when parse_sop or get_sop is preferable for bulk content).
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/sysrs/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/sysrs/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: paging defaults (25, cap 100), clamping rather than erroring on out-of-range values, glob matching being case-insensitive with None=all and empty=none, and validation ordering for language (shape-checked before file access, rejected if no heading table). This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is returned and why, then documents parameters in sequence. It is dense rather than padded, though a few clauses are repetitive (e.g. restating the default/'unchanged' behavior for 'en').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be explained; the description covers paging, filtering, language routing, and error conditions for a 4-parameter list 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.
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: glob semantics (case-insensitive, default None lists all, empty string matches nothing), max_results/offset paging behavior, and language's default 'en' plus directory-routing and validation rules. Every parameter is given meaning beyond its bare type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (System Requirements Specifications), the fields returned (ids, titles, statuses, refs), and the scope (configured base directory, one page at a time). It also implicitly separates itself from get_sysrs by noting refs are for 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use rationale ('for context before addressing one by id') and routes the agent to get_sysrs for ref-based retrieval. It also clarifies alternatives for language selection (no 'all languages' mode). Lacks an explicit when-not list, but the guidance is strong.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/tsk/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/tsk/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it discloses paging defaults (25, capped at 100), that out-of-range values are clamped rather than errored, that glob matching is case-insensitive and empty string matches nothing, and that invalid language shapes or unsupported languages raise ValueError before any file access. This is unusually rich behavioral disclosure for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded and every sentence carries information. It is dense and slightly overstuffed with parenthetical asides such as '(the default behavior, unchanged)', which could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers scope, paging, filtering, language selection, and 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.
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 four parameters: glob (case-insensitive, None default, empty-string semantics, 'dead*' example), offset/max_results (default 25, cap 100, clamping), and language (default 'en', flat docs/tsk/ vs docs/tsk/{language}/, no all-languages mode, shape validation). This adds far more meaning than the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Ids, titles, statuses, and refs of task lists') plus scope ('in the configured task list base directory, one page at a time') and explicitly frames its role relative to get_tsk ('for context before addressing one by id'). An agent can distinguish it from get_tsk and from sibling list_* tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case ('for context before addressing one by id') and routes opaque 'ref' values to the get_tsk tool, naming the alternative explicitly. It does not spell out when-not to use it (e.g., when you already have the id), but the practical routing guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_txtList free-form text documentsA
Ids, titles, statuses, and refs of free-form text documents in the configured free-form text 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_txt tool instead. An optional glob pattern (e.g. 'dead*') filters the listing to the free-form text 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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/txt/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/txt/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses paging defaults (25, capped at 100), that out-of-range values are clamped rather than errored, that invalid-shaped language codes raise ValueError before any file access, and that a shape-valid language lacking a heading-mapping table is rejected up front. It doesn't explain sorting order or what 'statuses' actually mean, which keeps it just shy of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The listing behavior is front-loaded and most sentences earn their place, but the language sentence is dense and repeats itself ('omitted/'en' = the flat docs/txt/ directory (the default behavior, unchanged)'). The parenthetical redundancies and nested clauses make it slower to parse than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is correctly omitted, and the description covers everything else the agent needs for a filtered, paginated, language-scoped list: filtering semantics, paging limits, error conditions, and the ref-handoff to get_txt. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: glob is case-insensitive against ids with an example ('dead*'), None lists everything, and empty string matches nothing; max_results/offset have defaults, caps, and clamping semantics; language has a default, an ISO 639-1 shape constraint, and a precise directory-mapping rule. This is meaning the schema cannot convey on its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Ids, titles, statuses, and refs of free-form text documents in the configured free-form text base directory') and immediately distinguishes itself from the sibling get_txt, which retrieves a single document by id. An agent can tell list_txt apart from get_txt, list_languages, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended use case ('for context before addressing one by id') and names the alternative explicitly: opaque 'ref' values must be passed to get_txt rather than treated as filenames. It also covers the default behavior (glob=None lists everything) and the deliberate absence of an 'all languages' mode, leaving little to infer.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/uc/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/uc/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so well: it discloses paging defaults and cap, clamping rather than erroring on out-of-range values, case-insensitive glob matching, and up-front ValueError behavior for invalid or unsupported language values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, starting with the purpose and the ref caveat before covering parameters. It is a single long paragraph with some heavy sentences, but every sentence adds operational meaning and nothing is obviously redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter listing tool with an output schema, the description supplies the missing operational context: ref handling, paging, filtering, language directory selection, and validation failure modes. An agent can call it correctly without opening the schema or making unsafe assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it explains all four parameters: glob's case-insensitive matching and null/empty-string semantics, max_results/offset paging defaults and clamping, and language's default, directory selection, and validation behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it lists ids, titles, statuses, and refs of use cases from the configured use-case base directory. It explicitly frames the listing as context before addressing an item by id and names get_uc as the follow-up tool, distinguishing it from sibling readers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says when to use the tool ('for context before addressing one by id') and routes the opaque ref identifier to get_uc instead of treating it as a filename. The glob, paging, and language behaviors are explained with concrete conditions, including that there is deliberately no 'all languages' mode.
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. The optional language parameter (default 'en') selects the directory scanned: omitted/'en' = the flat docs/vcr/ directory (the default behavior, unchanged); any other ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = only that language's docs/vcr/{language}/ subdirectory, listing exactly the existing variants of that language (there is deliberately no 'all languages' mode). The language is shape-validated before any file access (an invalid-shaped value is a ValueError, like an invalid id), and a shape-valid language without a packaged heading-mapping table is rejected up front with an actionable ValueError.
| Name | Required | Description | Default |
|---|---|---|---|
| glob | No | ||
| offset | No | ||
| language | No | en | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| offset | Yes | |
| results | Yes | |
| truncated | Yes | |
| error_count | No | |
| max_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: default page size 25, cap 100, out-of-range values clamped rather than errored, and ValueError behavior for invalid-shaped language or a language lacking a heading-mapping table. It stops short of describing ordering of results or what an empty listing looks like, which is a minor gap rather than a serious one.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope before the parameter detail, and nearly every clause carries operational information. It is a single dense paragraph with nested parentheticals, so it is heavier to parse than it needs to be, but nothing is redundant enough to cut outright.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still names the returned fields, and it fully covers the four undocumented parameters plus the error paths an agent would otherwise hit blind. For a list tool with four optional params and no annotations, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely, and it does: glob gets matching semantics, case-insensitivity, a concrete example ('dead*'), and the None-versus-empty-string behavior; max_results/offset get defaults, a cap, and clamping semantics; language gets its default, shape validation, and exact directory effect. Each parameter's behavior is disambiguated in ways the bare schema could not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the exact fields returned ('Ids, titles, statuses, and refs of verification case records') and immediately scopes it as paginated context gathering rather than retrieval. It also distinguishes itself from get_vcr by explaining that 'ref' is an opaque identifier to be resolved with that sibling, not a filename.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case ('for context before addressing one by id') and routes the agent to get_vcr for ref-based lookups. It also pre-empts a likely wrong turn by stating there is deliberately no 'all languages' mode, and spells out the glob filter's matching rules including the None vs empty-string distinction.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does 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.
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.
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.
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.
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.
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, returning its assigned full title.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| value | Yes | ||
| partial_title | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the operation appends and returns the assigned title, but says nothing about required ADR state, duplicate handling, ordering, side effects, or error behavior for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is a single front-loaded sentence with no wasted wording. It states the mutation and its return value immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with no annotations and 0% schema description coverage, the description is too thin. The output schema covers the return value, but the description does not compensate for the missing parameter and behavioral context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not define id, value, or partial_title. It only hints at partial_title through the phrase 'returning its assigned full title,' leaving the two other required parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and target: append a new 'Option N: ...' sub-section and return its assigned full title. That distinguishes it from sibling operations such as option_update, option_delete, and option_list without needing to inspect their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies use when creating an option, but gives no explicit when-to-use guidance, no exclusions, and no comparison to alternatives like option_update or create_adr. The agent must infer the usage context 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.
option_deleteDelete ADR OptionC
Remove the option named full_title, returning the remaining full titles.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| full_title | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the return shape (remaining full titles). But for a destructive, irreversible operation it says nothing about permission requirements, whether deletion can be undone, or what happens if the named 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Its brevity is appropriate structurally, even if the content is thin.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be spelled out, yet the description still omits parameter meaning, destructive-operation semantics, and error conditions for a two-parameter mutation tool with zero annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names full_title as the option selector but never explains that id identifies the parent ADR, nor what format either value takes, leaving half the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (option), and identifies the selection key as full_title, which distinguishes it from option_create, option_update, option_list and option_read. It does not, however, clarify the relationship between the ADR-level id and the option-level full_title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to delete versus option_update or the generic delete sibling, and no prerequisites or warnings about when deletion is inappropriate. The agent is left to infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
option_listList ADR OptionsC
Full titles of every current 'Option N: ...' sub-section, in document order.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses document ordering, which is useful, but does not say whether this is read-only, what happens if the id is missing, or what the caller should expect beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. It is concise, though its brevity contributes to the missing parameter and usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need less exposition. However, for a tool requiring an ADR id with no annotations and no schema descriptions, the description should at least identify the target ADR and its relationship to option_read and list_adr.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, id, has 0% schema description coverage and is not mentioned in the description. The description leaves unclear which ADR document the id identifies or how the id is used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that it returns the full titles of every 'Option N: ...' sub-section in document order. The listing verb is implied by the tool name and the phrasing, but the description never explicitly says these are ADR options or names the ADR being queried.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use option_list versus sibling tools such as option_read, list_adr, get_adr, or option_create. The listing intent is implied, but no alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
option_readRead ADR OptionC
Return the current content of the option named full_title.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| full_title | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. Stating that it returns the current content implies a read-only operation, but it does not disclose what happens if the option is missing, whether permissions are required, or other behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is efficient, though its brevity contributes to gaps in parameter and usage explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two required parameters, 0% schema description coverage, and no annotations, the description is too sparse. It explains only full_title and leaves id undocumented, which is insufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions full_title as the name of the option but does not explain the required 'id' parameter at all, leaving a significant gap for an agent trying to invoke the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and resource ('current content of the option named full_title'), making the read operation clear. It does not explicitly distinguish itself from sibling tools like option_list or option_update, but the purpose is still understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as option_list or option_update. Usage is only implied by the word 'Return', with no exclusions or prerequisites stated.
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, returning the new content.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| value | Yes | ||
| full_title | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden. 'Full-content replace' is genuinely useful: it warns that existing content not included in the call will be lost, and 'returning the new content' discloses the response. But it says nothing about which document is mutated, whether the option must already exist, or what happens if full_title does not match an existing option.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the destructive 'Full-content replace' fact is stated first, which is the right ordering for a write operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, but for a 3-parameter mutation tool with zero annotation coverage and zero schema descriptions, the description leaves the role of 'id', the target document, and the precondition that the named option exist all unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely does not. It identifies full_title as the option name, but 'id' is entirely unexplained (ADR id? option id?) and the meaning of 'value' as the replacement content is only hinted at via 'returning the new content', which describes the return value rather than the input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and effect ('Full-content replace') applied to a specific resource ('the option named full_title'), which is enough to tell it apart from option_create/option_delete/option_read and from update_section/update_frontmatter. It stops short of 5 because it never says which document/parent the option belongs to, so 'option' remains abstract.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance, and no reference to the obvious alternatives (option_create, option_delete, edit, update_section). The agent is left to infer that this is the mutation counterpart of option_read purely from the name.
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(). The file's language is derived from its path position relative to the decision base directory: a file in the flat docs/dec/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/dec/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full load and does so exceptionally: a parse failure returns a non-raising ValidateResult with valid=False and a 300-char-capped error message instead of raising AssertionError/ValidationError/YAMLError, while an absent or unreadable path still raises FileNotFoundError/PermissionError/OSError from Path.read_text(). It also discloses that language is derived from the file's path position, including the actionable ValueError when no mapping table exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first clause, which is good, but the remainder is one dense run-on paragraph loaded with ADR UUIDs, feat-110, GitHub issue #204, and 'case 5 of the ADR ... workaround chain' — provenance noise an agent gains nothing from. The behavioral rules are valuable; the references around them are not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the description still covers the two things the schema cannot: failure semantics (non-raising ValidateResult vs OSError family) and language-derivation rules from path position. For a one-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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage — 'path' is just a bare string — but the description compensates by explaining that the path's position relative to the decision base directory determines parsing behavior (flat docs/dec/ = canonical, docs/dec/{language}/ = mapped, anything else = canonical). That adds genuine semantics beyond the schema, though the base-directory value itself is never stated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a precise verb+resource ('Parse a decision markdown file (YAML frontmatter + body) from disk') and names the concrete return type, DecDocument, so the agent knows exactly what the tool produces. It stops short of explicitly distinguishing itself from parse-siblings or from get_dec/list_dec, which keeps it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus get_dec, list_dec, or validate, all of which appear in the sibling list. The single mention of the 'validate tool' is about error-message capping, not about choosing between the two tools. Usage must be inferred from the purpose sentence alone.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well. It explicitly states that parse failures on an existing file return a non-raising ValidateResult with valid=False and a capped error message, while absent or unreadable paths raise OSError-family exceptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and remains compact at two sentences. The second sentence is dense with internal ADR/issue identifiers that do not help an agent invoke the tool, but the actionable behavioral details are still present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not detail return values. It covers the key contextual gaps: success behavior, non-raising parse failure behavior, and file-access exceptions for missing or unreadable paths.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single path parameter, so the description must compensate. It clarifies that the parameter is a disk path to a feature markdown file and distinguishes existing-file parse failures from truly absent or unreadable paths, though it does not specify absolute versus relative path conventions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: parse a feature markdown file from disk into a FeatDocument. It clarifies the source (disk path) and output type, which distinguishes it from retrieval-oriented siblings like get_feat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: it parses an existing feature markdown file from disk. It does not explicitly name alternatives such as get_feat or validate as when-to-use choices, but the file-based operation is clear from the wording.
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(). The file's language is derived from its path position relative to the goal base directory: a file in the flat docs/gol/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/gol/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so thoroughly: an existing-but-invalid file returns a non-raising ValidateResult with valid=False and an errors[].message capped at 300 chars, while an absent or unreadable path still raises the OSError family from Path.read_text(). That is exactly the raise-vs-return distinction an agent needs to write correct error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and every functional sentence earns its place, but the commit/ADR/issue citations ('feat-110', 'ADR f14f125e-eaad-4f4f-a6fd-3c931bed726e, GitHub issue #204 -- case 5 of the ADR 519d1206 ... chain') add traceability noise an agent cannot act on. The content is also delivered as one dense paragraph rather than separated behavior, error, and language-resolution statements.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still characterizes the success and failure return shapes, and it fully covers path-driven language resolution for a single-parameter tool. The remaining gap is minor but real: nothing states what the path is relative to or whether it must include the .md extension.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single `path` parameter, so the description must compensate, and it does: it explains that language resolution depends on the path's position relative to the goal base directory (flat docs/gol/ = canonical, docs/gol/{language}/ = that language's table, anything else = canonical) and that a missing table yields an actionable ValueError. It stops short of saying whether the path is absolute or relative to the base directory, which is the one ambiguity left.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Parse a goal markdown file ... from disk') and states the concrete output type ('structured GolDocument'), which separates it from siblings like get_gol, list_gol, and create_gol without opening any schema. The parenthetical '(YAML frontmatter + body)' further pins down what is being parsed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool for turning an on-disk goal file into a model object, but the description never states when to prefer it over get_gol or list_gol, nor any prerequisite such as the file needing to exist. The error-behavior sentences describe outcomes rather than selection criteria.
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(). The file's language is derived from its path position relative to the problem statement base directory: a file in the flat docs/prb/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/prb/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly: parse failures return a non-raising ValidateResult with valid=False and a 300-char error message, absent/unreadable paths still raise the OSError family from Path.read_text(), and a missing language table yields an actionable ValueError. This is far more than the schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The failure-mode contrast is front-loaded and information-dense, but internal references (feat-110, ADR UUIDs, issue #204, 'case 5 of the ... workaround chain') add noise an agent cannot act on. Removing that parenthetical would improve it without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter parse tool with an output schema present, the description covers what is parsed, what is returned on success and failure, which exceptions propagate, and how path layout changes parsing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'path' parameter has no schema description (0% coverage), and the description compensates well by explaining that the path's position relative to the problem statement base directory determines the language and heading-mapping behavior (flat docs/prb/ vs docs/prb/{language}/ vs anywhere else).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: parse a problem statement markdown file (YAML frontmatter + body) from disk into a PrbDocument. This clearly separates it from get_prb/list_prb/create_prb, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'from disk' versus the get_/list_ siblings, but there is no explicit statement of when to call this instead of get_prb or the generic validate tool. No exclusions or preconditions are given for the success path, only for failure modes.
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(). The file's language is derived from its path position relative to the QA document base directory: a file in the flat docs/qa/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/qa/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it discloses that parse failures return a non-raising ValidateResult (valid=False, errors[].message capped at 300 chars) while missing or unreadable paths still raise FileNotFoundError/PermissionError/OSError. That is exactly the kind of failure-mode detail an agent needs before calling. It stops short of stating whether the parse has any side effects (read-only assumption 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single paragraph is front-loaded with the core action and error contract, which is good, but it is freighted with internal traceability noise — feat-110, an ADR UUID, GitHub issue #204, 'case 5 of the ADR 519d1206 ... chain' — that costs an agent tokens without changing how it calls the tool. The language-derivation clause is valuable but buried at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema, the definition covers what an agent needs: what it parses, where the file must live, how language selection works, and which failure modes raise versus return a result. Only minor gaps remain, such as whether repeated parses are idempotent and any implicit read-only guarantee.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it explains that the path's position determines behavior — flat docs/qa/ parses canonical, a two-letter docs/qa/{language}/ subdirectory applies that language's heading-mapping table, and an unsupported language raises an actionable ValueError. That meaning is entirely absent from the bare {path: string} schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Parse a QA document markdown file (YAML frontmatter + body) from disk') and names the resulting type, QaDocument. The 'from disk' framing implicitly separates it from repo-reading siblings like get_qa/list_qa, but it never names an alternative explicitly, so the sibling distinction is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this tool is for turning an on-disk QA markdown file into a model object. There is no explicit 'use this instead of get_qa' or 'use validate for X' guidance, and no stated prerequisites or when-not-to-use conditions.
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(). The file's language is derived from its path position relative to the requirement base directory: a file in the flat docs/req/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/req/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description carries much of that burden. It spells out error semantics: a non-raising ValidateResult on parse failure, a 300-char error cap, and OSError-family raises for missing or unreadable paths. It also explains how language is resolved from path position, including the ValueError case. It does not explicitly state that the tool is read-only and has no side effects, though 'parse' strongly implies that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is a dense run-on sprinkled with internal references (ADR UUIDs, GitHub issue #204, feat-110, 'case 5 of the ADR 519d1206 ... workaround chain') that add nothing for an agent. The purpose is front-loaded, but much of the rest is noise mixed in with useful behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool that has an output schema, it covers the return types, the error paths and the language-resolution logic thoroughly. The main gaps are differentiation from siblings and the format or base of the path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the single 'path' parameter has no schema description. The description compensates partly by saying it is a file on disk and by explaining how its location under docs/req/ or docs/req/{language}/ affects parsing. It leaves unclear whether the path is absolute or relative and what it is relative to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb and resource: it parses a requirement markdown file (YAML frontmatter + body) from disk into a structured ReqDocument. It does not say how this differs from siblings like get_req or validate, which likely overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use parse_req instead of get_req, which probably fetches by ID, or validate. The error-handling detail implies some use, but it never gives explicit when or when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_rskParse riskA
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(). The file's language is derived from its path position relative to the risk base directory: a file in the flat docs/rsk/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/rsk/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it specifies the successful return type, the non-raising ValidateResult on an existing unparseable file, the 300-character error message cap, and the OSError-family exceptions for absent or unreadable paths. It also discloses the ValueError case when a language table 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the description is a dense single paragraph with internal ADR UUIDs, issue numbers, feat IDs, and long exception lists that are not all necessary for an agent to invoke the tool. The behavioral detail earns some space, but the structure could be tighter and more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the one-parameter schema and the presence of an output schema, the description is largely complete: it covers successful parsing, parse-failure result behavior, file-access exceptions, and language routing. Only minor path syntax details are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the single path parameter, and it adds meaningful path-position semantics: flat docs/rsk parses canonical, docs/rsk/{language} uses that language's table, and other locations parse canonical. It does not fully specify relative versus absolute paths or file extension expectations, so it stops short of complete parameter coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and output: parse a risk markdown file with YAML frontmatter and body from disk into a structured RskDocument. The phrasing distinguishes parsing from retrieval/listing siblings such as get_rsk and list_rsk, even though it does not name those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by saying it parses a risk markdown file from disk, but it never explicitly says when to choose parse_rsk over get_rsk, list_rsk, or other parse_* tools, nor when not to use it. Error behavior is described, but that is not routing guidance.
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(). The file's language is derived from its path position relative to the Standard Operating Procedure base directory: a file in the flat docs/sop/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/sop/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavior: parse failures return a non-raising ValidateResult with valid=False and a 300-char-capped error instead of raising AssertionError/ValidationError/YAMLError, while an absent or unreadable path still raises an OSError-family exception. That failure-mode split is genuinely decision-relevant. It loses a point for burying this under internal citations (feat-110, ADR UUIDs, issue #204) that add noise rather than agent-usable context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, which is good. The remainder is one very long run-on sentence dense with parenthetical ADR hashes, feature IDs, and issue numbers that consume attention without helping the agent select or invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return shape needn't be spelled out, and the description adds the failure-path semantics and path-based language resolution that the schema cannot convey. For a single-parameter parse tool this is close to complete; only the relative-vs-absolute path question and the missing sibling comparison remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single `path` property has only a title, so the description must compensate — and largely does, explaining that the file's language is derived from its position (flat docs/sop/ = canonical, direct two-letter docs/sop/{language}/ = language table, anything else = canonical) plus the ValueError when no table exists. It stops short of saying whether the path is absolute or repository-relative, which matters for constructing a valid call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb, resource, and target type: 'Parse a Standard Operating Procedure markdown file (YAML frontmatter + body) from disk into a structured SopDocument'. 'From disk' implicitly separates it from retrieval-style siblings like get_sop, but no sibling is named, so the differentiation is left for the agent to infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the description makes clear this reads a file from a path, contrasting with the `validate` tool's 300-char error cap. There is no explicit 'use this when / don't use this when' guidance and get_sop, list_sop, and validate are never positioned against it.
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(). The file's language is derived from its path position relative to the System Requirements Specification base directory: a file in the flat docs/sysrs/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/sysrs/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does substantial work: it discloses that parse failures return a non-raising ValidateResult with valid=False and a 300-char error message, that missing/unreadable paths still raise OSError-family exceptions, and that an unknown language table raises ValueError. It stops short of stating that the operation is read-only and side-effect free, which an agent would still have to assume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is valuable but delivered as one dense paragraph salted with internal references (ADR UUIDs, 'feat-110', 'GitHub issue #204', 'case 5 of the ADR ... workaround chain') that add no decision-relevant information for an agent. The core behavioral facts are buried mid-paragraph rather than front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description nonetheless covers the success path, the soft-failure path, the hard-failure path, and the path-based language resolution. The remaining gap is small but real: no statement of read-only behavior or of what the caller should do with a valid=False result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: the single 'path' parameter is given real semantics via the base-directory-relative rules (flat docs/sysrs/ = canonical, docs/sysrs/{language}/ = language table, anything else = canonical). What it never states is whether the path is absolute or relative to that base directory, which is the one detail an agent most needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb ('Parse') and resource ('System Requirements Specification markdown file ... from disk') and names the concrete return type (SysrsDocument). It does not, however, distinguish this from sibling readers like get_sysrs or list_sysrs, so an agent must infer that this one is the disk-to-model parser.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the description makes clear this is the tool that turns an on-disk file into a model, and the language-directory rules tell you where the path may live. There is no explicit 'use this instead of X' routing against get_sysrs/validate, and no statement of prerequisites or when a caller should prefer another tool.
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(). The file's language is derived from its path position relative to the task list base directory: a file in the flat docs/tsk/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/tsk/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: parse failures on existing files return a non-raising ValidateResult (valid=False, single 300-char error message), while absent/unreadable paths still raise OSError-family errors from Path.read_text(). It also discloses the language-table resolution behavior and the ValueError case for a missing language table.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded, which is good, but the text is a single dense paragraph salted with ADR UUIDs, GitHub issue numbers, and feat IDs that add little for an agent choosing or calling the tool. The useful behavioral facts are buried inside long parentheticals.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape needn't be spelled out, and the description still covers error paths and language resolution well. The main remaining gap is that the 'task list base directory' is never defined or tied to a configuration mechanism, which an agent would need to interpret the path argument confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'path' parameter has no description, but the description compensates by explaining how path position determines parsing behavior: flat docs/tsk/ parses canonical, docs/tsk/{language}/ uses that language's table, and any other location parses canonical. It leaves open whether the path is absolute or relative to the base directory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Parse a task list markdown file ... into a structured TskDocument'), which distinguishes it from the many sibling parse_* tools by resource type. It never explicitly contrasts itself with get_tsk or validate, so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this is for reading an on-disk markdown file, and the error-behavior discussion implies when a parse failure surfaces as a ValidateResult rather than an exception. However, it never says when to choose this over alternatives like get_tsk, list_tsk, or validate, nor does it state prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_txtParse free-form textA
Parse a free-form text markdown file (YAML frontmatter + body) from disk into a structured :class:~biz.dfch.specmgr.txt.models.v1.TxtDocument. 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(). The file's language is derived from its path position relative to the free-form text base directory: a file in the flat docs/txt/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/txt/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so thoroughly: a parse failure on an existing file returns a non-raising ValidateResult (valid=False, single errors[].message capped at 300 chars) instead of raising AssertionError/ValidationError/YAMLError, while an absent or unreadable path still raises FileNotFoundError/PermissionError/OSError from Path.read_text(). It also discloses the language-table resolution rule and the actionable ValueError when a table 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core purpose is front-loaded, which is good, but the body is a single dense run-on with embedded ADR UUIDs (f14f125e..., 519d1206) and issue/feature tags (feat-110, #204) that add little for an agent selecting the tool. The substantive behavioral content earns its place; the internal tracker references do not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is optional, yet the definition still covers the important success/failure split and language resolution for a tool with non-trivial error paths. Minor omissions (encoding assumptions, whether it writes anything back to disk) keep it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must supply the meaning of 'path' — and it does, explaining that the file's language is derived from its position relative to the free-form text base directory (flat docs/txt/ = canonical, docs/txt/{language}/ = table-mapped, anything else = canonical). It never states explicitly whether an absolute path is accepted, which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Parse a free-form text markdown file (YAML frontmatter + body) from disk into a structured ... TxtDocument'. This clearly separates it from the read-only get_txt/list_txt siblings and from the other parse_* tools that target different document types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use it (you need a structured object from a .txt file on disk rather than raw content), but there is no explicit statement of when to prefer get_txt, get_txt_schema, or validate instead. Guidance is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_ucParse use caseA
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(). The file's language is derived from its path position relative to the use case base directory: a file in the flat docs/uc/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/uc/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that a parse failure returns a non-raising ValidateResult with valid=False and a 300-char-capped error message, that absent/unreadable paths still raise OSError-family errors from Path.read_text(), and that no language table yields an actionable ValueError. The one gap is whether parsing has any side effect (e.g. indexing or persistence), which is left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, which is good. However the remainder is a single dense paragraph freighted with ADR UUIDs, a GitHub issue number, and feature tickets ('feat-110', 'case 5 of the ADR ... chain') that add provenance but little decision-relevant meaning for an agent, diluting the operational content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still covers the notable result-shape exception (ValidateResult) and the error taxonomy. Path routing and failure modes are both addressed, making it largely complete for a one-parameter read tool; only the absence of side-effect disclosure and absolute/relative path guidance leave a small hole.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema is a bare required string 'path', so the description must compensate, and it largely does: it explains the base-directory-relative semantics of the path (flat docs/uc/ = canonical, docs/uc/{language}/ = table-driven, anything else = canonical). It does not give concrete path format examples or say whether the path is absolute or relative, which keeps it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Parse a use-case markdown file (YAML frontmatter + body) from disk into a structured document.' That is unambiguous and separable from create_uc/get_uc by naming the disk-file source and the structured-document output. It stops short of an explicit contrast with the get_uc/validate siblings, so not a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the tool is for turning on-disk use-case markdown into a document, and the language-table routing rules tell you which paths behave how. There is no explicit 'use this when X instead of get_uc/validate' routing, and no stated prerequisite about when a caller would want parse versus get.
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(). The file's language is derived from its path position relative to the verification case record base directory: a file in the flat docs/vcr/ directory parses canonical (no heading-mapping table); a file in a direct two-letter docs/vcr/{language}/ subdirectory parses through that language's table (an actionable ValueError when no table exists for the language); any other location parses canonical.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the whole burden and does so thoroughly: parse failures on an existing file return a non-raising ValidateResult with valid=False and a 300-char-capped errors[].message instead of raising AssertionError/ValidationError/YAMLError, while an absent or unreadable path still raises the OSError family from Path.read_text(). It also discloses the language-resolution rule keyed to path position, including the actionable ValueError when no table exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, but the body is a single dense block salted with internal bookkeeping (feat-110, ADR UUIDs, 'case 5 of the ADR 519d1206 non-raising-structured-result workaround chain', GitHub issue #204) that adds little for an agent choosing or calling the tool. The genuinely useful facts — non-raising parse failure, raising file-access failure, path-based language resolution — are buried in the same run-on sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter parse tool with no annotations and an existing output schema, the description covers everything an agent needs before calling: what the input file looks like, what happens on parse failure versus file-access failure, and how path placement silently selects the heading-mapping table. Return-value shape is deferred to the output schema, which is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for the single undocumented `path` parameter, and it does: it explains that the file's language is derived from the path's position relative to the VCR base directory — flat docs/vcr/ parses canonical, docs/vcr/{language}/ uses that language's heading-mapping table, anything else parses canonical. It stops short of stating whether the path is absolute or base-relative, which leaves a residual ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a precise verb, resource and output type: 'Parse a verification case record markdown file (YAML frontmatter + body) from disk into a structured ... VcrDocument'. That separates it from get_vcr/list_vcr/create_vcr by verb alone, but the description never names a sibling or states explicitly that it is the read-and-deserialize counterpart to the generic `validate` tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer it should call this when it has a file path on disk that needs turning into a VcrDocument, and the mention of the generic `validate` tool hints at an alternative. There is no explicit when-to-use/when-not guidance and no routing to get_vcr, validate, or parse_* siblings for other artifact types.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: it 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.
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.
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.
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.
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.
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, txt; 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. The optional language parameter (default 'en', feat-197-i18n) selects the language variant to act on: omitted/'en' = the flat default-language document, exactly the default behavior; a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs//{language}/ (found by id-scan of that subdirectory), acting on that file ONLY -- the EN file's content and updated timestamp stay untouched. Every whole-body type except feat supports a non-default language; for feat (always English) a non-default language raises a ValueError, as does a malformed language or one with no packaged heading-mapping table -- all raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| language | No | en | |
| classification | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and mostly discharges it: it discloses the `updated` bump, that body and other frontmatter are untouched, that blank clears to `None`, the ParseFailureResult-vs-not-found asymmetry, and that ValueError fires before any file access. It loses a point for over-specifying internals (ADR UUIDs, GitHub issue numbers, 'byte-identical error text ... trailing pydantic documentation line') that obscure rather than sharpen the behavioral picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and domain restriction are front-loaded in the first clause, which is good. But the remainder is a single dense paragraph bloated with internal references (ADR UUIDs, issue #170, 'case 4 of the ADR 519d1206 ... workaround chain') that no selecting agent needs and that bury the genuinely useful `language` guidance mid-paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still clarifies the success payload ('returns the updated frontmatter only, no body') and enumerates the failure surfaces. For a mutation tool with four parameters and no annotations, nothing material is missing: id validation, type support, language variants, and parse-failure behavior are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and does: `classification` is documented as fully free-text with blank/whitespace meaning clear, `type` is enumerated with `adr` called out as unsupported, `id` failure modes (path injection, wrong format) are stated, and `language` gets default, path layout, and per-type exceptions. Every one of the four parameters gains meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Replace the free-text `classification` frontmatter field of an existing document') and bounds the scope to the whole-body domains, explicitly excluding `adr`. It also distinguishes itself from the entire `create_*` family by declaring itself the sole classification-change entry point, so an agent can separate it from `update_frontmatter`/`update` siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('this is the sole classification-change entry point'), when-not ('`adr` is not supported', `create_*` takes no classification argument), and a follow-up alternative ('use the corresponding `get_<d>` tool to fetch the full document afterward'). The `language` paragraph adds further conditional routing (default vs. variant, `feat` excluded).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| new_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| type | No | |
| status | No | |
| created | No | |
| updated | No | |
| version | No | |
| classification | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so thoroughly: validation of the feat-NNN-slug shape, refusal on existing folder collision, the exact filesystem mutation, the updated timestamp bump, and the guarantee that the body stays byte-identical. It also discloses the truncated return (frontmatter only), which is precisely the kind of side-effect detail an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the operation, then the validation/refusal/mutation sequence, then the scope limit and return contract. The long first sentence is dense but every clause conveys distinct behavioral information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers preconditions (shape validation, existence check), side effects, explicit non-effects (no reference rewrites), and the return shape, and even points to get_feat for the follow-up fetch. Despite an output schema existing, the note about frontmatter-only return is a useful complement rather than a repetition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It defines new_id's required format ('feat-NNN-slug shape') and the collision constraint, plus implies id refers to the existing feature identifier. The 'id' parameter's own format is left implicit, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Rename an existing feature's id') and enumerates the exact effects: folder rename, frontmatter id rewrite, updated bump. This clearly distinguishes it from generic siblings like edit, update_frontmatter, or update, which do not perform id/folder migration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly scopes what the tool does NOT do ('Does not update or search for references to the old id in any other document') and directs the agent to get_feat afterward for the full document. It does not name which sibling to use instead for reference updating (e.g., list_references or edit), so the alternative routing is only partially closed.
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, txt), 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. The optional language parameter (default 'en', feat-197-i18n) selects the language variant to act on: omitted/'en' = the flat default-language document, exactly the default behavior; a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs//{language}/ (found by id-scan of that subdirectory), acting on that file ONLY -- the EN file's content and updated timestamp stay untouched. Every whole-body type except feat supports a non-default language; for feat and adr (always English) a non-default language raises a ValueError, as does a malformed language or one with no packaged heading-mapping table -- all raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| status | Yes | ||
| language | No | en | |
| superseded_by | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so: no-op behavior when status is unchanged (no write, no `updated` bump, same return shape), non-raising `InvalidStatusResult` for out-of-vocabulary status, `ParseFailureResult` for unparseable existing documents versus a raised not-found for truly absent ids, and `ValueError` for invalid ids raised before any 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is one long, heavily nested paragraph that buries actionable rules inside parentheticals containing ADR UUIDs, issue numbers, and 'case 4 of the ADR 519d1206 ... workaround chain'. The core purpose is front-loaded, but provenance citations and byte-identical-error-text detail do not help an agent decide or call correctly and make the definition hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, five parameters, and an output schema, the definition still covers the essentials: mutation semantics, no-op behavior, all three non-raising/raising failure modes, per-language file targeting, and what is returned (frontmatter only, body untouched). Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet the description explains every non-trivial parameter behaviorally: `status` must come from the domain's closed vocabulary (XFrontmatter.status) and fails non-raising; `superseded_by` is ADR-only and composes 'superseded by X', otherwise ValueError; `language` defaults to 'en', selects a per-language variant path, and raises for feat/adr or malformed codes. This is substantial meaning beyond an undescribed schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Replace the status of an existing document') and names the domain enum inline. It also explicitly differentiates from siblings: 'Neither `create_*` nor the generic `update` tool accepts a `status` argument at all -- this is the sole status-change entry point.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states this is the only status-change entry point versus create_*/update, and tells the agent to call the corresponding `get_<d>` tool afterward to fetch the full document. It does not address other adjacent writable siblings such as `edit` or `update_frontmatter`, so the alternatives picture is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, txt), 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. Each domain's structure reference is its own get_<d>_schema tool (the generated JSON Schema), with get_<d>_template/get_<d>_example as the authoring starting points. 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. The optional language parameter (default 'en', feat-197-i18n) selects the language variant to act on: omitted/'en' = the flat default-language document, exactly the default behavior; a non-default ISO 639-1-shaped lowercase two-letter code (e.g. 'de') = that language's variant at docs//{language}/ (found by id-scan of that subdirectory), acting on that file ONLY -- the EN file's content and updated timestamp stay untouched -- with the submitted content validated through that language's heading-mapping table (translated headings are accepted). Every whole-body type except feat supports a non-default language; for feat (always English) a non-default language raises a ValueError, as does a malformed language or one with no packaged heading-mapping table -- all raised before any file access.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| type | Yes | ||
| limit | No | ||
| offset | No | ||
| content | Yes | ||
| language | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so unusually well: it states what is preserved (id/type/status/created/version) and what changes (`updated`), that the spliced result is validated as a whole document before any write, and that id/coordinate misuse raises before any file access. It enumerates non-raising outcomes precisely — `ParseFailureResult` for unparseable existing documents versus the domain not-found error for absent ids, and `ValidateResult(valid=False)` with a 300-char-capped message for content failures. It even explains the frontmatter-stripped coordinate space and the numbered-output stripping hazard, which is exactly the kind of trap an agent would otherwise fall into.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The essential mode/coordinate information is front-loaded in the first two sentences, which is the right structure. But the single unbroken paragraph is bloated with provenance that does nothing for tool selection or invocation — ADR hex ids, 'GitHub issue #170', 'case 4 of the ADR 519d1206 non-raising-structured-result workaround chain' — and it re-narrates the `UpdateResult` shape that the output schema already provides. Trimming those would roughly halve the length without losing decision-relevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with 0% schema description coverage, the description covers the things that actually determine a correct call: coordinate space, mode selection, language routing, validation-before-write, and the three distinct failure channels. It does redundantly re-specify the return payload that the output schema already declares, and it says nothing about concurrency or whether `updated` is bumped on a no-op replacement. These are modest gaps against an otherwise thorough disclosure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and it does: `offset`/`limit` are given precise semantics (1-based body line coordinates, inclusive range, `limit` omitted = to end, `limit=0` = pure insert, `offset=N+1` = append), and `content` is differentiated by mode (full body without frontmatter versus replacement/insert lines). `language` is covered in depth (default 'en' meaning, ISO 639-1 lowercase shape, per-language subdirectory, target-file isolation, translated-heading validation, and the `feat` exclusion that raises). `id` and `type` get failure semantics rather than value semantics, which is adequate given the type value set already lives in the enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause gives a specific verb and resource — 'Whole-body or line-range replace of an existing document's content' — and scopes it to the enumerated whole-body domains and the two operating modes. It also names adjacent tools (`set_status`, `edit`, `get_<d>`) in passing, so an agent can place it in the family. It stops short of a crisp 'this is not update_section/update_frontmatter' contrast, so sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is real usage guidance: status is explicitly out of scope and must go through `set_status`, and the only safe source of line coordinates is a `get_<d>(id, raw=True)` read. However, the description never tells the agent when to reach for `update` versus `edit`, `update_section`, or `update_frontmatter`, which are the genuinely confusable siblings listed nearby. The when-to-use decision is left to be reconstructed from the mode semantics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_frontmatterUpdate ADR FrontmatterA
Whole-object replace of an ADR's frontmatter, preserving its existing id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| frontmatter | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | |
| frontmatter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose the most important trait — the operation is a full overwrite, not a merge — and that the id survives. It omits error behavior, whether omitted keys are dropped (that detail lives in the schema's $defs docstring, not here), and any permission/validation requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the operation's defining constraint (whole-object replace). Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the destructive-replace hazard is stated. But with zero annotations on a mutation tool, the description should also say whether the ADR must already exist, whether a malformed object is rejected, and that omitted keys are removed rather than left untouched.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The reported 0% coverage is a top-level measurement artifact; the $ref'd AdrFrontmatter definition documents every field in depth. Against that rich schema, the description adds exactly one useful fact: the submitted object's id is ignored in favor of the existing id. It adds nothing about the required 'id' argument's role as the id->path resolver.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Whole-object replace of an ADR's frontmatter') plus a scope qualifier ('preserving its existing id'), which separates it from partial-edit siblings like update_section or set_status. It does not name those siblings explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'whole-object replace' implies the situation (you must supply the complete frontmatter), but the description never says when to use this instead of set_status, update_section, or edit. Usage must be inferred rather than read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sectionUpdate ADR SectionC
Whole-section replace/delete of one AdrBody field.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| key | Yes | ||
| value | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| body | Yes | |
| frontmatter | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden, but it does disclose an important behavioral trait: the operation replaces or deletes an entire AdrBody section rather than patching it. It does not explain permissions, reversibility, how deletion is expressed, or what happens to other fields, leaving notable gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is short and front-loaded, with no obvious filler. However, its terseness contributes to the ambiguity around parameters and deletion behavior rather than resolving it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values need not be described. But as a mutation tool with no annotations and 0% schema description coverage, the description is too thin to fully prepare an agent to call it correctly; key/value semantics and deletion behavior remain unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only hints that 'key' identifies one AdrBody field and 'value' is the replacement, while the required 'id' parameter and the deletion mechanism are unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation on a specific object: whole-section replacement or deletion of one AdrBody field. It is clearer than a bare 'update section', though it does not explicitly differentiate itself from sibling tools like update, edit, delete, or update_frontmatter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use update_section versus update, edit, delete, or update_frontmatter. The phrase 'whole-section replace/delete' implies a use case, but the agent must infer the boundaries from the many sibling tools.
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, txt; 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. Each domain's structure reference is its own get_<d>_schema tool (the generated JSON Schema), with get_<d>_template/get_<d>_example as the authoring starting points.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | ||
| type | Yes | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | |
| errors | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden and does so: it discloses the never-raises-on-invalid-content contract, the exact return shape, the 300-character error truncation with suffix, and the specific cases that DO raise ValueError (shape mismatch, unsupported type) before any 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with scope and the sibling exclusion, then the runtime contract, then the authoring references. It is dense but every clause carries information; the parenthetical spelling out of the truncated suffix and the reiteration of the errors/valid relationship could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully explains the error semantics and truncation. For a 3-parameter, read-only validation tool this is near-complete; only the format expectations for `content` are left to the referenced schema/template tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate and largely does: it enumerates the valid `type` values and the unsupported one, and defines `full`'s default and the two content shapes it selects. `content` is only implied, but its meaning is unambiguous from the surrounding text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('dry run validating document content'), names the exact set of supported domains, and explicitly excludes `adr` with a pointer to `validate_adr`, so an agent can distinguish it from the many sibling tools instantly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance for the `full` flag (body-only vs frontmatter+body), names the alternative tool for the excluded domain (`validate_adr`), and points to the authoritative structure references (`get_<d>_schema`, templates/examples). It even clarifies the per-domain validate tools no longer exist, closing off a likely wrong call.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | |
| errors | Yes | |
| reason | No | |
| fix_hint | No | |
| rendered | Yes | |
| warnings | Yes | |
| available | No | |
| checked_by | Yes | |
| source_state | No | |
| structure_ok | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and 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.
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.
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.
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.
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.
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.
52 tool updates
v0.38.0- Added
check_translation_drift - Changed
create_dec2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_gol2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_prb2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_qa2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_req2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_rsk2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_sop2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_sysrs2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_tsk2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Added
create_txt - Changed
create_uc2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
create_vcr2 fields changed- added
Input schema / properties / idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" +} - added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
delete2 fields changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +]
- Changed
edit4 fields changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +] - added
Output schema / $defs / TxtFrontmatterAdded value: +{ + "description": "Free-Form Text (TXT) frontmatter: `MarkdownFrontmatter` narrowed for the ``txt`` document type.\n\nParameters\n----------\ntype:\n Fixed discriminator, always ``\"txt\"``. Narrows the base's mandatory,\n default-less ``str`` field to a ``Literal[\"txt\"] = \"txt\"``, so a document\n omitting ``type`` entirely still parses as a free-form text document.\nstatus:\n One of ``\"draft\"``, ``\"progress\"``, ``\"done\"``. Narrows the base's\n free-form ``str = \"draft\"`` default to this closed three-value set.\n Blank/absent still defaults to ``\"draft\"`` (inherited from the base's\n ``_default_blank_status_to_draft`` validator, which runs before this\n one).\nversion:\n The ``models.md`` schema major.minor.patch version this document's\n frontmatter was written with. DO NOT CHANGE!\n\nAll other fields (``id``, ``created``, ``updated``, ``version``,\n``classification``) are inherited unchanged from\n:class:`MarkdownFrontmatter`.", + "properties": { + "classification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Classification" + }, + "created": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Created" + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" + }, + "status": { + "default": "draft", + "enum": [ + "done", + "draft", + "progress" + ], + "title": "Status", + "type": "string" + }, + "type": { + "const": "txt", + "default": "txt", + "title": "Type", + "type": "string" + }, + "updated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Updated" + }, + "version": { + "default": "1.0.0", + "title": "Version", + "type": "string" + } + }, + "title": "TxtFrontmatter", + "type": "object" +} - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "$ref": "#/$defs/ReqFrontmatter" - }, - { - "$ref": "#/$defs/UcFrontmatter" - }, - { - "$ref": "#/$defs/TskFrontmatter" - }, - { - "$ref": "#/$defs/QaFrontmatter" - }, - { - "$ref": "#/$defs/PrbFrontmatter" - }, - { - "$ref": "#/$defs/GolFrontmatter" - }, - { - "$ref": "#/$defs/RskFrontmatter" - }, - { - "$ref": "#/$defs/DecFrontmatter" - }, - { - "$ref": "#/$defs/FeatFrontmatter" - }, - { - "$ref": "#/$defs/SopFrontmatter" - }, - { - "$ref": "#/$defs/VcrFrontmatter" - }, - { - "$ref": "#/$defs/SysrsFrontmatter" - }, - { - "$ref": "#/$defs/ParseFailureResult" - }, - { - "$ref": "#/$defs/ValidateResult" - } -]New value: +[ + { + "$ref": "#/$defs/ReqFrontmatter" + }, + { + "$ref": "#/$defs/UcFrontmatter" + }, + { + "$ref": "#/$defs/TskFrontmatter" + }, + { + "$ref": "#/$defs/QaFrontmatter" + }, + { + "$ref": "#/$defs/PrbFrontmatter" + }, + { + "$ref": "#/$defs/GolFrontmatter" + }, + { + "$ref": "#/$defs/RskFrontmatter" + }, + { + "$ref": "#/$defs/DecFrontmatter" + }, + { + "$ref": "#/$defs/FeatFrontmatter" + }, + { + "$ref": "#/$defs/SopFrontmatter" + }, + { + "$ref": "#/$defs/VcrFrontmatter" + }, + { + "$ref": "#/$defs/SysrsFrontmatter" + }, + { + "$ref": "#/$defs/TxtFrontmatter" + }, + { + "$ref": "#/$defs/ParseFailureResult" + }, + { + "$ref": "#/$defs/ValidateResult" + } +]
- Changed
find_related2 fields changed- changed
Input schema / properties / type / enumPrevious value: -[ - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +] - changed
Output schema / $defs / SimilarityHit / descriptionPrevious value: -"One ranked similarity hit: a candidate document plus its score (ACC-001/ACC-002).\n\nParameters\n----------\ntype:\n The hit's domain name: one of the whole-body domains\n (``req``, ``uc``, ``tsk``, ``qa``, ``prb``, ``gol``, ``rsk``,\n ``dec``, ``sop``, ``feat``, ``vcr``, ``sysrs``) -- ``adr`` is\n structurally excluded from the candidate set (issue #46, ADR\n 750842b2's **corpus and registry** sub-decision).\nid:\n The hit document's specmgr-assigned id (the validated frontmatter\n value, the domain's own defaults applied for a blank key --\n exactly what ``list_<domain>`` surfaces), or ``None`` when the\n candidate file failed to parse (REQ-009: the marker rows are not\n addressable).\ntitle:\n The hit document's first H1 title, or the fixed marker\n ``\"<failed to parse>\"`` for an unparseable candidate.\nstatus:\n The hit document's validated ``frontmatter.status`` value, or the\n fixed marker ``\"<failed to parse>\"`` for an unparseable candidate.\npath:\n The real, absolute (``.resolve()``d) filesystem path to the hit\n document's on-disk file, for a caller that wants to read it\n directly instead of going through the matching ``get_<domain>``\n tool (which it cannot do for an unparseable candidate -- its\n ``id`` is ``None``).\nscore:\n The cosine similarity of the hit document's embedding against the\n query (dot product on L2-normalized vectors, in [-1, 1]); the\n result list is sorted by ``score`` descending, ties in the\n candidate enumeration's own deterministic order."New value: +"One ranked similarity hit: a candidate document plus its score (ACC-001/ACC-002).\n\nParameters\n----------\ntype:\n The hit's domain name: one of the whole-body domains\n (``req``, ``uc``, ``tsk``, ``qa``, ``prb``, ``gol``, ``rsk``,\n ``dec``, ``sop``, ``feat``, ``vcr``, ``sysrs``, ``txt``) -- ``adr``\n is structurally excluded from the candidate set (issue #46, ADR\n 750842b2's **corpus and registry** sub-decision).\nid:\n The hit document's specmgr-assigned id (the validated frontmatter\n value, the domain's own defaults applied for a blank key --\n exactly what ``list_<domain>`` surfaces), or ``None`` when the\n candidate file failed to parse (REQ-009: the marker rows are not\n addressable).\ntitle:\n The hit document's first H1 title, or the fixed marker\n ``\"<failed to parse>\"`` for an unparseable candidate.\nstatus:\n The hit document's validated ``frontmatter.status`` value, or the\n fixed marker ``\"<failed to parse>\"`` for an unparseable candidate.\npath:\n The real, absolute (``.resolve()``d) filesystem path to the hit\n document's on-disk file, for a caller that wants to read it\n directly instead of going through the matching ``get_<domain>``\n tool (which it cannot do for an unparseable candidate -- its\n ``id`` is ``None``).\nscore:\n The cosine similarity of the hit document's embedding against the\n query (dot product on L2-normalized vectors, in [-1, 1]); the\n result list is sorted by ``score`` descending, ties in the\n candidate enumeration's own deterministic order."
- Changed
find_similar_text1 field changed- changed
Output schema / $defs / SimilarityHit / descriptionPrevious value: -"One ranked similarity hit: a candidate document plus its score (ACC-001/ACC-002).\n\nParameters\n----------\ntype:\n The hit's domain name: one of the whole-body domains\n (``req``, ``uc``, ``tsk``, ``qa``, ``prb``, ``gol``, ``rsk``,\n ``dec``, ``sop``, ``feat``, ``vcr``, ``sysrs``) -- ``adr`` is\n structurally excluded from the candidate set (issue #46, ADR\n 750842b2's **corpus and registry** sub-decision).\nid:\n The hit document's specmgr-assigned id (the validated frontmatter\n value, the domain's own defaults applied for a blank key --\n exactly what ``list_<domain>`` surfaces), or ``None`` when the\n candidate file failed to parse (REQ-009: the marker rows are not\n addressable).\ntitle:\n The hit document's first H1 title, or the fixed marker\n ``\"<failed to parse>\"`` for an unparseable candidate.\nstatus:\n The hit document's validated ``frontmatter.status`` value, or the\n fixed marker ``\"<failed to parse>\"`` for an unparseable candidate.\npath:\n The real, absolute (``.resolve()``d) filesystem path to the hit\n document's on-disk file, for a caller that wants to read it\n directly instead of going through the matching ``get_<domain>``\n tool (which it cannot do for an unparseable candidate -- its\n ``id`` is ``None``).\nscore:\n The cosine similarity of the hit document's embedding against the\n query (dot product on L2-normalized vectors, in [-1, 1]); the\n result list is sorted by ``score`` descending, ties in the\n candidate enumeration's own deterministic order."New value: +"One ranked similarity hit: a candidate document plus its score (ACC-001/ACC-002).\n\nParameters\n----------\ntype:\n The hit's domain name: one of the whole-body domains\n (``req``, ``uc``, ``tsk``, ``qa``, ``prb``, ``gol``, ``rsk``,\n ``dec``, ``sop``, ``feat``, ``vcr``, ``sysrs``, ``txt``) -- ``adr``\n is structurally excluded from the candidate set (issue #46, ADR\n 750842b2's **corpus and registry** sub-decision).\nid:\n The hit document's specmgr-assigned id (the validated frontmatter\n value, the domain's own defaults applied for a blank key --\n exactly what ``list_<domain>`` surfaces), or ``None`` when the\n candidate file failed to parse (REQ-009: the marker rows are not\n addressable).\ntitle:\n The hit document's first H1 title, or the fixed marker\n ``\"<failed to parse>\"`` for an unparseable candidate.\nstatus:\n The hit document's validated ``frontmatter.status`` value, or the\n fixed marker ``\"<failed to parse>\"`` for an unparseable candidate.\npath:\n The real, absolute (``.resolve()``d) filesystem path to the hit\n document's on-disk file, for a caller that wants to read it\n directly instead of going through the matching ``get_<domain>``\n tool (which it cannot do for an unparseable candidate -- its\n ``id`` is ``None``).\nscore:\n The cosine similarity of the hit document's embedding against the\n query (dot product on L2-normalized vectors, in [-1, 1]); the\n result list is sorted by ``score`` descending, ties in the\n candidate enumeration's own deterministic order."
- Changed
get_dec1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_gol1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_prb1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_qa1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_reference_diagram1 field changed- changed
Input schema / properties / type / enumPrevious value: -[ - "adr", - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "adr", + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +]
- Changed
get_req1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_rsk1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_sop1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_sysrs1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_tsk1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Added
get_txt - Added
get_txt_example - Added
get_txt_schema - Added
get_txt_template - Changed
get_uc1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
get_vcr1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_dec1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_gol1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Added
list_languages - Changed
list_prb1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_qa1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_references2 fields changed- changed
Input schema / properties / type / enumPrevious value: -[ - "adr", - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "adr", + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +] - changed
Output schema / $defs / ReferenceRow / descriptionPrevious value: -"One cross-reference extracted from a source document, plus its resolution outcome.\n\nParameters\n----------\ntype:\n The referenced document's target domain name, lowercase -- one of\n ``general.tools._references.REFERENCE_TYPES`` (``gol``/``prb``/\n ``qa``/``uc``/``req``/``rsk``/``dec``/``adr``/``vcr``/``sysrs``/\n ``feat``; the reference tag itself is the uppercase form of this\n value).\nid:\n The referenced document's own specmgr-assigned identifier, as it\n appeared in the source body (lowercased) -- a canonical\n lowercase-hex UUID for the UUID tags, or, for ``feat``, the\n full ``feat-NNN-slug`` id or the bare ``feat-NNN`` number.\ntitle:\n The referenced document's ``# {title}`` H1, re-derived from the\n resolved document on disk (``doc.body.text`` for the flat target\n domains, the ``feat`` H1 with its ``Feature: `` prefix stripped\n via ``feature_title``, ``doc.body.title`` for ``adr``) -- or\n ``None`` if the reference could not be resolved (``error`` is\n set).\npath:\n The referenced document's real, absolute (``.resolve()``d)\n on-disk file path, for a caller that wants to read it directly\n instead of going through the matching ``get_<domain>`` tool -- or\n ``None`` if the reference could not be resolved (``error`` is\n set).\nerror:\n ``None`` for a successfully resolved reference. Otherwise, the\n ``str()`` of the target domain's ``XNotFoundError`` raised while\n resolving this reference, so a caller can see *why* it failed\n without a second round trip."New value: +"One cross-reference extracted from a source document, plus its resolution outcome.\n\nParameters\n----------\ntype:\n The referenced document's target domain name, lowercase -- one of\n ``general.tools._references.REFERENCE_TYPES`` (``gol``/``prb``/\n ``qa``/``uc``/``req``/``rsk``/``dec``/``adr``/``vcr``/``sysrs``/\n ``txt``/``feat``; the reference tag itself is the uppercase form\n of this value).\nid:\n The referenced document's own specmgr-assigned identifier, as it\n appeared in the source body (lowercased) -- a canonical\n lowercase-hex UUID for the UUID tags, or, for ``feat``, the\n full ``feat-NNN-slug`` id or the bare ``feat-NNN`` number.\ntitle:\n The referenced document's ``# {title}`` H1, re-derived from the\n resolved document on disk (``doc.body.text`` for the flat target\n domains, the ``feat`` H1 with its ``Feature: `` prefix stripped\n via ``feature_title``, ``doc.body.title`` for ``adr``) -- or\n ``None`` if the reference could not be resolved (``error`` is\n set).\npath:\n The referenced document's real, absolute (``.resolve()``d)\n on-disk file path, for a caller that wants to read it directly\n instead of going through the matching ``get_<domain>`` tool -- or\n ``None`` if the reference could not be resolved (``error`` is\n set).\nerror:\n ``None`` for a successfully resolved reference. Otherwise, the\n ``str()`` of the target domain's ``XNotFoundError`` raised while\n resolving this reference, so a caller can see *why* it failed\n without a second round trip."
- Changed
list_req1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_rsk1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_sop1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_sysrs1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_tsk1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Added
list_txt - Changed
list_uc1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Changed
list_vcr1 field changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +}
- Added
parse_txt - Changed
set_classification4 fields changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +] - added
Output schema / $defs / TxtFrontmatterAdded value: +{ + "description": "Free-Form Text (TXT) frontmatter: `MarkdownFrontmatter` narrowed for the ``txt`` document type.\n\nParameters\n----------\ntype:\n Fixed discriminator, always ``\"txt\"``. Narrows the base's mandatory,\n default-less ``str`` field to a ``Literal[\"txt\"] = \"txt\"``, so a document\n omitting ``type`` entirely still parses as a free-form text document.\nstatus:\n One of ``\"draft\"``, ``\"progress\"``, ``\"done\"``. Narrows the base's\n free-form ``str = \"draft\"`` default to this closed three-value set.\n Blank/absent still defaults to ``\"draft\"`` (inherited from the base's\n ``_default_blank_status_to_draft`` validator, which runs before this\n one).\nversion:\n The ``models.md`` schema major.minor.patch version this document's\n frontmatter was written with. DO NOT CHANGE!\n\nAll other fields (``id``, ``created``, ``updated``, ``version``,\n``classification``) are inherited unchanged from\n:class:`MarkdownFrontmatter`.", + "properties": { + "classification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Classification" + }, + "created": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Created" + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" + }, + "status": { + "default": "draft", + "enum": [ + "done", + "draft", + "progress" + ], + "title": "Status", + "type": "string" + }, + "type": { + "const": "txt", + "default": "txt", + "title": "Type", + "type": "string" + }, + "updated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Updated" + }, + "version": { + "default": "1.0.0", + "title": "Version", + "type": "string" + } + }, + "title": "TxtFrontmatter", + "type": "object" +} - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "$ref": "#/$defs/ReqFrontmatter" - }, - { - "$ref": "#/$defs/UcFrontmatter" - }, - { - "$ref": "#/$defs/TskFrontmatter" - }, - { - "$ref": "#/$defs/QaFrontmatter" - }, - { - "$ref": "#/$defs/PrbFrontmatter" - }, - { - "$ref": "#/$defs/GolFrontmatter" - }, - { - "$ref": "#/$defs/RskFrontmatter" - }, - { - "$ref": "#/$defs/DecFrontmatter" - }, - { - "$ref": "#/$defs/FeatFrontmatter" - }, - { - "$ref": "#/$defs/SopFrontmatter" - }, - { - "$ref": "#/$defs/VcrFrontmatter" - }, - { - "$ref": "#/$defs/SysrsFrontmatter" - }, - { - "$ref": "#/$defs/ParseFailureResult" - } -]New value: +[ + { + "$ref": "#/$defs/ReqFrontmatter" + }, + { + "$ref": "#/$defs/UcFrontmatter" + }, + { + "$ref": "#/$defs/TskFrontmatter" + }, + { + "$ref": "#/$defs/QaFrontmatter" + }, + { + "$ref": "#/$defs/PrbFrontmatter" + }, + { + "$ref": "#/$defs/GolFrontmatter" + }, + { + "$ref": "#/$defs/RskFrontmatter" + }, + { + "$ref": "#/$defs/DecFrontmatter" + }, + { + "$ref": "#/$defs/FeatFrontmatter" + }, + { + "$ref": "#/$defs/SopFrontmatter" + }, + { + "$ref": "#/$defs/VcrFrontmatter" + }, + { + "$ref": "#/$defs/SysrsFrontmatter" + }, + { + "$ref": "#/$defs/TxtFrontmatter" + }, + { + "$ref": "#/$defs/ParseFailureResult" + } +]
- Changed
set_status4 fields changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "adr", - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "adr", + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +] - added
Output schema / $defs / TxtFrontmatterAdded value: +{ + "description": "Free-Form Text (TXT) frontmatter: `MarkdownFrontmatter` narrowed for the ``txt`` document type.\n\nParameters\n----------\ntype:\n Fixed discriminator, always ``\"txt\"``. Narrows the base's mandatory,\n default-less ``str`` field to a ``Literal[\"txt\"] = \"txt\"``, so a document\n omitting ``type`` entirely still parses as a free-form text document.\nstatus:\n One of ``\"draft\"``, ``\"progress\"``, ``\"done\"``. Narrows the base's\n free-form ``str = \"draft\"`` default to this closed three-value set.\n Blank/absent still defaults to ``\"draft\"`` (inherited from the base's\n ``_default_blank_status_to_draft`` validator, which runs before this\n one).\nversion:\n The ``models.md`` schema major.minor.patch version this document's\n frontmatter was written with. DO NOT CHANGE!\n\nAll other fields (``id``, ``created``, ``updated``, ``version``,\n``classification``) are inherited unchanged from\n:class:`MarkdownFrontmatter`.", + "properties": { + "classification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Classification" + }, + "created": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Created" + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" + }, + "status": { + "default": "draft", + "enum": [ + "done", + "draft", + "progress" + ], + "title": "Status", + "type": "string" + }, + "type": { + "const": "txt", + "default": "txt", + "title": "Type", + "type": "string" + }, + "updated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Updated" + }, + "version": { + "default": "1.0.0", + "title": "Version", + "type": "string" + } + }, + "title": "TxtFrontmatter", + "type": "object" +} - changed
Output schema / properties / result / anyOfPrevious value: -[ - { - "$ref": "#/$defs/ReqFrontmatter" - }, - { - "$ref": "#/$defs/UcFrontmatter" - }, - { - "$ref": "#/$defs/TskFrontmatter" - }, - { - "$ref": "#/$defs/QaFrontmatter" - }, - { - "$ref": "#/$defs/PrbFrontmatter" - }, - { - "$ref": "#/$defs/GolFrontmatter" - }, - { - "$ref": "#/$defs/RskFrontmatter" - }, - { - "$ref": "#/$defs/DecFrontmatter" - }, - { - "$ref": "#/$defs/FeatFrontmatter" - }, - { - "$ref": "#/$defs/SopFrontmatter" - }, - { - "$ref": "#/$defs/VcrFrontmatter" - }, - { - "$ref": "#/$defs/SysrsFrontmatter" - }, - { - "$ref": "#/$defs/Adr" - }, - { - "$ref": "#/$defs/ParseFailureResult" - }, - { - "$ref": "#/$defs/InvalidStatusResult" - } -]New value: +[ + { + "$ref": "#/$defs/ReqFrontmatter" + }, + { + "$ref": "#/$defs/UcFrontmatter" + }, + { + "$ref": "#/$defs/TskFrontmatter" + }, + { + "$ref": "#/$defs/QaFrontmatter" + }, + { + "$ref": "#/$defs/PrbFrontmatter" + }, + { + "$ref": "#/$defs/GolFrontmatter" + }, + { + "$ref": "#/$defs/RskFrontmatter" + }, + { + "$ref": "#/$defs/DecFrontmatter" + }, + { + "$ref": "#/$defs/FeatFrontmatter" + }, + { + "$ref": "#/$defs/SopFrontmatter" + }, + { + "$ref": "#/$defs/VcrFrontmatter" + }, + { + "$ref": "#/$defs/SysrsFrontmatter" + }, + { + "$ref": "#/$defs/TxtFrontmatter" + }, + { + "$ref": "#/$defs/Adr" + }, + { + "$ref": "#/$defs/ParseFailureResult" + }, + { + "$ref": "#/$defs/InvalidStatusResult" + } +]
- Changed
update4 fields changed- added
Input schema / properties / languageAdded value: +{ + "default": "en", + "title": "Language", + "type": "string" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +] - added
Output schema / $defs / TxtFrontmatterAdded value: +{ + "description": "Free-Form Text (TXT) frontmatter: `MarkdownFrontmatter` narrowed for the ``txt`` document type.\n\nParameters\n----------\ntype:\n Fixed discriminator, always ``\"txt\"``. Narrows the base's mandatory,\n default-less ``str`` field to a ``Literal[\"txt\"] = \"txt\"``, so a document\n omitting ``type`` entirely still parses as a free-form text document.\nstatus:\n One of ``\"draft\"``, ``\"progress\"``, ``\"done\"``. Narrows the base's\n free-form ``str = \"draft\"`` default to this closed three-value set.\n Blank/absent still defaults to ``\"draft\"`` (inherited from the base's\n ``_default_blank_status_to_draft`` validator, which runs before this\n one).\nversion:\n The ``models.md`` schema major.minor.patch version this document's\n frontmatter was written with. DO NOT CHANGE!\n\nAll other fields (``id``, ``created``, ``updated``, ``version``,\n``classification``) are inherited unchanged from\n:class:`MarkdownFrontmatter`.", + "properties": { + "classification": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Classification" + }, + "created": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Created" + }, + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Id" + }, + "status": { + "default": "draft", + "enum": [ + "done", + "draft", + "progress" + ], + "title": "Status", + "type": "string" + }, + "type": { + "const": "txt", + "default": "txt", + "title": "Type", + "type": "string" + }, + "updated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "pattern": "^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})$", + "title": "Updated" + }, + "version": { + "default": "1.0.0", + "title": "Version", + "type": "string" + } + }, + "title": "TxtFrontmatter", + "type": "object" +} - changed
Output schema / $defs / UpdateResult / properties / frontmatter / anyOfPrevious value: -[ - { - "$ref": "#/$defs/ReqFrontmatter" - }, - { - "$ref": "#/$defs/UcFrontmatter" - }, - { - "$ref": "#/$defs/TskFrontmatter" - }, - { - "$ref": "#/$defs/QaFrontmatter" - }, - { - "$ref": "#/$defs/PrbFrontmatter" - }, - { - "$ref": "#/$defs/GolFrontmatter" - }, - { - "$ref": "#/$defs/RskFrontmatter" - }, - { - "$ref": "#/$defs/DecFrontmatter" - }, - { - "$ref": "#/$defs/FeatFrontmatter" - }, - { - "$ref": "#/$defs/SopFrontmatter" - }, - { - "$ref": "#/$defs/VcrFrontmatter" - }, - { - "$ref": "#/$defs/SysrsFrontmatter" - } -]New value: +[ + { + "$ref": "#/$defs/ReqFrontmatter" + }, + { + "$ref": "#/$defs/UcFrontmatter" + }, + { + "$ref": "#/$defs/TskFrontmatter" + }, + { + "$ref": "#/$defs/QaFrontmatter" + }, + { + "$ref": "#/$defs/PrbFrontmatter" + }, + { + "$ref": "#/$defs/GolFrontmatter" + }, + { + "$ref": "#/$defs/RskFrontmatter" + }, + { + "$ref": "#/$defs/DecFrontmatter" + }, + { + "$ref": "#/$defs/FeatFrontmatter" + }, + { + "$ref": "#/$defs/SopFrontmatter" + }, + { + "$ref": "#/$defs/VcrFrontmatter" + }, + { + "$ref": "#/$defs/SysrsFrontmatter" + }, + { + "$ref": "#/$defs/TxtFrontmatter" + } +]
- Changed
validate1 field changed- changed
Input schema / properties / type / enumPrevious value: -[ - "req", - "uc", - "tsk", - "qa", - "prb", - "gol", - "rsk", - "dec", - "sop", - "feat", - "vcr", - "sysrs" -]New value: +[ + "req", + "uc", + "tsk", + "qa", + "prb", + "gol", + "rsk", + "dec", + "sop", + "feat", + "vcr", + "sysrs", + "txt" +]
58 tool updates
v0.37.0- Changed
create_adr7 fields changed- changed
Input schema / $defs / AdrBody / descriptionPrevious value: -"The ADR body: whole-section fields (plan §4) plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section (plan §5).\n\nEach whole-section field maps 1:1 to the ``key`` values the future\n``update_section(key, value)`` MCP tool accepts (plan §4's table),\nusing this model's snake_case attribute names rather than the table's\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors plan §4's rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them\n (plan §4).\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty (plan §5). Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional."New value: +"The ADR body: whole-section fields plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section.\n\nEach whole-section field maps 1:1 to the ``key`` values the\n``update_section(key, value)`` MCP tool accepts,\nusing this model's snake_case attribute names rather than\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors the rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them.\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty. Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional." - changed
Input schema / $defs / AdrFrontmatter / descriptionPrevious value: -"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only (plan §3) -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path`` (plan §9a). This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with (plan §6). This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline (plan §7) and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional."New value: +"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path``. This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with. This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional." - changed
Input schema / $defs / AdrOption / descriptionPrevious value: -"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel from plan §4 does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool\n(plan §5, §8), not by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank."New value: +"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool,\nnot by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank." - changed
Output schema / $defs / AdrBody / descriptionPrevious value: -"The ADR body: whole-section fields (plan §4) plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section (plan §5).\n\nEach whole-section field maps 1:1 to the ``key`` values the future\n``update_section(key, value)`` MCP tool accepts (plan §4's table),\nusing this model's snake_case attribute names rather than the table's\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors plan §4's rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them\n (plan §4).\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty (plan §5). Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional."New value: +"The ADR body: whole-section fields plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section.\n\nEach whole-section field maps 1:1 to the ``key`` values the\n``update_section(key, value)`` MCP tool accepts,\nusing this model's snake_case attribute names rather than\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors the rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them.\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty. Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional." - changed
Output schema / $defs / AdrFrontmatter / descriptionPrevious value: -"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only (plan §3) -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path`` (plan §9a). This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with (plan §6). This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline (plan §7) and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional."New value: +"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path``. This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with. This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional." - changed
Output schema / $defs / AdrOption / descriptionPrevious value: -"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel from plan §4 does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool\n(plan §5, §8), not by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank."New value: +"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool,\nnot by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank." - changed
Output schema / descriptionPrevious value: -"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the future parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` (plan §8) are expected to exchange\nwith the LLM instead of raw markdown text.\n\nThe specmgr schema version lives on ``frontmatter.version`` (plan §3),\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do (plan §7); a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."New value: +"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` exchange with the LLM instead of raw\nmarkdown text.\n\nThe specmgr schema version lives on ``frontmatter.version``,\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do; a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."
- Changed
create_dec1 field changed- added
Output schema / $defs / DecFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "rejected", + "superseded" +]
- Changed
create_feat1 field changed- added
Output schema / $defs / FeatFrontmatter / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +]
- Changed
create_gol1 field changed- added
Output schema / $defs / GolFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +]
- Changed
create_prb1 field changed- added
Output schema / $defs / PrbFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "draft", + "resolved" +]
- Changed
create_qa1 field changed- added
Output schema / $defs / QaFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +]
- Changed
create_req1 field changed- added
Output schema / $defs / ReqFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +]
- Changed
create_rsk1 field changed- added
Output schema / $defs / RskFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "closed", + "dropped", + "mitigating", + "occurred", + "open" +]
- Changed
create_sop1 field changed- added
Output schema / $defs / SopFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +]
- Changed
create_sysrs1 field changed- added
Output schema / $defs / SysrsFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +]
- Changed
create_tsk1 field changed- added
Output schema / $defs / TskFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +]
- Changed
create_uc1 field changed- added
Output schema / $defs / UcFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "superseded" +]
- Changed
create_vcr1 field changed- added
Output schema / $defs / VcrFrontmatter / properties / status / enumAdded value: +[ + "approved", + "complete", + "draft", + "progress" +]
- Changed
edit12 fields changed- added
Output schema / $defs / DecFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / FeatFrontmatter / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +] - added
Output schema / $defs / GolFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / PrbFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "draft", + "resolved" +] - added
Output schema / $defs / QaFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / ReqFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / RskFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "closed", + "dropped", + "mitigating", + "occurred", + "open" +] - added
Output schema / $defs / SopFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / SysrsFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / TskFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / UcFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "superseded" +] - added
Output schema / $defs / VcrFrontmatter / properties / status / enumAdded value: +[ + "approved", + "complete", + "draft", + "progress" +]
- Changed
get_adr4 fields changed- changed
Output schema / $defs / AdrBody / descriptionPrevious value: -"The ADR body: whole-section fields (plan §4) plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section (plan §5).\n\nEach whole-section field maps 1:1 to the ``key`` values the future\n``update_section(key, value)`` MCP tool accepts (plan §4's table),\nusing this model's snake_case attribute names rather than the table's\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors plan §4's rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them\n (plan §4).\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty (plan §5). Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional."New value: +"The ADR body: whole-section fields plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section.\n\nEach whole-section field maps 1:1 to the ``key`` values the\n``update_section(key, value)`` MCP tool accepts,\nusing this model's snake_case attribute names rather than\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors the rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them.\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty. Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional." - changed
Output schema / $defs / AdrFrontmatter / descriptionPrevious value: -"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only (plan §3) -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path`` (plan §9a). This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with (plan §6). This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline (plan §7) and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional."New value: +"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path``. This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with. This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional." - changed
Output schema / $defs / AdrOption / descriptionPrevious value: -"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel from plan §4 does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool\n(plan §5, §8), not by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank."New value: +"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool,\nnot by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank." - changed
Output schema / descriptionPrevious value: -"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the future parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` (plan §8) are expected to exchange\nwith the LLM instead of raw markdown text.\n\nThe specmgr schema version lives on ``frontmatter.version`` (plan §3),\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do (plan §7); a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."New value: +"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` exchange with the LLM instead of raw\nmarkdown text.\n\nThe specmgr schema version lives on ``frontmatter.version``,\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do; a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."
- Changed
get_dec1 field changed- added
Output schema / $defs / DecFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "rejected", + "superseded" +]
- Added
get_dec_schema - Changed
get_feat3 fields changed- added
Output schema / $defs / AcceptanceCriterionItem / patternAdded value: +"^\\[( |x|X)\\]\\s*(.*)$" - added
Output schema / $defs / FeatFrontmatter / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +] - added
Output schema / $defs / FeatTaskItem / patternAdded value: +"^\\[( |x|X)\\]\\s*(.*)$"
- Added
get_feat_schema - Changed
get_gol1 field changed- added
Output schema / $defs / GolFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +]
- Added
get_gol_schema - Changed
get_prb2 fields changed- added
Output schema / $defs / Prb / properties / problem_statement / patternAdded value: +"^(?:.+)\\s+is\\s+causing\\s+(?:.+),\\s+for\\s+(?:.+)\\s+because\\s+(?:.+)\\.$" - added
Output schema / $defs / PrbFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "draft", + "resolved" +]
- Added
get_prb_schema - Changed
get_qa2 fields changed- added
Output schema / $defs / QaFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / QaQuestionAnswer / properties / question / patternAdded value: +"^\\*\\*\\d\\.\\d{4}\\*\\*:\\s"
- Added
get_qa_schema - Changed
get_req2 fields changed- changed
Output schema / $defs / Level / properties / value / descriptionPrevious value: -"Single-line value giving the requirement's obligation strength (e.g. \"MUST\")."New value: +"Single-line value giving the requirement's obligation strength (e.g. \"MUST\"). One of `MUST`, `SHOULD`, `MUST NOT`, `SHOULD NOT`, `MAY` (RFC 2119)." - added
Output schema / $defs / ReqFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +]
- Added
get_req_schema - Changed
get_rsk3 fields changed- added
Output schema / $defs / Impact / patternAdded value: +"^Impact [1-5]$" - added
Output schema / $defs / Probability / patternAdded value: +"^Probability [1-5]$" - added
Output schema / $defs / RskFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "closed", + "dropped", + "mitigating", + "occurred", + "open" +]
- Added
get_rsk_schema - Changed
get_sop1 field changed- added
Output schema / $defs / SopFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +]
- Added
get_sop_schema - Changed
get_sysrs1 field changed- added
Output schema / $defs / SysrsFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +]
- Added
get_sysrs_schema - Changed
get_tsk4 fields changed- changed
Output schema / $defs / RecentUpdates / descriptionPrevious value: -"`## Recent Updates` -- a dynamic, newest-first list of timestamp-led `### ` update entries.\n\nA fixed-title (non-alias) `MarkdownSection2WithComment`, structurally\nsimilar to `AdrBody`'s `## Pros and Cons of the Options`/`AdrOption`\ncollection, but with no dedicated per-entry tools (no\n`option_create`/`option_list` equivalent) -- entries are prepended\n(newest-first) by editing the whole body. May be preceded by an\nexplanatory HTML comment (e.g. an ordering hint).\n\nParameters\n----------\ncomment:\n Optional explanatory HTML comment (`<!-- ... -->`), e.g.\n `<!-- Newest entry first -- prepend new entries directly below\n this comment. -->`. Inherited from `MarkdownSection2WithComment`.\nupdates:\n The dynamic collection of `### ` entries, in document order,\n newest-first (enforced, see `_validate_newest_first`). Requires\n at least one entry (``min_length=1``), same as `Task.items` below --\n `models.md`'s generic list-parsing engine already enforces this\n during `from_text` for any non-`Optional` `list[X]` field regardless\n of `min_length`, so this constraint makes direct Python construction\n (e.g. a future `create_tsk` tool) consistent with parsing instead of\n silently allowing `RecentUpdates(updates=[])`. A newly created `tsk`\n document must therefore seed a first entry (e.g. \"Created\") -- see\n the feature README's Decisions Made."New value: +"`## Recent Updates` -- a dynamic, newest-first list of timestamp-led `### ` update entries.\n\nA fixed-title (non-alias) `MarkdownSection2WithComment`, structurally\nsimilar to `AdrBody`'s `## Pros and Cons of the Options`/`AdrOption`\ncollection, but with no dedicated per-entry tools (no\n`option_create`/`option_list` equivalent) -- entries are prepended\n(newest-first) by editing the whole body. May be preceded by an\nexplanatory HTML comment (e.g. an ordering hint).\n\nParameters\n----------\ncomment:\n Optional explanatory HTML comment (`<!-- ... -->`), e.g.\n `<!-- Newest entry first -- prepend new entries directly below\n this comment. -->`. Inherited from `MarkdownSection2WithComment`.\nupdates:\n The dynamic collection of `### ` entries, in document order,\n newest-first (enforced, see `_validate_newest_first`). Requires\n at least one entry (``min_length=1``), same as `Task.items` below --\n `models.md`'s generic list-parsing engine already enforces this\n during `from_text` for any non-`Optional` `list[X]` field regardless\n of `min_length`, so this constraint makes direct Python construction\n (e.g. the `create_tsk` tool) consistent with parsing instead of\n silently allowing `RecentUpdates(updates=[])`. A newly created `tsk`\n document must therefore seed a first entry (e.g. \"Created\") -- see\n the feature README's Decisions Made." - added
Output schema / $defs / TaskItem / patternAdded value: +"^\\[( |x|X)\\]\\s*(.*)$" - added
Output schema / $defs / TskFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / UpdateEntry / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})(?: - | : ).+$"
- Added
get_tsk_schema - Changed
get_uc1 field changed- added
Output schema / $defs / UcFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "superseded" +]
- Added
get_uc_schema - Changed
get_vcr3 fields changed- changed
Output schema / $defs / AcceptanceCriterion / descriptionPrevious value: -"`### AC-NNN (Method): <criterion text>` under `## Acceptance Criteria` -- one verification criterion.\n\nThe number, method, and criterion text all live in the heading itself\n(e.g. `### AC-001 (Test): The revoke endpoint returns 204 within 1s`),\nconstrained by the regex `@alias` above and enforced by `match_alias`\n(`re.fullmatch`) at parse time -- a missing/out-of-range/malformed\nnumber, an unknown method word, or a title-less heading all fail the\nparse eagerly (REQ-003). AC numbers need not be contiguous (gaps are\nallowed, numbers are never renumbered); duplicates are rejected by\n`Vcr`'s own after-validator (the `ValidationError` channel, mirroring\nDEC's `Decision._validate_option_numbers_unique`).\n\nUnlike DEC's `Option`/RSK's `Probability`/`Impact` (all *leaf* sections\nwith zero other declared fields, so their own `.text` computed property\nreturns the *complete* extent verbatim, heading marker and any body\ntext both included), this class declares two other fields\n(`description`, `test_steps`), making it a *composite* section: its own\n`.text` therefore returns only the heading's own inline content (marker\nstripped, body text excluded -- see `MarkdownSection.text`'s composite\nbranch). `number`/`method` below are matched against that heading-only\n`.text` directly, not `.text.splitlines()[0]` -- the DEC/RSK idiom's\nexact mechanics don't apply verbatim here because of this leaf/composite\ndifference, even though the underlying idea (compute a value from the\nretained heading text via a private module-level compiled regex) is the\nsame. A consequence: an `AcceptanceCriterion`'s body may contain nothing\nbesides an optional free-form `description` paragraph followed by an\noptional `#### Test Steps` -- both independently optional (e.g. one\ncriterion may carry only a description, another only `Test Steps`,\nanother both, another neither), in that fixed declaration order.\n\nParameters\n----------\ndescription:\n The lead paragraph directly under the heading -- free-form prose\n elaborating on the criterion beyond what fits in the heading\n itself (mirrors `MoreInformation`'s \"free-form, no fixed format\"\n tone). Optional; independent of `test_steps`.\ntest_steps:\n `#### Test Steps` sub-section (a numbered verification procedure).\n Optional; independent of `description`.\nnumber:\n Computed. The criterion's 3-digit number (e.g. `1` for\n `### AC-001 (Test): ...`). Never stored separately -- derived from\n the retained heading text.\nmethod:\n Computed. The closed DTAIS method word carried by the heading\n (e.g. `\"Test\"` for `### AC-001 (Test): ...`), exactly as written\n (not lowercased/normalized). Never stored separately -- derived\n from the retained heading text."New value: +"`### AC-NNN (Method): <criterion text>` under `## Acceptance Criteria` -- one verification criterion.\n\nThe number, method, and criterion text all live in the heading itself\n(e.g. `### AC-001 (Test): The revoke endpoint returns 204 within 1s`),\nconstrained by the regex `@alias` above and enforced by `match_alias`\n(`re.fullmatch`) at parse time -- a missing/out-of-range/malformed\nnumber, an unknown method word, or a title-less heading all fail the\nparse eagerly (REQ-003). The method word is one of the five DTAIS words:\n`Demonstration`, `Test`, `Analysis`, `Inspection`, `Special` (the\n`specmgr://dtais` vocabulary). AC numbers need not be contiguous (gaps are\nallowed, numbers are never renumbered); duplicates are rejected by\n`Vcr`'s own after-validator (the `ValidationError` channel, mirroring\nDEC's `Decision._validate_option_numbers_unique`).\n\nUnlike DEC's `Option`/RSK's `Probability`/`Impact` (all *leaf* sections\nwith zero other declared fields, so their own `.text` computed property\nreturns the *complete* extent verbatim, heading marker and any body\ntext both included), this class declares two other fields\n(`description`, `test_steps`), making it a *composite* section: its own\n`.text` therefore returns only the heading's own inline content (marker\nstripped, body text excluded -- see `MarkdownSection.text`'s composite\nbranch). `number`/`method` below are matched against that heading-only\n`.text` directly, not `.text.splitlines()[0]` -- the DEC/RSK idiom's\nexact mechanics don't apply verbatim here because of this leaf/composite\ndifference, even though the underlying idea (compute a value from the\nretained heading text via a private module-level compiled regex) is the\nsame. A consequence: an `AcceptanceCriterion`'s body may contain nothing\nbesides an optional free-form `description` paragraph followed by an\noptional `#### Test Steps` -- both independently optional (e.g. one\ncriterion may carry only a description, another only `Test Steps`,\nanother both, another neither), in that fixed declaration order.\n\nParameters\n----------\ndescription:\n The lead paragraph directly under the heading -- free-form prose\n elaborating on the criterion beyond what fits in the heading\n itself (mirrors `MoreInformation`'s \"free-form, no fixed format\"\n tone). Optional; independent of `test_steps`.\ntest_steps:\n `#### Test Steps` sub-section (a numbered verification procedure).\n Optional; independent of `description`.\nnumber:\n Computed. The criterion's 3-digit number (e.g. `1` for\n `### AC-001 (Test): ...`). Never stored separately -- derived from\n the retained heading text.\nmethod:\n Computed. The closed DTAIS method word carried by the heading\n (e.g. `\"Test\"` for `### AC-001 (Test): ...`), exactly as written\n (not lowercased/normalized). Never stored separately -- derived\n from the retained heading text." - added
Output schema / $defs / AcceptanceCriterion / patternAdded value: +"^AC-(\\d{3}) \\((Demonstration|Test|Analysis|Inspection|Special)\\): .+$" - added
Output schema / $defs / VcrFrontmatter / properties / status / enumAdded value: +[ + "approved", + "complete", + "draft", + "progress" +]
- Added
get_vcr_schema - Changed
list_adr1 field changed- changed
Output schema / $defs / AdrSummary / descriptionPrevious value: -"One line of ``list_adr`` tool output (plan §8, §9a).\n\nParameters\n----------\nid:\n The document's specmgr-assigned identifier, or ``None`` if the file\n has not been assigned one yet (e.g. hand-authored without the\n ``id`` frontmatter key -- plan §9a).\ntitle:\n The ADR's ``# {title}`` H1.\nstatus:\n The ADR's ``frontmatter.status`` value, verbatim.\nref:\n The document's extensionless base name (e.g.\n ``\"<uuid>-a-title\"``), deliberately *not* a filename or path --\n callers must not read this off disk themselves, only pass it to\n ``get_adr``/``specmgr://adr/{id}`` alongside (or instead of) ``id``.\n Named ``ref`` rather than ``filename`` precisely to avoid inviting\n direct filesystem access."New value: +"One line of ``list_adr`` tool output.\n\nParameters\n----------\nid:\n The document's specmgr-assigned identifier, or ``None`` if the file\n has not been assigned one yet (e.g. hand-authored without the\n ``id`` frontmatter key).\ntitle:\n The ADR's ``# {title}`` H1.\nstatus:\n The ADR's ``frontmatter.status`` value, verbatim.\nref:\n The document's extensionless base name (e.g.\n ``\"<uuid>-a-title\"``), deliberately *not* a filename or path --\n callers must not read this off disk themselves, only pass it to\n ``get_adr``/``specmgr://adr/{id}`` alongside (or instead of) ``id``.\n Named ``ref`` rather than ``filename`` precisely to avoid inviting\n direct filesystem access."
- Changed
parse_dec1 field changed- added
Output schema / $defs / DecFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "rejected", + "superseded" +]
- Changed
parse_feat3 fields changed- added
Output schema / $defs / AcceptanceCriterionItem / patternAdded value: +"^\\[( |x|X)\\]\\s*(.*)$" - added
Output schema / $defs / FeatFrontmatter / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +] - added
Output schema / $defs / FeatTaskItem / patternAdded value: +"^\\[( |x|X)\\]\\s*(.*)$"
- Changed
parse_gol1 field changed- added
Output schema / $defs / GolFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +]
- Changed
parse_prb2 fields changed- added
Output schema / $defs / Prb / properties / problem_statement / patternAdded value: +"^(?:.+)\\s+is\\s+causing\\s+(?:.+),\\s+for\\s+(?:.+)\\s+because\\s+(?:.+)\\.$" - added
Output schema / $defs / PrbFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "draft", + "resolved" +]
- Changed
parse_qa2 fields changed- added
Output schema / $defs / QaFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / QaQuestionAnswer / properties / question / patternAdded value: +"^\\*\\*\\d\\.\\d{4}\\*\\*:\\s"
- Changed
parse_req2 fields changed- changed
Output schema / $defs / Level / properties / value / descriptionPrevious value: -"Single-line value giving the requirement's obligation strength (e.g. \"MUST\")."New value: +"Single-line value giving the requirement's obligation strength (e.g. \"MUST\"). One of `MUST`, `SHOULD`, `MUST NOT`, `SHOULD NOT`, `MAY` (RFC 2119)." - added
Output schema / $defs / ReqFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +]
- Changed
parse_rsk3 fields changed- added
Output schema / $defs / Impact / patternAdded value: +"^Impact [1-5]$" - added
Output schema / $defs / Probability / patternAdded value: +"^Probability [1-5]$" - added
Output schema / $defs / RskFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "closed", + "dropped", + "mitigating", + "occurred", + "open" +]
- Changed
parse_sop1 field changed- added
Output schema / $defs / SopFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +]
- Changed
parse_sysrs1 field changed- added
Output schema / $defs / SysrsFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +]
- Changed
parse_tsk4 fields changed- changed
Output schema / $defs / RecentUpdates / descriptionPrevious value: -"`## Recent Updates` -- a dynamic, newest-first list of timestamp-led `### ` update entries.\n\nA fixed-title (non-alias) `MarkdownSection2WithComment`, structurally\nsimilar to `AdrBody`'s `## Pros and Cons of the Options`/`AdrOption`\ncollection, but with no dedicated per-entry tools (no\n`option_create`/`option_list` equivalent) -- entries are prepended\n(newest-first) by editing the whole body. May be preceded by an\nexplanatory HTML comment (e.g. an ordering hint).\n\nParameters\n----------\ncomment:\n Optional explanatory HTML comment (`<!-- ... -->`), e.g.\n `<!-- Newest entry first -- prepend new entries directly below\n this comment. -->`. Inherited from `MarkdownSection2WithComment`.\nupdates:\n The dynamic collection of `### ` entries, in document order,\n newest-first (enforced, see `_validate_newest_first`). Requires\n at least one entry (``min_length=1``), same as `Task.items` below --\n `models.md`'s generic list-parsing engine already enforces this\n during `from_text` for any non-`Optional` `list[X]` field regardless\n of `min_length`, so this constraint makes direct Python construction\n (e.g. a future `create_tsk` tool) consistent with parsing instead of\n silently allowing `RecentUpdates(updates=[])`. A newly created `tsk`\n document must therefore seed a first entry (e.g. \"Created\") -- see\n the feature README's Decisions Made."New value: +"`## Recent Updates` -- a dynamic, newest-first list of timestamp-led `### ` update entries.\n\nA fixed-title (non-alias) `MarkdownSection2WithComment`, structurally\nsimilar to `AdrBody`'s `## Pros and Cons of the Options`/`AdrOption`\ncollection, but with no dedicated per-entry tools (no\n`option_create`/`option_list` equivalent) -- entries are prepended\n(newest-first) by editing the whole body. May be preceded by an\nexplanatory HTML comment (e.g. an ordering hint).\n\nParameters\n----------\ncomment:\n Optional explanatory HTML comment (`<!-- ... -->`), e.g.\n `<!-- Newest entry first -- prepend new entries directly below\n this comment. -->`. Inherited from `MarkdownSection2WithComment`.\nupdates:\n The dynamic collection of `### ` entries, in document order,\n newest-first (enforced, see `_validate_newest_first`). Requires\n at least one entry (``min_length=1``), same as `Task.items` below --\n `models.md`'s generic list-parsing engine already enforces this\n during `from_text` for any non-`Optional` `list[X]` field regardless\n of `min_length`, so this constraint makes direct Python construction\n (e.g. the `create_tsk` tool) consistent with parsing instead of\n silently allowing `RecentUpdates(updates=[])`. A newly created `tsk`\n document must therefore seed a first entry (e.g. \"Created\") -- see\n the feature README's Decisions Made." - added
Output schema / $defs / TaskItem / patternAdded value: +"^\\[( |x|X)\\]\\s*(.*)$" - added
Output schema / $defs / TskFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / UpdateEntry / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(?:Z|[+-]\\d{2}:\\d{2})(?: - | : ).+$"
- Changed
parse_uc1 field changed- added
Output schema / $defs / UcFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "superseded" +]
- Changed
parse_vcr3 fields changed- changed
Output schema / $defs / AcceptanceCriterion / descriptionPrevious value: -"`### AC-NNN (Method): <criterion text>` under `## Acceptance Criteria` -- one verification criterion.\n\nThe number, method, and criterion text all live in the heading itself\n(e.g. `### AC-001 (Test): The revoke endpoint returns 204 within 1s`),\nconstrained by the regex `@alias` above and enforced by `match_alias`\n(`re.fullmatch`) at parse time -- a missing/out-of-range/malformed\nnumber, an unknown method word, or a title-less heading all fail the\nparse eagerly (REQ-003). AC numbers need not be contiguous (gaps are\nallowed, numbers are never renumbered); duplicates are rejected by\n`Vcr`'s own after-validator (the `ValidationError` channel, mirroring\nDEC's `Decision._validate_option_numbers_unique`).\n\nUnlike DEC's `Option`/RSK's `Probability`/`Impact` (all *leaf* sections\nwith zero other declared fields, so their own `.text` computed property\nreturns the *complete* extent verbatim, heading marker and any body\ntext both included), this class declares two other fields\n(`description`, `test_steps`), making it a *composite* section: its own\n`.text` therefore returns only the heading's own inline content (marker\nstripped, body text excluded -- see `MarkdownSection.text`'s composite\nbranch). `number`/`method` below are matched against that heading-only\n`.text` directly, not `.text.splitlines()[0]` -- the DEC/RSK idiom's\nexact mechanics don't apply verbatim here because of this leaf/composite\ndifference, even though the underlying idea (compute a value from the\nretained heading text via a private module-level compiled regex) is the\nsame. A consequence: an `AcceptanceCriterion`'s body may contain nothing\nbesides an optional free-form `description` paragraph followed by an\noptional `#### Test Steps` -- both independently optional (e.g. one\ncriterion may carry only a description, another only `Test Steps`,\nanother both, another neither), in that fixed declaration order.\n\nParameters\n----------\ndescription:\n The lead paragraph directly under the heading -- free-form prose\n elaborating on the criterion beyond what fits in the heading\n itself (mirrors `MoreInformation`'s \"free-form, no fixed format\"\n tone). Optional; independent of `test_steps`.\ntest_steps:\n `#### Test Steps` sub-section (a numbered verification procedure).\n Optional; independent of `description`.\nnumber:\n Computed. The criterion's 3-digit number (e.g. `1` for\n `### AC-001 (Test): ...`). Never stored separately -- derived from\n the retained heading text.\nmethod:\n Computed. The closed DTAIS method word carried by the heading\n (e.g. `\"Test\"` for `### AC-001 (Test): ...`), exactly as written\n (not lowercased/normalized). Never stored separately -- derived\n from the retained heading text."New value: +"`### AC-NNN (Method): <criterion text>` under `## Acceptance Criteria` -- one verification criterion.\n\nThe number, method, and criterion text all live in the heading itself\n(e.g. `### AC-001 (Test): The revoke endpoint returns 204 within 1s`),\nconstrained by the regex `@alias` above and enforced by `match_alias`\n(`re.fullmatch`) at parse time -- a missing/out-of-range/malformed\nnumber, an unknown method word, or a title-less heading all fail the\nparse eagerly (REQ-003). The method word is one of the five DTAIS words:\n`Demonstration`, `Test`, `Analysis`, `Inspection`, `Special` (the\n`specmgr://dtais` vocabulary). AC numbers need not be contiguous (gaps are\nallowed, numbers are never renumbered); duplicates are rejected by\n`Vcr`'s own after-validator (the `ValidationError` channel, mirroring\nDEC's `Decision._validate_option_numbers_unique`).\n\nUnlike DEC's `Option`/RSK's `Probability`/`Impact` (all *leaf* sections\nwith zero other declared fields, so their own `.text` computed property\nreturns the *complete* extent verbatim, heading marker and any body\ntext both included), this class declares two other fields\n(`description`, `test_steps`), making it a *composite* section: its own\n`.text` therefore returns only the heading's own inline content (marker\nstripped, body text excluded -- see `MarkdownSection.text`'s composite\nbranch). `number`/`method` below are matched against that heading-only\n`.text` directly, not `.text.splitlines()[0]` -- the DEC/RSK idiom's\nexact mechanics don't apply verbatim here because of this leaf/composite\ndifference, even though the underlying idea (compute a value from the\nretained heading text via a private module-level compiled regex) is the\nsame. A consequence: an `AcceptanceCriterion`'s body may contain nothing\nbesides an optional free-form `description` paragraph followed by an\noptional `#### Test Steps` -- both independently optional (e.g. one\ncriterion may carry only a description, another only `Test Steps`,\nanother both, another neither), in that fixed declaration order.\n\nParameters\n----------\ndescription:\n The lead paragraph directly under the heading -- free-form prose\n elaborating on the criterion beyond what fits in the heading\n itself (mirrors `MoreInformation`'s \"free-form, no fixed format\"\n tone). Optional; independent of `test_steps`.\ntest_steps:\n `#### Test Steps` sub-section (a numbered verification procedure).\n Optional; independent of `description`.\nnumber:\n Computed. The criterion's 3-digit number (e.g. `1` for\n `### AC-001 (Test): ...`). Never stored separately -- derived from\n the retained heading text.\nmethod:\n Computed. The closed DTAIS method word carried by the heading\n (e.g. `\"Test\"` for `### AC-001 (Test): ...`), exactly as written\n (not lowercased/normalized). Never stored separately -- derived\n from the retained heading text." - added
Output schema / $defs / AcceptanceCriterion / patternAdded value: +"^AC-(\\d{3}) \\((Demonstration|Test|Analysis|Inspection|Special)\\): .+$" - added
Output schema / $defs / VcrFrontmatter / properties / status / enumAdded value: +[ + "approved", + "complete", + "draft", + "progress" +]
- Changed
set_classification12 fields changed- added
Output schema / $defs / DecFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / FeatFrontmatter / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +] - added
Output schema / $defs / GolFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / PrbFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "draft", + "resolved" +] - added
Output schema / $defs / QaFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / ReqFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / RskFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "closed", + "dropped", + "mitigating", + "occurred", + "open" +] - added
Output schema / $defs / SopFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / SysrsFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / TskFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / UcFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "superseded" +] - added
Output schema / $defs / VcrFrontmatter / properties / status / enumAdded value: +[ + "approved", + "complete", + "draft", + "progress" +]
- Changed
set_feat_id1 field changed- added
Output schema / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +]
- Changed
set_status16 fields changed- changed
Output schema / $defs / Adr / descriptionPrevious value: -"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the future parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` (plan §8) are expected to exchange\nwith the LLM instead of raw markdown text.\n\nThe specmgr schema version lives on ``frontmatter.version`` (plan §3),\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do (plan §7); a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."New value: +"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` exchange with the LLM instead of raw\nmarkdown text.\n\nThe specmgr schema version lives on ``frontmatter.version``,\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do; a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`." - changed
Output schema / $defs / AdrBody / descriptionPrevious value: -"The ADR body: whole-section fields (plan §4) plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section (plan §5).\n\nEach whole-section field maps 1:1 to the ``key`` values the future\n``update_section(key, value)`` MCP tool accepts (plan §4's table),\nusing this model's snake_case attribute names rather than the table's\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors plan §4's rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them\n (plan §4).\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty (plan §5). Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional."New value: +"The ADR body: whole-section fields plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section.\n\nEach whole-section field maps 1:1 to the ``key`` values the\n``update_section(key, value)`` MCP tool accepts,\nusing this model's snake_case attribute names rather than\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors the rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them.\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty. Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional." - changed
Output schema / $defs / AdrFrontmatter / descriptionPrevious value: -"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only (plan §3) -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path`` (plan §9a). This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with (plan §6). This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline (plan §7) and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional."New value: +"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path``. This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with. This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional." - changed
Output schema / $defs / AdrOption / descriptionPrevious value: -"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel from plan §4 does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool\n(plan §5, §8), not by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank."New value: +"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool,\nnot by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank." - added
Output schema / $defs / DecFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / FeatFrontmatter / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +] - added
Output schema / $defs / GolFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / PrbFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "draft", + "resolved" +] - added
Output schema / $defs / QaFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / ReqFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / RskFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "closed", + "dropped", + "mitigating", + "occurred", + "open" +] - added
Output schema / $defs / SopFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / SysrsFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / TskFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / UcFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "superseded" +] - added
Output schema / $defs / VcrFrontmatter / properties / status / enumAdded value: +[ + "approved", + "complete", + "draft", + "progress" +]
- Changed
update12 fields changed- added
Output schema / $defs / DecFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / FeatFrontmatter / properties / status / enumAdded value: +[ + "done", + "planning", + "progress", + "review" +] - added
Output schema / $defs / GolFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / PrbFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "draft", + "resolved" +] - added
Output schema / $defs / QaFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / ReqFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "implemented", + "proposed", + "rejected", + "superseded" +] - added
Output schema / $defs / RskFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "closed", + "dropped", + "mitigating", + "occurred", + "open" +] - added
Output schema / $defs / SopFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / SysrsFrontmatter / properties / status / enumAdded value: +[ + "active", + "approved", + "draft", + "retired", + "review" +] - added
Output schema / $defs / TskFrontmatter / properties / status / enumAdded value: +[ + "active", + "cancelled", + "done", + "draft" +] - added
Output schema / $defs / UcFrontmatter / properties / status / enumAdded value: +[ + "accepted", + "deprecated", + "draft", + "proposed", + "superseded" +] - added
Output schema / $defs / VcrFrontmatter / properties / status / enumAdded value: +[ + "approved", + "complete", + "draft", + "progress" +]
- Changed
update_frontmatter5 fields changed- changed
Input schema / $defs / AdrFrontmatter / descriptionPrevious value: -"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only (plan §3) -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path`` (plan §9a). This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with (plan §6). This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline (plan §7) and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional."New value: +"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path``. This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with. This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional." - changed
Output schema / $defs / AdrBody / descriptionPrevious value: -"The ADR body: whole-section fields (plan §4) plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section (plan §5).\n\nEach whole-section field maps 1:1 to the ``key`` values the future\n``update_section(key, value)`` MCP tool accepts (plan §4's table),\nusing this model's snake_case attribute names rather than the table's\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors plan §4's rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them\n (plan §4).\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty (plan §5). Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional."New value: +"The ADR body: whole-section fields plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section.\n\nEach whole-section field maps 1:1 to the ``key`` values the\n``update_section(key, value)`` MCP tool accepts,\nusing this model's snake_case attribute names rather than\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors the rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them.\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty. Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional." - changed
Output schema / $defs / AdrFrontmatter / descriptionPrevious value: -"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only (plan §3) -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path`` (plan §9a). This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with (plan §6). This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline (plan §7) and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional."New value: +"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path``. This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with. This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional." - changed
Output schema / $defs / AdrOption / descriptionPrevious value: -"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel from plan §4 does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool\n(plan §5, §8), not by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank."New value: +"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool,\nnot by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank." - changed
Output schema / descriptionPrevious value: -"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the future parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` (plan §8) are expected to exchange\nwith the LLM instead of raw markdown text.\n\nThe specmgr schema version lives on ``frontmatter.version`` (plan §3),\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do (plan §7); a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."New value: +"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` exchange with the LLM instead of raw\nmarkdown text.\n\nThe specmgr schema version lives on ``frontmatter.version``,\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do; a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."
- Changed
update_section4 fields changed- changed
Output schema / $defs / AdrBody / descriptionPrevious value: -"The ADR body: whole-section fields (plan §4) plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section (plan §5).\n\nEach whole-section field maps 1:1 to the ``key`` values the future\n``update_section(key, value)`` MCP tool accepts (plan §4's table),\nusing this model's snake_case attribute names rather than the table's\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors plan §4's rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them\n (plan §4).\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty (plan §5). Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional."New value: +"The ADR body: whole-section fields plus the dynamic\n``Option`` collection that backs the derived ``## Pros and Cons of the\nOptions`` section.\n\nEach whole-section field maps 1:1 to the ``key`` values the\n``update_section(key, value)`` MCP tool accepts,\nusing this model's snake_case attribute names rather than\ncamelCase key strings -- the tool layer, not this model, is responsible\nfor translating between the two.\n\nMandatory fields (``title``, ``context_and_problem_statement``,\n``considered_options``, ``decision_outcome``) must be non-blank; this\nmirrors the rule that ``update_section`` must reject a deletion\nsentinel targeting a mandatory section rather than write it. Optional\nfields (``decision_drivers``, ``consequences``, ``confirmation``,\n``more_information``) normalize a blank/whitespace-only value to\n``None``, i.e. \"absent\", consistent with the render-time rule that an\nabsent optional section omits its heading entirely.\n\nParameters\n----------\ntitle:\n The ``# {title}`` H1. Mandatory.\ncontext_and_problem_statement:\n ``## Context and Problem Statement``. Mandatory.\ndecision_drivers:\n ``## Decision Drivers``. Optional.\nconsidered_options:\n ``## Considered Options``. Mandatory. Kept fully independent from\n ``options`` below -- no consistency check is enforced between them.\ndecision_outcome:\n ``## Decision Outcome`` text before any H3. Mandatory.\nconsequences:\n ``### Consequences`` under Decision Outcome. Optional.\nconfirmation:\n ``### Confirmation`` under Decision Outcome. Optional.\noptions:\n The dynamic ``### Option N: {title}`` collection. Backs the derived\n ``## Pros and Cons of the Options`` section, which is rendered iff\n this list is non-empty. Defaults to an empty list.\nmore_information:\n ``## More Information``, always last. Optional." - changed
Output schema / $defs / AdrFrontmatter / descriptionPrevious value: -"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only (plan §3) -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path`` (plan §9a). This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with (plan §6). This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline (plan §7) and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional."New value: +"The ADR YAML frontmatter block.\n\nUpdate contract: whole object, full replace only -- there is\nno partial-update or deletion-sentinel mechanism for frontmatter; omit a\nkey from the submitted object to drop it.\n\nParameters\n----------\nid:\n The specmgr-assigned document identifier (a server-generated UUID\n string), used to resolve ``id -> file path``. This is a\n specmgr-only extension key, not part of the MADR 4.0.0 standard --\n assigned once by ``create_adr`` and never reassigned. Optional\n (``str | None = None``, default ``None``), the same non-breaking-\n addition pattern used for ``version`` below, so existing/hand-\n authored files without an ``id`` still parse successfully; they are\n just not addressable via id-based tools until one is assigned.\nversion:\n The specmgr schema major.minor.patch version this document was\n written with. This is a specmgr-only extension key, not\n part of the MADR 4.0.0 standard -- it is kept alongside the\n MADR-defined keys below purely so it round-trips through the\n parse/render pipeline and lets a future parser dispatch\n an on-disk file to the ``models/adr/vN`` package that understands\n it, or recognize a document still on an older major version.\n Defaults to :data:`CURRENT_SCHEMA_VERSION`. Must share this\n package's major component -- ``models.adr.v1.AdrFrontmatter`` never\n accepts a ``\"2.x.x\"`` value.\nstatus:\n Either one of ``\"draft\"``, ``\"proposed\"``, ``\"rejected\"``,\n ``\"accepted\"``, ``\"deprecated\"``, ``\"superseded\"``, or a string\n matching ``^superseded by .+$``. Defaults to ``\"draft\"`` -- both\n when the key is absent entirely and when it is present but blank\n (e.g. MADR's bare-bones template ships a placeholder ``status:``\n with nothing after the colon, which YAML parses as ``None``, not\n an absent key).\ndate:\n Free-form date the decision was last updated (MADR uses\n ``YYYY-MM-DD``, not enforced here since the ``.md`` file is the\n source of truth). Optional.\ndecision_makers:\n Free-form list of everyone involved in the decision, as written in\n the frontmatter (YAML key ``decision-makers``). Optional. Accepts\n either the literal hyphenated YAML key or the snake_case field name\n (``validation_alias``, not ``alias``, so static type checkers keep\n seeing ``decision_makers`` as the constructor parameter name -- see\n ``tests/models/adr/v1/test_frontmatter.py`` for both call shapes).\nconsulted:\n Free-form list of subject-matter experts consulted. Optional.\ninformed:\n Free-form list of people kept up to date on progress. Optional." - changed
Output schema / $defs / AdrOption / descriptionPrevious value: -"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel from plan §4 does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool\n(plan §5, §8), not by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank."New value: +"One entry of the dynamic ``## Pros and Cons of the Options`` collection.\n\nRendered as ``### Option {number}: {partial_title}``. Options are never\nindividually mandatory -- zero options is a valid ADR state -- and the\nwhole-section deletion sentinel does not apply to them;\nremoval only ever happens through the dedicated ``option_delete`` tool,\nnot by submitting a blank/``\"REMOVE\"`` value here.\n\nParameters\n----------\nnumber:\n Monotonically increasing, unpadded, never-reused counter assigned at\n creation time. Deleting an option leaves a gap; remaining options are\n neither renumbered nor reordered.\npartial_title:\n The ``{title}`` portion after ``\"Option {number}: \"``. Must be\n non-blank and single-line (no embedded line breaks).\ncontent:\n Opaque markdown blob for the option's body (no enforced\n Good/Bad/Neutral structure). May be empty -- unlike the mandatory\n whole-section body fields, an option's content is never required to\n be non-blank." - changed
Output schema / descriptionPrevious value: -"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the future parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` (plan §8) are expected to exchange\nwith the LLM instead of raw markdown text.\n\nThe specmgr schema version lives on ``frontmatter.version`` (plan §3),\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do (plan §7); a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."New value: +"A full ADR document: YAML frontmatter and body.\n\nThis is the structured object the parser produces from an\non-disk ``.md`` file and the renderer consumes to produce one, and the\nshape ``get_adr``/``create_adr`` exchange with the LLM instead of raw\nmarkdown text.\n\nThe specmgr schema version lives on ``frontmatter.version``,\nnot here -- it must round-trip through the on-disk file's YAML block,\nwhich only ``frontmatter``/``body`` do; a top-level field on\nthis wrapper class would never be persisted.\n\nParameters\n----------\nfrontmatter:\n The YAML frontmatter block, including the schema version. See\n :class:`AdrFrontmatter`.\nbody:\n The parsed body sections and options. See :class:`AdrBody`."
103 tool updates
v0.36.0- First observed
create_adr - First observed
create_dec - First observed
create_feat - First observed
create_gol - First observed
create_prb - First observed
create_qa - First observed
create_req - First observed
create_rsk - First observed
create_sop - First observed
create_sysrs - First observed
create_tsk - First observed
create_uc - First observed
create_vcr - First observed
delete - First observed
edit - First observed
find_related - First observed
find_similar_text - First observed
get_adr - First observed
get_dec - First observed
get_dec_example - First observed
get_dec_template - First observed
get_feat - First observed
get_feat_example - First observed
get_feat_template - First observed
get_gol - First observed
get_gol_example - First observed
get_gol_template - First observed
get_prb - First observed
get_prb_example - First observed
get_prb_template - First observed
get_qa - First observed
get_qa_example - First observed
get_qa_template - First observed
get_reference_diagram - First observed
get_reference_diagram_all - First observed
get_req - First observed
get_req_example - First observed
get_req_template - First observed
get_rsk - First observed
get_rsk_example - First observed
get_rsk_template - First observed
get_sop - First observed
get_sop_example - First observed
get_sop_template - First observed
get_sysrs - First observed
get_sysrs_example - First observed
get_sysrs_template - First observed
get_tsk - First observed
get_tsk_example - First observed
get_tsk_template - First observed
get_uc - First observed
get_uc_diagram - First observed
get_uc_example - First observed
get_uc_plantuml_example - First observed
get_uc_plantuml_template - First observed
get_uc_sequence_skeleton - First observed
get_uc_template - First observed
get_use_case_package_diagram - First observed
get_vcr - First observed
get_vcr_example - First observed
get_vcr_template - First observed
list_adr - First observed
list_dec - First observed
list_feat - First observed
list_gol - First observed
list_prb - First observed
list_qa - First observed
list_references - First observed
list_req - First observed
list_rsk - First observed
list_sop - First observed
list_sysrs - First observed
list_tsk - First observed
list_uc - First observed
list_vcr - First observed
mdformat - First observed
option_create - First observed
option_delete - First observed
option_list - First observed
option_read - First observed
option_update - First observed
parse_dec - First observed
parse_feat - First observed
parse_gol - First observed
parse_prb - First observed
parse_qa - First observed
parse_req - First observed
parse_rsk - First observed
parse_sop - First observed
parse_sysrs - First observed
parse_tsk - First observed
parse_uc - First observed
parse_vcr - First observed
plantuml_encode - First observed
set_classification - First observed
set_feat_id - First observed
set_status - First observed
update - First observed
update_frontmatter - First observed
update_section - First observed
validate - First observed
validate_adr - First observed
validate_plantuml
TDQS
Scored across 124 tools
Each tool targets a distinct (domain, action) pair — create_prb vs create_req vs get_tsk etc. are clearly separated by domain token, and the generic update/edit/delete/set_status/set_classification are clearly scoped. There is mild ambiguity between parallel families (get_X id-based read vs parse_X path-based parse, update vs edit vs option_update vs update_section, get_reference_diagram vs _all), but descriptions disambiguate well.
Most tools follow verb_domain (create_prb, get_tsk, list_gol, parse_sysrs), but there is notable inconsistency: bare verbs with no noun (update, edit, delete, validate, mdformat), noun_verb reversal (option_create, option_list, option_read), mixed uc vs use_case spelling (get_uc_schema vs get_use_case_package_diagram), and some domain-in-name vs domain-as-parameter splits.
124 tools for a 14-domain spec manager is heavy; while the per-domain parallelism (create/get/list/parse/template/example/schema for ~13 domains) partially justifies the count, it is far past the practical ceiling for agent navigation and surfaces many rarely-needed variants.
Coverage is very strong: full create/get/list/validate/update/edit/delete lifecycle across 13 whole-body domains plus ADR-specific tools, references, similarity search, diagrams, and translation drift. Minor gaps: ADR is excluded from delete/set_status/set_classification/validate generic tools and has no delete_adr, leaving some ADR lifecycle dead ends.
Maintenance
Related MCP Connectors
MCP server for Product Management
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for innovationlab documentation, generated by doc2mcp.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceShared project memory MCP server for storing and retrieving technical decisions, lessons learned, ADRs, and cross-links between projects.-
- AlicenseNot gradedqualityCmaintenanceMCP 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
- AlicenseNot gradedqualityCmaintenanceMCP server that manages C4 architecture models, ADRs, and flow diagrams as TOML files in a docs directory, with git versioning and an HTTP viewer.MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that turns a folder of Markdown ADRs into live tools for AI agents: search, author, validate, link, and trace architectural decisions, with preview-by-default writes.1MIT