Skip to main content
Glama

Set document status

set_status

Change an existing document's status across supported domains, preserving its body and optionally selecting a language variant; invalid status values return structured details.

Instructions

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.

Input Schema

NameRequiredDescriptionDefault
idYes
typeYes
statusYes
languageNoen
superseded_byNo

Output Schema

NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv0.38.0
    • addedInput schema / properties / language
      Added value: +{
      +  "default": "en",
      +  "title": "Language",
      +  "type": "string"
      +}
    • changedInput schema / properties / type / enum
      Previous 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"
      +]
    • addedOutput schema / $defs / TxtFrontmatter
      Added 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"
      +}
    • changedOutput schema / properties / result / anyOf
      Previous 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"
      +  }
      +]
  2. Changed16 schema fields changedv0.37.0
    • changedOutput schema / $defs / Adr / description
      Previous 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`."
    • changedOutput schema / $defs / AdrBody / description
      Previous 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."
    • changedOutput schema / $defs / AdrFrontmatter / description
      Previous 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."
    • changedOutput schema / $defs / AdrOption / description
      Previous 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."
    • addedOutput schema / $defs / DecFrontmatter / properties / status / enum
      Added value: +[
      +  "accepted",
      +  "deprecated",
      +  "draft",
      +  "proposed",
      +  "rejected",
      +  "superseded"
      +]
    • addedOutput schema / $defs / FeatFrontmatter / properties / status / enum
      Added value: +[
      +  "done",
      +  "planning",
      +  "progress",
      +  "review"
      +]
    • addedOutput schema / $defs / GolFrontmatter / properties / status / enum
      Added value: +[
      +  "accepted",
      +  "deprecated",
      +  "draft",
      +  "implemented",
      +  "proposed",
      +  "rejected",
      +  "superseded"
      +]
    • addedOutput schema / $defs / PrbFrontmatter / properties / status / enum
      Added value: +[
      +  "active",
      +  "cancelled",
      +  "draft",
      +  "resolved"
      +]
    • addedOutput schema / $defs / QaFrontmatter / properties / status / enum
      Added value: +[
      +  "active",
      +  "cancelled",
      +  "done",
      +  "draft"
      +]
    • addedOutput schema / $defs / ReqFrontmatter / properties / status / enum
      Added value: +[
      +  "accepted",
      +  "deprecated",
      +  "draft",
      +  "implemented",
      +  "proposed",
      +  "rejected",
      +  "superseded"
      +]
    • addedOutput schema / $defs / RskFrontmatter / properties / status / enum
      Added value: +[
      +  "accepted",
      +  "closed",
      +  "dropped",
      +  "mitigating",
      +  "occurred",
      +  "open"
      +]
    • addedOutput schema / $defs / SopFrontmatter / properties / status / enum
      Added value: +[
      +  "active",
      +  "approved",
      +  "draft",
      +  "retired",
      +  "review"
      +]
    • addedOutput schema / $defs / SysrsFrontmatter / properties / status / enum
      Added value: +[
      +  "active",
      +  "approved",
      +  "draft",
      +  "retired",
      +  "review"
      +]
    • addedOutput schema / $defs / TskFrontmatter / properties / status / enum
      Added value: +[
      +  "active",
      +  "cancelled",
      +  "done",
      +  "draft"
      +]
    • addedOutput schema / $defs / UcFrontmatter / properties / status / enum
      Added value: +[
      +  "accepted",
      +  "deprecated",
      +  "draft",
      +  "proposed",
      +  "superseded"
      +]
    • addedOutput schema / $defs / VcrFrontmatter / properties / status / enum
      Added value: +[
      +  "approved",
      +  "complete",
      +  "draft",
      +  "progress"
      +]
  3. First observedv0.36.0

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so: 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.

Conciseness2/5

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.

Completeness5/5

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

For a mutation tool with 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Deploy Server

Other Tools