Skip to main content
Glama

@illodev/workfile is a repository-native protocol for coordinating Work, Docs, History and durable project Memory between humans and software agents.

Markdown files in the repository are canonical. The CLI, HTTP API and local UI use the same core services, collection registry, index and validation rules. No exclusive state is kept in the browser or in a database.

Work, Docs, History and Memory share the common ProjectRecord index. The core, CLI, HTTP server and MCP runtime are authored in TypeScript and distributed as compiled ESM with public declarations. The local UI is precompiled and included in the package, and semantic search runs on-device through the optional @illodev/workfile-search-local workspace package.

Try the live demo — it replays this repository's own workspace: the real cards, releases, incidents and learnings of Workfile's development. Mutations work per browser session and reset on reload.

https://github.com/user-attachments/assets/c9cd3035-6729-4cda-9172-984829ab5dbc

Used by

Related MCP server: elefante

Boundaries

Workfile records work. It does not configure agents.

The two get confused because both live next to the same repository. Ecosystem configurators — gentle-ai is a good example — install a persona, curated skills, model routing, MCP servers and review gates into the agents you already use, across many agents at once. Their question is how your agent works. Workfile's question is what was done, who holds it and on what evidence, and its answer is Markdown files that outlive the agent, the session and this package.

They compose. A well-configured agent still needs somewhere durable to write down what it did.

What is here, and is not a configurator's job:

  • The repository is canonical. A card is a file in the pull request: reviewed in the diff, reported by workfile doctor when malformed. No exclusive state in a browser, a database or ~/.config. Remove the package and the records stay readable.

  • Claims are enforced, not agreed. Ownership is checked at the mutation, so a card another actor holds refuses your transition with CARD_CLAIM_OWNER_MISMATCH instead of quietly accepting it — a guarantee no sentence in a prompt can make.

  • review is not done. done requires evidence from somewhere the code actually ran. A merge is not evidence.

  • Humans read the same records. The UI, the rendered changelog and the releases are derived from exactly what the agent writes; there is no machine view and human view to keep in sync.

What is deliberately absent: Workfile does not install or update agents, ship a persona, route models or curate a skill catalogue. It syncs its own protocol into the instruction files an agent already reads (workfile agents sync) and exposes every operation over MCP — vendor neutral, but a server, not an ecosystem.

Requirements

  • Node.js 22 or newer.

  • npm, pnpm, yarn or Bun may invoke the package.

Install

Every workfile … command in this README requires the package to be installed — pnpm dlx / npx one-offs run a command and discard the binary afterwards:

pnpm add -D @illodev/workfile     # per repository (recommended)
pnpm workfile doctor              # dependency bins run through pnpm / npx

pnpm add -g @illodev/workfile     # or globally: `workfile` lands on your PATH
workfile doctor
wf doctor                         # `wf` is the same binary, for typing by hand

wf is an alias, not a rename: both names reach the same entry point, and the help and error hints answer in whichever one you typed. Keep the long form in anything generated or shared. wf only resolves once the package is installed, and an unrelated wf exists on the registry — so npx wf would fetch someone else's tool where npx workfile fails outright.

pnpm dlx @illodev/workfile init is fine for one-shot initialization, but keep the package as a devDependency afterwards: that is what makes the project* scripts that init adds to package.json resolve. That prefix is an npm script namespace — pnpm project opens the UI, pnpm project:doctor runs the checks — and has nothing to do with the old binary name.

TypeScript API

The published surface exposes JavaScript and declarations through conditional package exports. TypeScript consumers receive typed configuration, workspace, record, search and integration contracts from the root package and every documented subpath:

import {
    defineProject,
    type CardStatus,
    type ProjectConfig,
    type ProjectRecord
} from "@illodev/workfile";
import { createSemanticSearchProvider } from "@illodev/workfile/search";

const config: ProjectConfig = defineProject({
    schemaVersion: 2,
    name: "Billing",
    cards: {
        areas: ["api", "web"]
    }
});

const status: CardStatus = "doing";

The CLI and UI do not require TypeScript in consuming projects. React, Primer, Vite and the UI type packages are build-only dependencies; the installed package serves bundled browser assets from dist/ui.

Workspace

A project is discovered through project.config.mjs and normally stores protocol-owned files under .project/:

project.config.mjs
.project/
├── VERSION
├── cards/
│   └── archive/
├── assets/
├── docs/
├── changelog/
│   ├── unreleased/
│   └── releases/
├── memory/
│   ├── learnings/
│   ├── decisions/
│   ├── incidents/
│   ├── conventions/
│   └── context/
├── agents/
└── .cache/

Minimal configuration — a plain object, not defineProject(...). The loader applies defineProject itself, and an import here is a bare specifier the file can only resolve with node_modules present, which breaks the two consumers that run without one: a pnpm dlx-initialized workspace before the package is installed, and the generated CI job's npx run on a clean clone. The JSDoc annotation keeps editor typing without a runtime import:

/** @type {import("@illodev/workfile").ProjectConfigInput} */
export default {
    schemaVersion: 2,
    name: "My project",
    cards: {
        areas: ["api", "web", "infra", "docs"]
    },
    docs: {
        sources: [
            "README.md",
            "docs/**/*.md",
            "apps/*/README.md",
            ".project/specs/**/*.md"
        ]
    },
    changelog: {
        releaseStrategy: "semver",
        defaultVisibility: "public"
    },
    memory: {
        collections: [
            "learnings",
            "decisions",
            "incidents",
            "conventions",
            "context"
        ]
    },
    agents: {
        targets: ["agents-md", "cursor"]
    },
    ci: {
        targets: ["github"]
    },
    mcp: {
        allowMutations: true
    },
    search: {
        semanticWeight: 0.35,
        maxProviderRecords: 500
    }
};

Project-specific areas, paths and vocabularies are resolved at runtime and exposed through the effective schema. The eight Work statuses and the schema-v2 memory collection semantics remain protocol contracts.

Work

Cards are managed Markdown records under .project/cards/. The Work module provides hierarchy, dependencies, claims, scope, status transitions, archives, assets and conflict-aware writes.

workfile card list --json
workfile card show T-0042 --json
workfile card create --title "Implement runtime schema" --area infra
workfile card create --json-input card.json   # body, parent, source and tags in one call
workfile card claim T-0042 --scope apps/api,packages/sdk   # actor resolves itself
workfile card transition T-0042 review
workfile card patch T-0042 --json-input changes.json --expected-revision sha256:...
workfile card archive T-0042
workfile card reopen T-0042 --status backlog

Docs

Docs combines two sources without copying existing documentation:

  • Indexed documents discovered from configured globs. They receive deterministic PATH-* IDs and remain read-only through the protocol.

  • Managed documents stored in .project/docs/ with stable DOC-NNNN IDs, typed frontmatter and revision-aware mutations.

Managed documents are read recursively, so they can be grouped in folders — including folders you create by hand. IDs stay global and sequential: a folder is organization, not identity. New documents follow docs.layout (kind, the default, groups them by document kind; flat writes them to the managed root) and --folder overrides it.

workfile doc list --query billing
workfile doc show DOC-0012 --json
workfile doc create --title "Deployment runbook" --kind runbook --status current
workfile doc create --title "Rate limiting" --folder architecture/billing
workfile doc move DOC-0012 --folder architecture
workfile doc patch DOC-0012 --json-input changes.json --expected-revision sha256:...

The doctor detects broken local links, unresolved related or superseded records, missing scope paths and stale review/source relationships.

History

History uses atomic change fragments rather than asking multiple branches or agents to edit one shared CHANGELOG.md.

Unreleased fragment:

---
id: CHG-0042
title: Add portable history workspace
type: added
area: infra
visibility: public
cards: [T-0042]
created: 2026-07-28
updated: 2026-07-28
---

A release consumes selected fragments, moves them beneath the release directory and creates a canonical REL-NNNN record. Public or internal changelogs are derived output.

workfile changelog list --unreleased
workfile changelog add --title "Add portable history" --type added --area infra
workfile changelog preview
workfile changelog release 0.4.0 --title "History and Memory"
workfile changelog render --visibility public
workfile changelog render --visibility public --write
workfile changelog verify

Release versions can use semver, calendar or freeform validation according to configuration. Fragments and releases participate in the same workfile search and backlink graph as cards, docs and memory.

Memory

Memory is a set of typed, atomic and lifecycle-aware records rather than a single growing conversation transcript:

Collection

Prefix

Purpose

Learnings

LRN

Reusable observations with confidence and occurrence signals

Decisions

ADR

Proposed, accepted, rejected or superseded decisions

Incidents

INC

Operational events, severity, timing and corrective actions

Conventions

CONV

Durable rules followed by humans and agents

Context

CTX

Useful but potentially expiring project state

workfile memory list --collection learnings --status active
workfile memory add learning --title "Atomic fragments avoid merge conflicts" \
  --confidence high
workfile memory add decision --title "Keep Markdown canonical" --status accepted
workfile memory add incident --title "Release pipeline stalled" --severity high
workfile memory graduate LRN-0004 --to CONV-0002,DOC-0012
workfile memory supersede ADR-0003 --by ADR-0009
workfile memory patch CTX-0002 --json-input changes.json --expected-revision sha256:...
workfile memory verify

The doctor checks invalid lifecycle states, missing graduation/supersession targets, expired context and incomplete incident resolution metadata.

Unified index

Every module normalizes its files as ProjectRecord entries through a common collection registry. The derived process-local index provides:

  • weighted full-project text search;

  • lookup by stable record ID;

  • outgoing references and incoming backlinks across all four domains;

  • card source: links and local Markdown links;

  • module-specific health, lifecycle and freshness signals;

  • module and collection counts.

Canonical state always remains on disk. The server cache is short-lived, invalidatable and fully rebuildable.

workfile search "billing architecture"
workfile search release --kind change,release,memory --limit 25 --json

Initialization

The initializer can run interactively or deterministically in automation. It detects the package manager, monorepo folders, likely card areas, documentation sources, existing agent environments and CI providers. A dry run exposes the exact filesystem plan.

pnpm dlx @illodev/workfile init
pnpm dlx @illodev/workfile init --yes \
  --agents agents-md,claude,cursor,copilot --ci github
workfile init --dry-run --json

The generated project.config.mjs exports a plain object, so a workspace initialized via pnpm dlx remains loadable before the package is installed locally. Existing files are not overwritten unless --force is explicit. .project/.cache/ is added to .gitignore; all canonical protocol files remain tracked.

Hosted demo

The UI ships with a demo mode for static hosting (Vercel, GitHub Pages, any file server). npm run build:demo builds the UI with an in-memory API that replays a snapshot of a seeded workspace: every view works and mutations behave normally for the session, then reset on reload. The repository includes a vercel.json, so importing it into Vercel deploys the demo with zero configuration.

pnpm run demo:data   # reseed and resnapshot packages/workfile/ui/src/demo-data.json
pnpm run build:demo  # static demo build into packages/workfile/dist/demo

Regular builds tree-shake the demo layer and snapshot out of the bundle.

Releasing

Releases publish from CI via npm trusted publishing (OIDC) — no npm token is stored in the repository. The circuit:

  1. Cut the changelog: workfile changelog release <version> and workfile changelog render --write.

  2. Bump and tag: npm version <version> then git push && git push --tags. The version hook carries every packages/* package inside the same bump — workspace packages always ship the core's version.

  3. The Release workflow verifies the tag matches package.json (and that no workspace version drifted), runs check:release (build, typechecks, tests, audit and a packaged-tarball smoke) with pnpm, and publishes the core and every workspace package with the npm CLI under latest.

There is no prerelease channel: every published version is one npm install away, and a v*-rc.* tag fails the release rather than publishing. That is a consequence of trusted publishing rather than a preference — OIDC authorizes npm publish and no other registry write, so CI cannot move a dist-tag off a release candidate once it has been set.

Agent Protocol

Canonical instructions and workflows live under .project/agents/. Compact managed blocks are synchronized into supported environments without replacing unrelated user content:

AGENTS.md
CLAUDE.md
.cursor/rules/workfile.mdc
.github/copilot-instructions.md
workfile agents sync
workfile agents sync --targets agents-md,claude,cursor,copilot
workfile agents check
workfile agents context --card T-0042

Managed blocks carry the package version and a SHA-256 digest. agents check and workfile doctor report missing, unmanaged or stale generated instructions. Agent context is bounded and prioritizes the selected card, direct relationships, active conventions, unresolved incidents and non-expired context instead of loading all workfile memory.

Model Context Protocol

Workfile includes a local, dependency-free MCP server using UTF-8, newline-delimited JSON-RPC over stdio. It delegates every operation to the same core services used by the CLI and HTTP API, speaks both the modern (2026-07-28) and legacy (2025-11-25) protocol revisions, and exposes 30 tools, four resources and three prompts. Mutation tools disappear entirely in --read-only mode.

Point a client at it without installing anything. This is the invocation the official registry publishes for io.github.illodev/workfile, and what most clients will build for you from that listing:

{
  "mcpServers": {
    "workfile": {
      "command": "npx",
      "args": ["-y", "@illodev/workfile", "mcp"]
    }
  }
}

mcp there is a subcommand, not a binary: npx resolves the bin whose name matches the package and hands it everything that follows. Append --root PATH when the client starts somewhere other than the workspace — it searches upwards for .project/ otherwise — and --read-only to serve the read tools alone, with every mutation refused.

With the package installed, the same server is a subcommand away:

workfile mcp
workfile mcp inspect --json
workfile mcp config --read-only --json

For Claude Code the same surface ships as a plugin — the MCP server plus /claim, /context, /next and /done commands, a skill, and hooks that turn card claims into an executable guard rail — with no generated files committed to the repository:

/plugin marketplace add illodev/workfile
/plugin install workfile@illodev

The full contract — tool inventory, resources, prompts, process hygiene and the plugin's surface — is documented in docs/mcp.md.

The server is listed on Glama, which builds it in a container and inspects the capabilities it reports:

Workfile MCP server on Glama

Search integrations

Lexical search remains deterministic and local. Hosts may inject an optional semantic provider programmatically; Workfile never selects a vendor or sends repository content over the network by itself.

First-party: local embeddings

@illodev/workfile-search-local runs embeddings on-device (onnxruntime-web, ONNX on CPU, Xenova/multilingual-e5-small quantized) — repository content never leaves the machine. Declare it in project.config.mjs with a guarded import, because the config must also load where the package cannot resolve (the generated CI job runs npx on a clean clone):

export const integrations = await (async () => {
    try {
        const { localSearchIntegration } = await import(
            "@illodev/workfile-search-local"
        );
        return [localSearchIntegration()];
    } catch {
        return []; // package absent: search stays lexical
    }
})();

export default {
    // …
    search: { provider: "local-embeddings" }
};

Know the cost model before wiring it: the first hybrid search embeds every uncached candidate record — minutes of sustained CPU on a few-thousand-record workspace, triggered by whichever surface searches first (CLI, board UI, or the MCP server an agent loads). The provider caps ONNX at half the cores by default, persists per batch so an interrupted pass resumes instead of restarting, and reports progress on stderr; sizing search.maxProviderRecords to your corpus makes every record eligible. Details and options in packages/search-local/README.md.

Bring your own

import {
    createSemanticSearchProvider,
    searchProjectRecordsHybrid
} from "@illodev/workfile/search";

const provider = createSemanticSearchProvider({
    id: "company-embeddings",
    async search({ query, records }) {
        // Return [{ id, score }] with scores between 0 and 1.
        return rankWithYourApprovedProvider(query, records);
    }
});

const result = await searchProjectRecordsHybrid(index.records, query, {
    provider,
    semanticWeight: 0.35
});

The adapter boundary makes external data disclosure an explicit host decision and keeps the canonical Markdown/index implementation provider-independent.

Experimental integration registry

Programmatic hosts can group approved semantic search and health adapters in a small, vendor-neutral registry:

import {
    createIntegrationRegistry,
    defineProjectIntegration
} from "@illodev/workfile/integrations";

const integrations = createIntegrationRegistry([
    defineProjectIntegration({
        id: "company.platform",
        semanticSearchProvider: provider,
        async healthCheck({ workspace, index }) {
            return [];
        }
    })
]);

The registry is accepted by the MCP server and doctor APIs. It is intentionally limited in the current RC: vendor-specific issue trackers, deployment systems and credentials are not part of the canonical package. The boundary can mature from real integrations without committing the schema to GitHub, GitLab, Jira or a deployment provider.

CI templates

CI files use the same managed-file contract and can be generated for GitHub Actions, GitLab CI or a generic shell runner:

workfile ci sync --targets github,gitlab,generic
workfile ci check

Templates run both the workfile doctor and agent synchronization check against the pinned Workfile version.

Legacy migration

The v1 .planning system can be planned and applied with deterministic collision checks:

workfile migrate plan --source .planning
workfile migrate apply --source .planning --mode copy
workfile migrate apply --source .planning --mode move

Valid legacy cards and assets become canonical v2 Work records. Old proposals, changelogs, learnings and malformed records are preserved under .project/sources/legacy-planning/ rather than being silently reinterpreted with an incompatible schema. Every applied migration writes .project/migrations/legacy-planning.json with source, destination, digest and result metadata.

General CLI

workfile init
workfile schema --json
workfile doctor --json
workfile ui
workfile ui --read-only --host 0.0.0.0 --allowed-host board.example.com

Commands return stable machine-readable errors with --json. A stale revision exits with code 3; configuration errors exit with code 2; validation and not-found errors exit with code 1. The complete command surface is documented in docs/cli.md.

HTTP API

workfile ui --read-only --host 0.0.0.0 --allowed-host board.example.com serves the same board as a thing people read: every mutating route answers 409 WORKSPACE_READ_ONLY and the UI drops its editing affordances. There is still no authentication of its own, so put a reverse proxy that authenticates in front of anything published this way — see docs/security.md.

workfile ui starts the local server, normally at http://127.0.0.1:4747. The versioned /api/v2/* surface covers the workspace, unified search, and every collection — cards, docs, changelog (including release preview/assembly/render), memory lifecycle, agents and CI sync. Managed record reads expose an ETag, writes accept If-Match, and errors use stable codes. The endpoint reference lives in docs/http-api.md.

Local UI

Navigation is a collapsible sidebar grouped by domain:

  • Work: Explorer, Triage, Flow, Epics and a Gantt Timeline (status-colored bars, month scale, today marker).

  • Knowledge: Docs (search, Markdown, metadata, freshness, scope, backlinks) and Memory (typed collections, lifecycle warnings, graduation and supersession).

  • Project: Workflow (the provenance graph — every record a node, typed relations as edges), History (fragments, releases, release preparation, rendered changelog preview) and Health.

Health issues can navigate to records in any domain. Runtime configuration drives card areas, change vocabularies and memory collection statuses; these values are not compiled into the views. File links open the local editor, or the repository web UI when the server provides a repoUrl (as the hosted demo does).

Overview: a verdict sentence, three tiles, the whole remaining backlog and the activity trail collapsed by actor and minute

The Overview answers "how are we doing" in a sentence chosen worst-first — doctor errors, hanging claims, colliding scopes, blocked cards, work in flight — above the trail of every move the agents wrote while you were away.

Explorer with the inspector open

Gantt timeline

Explorer with a card selected — claim, scope and metadata in the inspector

Gantt timeline: month scale, status-colored bars, dependency arcs and today marker

History with releases

Memory (dark theme)

History: change fragments, the derived changelog and release preparation

Memory: learnings, decisions and incidents as typed collections

Workflow: every record a node and every typed relation an edge, with the collections and relation types as filters above the canvas

Workflow reads the collections into one graph instead of four lists: the first row of toggles selects them, the second selects relation types. A relation declared in frontmatter draws a solid edge and an ID written into a sentence a dashed one, because a link in prose is a weaker claim than a field and should not look equally solid. Prose scanning is off by default — it is 294 of this workspace's 742 edges.

Development

The repository is a pnpm workspace: the root is a private shell that holds the version and delegator scripts, while everything published lives under packages/ — the core in packages/workfile, providers like packages/search-local beside it, all shipping in version lockstep. pnpm is pinned via the packageManager field (corepack enable picks it up automatically):

pnpm install
pnpm run check
pnpm run smoke:package
node ./packages/workfile/dist/bin/workfile.js mcp inspect --root ./packages/workfile/test/fixtures/workspace --json
node ./packages/workfile/dist/bin/workfile.js schema --root ./packages/workfile/test/fixtures/workspace --json
node ./packages/workfile/dist/bin/workfile.js doctor --root ./packages/workfile/test/fixtures/workspace --json
node ./packages/workfile/dist/bin/workfile.js ui --root ./packages/workfile/test/fixtures/workspace

pnpm run check compiles the TypeScript runtime and declarations, checks the strict public consumer contract, typechecks and bundles the React UI, and runs the complete test suite. pnpm run smoke:package packs and installs the actual tarball in a temporary project before exercising initialization, all four domains, MCP and the packaged UI — the smoke installs with npm on purpose, exercising the npm consumer path.

prepack rebuilds the runtime declarations and UI so a future published package contains only compiled runtime artifacts under dist/, never development TypeScript or a copied UI source tree.

Current guarantees

  • restricted frontmatter codec with byte-stable scalar/list round trips;

  • preservation of unknown frontmatter fields and body bytes;

  • atomic file replacement, per-record locks and collision-safe ID reservations;

  • SHA-256 revision tokens and stale-write rejection;

  • atomic Work claims, transitions, archive and reopen operations;

  • managed Docs, History fragments and typed Memory mutations;

  • release assembly with canonical fragment consumption and derived rendering;

  • configurable repository-safe paths and runtime vocabularies;

  • common normalization, search, references and backlinks across all domains;

  • health diagnostics for Work, Docs, History and Memory;

  • compiled ESM and .d.ts declarations for the public package and subpath exports;

  • executable packaged CLI/MCP binaries verified from a clean tarball installation;

  • versioned API plus a compatibility adapter for the original board.

Documents

  • docs/getting-started.md — install, initialize and the daily loop.

  • docs/cli.md — complete CLI reference for every module.

  • docs/http-api.md — endpoint reference, conventions and errors.

  • docs/mcp.md — MCP server contract: tools, resources, prompts.

  • docs/security.md — threat model of the local server, request guard, asset handling and what is deliberately out of scope.

  • docs/ui.md — the interface: its build, the zero-dependency guarantee and how the shadcn migration coexists with the design system.

  • docs/SPEC.md — the normative protocol specification: data model, record contracts, revision semantics and the MCP integration contract.

Available Tools

30 tools
project_agent_contextBuild bounded agent contextA
Read-onlyIdempotent

Build a compact context bundle around a card from direct relations, active conventions, open incidents and active project context. Prefer this over reading records one by one before working on a card.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum related records to include.
cardIdYesCard the bundle is centred on, e.g. T-0042.

Output Schema

ParametersJSON Schema
NameRequiredDescription
focusYesID of the card the bundle was built around.
recordsYesThe selected records, with bodies.
markdownNoThe same bundle rendered as Markdown, ready to paste into a prompt.
truncatedNoTrue when relevant records were dropped to respect limit.
generatedAtNoWhen the bundle was assembled, RFC 3339.
totalAvailableNoRelated records before limit was applied.

TDQS

A4.5/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the key behavior of aggregation (from multiple source types: direct relations, conventions, incidents, project context) and boundedness ('compact context bundle', 'limit' defaults). However, it doesn't describe what happens when no data is found for a category, or how current the data is. With strong annotations present, a 3 is appropriate.

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

Conciseness5/5

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

Two sentences, zero waste. The first sentence states the purpose with concrete content types; the second provides an actionable usage recommendation. Every phrase earns its place, and the description is front-loaded with the most important information.

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

Completeness5/5

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

The tool outputs a context bundle (with an output schema present), so the description need not explain return values. It enumerates the source types that feed the bundle, names the intended workflow use-case, and the annotations + schema cover the safety and parameter dimensions. For a read-only aggregation tool, this is complete.

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

Parameters4/5

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

Schema coverage is 100%, so the input schema already documents both parameters (cardId and limit) fully. The description adds value by explaining that the bundle is 'centred on' the card and is 'compact' (bounded), which clarifies the semantic role of the limit parameter beyond its schema description. However, the param-level value-add is modest since the schema is already complete, giving a 4 rather than 5.

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

Purpose5/5

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

The description uses a specific verb+resource ('Build a compact context bundle around a card') and clearly enumerates what it aggregates: direct relations, active conventions, open incidents, and active project context. It clearly distinguishes itself from sibling tools like project_get_record or project_search, making the purpose unmistakable.

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

Usage Guidelines5/5

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

The description explicitly states when to prefer this tool: 'Prefer this over reading records one by one before working on a card.' This gives the agent a clear decision rule and differentiates from sibling tools that fetch single records or search. It explains the intended workflow context (working on a card) rather than just what the tool does.

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

project_card_archiveArchive a closed work cardA
Destructive

Move a closed card to the canonical archive directory. Only done and discarded cards can be archived; the ID and the file survive, so project_card_reopen undoes this.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCard to archive. Must already be done or discarded.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false. The description adds meaningful behavioral context: the card 'survives' (the archive is reversible via project_card_reopen), which is genuinely new information beyond annotations. It doesn't discuss permission/auth requirements, but given the annotation coverage and that this is a state-change operation, the transparency is decent.

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

Conciseness5/5

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

Two crisp sentences with zero filler. The first sentence states the action, the second packs the precondition, survivability, and reversibility notes into an efficient caveat clause. Everything earns its place.

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

Completeness4/5

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

Given the tool has an output schema (so return format is handled), full schema coverage for 2 params, and clear annotations (destructiveHint=true), the description covers the essential semantics: what it does, which cards qualify, and reversibility. It could mention concurrency/revision implications or permissions, but for a single-item state-change tool this is reasonably complete.

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

Parameters4/5

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

Schema description coverage is 100%, so both parameters are documented in the schema. The description adds value by confirming the id parameter must reference a done/discarded card, aligning with the schema. The expectedRevision parameter is not elaborated in the description, but the schema covers its semantics (concurrency check) thoroughly, so the baseline 3 is exceeded slightly by the id constraint reinforcement.

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

Purpose4/5

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

The title 'Archive a closed work card' plus description 'Move a closed card to the canonical archive directory' clearly state the verb (archive/move) and resource (closed card). It doesn't explicitly distinguish from siblings like project_card_write or project_card_reopen, but the domain-specific 'canonical archive directory' adds clarity. It drops slightly from a 5 because it doesn't name the sibling alternatives for differentiation.

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

Usage Guidelines4/5

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

The description states the precondition ('Only done and discarded cards can be archived') and notes the reversible nature via project_card_reopen, giving clear context. It doesn't explicitly say when NOT to use it or name alternatives as the when/not alternatives, but the inversion (reopen undoes) implies the lifecycle placement.

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

project_card_claimClaim a work cardA

Claim a card for an actor, move it to doing and optionally declare the filesystem scope that will be changed. Claim before editing anything the card covers; another actor's claim is refused unless forced.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCard to claim, e.g. T-0042.
actorYesWho is claiming. Defaults to the MCP client's own name; a hand-typed value will not match the identity the edit guard sees.
forceNoTake a claim another actor already holds. Requires reason.
scopeNoRepository paths this claim covers. Overlapping scopes are what stop two agents editing the same files.
reasonNoWhy the existing claim is being taken over. Recorded on the card.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.
warningsNoNon-fatal findings, such as a stale claim that was taken over.

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already declare non-readonly and non-idempotent, so the description needn't repeat that. It adds valuable context: the claim mutates state (moves to 'doing'), enforces exclusivity (refused unless forced), and involves concurrency protection. It doesn't describe the return format or outcome details, but with annotations covering the basic safety profile plus output schema present, this is solid.

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

Conciseness5/5

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

Three sentences with zero filler. Front-loads the core action and purpose, then adds the critical exclusivity caveat. Every sentence earns its place.

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

Completeness5/5

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

For a complex concurrency-sensitive tool with 6 parameters, dedicated annotations, and an output schema, the description is complete. It captures the essential mutating behavior, exclusivity rules, filesystem scope purpose, force/override semantics, and timing guidance. The output schema and rich parameter descriptions handle the rest.

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 100% and parameters are richly described in the schema itself. However the description adds meaningful semantics beyond the schema: it frames scope as the mechanism 'stopping two agents editing the same files' and clarifies that claim refusal semantics are the core behavior. The description and schema together fully explain the 6 parameters.

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?

Description clearly states the verb, resource, and concurrent effects: 'Claim a card for an actor, move it to doing and optionally declare the filesystem scope that will be changed.' This distinctly differentiates it from siblings like project_card_release, project_card_transition, and project_card_patch by naming the claim + move-to-doing + scope behavior.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('Claim before editing anything the card covers') and the exclusivity semantics ('another actor's claim is refused unless forced'), giving clear when/when-not guidance versus the sibling release and patch tools.

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

project_card_createCreate a work cardA

Create one canonical Work card with a concurrency-safe stable ID. Search first: this mints a new record rather than finding an existing one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dueNoTarget completion date, YYYY-MM-DD.
areaNoPart of the system this touches. Project-declared, so the accepted values vary; project_workspace reports them.
axesNoDeclared classification axes as { axis: value }, e.g. { context: "treasury" }. Project-declared, so the accepted values vary; project_workspace reports them.
bodyNoMarkdown body, written below the frontmatter.
tagsNoFree-form tags for filtering.
typeNoWhat kind of work this is.
scopeNoRepository paths this work will change. Declared here, enforced when the card is claimed.
startNoPlanned start date, YYYY-MM-DD.
titleYesWhat the card is about, in one line.
effortNoRough size: S, M or L.
parentNoID of the parent card. The hierarchy is bounded by cards.maxHierarchyDepth.
sourceNoWhere the work came from: an issue URL, a person, a meeting.
statusNoStarting lifecycle status.backlog
dependsNoIDs of cards that must close first. Blocks this card from being ranked as actionable.
relatedNoIDs of records worth reading alongside this one.
priorityNoHow urgent the work is.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false (it mutates), which the description's 'Create' and 'mints a new record' wording confirms—no contradiction. The description adds the concurrency-safe stable ID behavior as useful context. However, as a creation tool with an output schema, it doesn't disclose return behavior or whether partial failures occur, and 100% schema coverage means the description carries moderate additional burden beyond annotations.

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

Conciseness4/5

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

The description is two concise sentences with no filler. The operational guidance ('search first') is front-loaded and adds value. It could arguably mention the distinction from project_card_write explicitly, but the existing structure is tight and purposeful.

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

Completeness4/5

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

Given a complex 16-parameter tool with an output schema and annotations present, the description covers the key operational concern (search-first to avoid duplicates, concurrency-safe ID). The nuanced project-declared values (area, axes) are delegated to project_workspace which is correctly referenced. It's reasonably complete for a create operation, though could note what the canonical-creation invariant ensures about duplicates.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema documents all 16 parameters thoroughly. The description doesn't add parameter-level meaning beyond the schema. Baseline 3 is appropriate since the schema does the heavy lifting, though the description's comment about project_workspace for accepted area/axes values aligns with what schema already notes.

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

Purpose4/5

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

The description states a clear verb+resource ('Create one canonical Work card') with a distinctive attribute ('concurrency-safe stable ID'). It distinguishes from project_card_write (which shares the 'create' domain) by emphasizing 'one canonical' card with concurrency safety. However, it doesn't explicitly name the sibling it differs from, leaving some differentiation implicit.

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

Usage Guidelines4/5

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

The phrase 'Search first: this mints a new record rather than finding an existing one' provides explicit usage guidance, implying the agent should check for existing cards (via project_next or project_search) before calling create to avoid duplication. This gives clear context on when this tool is appropriate. It doesn't explicitly list excluded sibling tools, but the guidance is actionable.

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

project_card_listList work cardsA
Read-onlyIdempotent

List cards filtered by status, area, type, priority, parent or claim. Use before starting work; use project_search for full-text.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoKeep only these areas. Project-declared, so the accepted values vary; project_workspace reports them.
tagsNoKeep cards carrying any of these tags.
typeNoKeep only these card types. One of: epic, idea, feature, bug, task, audit, docs, chore.
limitNoMaximum cards to return.
offsetNoSkip this many matches before the page starts.
parentNoKeep only direct children of this card ID.
statusNoKeep only these statuses; any match passes. One of: backlog, next, doing, review, blocked, deferred, done, discarded.
priorityNoKeep only these priorities. One of: critical, high, medium, low.
claimedByNoKeep only cards claimed by this actor.
unclaimedNoKeep only cards nobody has claimed.
updatedSinceNoOnly records updated on or after this date. YYYY-MM-DD; an RFC 3339 timestamp is read as its date.

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitNoMaximum this page could contain.
totalYesMatches before offset and limit were applied.
offsetNoOffset this page started at.
recordsYesCards matching the filters, in list projection.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered by structured data. The description adds the filtered-list semantics and the 'use before starting work' workflow context. The openWorldHint=false is slightly in tension with the description implying exhaustive results, but this is reasonable for a filter-based 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.

Conciseness5/5

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

Two tight sentences: the first enumerates the filter dimensions in a compact list, the second states usage context and the alternative tool. Zero waste, all information earns its place.

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

Completeness4/5

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

For a 11-parameter read tool with an output schema and strong annotations, the description is complete enough. It explains the filter scope, provides usage timing, and names the alternative. No nested-object complexity or undocumented safety concerns. Could mention pagination behavior (limit/offset) but the schema documents those defaults clearly.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter having a detailed description including enums for type, status, and priority. The description names the filter dimensions but adds little beyond the schema. Baseline 3 is appropriate since the schema carries the full burden of parameter documentation and does so well.

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

Purpose5/5

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

The description clearly states the verb (list) and resource (work cards) with explicit filter dimensions (status, area, type, priority, parent, claim). It distinguishes from sibling project_search by noting the full-text alternative, and name/title reinforce the same purpose without contradiction.

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?

'Use before starting work' provides clear contextual guidance for when to invoke this tool, and it explicitly names project_search as the alternative for full-text queries. It doesn't enumerate every sibling's differentiation, but the key alternative is called out, which is sufficient given the schema provides exhaustive filter options.

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

project_card_noteAppend a note to a cardA

Append one timestamped line under a heading. Cheaper than rewriting the body and safe when two agents write at once.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCard to append to.
textYesThe line to append. One observation, not a paragraph.
actorNoWho to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf.
sectionNoHeading to append under. Created if it does not exist yet.Notes

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false (mutation) and destructiveHint=false, which the description supports by explaining it appends rather than rewrites. The description adds value by explaining concurrency safety and the "created if it does not exist" section behavior via the schema. It doesn't mention idempotency implications or whether the timestamp is server-side, but annotations cover the core safety profile.

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

Conciseness5/5

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

Two sentences, front-loaded with the core action, and zero filler. Every phrase earns its place — the timestamped-line detail, the cost comparison, and the concurrency safety are all high-value.

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

Completeness4/5

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

For an append-only tool with 4 params (100% schema coverage) and an output schema, the description plus schema fully covers the behavioral contract. The concurrency-safety note addresses the key risk of a mutation tool, and the heading-creation behavior is documented in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds the "timestamped" behavior and the "safe for concurrent writes" framing but doesn't add details about parameter formats or constraints beyond schema descriptions, which already document actor defaulting and section creation.

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?

Description says "Append one timestamped line under a heading" — specific verb (append), specific resource (card), and specific mechanism (timestamped line under heading). It distinguishes from sibling card_write and card_patch by emphasizing the append-only, cheap, concurrent-safe nature.

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?

Description says it's "cheaper than rewriting the body and safe when two agents write at once," which signals when to prefer this tool over writing/patching the body. It doesn't explicitly name the alternative tools (card_write/card_patch) or give exclusions, but the context is clear enough to guide selection.

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

project_card_patchPatch a work cardA
Idempotent

Patch allowed card metadata using optimistic concurrency. Use expectedRevision whenever the card was read earlier. Declared axes go in changes.axes as { name: value }; an empty value clears one.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCard to patch.
changesYesFrontmatter fields to overwrite, e.g. { priority: "high", tags: ["mcp"] }. Only the keys present are touched. Use project_card_transition for status and project_card_write for the body; declared axes go under an axes key.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, covering the safety profile. The description adds valuable behavior not in annotations: optimistic concurrency semantics — that expectedRevision causes refusal on stale writes and that an empty axes value clears an axis. The 'only the keys present are touched' partial-update behavior 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.

Conciseness5/5

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

The description is two dense, front-loaded sentences with zero filler. Every clause conveys load-bearing information: the operation, the concurrency model, the expectedRevision condition, and the axes clearing semantics. The schema descriptions are also concise and informative. No wasted words.

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

Completeness4/5

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

The tool has 3 params (100% schema coverage), nested objects, an output schema, and clear annotations. The description, combined with the rich schema and annotations, fully covers the patch mechanics, concurrency behavior, and axis handling. It's complete for the tool's complexity. The only minor gap is it doesn't explicitly preview the output, but the output schema exists so that burden is transferred.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all three parameters well. The description adds value beyond the schema: it clarifies that an empty axes value clears an axis, names the exact shape '{ name: value }' for changes.axes, and explains the concurrency-check behavior of expectedRevision beyond its schema text. This exceeds the schema-only baseline of 3.

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

Purpose5/5

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

The description says 'Patch allowed card metadata using optimistic concurrency' — a specific verb (patch) plus resource (card metadata) plus a defining mechanism (optimistic concurrency). It clearly distinguishes itself from siblings: the schema notes status belongs to project_card_transition and body to project_card_write, and the description explains axes placement, disambiguating from project_card_write and others.

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

Usage Guidelines5/5

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

Explicit guidance: 'Use expectedRevision whenever the card was read earlier' and 'Declared axes go in changes.axes'. The schema additionally directs status changes to project_card_transition and body changes to project_card_write, naming concrete alternatives. This is strong when-to-use versus alternative-tool guidance.

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

project_card_releaseRelease a claimA
Idempotent

Release your claim on a card and move it out of doing. Call when work stops, finished or not.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCard whose claim is being released.
actorNoWho to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf.
forceNoRelease a claim held by another actor. Requires reason.
reasonNoWhy another actor's claim is being released. Recorded on the card.
statusNoStatus to leave the card in. Omit to keep the current one — a card just moved to done is not demoted by releasing it — except doing, which becomes next because active work without a claimant is a contradiction. doing is refused as an explicit target.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the mutation profile is known. The description adds valuable behavioral nuance: the status handling rule that 'doing becomes next because active work without a claimant is a contradiction' and that doing is refused as an explicit target. The status-field description (inside params) explains the done-not-demoted edge case. Describes the force/actor interaction implicitly. Good behavioral context beyond annotations, though it could note the audit/permission implications of force more explicitly.

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

Conciseness5/5

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

Two concise sentences front-load the purpose and trigger condition. No wasted words. Every sentence earns its place, and the nuanced status behavior is deferred to the parameter schema where it belongs rather than cluttering the description.

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

Completeness4/5

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

For a mutation tool with idempotence declared and full schema coverage plus an output schema, the description is largely complete. It covers the action, the trigger, and the core behavioral twist (status handling). Could arguably add more on the force/reason authorization flow, but with 100% schema coverage and output schema present, the description carries adequate weight. Good completeness for its complexity.

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

Parameters4/5

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

Schema description coverage is 100%, so all 6 parameters are documented in the schema. The description adds specific behavioral context for the status parameter: the exception that a card just moved to done is not demoted by releasing, and the doing-becomes-next rule. This is genuinely useful semantic guidance beyond the raw enum/schema text. However, the description itself doesn't enumerate each parameter, relying on the full schema coverage, so baseline 3 plus the status nuance earns a 4.

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

Purpose5/5

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

The description states a specific action: 'Release your claim on a card and move it out of doing.' This is a specific verb+resource with clear scope. It distinguishes from sibling tools like project_card_claim (the inverse operation) and project_card_transition by focusing on claim release specifically. Clear and actionable.

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?

'Call when work stops, finished or not' provides clear trigger context for when to use the tool. It distinguishes releasing from simply transitioning by noting it moves cards 'out of doing.' While it doesn't explicitly name alternatives or when-not-to-use, the purpose is clear enough that the agent can differentiate this from claim, transition, and patch operations. Lacks explicit exclusions naming sibling alternatives, hence not a 5.

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

project_card_reopenReopen an archived work cardA

Move an archived card back out of the archive directory and into a live status. The ID never changes, so every existing reference to it keeps resolving.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesArchived card to bring back.
actorNoWho to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf.
statusNoStatus to reopen into.backlog
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false. The description's key value is the 'ID never changes' guarantee and the mechanism (moving out of archive directory into a live status). However, it doesn't disclose things like whether reopened cards retain notes/memory, or what happens to the prior done/archived status beyond the archive flag. With annotations covering the safety profile, this is adequate but not rich.

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

Conciseness5/5

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

Two tight sentences with zero waste. The first delivers the purpose and action; the second delivers the critical behavioral guarantee (ID stability). Front-loaded and efficient.

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

Completeness4/5

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

The output schema exists and schema coverage is 100%, so the description doesn't need to detail returns. The key forward-looking guarantee (ID never changes) is stated. It could briefly note that reopening impacts references for the status param or the actor field, but the essentials are covered for this moderately complex tool.

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

Parameters4/5

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

Schema coverage is 100%, so all 4 params are documented. The description adds meaningful context on the 'id' param (the one that never changes) and complements the 'status' enum by clarifying the card is 'brought back into a live status.' It reinforces the expectedRevision semantics through the 'write is refused if no longer matches' phrasing, adding practical value beyond the schema's 'skip the check' note.

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

Purpose4/5

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

Clear verb+resource: 'Move an archived card back out of the archive directory and into a live status.' Specifies what it does and the key net effect (the ID never changes, references keep resolving). While it's clear and distinct from siblings like project_card_archive (the inverse action), it doesn't explicitly name a sibling as a contrast, so not quite a 5.

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

Usage Guidelines3/5

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

The description implies this is used after project_card_archive, and states the ID-stability benefit. However, it doesn't explicitly say when to use this versus project_card_transition or project_card_write (which also affect status), nor state any preconditions or exclusions for when reopening is appropriate.

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

project_card_transitionTransition a work cardA

Move a card to another protocol status. Moving to doing claims the card for the actor; review means the implementation is finished but unverified, and done requires evidence it ran, not a commit.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCard to transition.
actorNoWho to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf.
scopeNoRepository paths to claim when moving to doing. Ignored by the other statuses.
statusYesTarget status. backlog: identified, uncommitted. next: prioritized. doing: actively worked, and claimed by the actor. review: implemented, awaiting verification. blocked: externally blocked, record why. deferred: postponed on purpose, record why. done: verified where it actually runs. discarded: will not be done, record why.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so the tool is known to mutate but not destroy. The description adds valuable semantics beyond annotations: moving to 'doing' claims the card for the actor, 'done' requires evidence it ran (not a commit). This adds protocol-level behavioral context that annotations alone don't convey.

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

Conciseness4/5

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

Three sentences, front-loaded with the core action and then targeted clarifications on the most semantically-loaded statuses (doing, review, done). No wasted words. Could arguably be even tighter, but every sentence earns its place.

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

Completeness4/5

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

The tool is moderately complex (8 statuses, 5 params) with a full output schema and 100% schema coverage. The description covers the key conceptual distinctions (claim semantics, verification requirement, evidence standard). The mutating-but-not-destructive profile is clear, and the complexity is well addressed for an agent selecting transitions.

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

Parameters4/5

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

Schema coverage is 100%, so the status enum and parameter descriptions are complete. The description adds meaningful value beyond the schema: it clarifies the claim-on-doing behavior and the evidence requirement for 'done', which enrich what the enum descriptions alone convey. The description reinforces but doesn't restate the full enum.

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

Purpose4/5

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

The description uses a specific verb ('Move') and resource ('a card') with clear target (''another protocol status'). It names what the tool does. However, it doesn't explicitly distinguish from siblings like project_card_claim, project_card_release, or project_card_reopen, though the status-enum and claim semantics provide implicit differentiation.

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

Usage Guidelines3/5

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

The description clarifies nuanced semantics of moving to 'doing', 'review', and 'done' (claiming for actor, verification, evidence-of-run). It gives implicit context but doesn't explicitly say when to use this vs alternatives like project_card_claim/release, nor state exclusions. Sibling differentiation is implied through status semantics rather than stated.

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

project_card_writeReplace a card bodyA

Replace the Markdown body of a card under the protocol's lock and revision check. Use project_card_note to append instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCard whose body is being replaced.
bodyYesThe complete new Markdown body. This overwrites, so read the card first unless you intend to discard what is there.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare destructiveHint=false, but the description and schema clarify this is an overwriting operation ('The complete new Markdown body. This overwrites'). The schema's expectedRevision parameter explains the concurrency behavior ('The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten'), which adds meaningful behavioral context beyond the annotations about the destructive/overwrite semantics and lock/version checking.

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

Conciseness5/5

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

The description is two tight sentences: one states the primary action and mechanism, the second gives the sibling alternative. Zero wasted words, and the overwrite warning is delivered in the schema. Perfect front-loading of the core purpose.

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

Completeness4/5

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

The tool is a mutation with a concurrency-control mechanism, and the schema + annotations cover the essential context well. The description explains the protocol lock/revision behavior and names the append alternative. The output schema exists, so return-value documentation isn't needed. Slight gap: no mention of what happens if the id doesn't exist, but the revision check covers the main failure mode.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (id, body, expectedRevision) are documented in the schema itself. The description adds marginal value ('This overwrites, so read the card first' clarifies body semantics beyond a plain field label). Per the rubric, baseline 3 is appropriate when the schema already handles parameter documentation fully.

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

Purpose5/5

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

The description states a clear verb+resource+action: 'Replace the Markdown body of a card' with a specific mechanism ('under the protocol's lock and revision check'). It distinguishes from sibling project_card_patch (partial vs full replace) and explicitly points to project_card_note as the append alternative. This clearly differentiates from siblings.

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

Usage Guidelines5/5

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

The description explicitly names the alternative tool for appending ('Use project_card_note to append instead') and the schema hints to read the card first ('read the card first unless you intend to discard what is there'). The expectedRevision parameter semantics also tell the agent when to use it and what happens on mismatch, giving clear when-to-use and excluded-behavior guidance.

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

project_changelog_addAdd a changelog fragmentA

Create an atomic unreleased changelog fragment and relate it to cards, decisions or other records. One fragment per user-visible change, written when the change lands rather than when the release is cut.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoPart of the system that changed. Project-declared, so the accepted values vary; project_workspace reports them.
bodyNoMarkdown body, written below the frontmatter.
tagsNoFree-form tags for filtering.
typeNoWhat kind of change this is — added, changed, fixed and so on. Project-declared, so the accepted values vary; project_workspace reports them.
cardsNoIDs of the cards this change came from.
titleYesThe change, stated from the reader's side rather than the implementer's.
issuesNoExternal issue or ticket references.
relatedNoIDs of other records worth reading alongside.
decisionsNoIDs of decision records this change implements.
visibilityNoWho the entry is rendered for, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, so the mutating nature is already signaled; annotations do not contradict. The description adds behavioral context: fragments are 'unreleased' (they accumulate until a release tool consolidates them) and 'atomic', giving the agent a sense of scope and lifecycle. It doesn't detail response format or failure modes, but output schema and annotations cover some of this. Slight gap on what happens after creation, but the note about 'unreleased' is valuable.

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

Conciseness4/5

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

Two sentences, no filler, front-loaded with the core purpose. The second sentence adds genuinely useful operational guidance (granularity and timing). Could arguably be trimmed but every word earns its place and nothing is redundant with the schema.

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

Completeness4/5

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

With 10 parameters but full schema coverage and a present output schema, the description's job is modest. It communicates the invariance rules (atomic, unreleased, timing) which the schema cannot express. It doesn't spell out the relation types fully, but the schema fields (cards, decisions, related, issues) cover that. Reasonably complete for a create-oriented tool.

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

Parameters3/5

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

Schema coverage is 100%, so all 10 parameters have structured descriptions already. The description adds the 'atomic' and 'unreleased' framing that connects to title/body semantics, but doesn't itself explain individual parameters. Per the baseline rule, schema is doing the heavy lifting, so 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb+resource ('Create an atomic unreleased changelog fragment') and adds clear semantics: one fragment per user-visible change, written when the change lands rather than when release is cut. It also mentions relating to cards, decisions, or other records, which distinguishes it from siblings like project_changelog_patch (edits existing) and project_changelog_list (lists).

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

Usage Guidelines4/5

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

The description gives clear timing guidance ('written when the change lands rather than when the release is cut') and the atomicity rule ('One fragment per user-visible change'). It implies the creation use-case distinct from patch/release siblings, though it doesn't explicitly say 'use list/patch instead when...'. The timing and granularity advice is useful, context-rich guidance by name.

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

project_changelog_listList change fragments and releasesA
Read-onlyIdempotent

List unreleased change fragments and cut releases, filtered by type, area or visibility.

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoKeep only these areas. Project-declared, so the accepted values vary; project_workspace reports them.
typeNoKeep only these change types. Project-declared, so the accepted values vary; project_workspace reports them.
limitNoMaximum records to return.
offsetNoSkip this many matches before the page starts.
releasedNotrue keeps only fragments already consumed by a release; false keeps only unreleased ones.
visibilityNoKeep only these visibilities, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them.

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitNoMaximum this page could contain.
totalYesMatches before offset and limit were applied.
offsetNoOffset this page started at.
recordsYesChange fragments and releases matching the filters, in list projection.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, establishing this as a safe read operation. The description adds the 'released' filtering semantic (consumed by release vs unreleased) as context beyond what annotations provide. For a read-only listing tool with strong annotations, the coverage is adequate.

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

Conciseness4/5

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

A single compact sentence covering purpose and filter dimensions. It's efficient and front-loaded, though the enumerated filters in the description are implied rather than explicitly mapped to parameter names, which would add marginal clarity without bloating length.

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

Completeness4/5

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

There is an output schema present (has_output_schema=true), so return structure doesn't need description coverage. With 100% param schema coverage and read-only annotations, the tool is reasonably self-documenting. The description could mention the released/unreleased distinction as the core listing dimension, but overall completeness is good for a listing tool.

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

Parameters4/5

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

Schema coverage is 100%, so all 6 parameters have descriptions in the schema itself. The description adds a collapsed enumeration of filter dimensions (type, area, visibility) mapping to 3 of the params. The 'released' boolean parameter is documented in the schema but not surfaced in the description, which would have been helpful. Baseline 3 plus the filter-dimension synopsis merits a 4.

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

Purpose4/5

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

The description clearly states it lists unreleased change fragments and cut releases, filterable by type, area, or visibility. This distinguishes it from sibling changelog tools (add, patch, preview, release) which are mutation or preview operations. However, it doesn't explicitly contrast against sibling changelog_list variants, so it's clear but not fully differentiating.

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

Usage Guidelines3/5

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

The description implies usage for listing/filtering changelog content but provides no explicit when-to-use guidance or exclusions. Siblings like project_changelog_add, project_changelog_patch, project_changelog_release are clearly mutations, so listing is the natural read operation, but no alternative tools are named and no exclusion criteria given.

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

project_changelog_patchPatch a changelog fragmentA
Idempotent

Patch an unreleased changelog fragment using optimistic concurrency. Only works before a release consumes the fragment; afterwards the text belongs to that release.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUnreleased fragment to patch, e.g. CHG-0101.
changesYesFrontmatter fields to overwrite — title, type, area, visibility, tags and the relation lists — plus body to replace the Markdown. Only the keys present are touched.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false (it's a write), idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond annotations: the optimistic-concurrency mechanism and the release-boundary constraint ('afterwards the text belongs to that release'). This directly explains what happens in the concurrent-edit case and the lifecycle boundary.

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

Conciseness5/5

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

Two crisp, front-loaded sentences with zero wasted words. The first sentence states the purpose plus the key concurrency mechanism; the second sentence nails the critical lifecycle boundary. Every clause earns its place.

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

Completeness4/5

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

Given the moderately complex signature (a nested object parameter, an optional concurrency-check param) and the presence of an output schema, the description covers the essential operational semantics. It leaves details of the output schema to the schema itself. Could mention what fields are valid in 'changes' or error behavior, but the schema covers field names and the description covers the partial-update and concurrency semantics.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description's first sentence adds lifecycle semantics for the id parameter context and explains the concurrency-check behavior of expectedRevision. The 'Only the keys present are touched' note clarifies partial-update semantics for the changes object beyond what the schema states, which is valuable for an object parameter.

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

Purpose5/5

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

The description states a specific verb+resource ('Patch an unreleased changelog fragment') with clear scoping — it operates on 'unreleased' fragments only and explicitly distinguishes itself from the release-related lifecycle ('Only works before a release consumes the fragment'). It differentiates from sibling tools like project_changelog_add, project_changelog_list, and project_changelog_release which are lifecycle peers.

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

Usage Guidelines4/5

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

The description clearly states when the tool works ('before a release consumes the fragment') and its optimistic-concurrency behavior. It could be strengthened with an explicit alternative mention (e.g., adding vs patching a fragment), but the lifecycle constraint provides clear operational guidance.

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

project_changelog_previewPreview a releaseA
Read-onlyIdempotent

Render selected unreleased fragments without mutating the repository. Use to read a release before project_changelog_release makes it permanent.

ParametersJSON Schema
NameRequiredDescriptionDefault
visibilityNoRender only entries at this visibility, typically public or internal. Omit to include all of them. Project-declared, so the accepted values vary; project_workspace reports them.
fragmentIdsNoFragments to include, e.g. CHG-0101. Omit to preview every unreleased fragment.

Output Schema

ParametersJSON Schema
NameRequiredDescription
groupsNoEntries bucketed by change type, in render order.
markdownYesThe release notes as they would be written.
fragmentsNoFragments this preview covered.

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the agent knows it's a safe read. The description adds the non-mutating scoping ('without mutating the repository'), which reinforces but doesn't heavily extend beyond annotations. No info on output format, but output_schema exists.

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

Conciseness5/5

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

Two tight sentences with zero padding. Each sentence earns its place: one states the action+non-mutating guarantee, the other gives usage context against the sibling. Front-loaded purpose.

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

Completeness4/5

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

For a simple read-only preview tool with 2 optional params, full schema descriptions, an output schema, and solid annotations, the description is complete. The only slight gap is explaining why visibility values are project-variable, but the description already points to project_workspace for resolution, which is adequate.

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

Parameters4/5

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

Schema coverage is 100%, so the schema documents both params well. The description adds context: it explains that visibility is project-declared with varying accepted values, and that omitting fragmentIds previews every unreleased fragment. This adds operational meaning beyond raw 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?

Clear verb ('Render') + resource ('selected unreleased fragments') with explicit non-mutating scope. Names the sibling project_changelog_release as the permanent counterpart, distinguishing it well.

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

Usage Guidelines5/5

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

Explicitly says 'Use to read a release before project_changelog_release makes it permanent,' naming the alternative and the sequential relationship. This gives clear when-to-use guidance against a specific sibling.

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

project_changelog_releaseCreate a releaseA
Destructive

Consume selected unreleased fragments and create a canonical release record. This moves fragment files into the release directory, so preview first: the fragments stop being separately editable.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoMarkdown prelude written above the generated entries.
dateNoRelease date, YYYY-MM-DD. Defaults to today.
tagsNoFree-form tags for filtering.
titleNoRelease title. Defaults to the version itself.
commitNoCommit SHA this release was cut from.
versionYesVersion being cut, e.g. 0.5.4. Validated against changelog.releaseStrategy.
visibilityNoVisibility of the release record itself, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them.
fragmentIdsNoFragments to consume, e.g. CHG-0101. Omit to consume every unreleased fragment.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesThe release record that was created.
consumedFragmentsYesFragments that moved into the release directory and no longer exist as unreleased records.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations provide readOnlyHint=false and destructiveHint=true, but the description adds genuine value by explaining the specific destructive consequence: 'the fragments stop being separately editable' and that files are moved into the release directory. This goes beyond the annotation's generic destructive flag, warning the agent that the action is irreversible for those fragments. Combined with the destructiveHint=true annotation, this is solid 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.

Conciseness5/5

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

Two sentences, zero waste. Each sentence earns its place: the first states the action and resource, the second adds the critical destructive consequence and preview instruction. Front-loaded and efficient.

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

Completeness4/5

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

The tool has 8 parameters but all are documented in the 100%-covered schema. It has an output schema and destructiveHint annotation. The description explains the core destructive behavior (moving fragments, losing separate editability) and the preview prerequisite. Given the complexity of the release operation, the description is adequate though it could mention what the output schema contains; however, with an output schema present, the description isn't required to explain return values.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is documented in the schema itself. The description adds marginal value: it clarifies the semantics of the key destructive parameter (fragmentIds: 'Omit to consume every unreleased fragment') which is a meaningful behavioral note. However, most parameter meaning is carried by the schema descriptions, so the baseline-3 applies.

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

Purpose5/5

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

The description clearly states the verb+resource+outcome: 'Consume selected unreleased fragments and create a canonical release record.' It distinguishes from siblings by describing the fragment-to-release mechanism, which is unique among changelog-related tools (project_changelog_add/list/patch/preview don't aggregate fragments into a release).

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

Usage Guidelines4/5

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

The description gives clear context: you consume fragments and create a release record. It implies this is the finalization step and that previewing (project_changelog_preview) is a prerequisite via 'preview first'. It doesn't explicitly name the sibling alternative or give when-not scenarios, but the guidance is strong enough for selecting this tool over changelog add/patch/preview.

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

project_doc_createCreate managed documentationA

Create a managed Markdown document with a stable DOC ID. Without an explicit folder the workspace docs.layout decides where it is written.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoMarkdown body, written below the frontmatter.
kindNoWhat sort of document this is — architecture, runbook, reference and so on. Project-declared, so the accepted values vary; project_workspace reports them.
tagsNoFree-form tags for filtering.
scopeNoSubject matter this document covers — topics, not file paths.
titleYesWhat the document is about, in one line.
folderNoFolder below the managed docs root. Omit to let docs.layout decide; an empty string writes to the root.
ownersNoWho is answerable for keeping this accurate.
sourceNoWhere the content came from: a URL, a person, a meeting.
statusNoLifecycle status, typically draft or current. Project-declared, so the accepted values vary; project_workspace reports them.
relatedNoIDs of records worth reading alongside this one.
supersedesNoIDs of documents this replaces. They are marked superseded.
review_afterNoDate after which this goes stale, YYYY-MM-DD. Defaults to docs.reviewIntervalDays from now.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, indicating mutation but with no safety issue requiring disclosure. The description adds useful context about folder routing behavior and implicitly the creation action. However, it doesn't disclose behavioral traits like whether a DOC ID is auto-generated, what happens with duplicate titles, or whether creating generates review/stale reminders beyond the default review_after semantics mentioned in 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.

Conciseness4/5

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

Two sentences, front-loaded with the core purpose and a single meaningful behavioral constraint about folder placement. No fluff or redundancy. It earns its words, though it could be slightly more explicit about sibling differentiation.

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

Completeness4/5

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

With 12 parameters but 100% schema coverage and an output schema present, the description doesn't need to enumerate everything. It covers the most complex behavior (folder routing) that the schema can't fully express. Combined with the annotations and output schema, this is reasonably complete for a creation tool with a single required parameter.

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

Parameters3/5

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

Schema description coverage is 100%, with all 12 parameters having descriptions. The tool-level description adds the folder-routing nuance which schema alone wouldn't convey. However, most parameter semantics (kind, status, related, supersedes, etc.) are solely carried by the schema since the description doesn't elaborate further. Baseline 3 is appropriate given full schema coverage.

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

Purpose4/5

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

The description states a specific verb+resource ('Create a managed Markdown document') and adds a distinguishing feature ('stable DOC ID'). It differentiates from siblings like project_card_create and project_memory_add by focusing on managed documentation, though it doesn't explicitly name alternatives. The 'managed' qualifier and DOC ID point are genuinely informative.

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

Usage Guidelines4/5

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

The description explains the folder placement behavior ('Without an explicit folder the workspace docs.layout decides where it is written'), including that an empty string writes to the root. This gives clear context on when/where content lands, but doesn't explicitly discuss when to use this vs sibling doc tools (e.g., project_doc_patch for edits).

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

project_doc_listList documentsA
Read-onlyIdempotent

List indexed and managed documents, filtered by kind, status or freshness.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoKeep only these document kinds. Project-declared, so the accepted values vary; project_workspace reports them.
limitNoMaximum documents to return.
offsetNoSkip this many matches before the page starts.
statusNoKeep only these document statuses. Project-declared, so the accepted values vary; project_workspace reports them.
managedNotrue keeps only documents Workfile owns under the managed docs root; false keeps only repository files it merely indexes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitNoMaximum this page could contain.
totalYesMatches before offset and limit were applied.
offsetNoOffset this page started at.
recordsYesDocuments matching the filters, in list projection.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the read-only safety profile is already covered. The description adds freshness filtering and the indexed-vs-managed distinction, which enriches behavioral understanding beyond what annotations state. It doesn't contradict annotations.

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

Conciseness4/5

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

Single sentence, efficient, front-loaded with the core purpose. Minimal waste. The freshness mention is a small ambiguity since it's not an actual parameter, but overall concise and well-structured.

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

Completeness4/5

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

Output schema exists and is rich (5 params, all documented). The description covers what's expected of a filtered list tool. The one gap: 'freshness' is referenced in the description but no freshness parameter exists, which could confuse the agent about what filtering is actually available.

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

Parameters3/5

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

Schema description coverage is 100%, so all 5 parameters are described in the schema itself. The description adds 'freshness' as a filter axis (not a parameter, suggesting time-based filtering exists implicitly), and 'project_workspace reports them' for kind/status is useful cross-tool pointer that goes slightly beyond schema. Baseline 3 is appropriate.

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

Purpose4/5

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

Description is clear: 'List indexed and managed documents, filtered by kind, status or freshness.' It identifies verb (list), resource (documents), and the three filter axes. It distinguishes from siblings by noting these are 'indexed and managed' documents (vs card/changelog/memory lists), though it doesn't explicitly name an alternative sibling for filtering.

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

Usage Guidelines3/5

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

The description implies a query/filter tool and mentions 'indexed and managed' distinction which hints at scope, but it doesn't explicitly state when to use this vs project_doc_create/patch/move or when the managed vs indexed distinction matters practically. The managed parameter hints at one usage nuance but no explicit when-to-use guidance is given.

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

project_doc_moveMove managed documentationA
Idempotent

Move a managed document to another folder below the managed docs root. The DOC ID never changes; use an empty folder for the root.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesManaged document to move, e.g. DOC-0003.
folderYesDestination folder relative to the managed docs root. An empty string moves it to the root.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, and the description competently adds context: the DOC ID is stable across moves, and an empty folder targets the root. The expectedRevision optimistic-concurrency detail is valuable. No contradiction with the idempotentHint=true annotation; moving a doc to a location is plausibly idempotent.

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

Conciseness5/5

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

Two focused sentences with zero waste. The first states the action and constraint; the second adds the critical ID-stability fact and root-folder convention. Every word earns its place.

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

Completeness4/5

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

The tool is simple with a strong schema (100% coverage) and an output schema present. The description covers the key behavioral nuance (ID stability, root targeting) plus concurrency semantics via expectedRevision in the schema. Adequately complete for this level of complexity.

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

Parameters3/5

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

Schema coverage is 100% and parameter descriptions are strong (id, folder with root semantics, expectedRevision with concurrency behavior). The description adds the 'DOC ID never changes' fact and root convention, which complements rather than duplicates the schema. Baseline 3 is appropriate since the schema already carries the load.

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

Purpose4/5

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

The description states 'Move a managed document to another folder below the managed docs root' — a specific verb (move), resource (managed document), and destination (folder below root). It distinguishes from sibling doc tools (create/list/patch) by focusing on relocation. However, it doesn't explicitly name alternative tools for other doc operations.

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

Usage Guidelines3/5

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

The description implies when to use it (moving a document) but doesn't state when not to use it or name alternatives like project_doc_patch or project_doc_create. The 'DOC ID never changes' note and root-folder convention provide some usage context, but there's no explicit exclusion guidance.

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

project_doc_patchPatch managed documentationA
Idempotent

Patch a managed document using optimistic concurrency. Indexed repository docs are intentionally read-only through this tool — edit those files directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesManaged document to patch, e.g. DOC-0003.
changesYesFrontmatter fields to overwrite, plus body to replace the Markdown. Only the keys present are touched. Use project_doc_move to change the folder.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4/5.0
Behavior4/5

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

With idempotentHint=true annotation present, the bar is lower. The description adds genuine value by explaining the optimistic concurrency behavior (write refused on revision mismatch, concurrent edits reported rather than overwritten) and the read-only constraint on indexed repo docs. It doesn't mention the return format or error behavior in detail despite having an output schema, but the annotation plus inline concurrency explanation provide solid coverage.

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

Conciseness4/5

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

Two compact sentences that are front-loaded with the primary purpose and mechanism. The second sentence adds a critical safety constraint (read-only indexed docs) without padding. No filler or redundant restatement of the title. Slightly more guidance on return shape could push it higher, but overall it's economical and earns its sentences.

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

Completeness4/5

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

The tool has nested objects and an output schema, so the description doesn't need to explain return values. The description covers the concurrency mechanism, the partial-update behavior, the read-only restriction, and references the move tool for folder changes. This is well-rounded for a patch tool of moderate complexity, though it could mention error responses (e.g., revision conflict handling details) beyond what the schema states.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context beyond schema: it notes indexed docs are read-only, and it states that only keys present in 'changes' are touched (partial update semantics). The expectedRevision parameter's concurrency behavior is already well-described in the schema itself, so the description's mention reinforces rather than duplicates it. The partial-touch semantics in the description meaningfully complement the schema.

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

Purpose4/5

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

The description clearly states 'Patch a managed document using optimistic concurrency' — a specific verb+resource with a distinctive mechanism (optimistic concurrency). It also adds important scoping information by noting indexed repository docs are intentionally read-only through this tool. While the sibling project_doc_move is separately named for folder changes, the description doesn't explicitly differentiate from other patch tools like project_card_patch or project_memory_patch, though those target different resource types so the distinction is reasonably clear.

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

Usage Guidelines4/5

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

It states when to use (patch managed docs) and explicitly excludes indexed repository docs ('edit those files directly'), providing a clear when-not. The exclusion is valuable context. However, it doesn't contrast with the sibling patch tools (card, memory, changelog) explicitly, leaving the agent to infer resource-type differentiation, nor does it mention the project_doc_create/list alternatives for creation/listing flows.

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

project_doctorRun workfile doctorA
Read-onlyIdempotent

Validate Work, Docs, History, Memory, agent instructions, CI templates and cross-record references. Run before declaring work finished.

ParametersJSON Schema
NameRequiredDescriptionDefault
checkPathsNoAlso verify that paths referenced by records exist on disk. Set false to skip the filesystem walk on a large repository.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYesTrue when no error-severity issue was found.
cardsNoCards inspected.
countsNoIssue counts by severity: error, warning, info.
issuesYesFindings, each with a severity, a code and the record it concerns.
modulesNoRecord counts per module and collection.
generatedAtNoWhen this run completed, as an RFC 3339 timestamp.

TDQS

A4.4/5.0
Behavior4/5

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

The description provides solid behavioral context: it validates multiple artifact categories and checks cross-record references, and critically mentions that checkPaths performs a filesystem walk which can be disabled on large repos (a cost/perf disclosure). Annotations already declare readOnlyHint=true and destructiveHint=false, which the description aligns with. The description adds the performance-aware behavior about the filesystem walk beyond what annotations convey.

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

Conciseness5/5

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

The description is a single, information-dense sentence followed by a directive clause. Every word earns its place: it enumerates the validation targets, mentions cross-record references, and states the trigger condition. No filler, no redundancy with the schema or annotations.

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

Completeness4/5

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

The description is complete enough for this tool's complexity: single optional parameter fully documented in schema, output schema present (so return value details are covered elsewhere), and annotations declare the read-only, idempotent, non-destructive safety profile. The validation scope is enumerated explicitly. A pre-completion diagnostic tool with good schema/annotation coverage doesn't require much more.

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

Parameters4/5

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

Schema coverage is 100% and the single parameter checkPaths is fully documented in the schema itself (verify paths exist, skip filesystem walk on large repos). The description complements the schema by mentioning the filesystem walk implication ('checkPaths' behavior) in the context of validation scope. Since there's only one well-documented param and schema coverage is complete, the description doesn't need to add much here.

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 title and description clearly state the verb+resource: 'Run workfile doctor' and 'Validate Work, Docs, History, Memory, agent instructions, CI templates and cross-record references.' It enumerates the specific things validated, distinguishing it from sibling tools like project_card_list or project_memory_list, which are individual-file operations. The 'Run before declaring work finished' clause gives the purpose strong operational context.

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

Usage Guidelines4/5

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

The description provides clear when-to-use guidance ('Run before declaring work finished'), establishing it as a pre-completion verification step. It doesn't explicitly name alternatives or exclusions, but given the tool's unique validation role among siblings (none of which do cross-record validation), direction is reasonably clear. A named alternative or 'when not to use' would push this to 5.

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

project_get_recordRead a project recordA
Read-onlyIdempotent

Read one canonical project record by stable ID, including body, revision, outgoing references, backlinks and health signals. The revision it returns is what a later write passes as expectedRevision.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesStable record ID of any family: T-0042, DOC-0003, CHG-0101, REL-0007, ADR-0009.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, fully covering the safety profile. The description adds value by specifying the exact return contents (body, revision, outgoing references, backlinks, health signals) and the critical revision behavior — that the returned revision is what a later write passes as expectedRevision. This is genuinely useful beyond annotations, though it doesn't describe error cases (e.g., 404 for nonexistent IDs) or pagination behavior.

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

Conciseness5/5

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

Two efficient sentences, zero filler. The first states the action and scope; the second provides a critical behavioral detail about revision semantics. Every word earns its place.

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

Completeness4/5

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

With a rich output schema, good annotations, and a single well-documented parameter, the description is nearly complete. The revision→expectedRevision linkage is a subtle and important behavior clearly disclosed. It could mention error handling for nonexistent IDs, but given the completeness of structured fields, this is a minor gap.

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

Parameters3/5

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

Schema coverage is 100% — the id parameter is fully documented with examples (T-0042, DOC-0003, etc.) and a clear definition of stable record ID. The description adds the key semantic detail that the revision value is reused by writes as expectedRevision, which is valuable context linking this read to the write flow. Baseline of 3 is appropriate since the schema already handles parameter documentation well.

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?

Clear verb+resource: 'Read one canonical project record by stable ID'. It specifies exactly what's returned (body, revision, outgoing references, backlinks, health signals). Distinguishes from siblings like project_doc_list and project_search which fetch multiple/filtered results. The scope ('one canonical record') is unambiguous.

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

Usage Guidelines4/5

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

The description states it reads by stable ID and notes this is the getter counterpart to write tools. It implies this is for fetching single records by ID rather than listing/searching. However, it doesn't explicitly name alternative tools or state when NOT to use it (e.g., for bulk retrieval use project_search/project_card_list).

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

project_memory_addAdd workfile memoryA

Create a typed learning, decision, incident, convention or temporary context record. For knowledge that should change future behaviour — not for narrating what happened this session.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoMarkdown body, written below the frontmatter.
tagsNoFree-form tags for filtering.
scopeNoSubject matter this applies to — topics, not file paths.
titleYesThe knowledge itself, stated as a claim rather than a topic.
ownersNoWho is answerable for keeping this accurate.
statusNoLifecycle status. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them.
expiresNoFor context: the date after which this stops being true, YYYY-MM-DD.
relatedNoIDs of records worth reading alongside this one.
categoryNoOptional sub-classification within the collection.
decidersNoFor decisions: who made the call.
severityNoFor incidents: how bad it was.
collectionYesWhich kind of memory this is. learnings: something discovered that changes how the next attempt goes. decisions: a choice made, with its rationale (ADR). incidents: something that broke, and what it cost. conventions: a rule the project now follows. context: temporary situational state, which expires.
confidenceNoHow well established this is — for learnings, whether it has been seen once or many times.
started_atNoFor incidents: when it began, YYYY-MM-DD.
supersedesNoIDs of memory records this replaces. Prefer project_memory_supersede, which updates both sides.
occurrencesNoHow many times this has been observed.
resolved_atNoFor incidents: when it was resolved, YYYY-MM-DD.
graduated_toNoIDs of the durable records a learning has been promoted into.
review_afterNoDate after which this should be re-read, YYYY-MM-DD.
corrective_actionsNoFor incidents: IDs of the cards that stop it recurring.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false, so mutation is implied by the annotation already. The description adds the intended-use context (behavior-changing knowledge vs session narration). However, it doesn't disclose what happens on record creation (return value, whether duplicates are checked, side effects like index updates, or how errors are surfaced). With 4 annotation fields all set to defaults/false, the description doesn't compensate for the lack of behavioral detail.

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

Conciseness4/5

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

The description is two sentences and front-loads the purpose immediately in sentence one. Sentence two provides the essential exclusion criterion. It's efficient with no filler. Slightly more guidance on when NOT to use (which alternative tool for narration) would push it to 5, but as written it earns its place.

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

Completeness4/5

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

For a 20-parameter tool, the description relies heavily on the schema (100% coverage) and output schema being present to explain return values. The description correctly focuses on the selection decision (which collection type, purpose vs narration). The phrase about status vocabulary varying by collection and being project-declared is valuable cross-tool guidance referencing project_workspace. The main gap is no explicit statement about whether related records or supersede chains are validated/created atomically.

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

Parameters4/5

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

Schema coverage is 100%, so the description need not repeat parameter meaning. However, the description adds meaningful cross-collection guidance, particularly the collection enum values ('learnings: something discovered... decisions: a choice made... incidents: something that broke...') in the schema itself, and pointers like 'prefer project_memory_supersede' for supersedes, and 'project_workspace reports them' for status. This enriches param semantics beyond bare types.

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

Purpose5/5

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

The description clearly states the verb (Create) and resource (typed learning, decision, incident, convention or temporary context record). It distinguishes from sibling tools (project_memory_list, project_memory_patch, project_memory_supersede, project_memory_graduate) by being the add operation. The phrase 'not for narrating what happened this session' adds a clear exclusion criterion.

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

Usage Guidelines4/5

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

The description explicitly states the tool is for 'knowledge that should change future behaviour' and excludes 'narrating what happened this session'. While it doesn't name specific alternative tools for the 'narrating' case, the collection parameter enum and cross-references to project_memory_supersede and project_memory_graduate in schema properties provide contextual alternatives. It could more explicitly say which sibling handles narration.

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

project_memory_graduateGraduate a learningA

Mark a learning as graduated and link it to the convention, decision or documentation that now carries the durable rule. Create the target record first — graduating points at something that must already exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesLearning to graduate, e.g. LRN-0015.
targetsYesIDs of the records that now carry the rule: a convention, a decision or a document.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, so it's clearly a write operation. The description adds the key dependency constraint (target must pre-exist) and the expectedRevision param is documented in the schema. Since annotations already establish the mutation context and the schema covers revision guarding, the description adds meaningful context with the prerequisite rule.

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

Conciseness4/5

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

The description is two tight sentences with zero filler. It front-loads the action and adds the critical prerequisite in the second sentence. Only minor credit lost for not structuring the prerequisite as an explicit 'When to use' framing.

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

Completeness4/5

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

With full schema coverage, an output schema present, and annotations clarifying it's a non-readonly write, the description covers the core workflow (create target first, then graduate). The completeness is strong given what structured fields already provide, though it doesn't describe what happens to the learning's state beyond 'graduated'.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters (id, targets, expectedRevision) are documented in the input schema. The description adds context about targets being conventions/decisions/documents and the expectedRevision referential integrity behavior, but the schema already explains these thoroughly. Baseline 3 for full schema coverage is appropriate.

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

Purpose5/5

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

The description states a specific verb+resource (graduate a learning/mark as graduated and link it to the target record). It clearly distinguishes from siblings like project_memory_supersede (which likely supersedes a learning differently) and project_memory_patch. The 'mark as graduated and link to durable rule' phrasing is specific.

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

Usage Guidelines4/5

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

The description gives clear guidance to create the target record first ('graduating points at something that must already exist'), which is a critical prerequisite. However, it doesn't explicitly contrast with alternatives like project_memory_supersede or state when to graduate vs supersede, which would push to a 5.

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

project_memory_listList durable memoryA
Read-onlyIdempotent

List learnings, decisions, incidents, conventions and context, filtered by collection or lifecycle status.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum records to return.
offsetNoSkip this many matches before the page starts.
statusNoKeep only these lifecycle statuses. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them.
collectionNoKeep only these collections: learnings, decisions, incidents, conventions, context.

Output Schema

ParametersJSON Schema
NameRequiredDescription
limitNoMaximum this page could contain.
totalYesMatches before offset and limit were applied.
offsetNoOffset this page started at.
recordsYesMemory records matching the filters, in list projection.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the scoping dimension (filter by collection or lifecycle status) and notes that status vocabularies are project-declared and vary by collection, which is genuinely useful behavioral context beyond the schema. This adds good value atop strong annotations.

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

Conciseness5/5

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

A single tight sentence that captures purpose and filtering dimensions with zero filler. Every word earns its place, and the collection\.enum in the schema carries the detailed vocabulary without cluttering the description.

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

Completeness4/5

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

For a read-only list tool with 100% parameter coverage, an output schema present, and strong annotations, the description is quite complete. The one gap is guidance on how it relates to project_search/project_get_record for discovering memory content, but this is minor given the structured annotations and schema richness.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters (limit, offset, status, collection). The description lists what the tool filters by but doesn't add much beyond what the schema provides — the collection enum is fully specified in-schema, and the status field already explains its variability. At full coverage, the baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb+resource ('List durable memory') and enumerates the content types (learnings, decisions, incidents, conventions, context) plus the filtering dimensions (collection, lifecycle status). It's clear, though it doesn't explicitly distinguish itself from sibling tools like project_card_list or project_changelog_list — the memory vs card distinction is implied by the title and description.

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

Usage Guidelines4/5

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

The description implies this is a read/list operation for durable memory records and mentions filtering options. However, it doesn't explicitly say when NOT to use this (e.g., vs project_search for cross-cutting queries or project_card_list for card-type records). The breadth of sibling tools makes this guidance gap noticeable, but the readOnlyHint and list-focused purpose provide reasonable implied context.

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

project_memory_patchPatch workfile memoryA
Idempotent

Patch a durable memory record using optimistic concurrency. To retire one in favour of another use project_memory_supersede, which updates both sides.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory record to patch: LRN-, ADR-, INC-, CONV- or CTX-.
changesYesFrontmatter fields to overwrite — status, tags, related, owners and the collection-specific fields — plus body to replace the Markdown. Only the keys present are touched.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesA canonical record with its body, revision and reference graph.

TDQS

A4.5/5.0
Behavior4/5

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

The description explains the optimistic concurrency mechanism (write refused if expectedRevision no longer matches, concurrent edit reported rather than overwritten), which adds meaningful behavioral context beyond the annotations. While annotations declare idempotentHint=true and readOnlyHint=false, the description's explanation of the revision-refusal behavior adds genuine value. It could note the destructive nature of body replacement more explicitly, but the 'only keys present are touched' qualifier helps.

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

Conciseness5/5

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

Two sentences, zero waste. The first sentence states the core action with the concurrency qualifier, and the second gives a precise pointer to an alternative. Every word earns its place.

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

Completeness5/5

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

For a memory-record patching tool with 100% schema description coverage, a rich output schema, and detailed per-parameter documentation, the description is complete. It covers the action, the concurrency behavior, the partial-update semantics (delegated to schema), and the sibling distinction. The schema already explains expectedRevision and changes thoroughly, and the description adds the retire-orientation.

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

Parameters3/5

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

Schema coverage is 100% and each parameter already has detailed descriptions in the schema, including the revision string's purpose, the id prefix pattern, and the changes semantics with partial-update behavior. The description's main contribution is naming the retire flow via supersede, which reinforces schema content but doesn't add substantial new parameter semantics beyond what's already documented.

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

Purpose5/5

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

The description clearly states the tool patches a durable memory record using optimistic concurrency, with a specific verb (patch) and resource (durable memory record). It explicitly distinguishes itself from the sibling project_memory_supersede, naming the alternative and explaining the difference (retirement updates both sides).

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

Usage Guidelines5/5

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

The description explicitly says when NOT to use this tool: for retiring a record in favour of another, pointing to project_memory_supersede as the alternative. This is direct when/when-not guidance with a named sibling tool, exactly the highest tier of usage guidance.

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

project_memory_supersedeSupersede workfile memoryA

Supersede one memory record with another and update both sides atomically. Create the replacement first; neither record is deleted, so the superseded one stays readable and its ID keeps resolving.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory record being retired.
replacementIdYesMemory record that replaces it. Must already exist.
expectedRevisionNoRevision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordYesThe superseded record.
replacementYesThe record that replaces it.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, which already convey this is a write operation that isn't destructive. The description adds atomicity ('update both sides atomically') and the non-deletion detail, which is genuinely useful. However, it doesn't disclose behaviors like whether the operation requires additional permissions, whether it's reversible, or what the response shape validates—though the output schema partially 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.

Conciseness5/5

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

Three sentences, no filler. Every clause adds value: atomicity, prerequisite ordering, non-deletion behavior, and ID persistence. Front-loaded purpose with critical behavioral caveats following. No wasted words.

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

Completeness4/5

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

For a 3-parameter tool with full schema coverage and an output schema present, the description covers the core semantics well: atomicity, prerequisite, and non-destructive nature. It could mention reversibility or permission requirements for full completeness, but for the complexity level this is solidly complete.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters already have descriptions in the schema. The description reinforces that replacementId 'must already exist' and explains the expectedRevision 'revision string' guard (concurrent edit protection), which adds semantic meaning beyond the schema. With full schema coverage, this is the appropriate baseline 3 with slight credit.

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

Purpose5/5

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

The description states a specific verb ('supersede') and resource (memory records), and clearly explains the binary relationship: one record supersedes another with both sides updated. It distinguishes itself from siblings like project_memory_graduate and project_memory_patch by framing the action as a pair-wise replacement rather than a single-record modification.

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

Usage Guidelines5/5

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

The description explicitly instructs to 'Create the replacement first' as a prerequisite, and explains the important exclusion: 'neither record is deleted, so the superseded one stays readable and its ID keeps resolving.' This gives clear when-to-use framing and sets expectations about alternative behaviors (non-destructive) that differentiate it from delete-like operations.

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

project_nextWhat to work on nextA
Read-onlyIdempotent

Rank actionable cards: unblocked, unclaimed or claimed by you, highest priority first. Answers "what should I do now".

ParametersJSON Schema
NameRequiredDescriptionDefault
areaNoRank only cards in these areas. Project-declared, so the accepted values vary; project_workspace reports them.
actorNoWho to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf.
limitNoMaximum candidates to rank.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesActionable cards found before limit was applied.
recordsYesCandidates, most actionable first.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is fully covered. The description adds behavioral value by defining what 'actionable' means (unblocked, unclaimed or claimed by you) and the ranking logic (highest priority first), which are non-obvious behaviors not in annotations.

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

Conciseness5/5

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

Two sentences, zero waste. The purpose statement and the guiding question are both front-loaded and directly actionable. Every word earns its place.

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

Completeness5/5

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

For a read-only ranking tool with an output schema present, full parameter schema coverage, and comprehensive annotations (readOnly, idempotent, non-destructive), the description is complete. It explains what it ranks, the filtering rules, and the ordering logic. No gaps that would confuse an agent.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The area parameter description is useful ('Project-declared, so the accepted values vary; project_workspace reports them'), which adds meaning beyond the schema. The actor and limit parameters are adequately described in the schema and the description doesn't need to repeat them.

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

Purpose5/5

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

Specific verb+resource: 'Rank actionable cards' with clear scope (unblocked, unclaimed or claimed by you, highest priority first). The description directly answers the question 'what should I do now', distinguishing it from card_list (listing), card_create (creating), etc. Clearly distinct from siblings.

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

Usage Guidelines4/5

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

The description states it ranks actionable cards with defined inclusion criteria and explicitly frames it as an answer to 'what should I do now'. While it doesn't explicitly name alternative tools to use instead, the purpose framing plus sibling context (card_list, search) makes the usage situation clear. Could add exclusions for alternatives but the core context is present.

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

project_workspaceRead project workspaceA
Read-onlyIdempotent

Return the effective Workfile workspace, schema, enabled modules and mutation mode. Read this first when a vocabulary is project-declared: it reports the areas, axes, document kinds, changelog types and memory collections this project accepts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesProject name from project.config.mjs.
rootYesAbsolute path to the workspace root.
schemaNoEffective vocabularies and paths per module: cards (statuses, types, priorities, efforts, areas, axes), docs, memory, changelog, agents, ci, mcp and search.
versionNoSchema version the workspace was created with.
readOnlyYesWhether this server refuses mutations, from --read-only or mcp.allowMutations.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by listing the specific categories of info it reports (areas, axes, document kinds, changelog types, memory collections) and the 'effective' workspace qualifier. No specific output/pagination details, but the output schema exists to cover that.

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

Conciseness5/5

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

Two concise sentences. The first states the purpose precisely, the second gives actionable usage guidance. No wasted words — every sentence earns its place.

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

Completeness5/5

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

A parameterless read tool with strong annotations (readOnly, idempotent, non-destructive) and an output schema. The description adds the crucial 'read this first' sequencing guidance and enumerates the domain categories it covers. Complete for this tool's complexity.

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

Parameters4/5

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

The tool has zero parameters, so the schema fully documents the input surface (100% coverage, empty properties object). With no params, the baseline is 4 — and the description correctly focuses on what the tool RETURNS rather than inputs, which is appropriate here.

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

Purpose4/5

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

The description states it returns 'the effective Workfile workspace, schema, enabled modules and mutation mode' — a specific verb+resource combination. It doesn't explicitly distinguish from siblings, but 'read this first' hints at its foundational role among the many project_* tools.

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

Usage Guidelines4/5

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

It explicitly says 'Read this first when a vocabulary is project-declared' and enumerates what it reports (areas, axes, document kinds, changelog types, memory collections). It provides clear context for when to invoke it, though it doesn't name specific alternative tools to exclude.

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. Dates show when Glama detected each change.

  1. 30 tool updatesv0.5.4
    • Changedproject_agent_context4 fields changed
      • addedInput schema / properties / cardId / description
        Added value: +"Card the bundle is centred on, e.g. T-0042."
      • addedInput schema / properties / limit / default
        Added value: +20
      • addedInput schema / properties / limit / description
        Added value: +"Maximum related records to include."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "focus": {
        +      "description": "ID of the card the bundle was built around.",
        +      "type": "string"
        +    },
        +    "generatedAt": {
        +      "description": "When the bundle was assembled, RFC 3339.",
        +      "type": "string"
        +    },
        +    "markdown": {
        +      "description": "The same bundle rendered as Markdown, ready to paste into a prompt.",
        +      "type": "string"
        +    },
        +    "records": {
        +      "description": "The selected records, with bodies.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A canonical record with its body, revision and reference graph.",
        +        "properties": {
        +          "archived": {
        +            "description": "Whether the record lives in the archive directory.",
        +            "type": "boolean"
        +          },
        +          "body": {
        +            "description": "Markdown body below the frontmatter.",
        +            "type": "string"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "file": {
        +            "description": "File name within the collection directory.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID.",
        +            "type": "string"
        +          },
        +          "incoming": {
        +            "description": "Backlinks: references other records make to this one.",
        +            "items": {
        +              "additionalProperties": true,
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "incomingTotal": {
        +            "description": "Total backlinks, which may exceed the returned page.",
        +            "type": "integer"
        +          },
        +          "issues": {
        +            "description": "Validation findings doctor would report for this record.",
        +            "items": {
        +              "additionalProperties": true,
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "outgoing": {
        +            "description": "References this record makes to others.",
        +            "items": {
        +              "additionalProperties": true,
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family.",
        +            "type": "string"
        +          },
        +          "revision": {
        +            "description": "Content hash to pass back as expectedRevision on the next write.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status.",
        +            "type": "string"
        +          },
        +          "tags": {
        +            "description": "Free-form tags.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "totalAvailable": {
        +      "description": "Related records before limit was applied.",
        +      "type": "integer"
        +    },
        +    "truncated": {
        +      "description": "True when relevant records were dropped to respect limit.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "focus",
        +    "records"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_archive3 fields changed
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Card to archive. Must already be done or discarded."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_claim8 fields changed
      • addedInput schema / properties / actor / description
        Added value: +"Who is claiming. Defaults to the MCP client's own name; a hand-typed value will not match the identity the edit guard sees."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / force / default
        Added value: +false
      • addedInput schema / properties / force / description
        Added value: +"Take a claim another actor already holds. Requires reason."
      • addedInput schema / properties / id / description
        Added value: +"Card to claim, e.g. T-0042."
      • addedInput schema / properties / reason / description
        Added value: +"Why the existing claim is being taken over. Recorded on the card."
      • addedInput schema / properties / scope / description
        Added value: +"Repository paths this claim covers. Overlapping scopes are what stop two agents editing the same files."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "warnings": {
        +      "description": "Non-fatal findings, such as a stale claim that was taken over.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_create22 fields changed
      • addedInput schema / properties / area / description
        Added value: +"Part of the system this touches. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / axes / description
        Added value: +"Declared classification axes as { axis: value }, e.g. { context: \"treasury\" }. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / body / description
        Added value: +"Markdown body, written below the frontmatter."
      • addedInput schema / properties / depends / description
        Added value: +"IDs of cards that must close first. Blocks this card from being ranked as actionable."
      • addedInput schema / properties / due / description
        Added value: +"Target completion date, YYYY-MM-DD."
      • addedInput schema / properties / effort / description
        Added value: +"Rough size: S, M or L."
      • addedInput schema / properties / effort / enum
        Added value: +[
        +  "S",
        +  "M",
        +  "L"
        +]
      • addedInput schema / properties / parent / description
        Added value: +"ID of the parent card. The hierarchy is bounded by cards.maxHierarchyDepth."
      • addedInput schema / properties / priority / description
        Added value: +"How urgent the work is."
      • addedInput schema / properties / priority / enum
        Added value: +[
        +  "critical",
        +  "high",
        +  "medium",
        +  "low"
        +]
      • addedInput schema / properties / related / description
        Added value: +"IDs of records worth reading alongside this one."
      • addedInput schema / properties / scope / description
        Added value: +"Repository paths this work will change. Declared here, enforced when the card is claimed."
      • addedInput schema / properties / source / description
        Added value: +"Where the work came from: an issue URL, a person, a meeting."
      • addedInput schema / properties / start / description
        Added value: +"Planned start date, YYYY-MM-DD."
      • addedInput schema / properties / status / default
        Added value: +"backlog"
      • addedInput schema / properties / status / description
        Added value: +"Starting lifecycle status."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "next",
        +  "doing",
        +  "review",
        +  "blocked",
        +  "deferred",
        +  "done",
        +  "discarded"
        +]
      • addedInput schema / properties / tags / description
        Added value: +"Free-form tags for filtering."
      • addedInput schema / properties / title / description
        Added value: +"What the card is about, in one line."
      • addedInput schema / properties / type / description
        Added value: +"What kind of work this is."
      • addedInput schema / properties / type / enum
        Added value: +[
        +  "epic",
        +  "idea",
        +  "feature",
        +  "bug",
        +  "task",
        +  "audit",
        +  "docs",
        +  "chore"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_list16 fields changed
      • addedInput schema / properties / area / description
        Added value: +"Keep only these areas. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / claimedBy / description
        Added value: +"Keep only cards claimed by this actor."
      • addedInput schema / properties / limit / default
        Added value: +50
      • addedInput schema / properties / limit / description
        Added value: +"Maximum cards to return."
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"Skip this many matches before the page starts."
      • addedInput schema / properties / parent / description
        Added value: +"Keep only direct children of this card ID."
      • addedInput schema / properties / priority / description
        Added value: +"Keep only these priorities. One of: critical, high, medium, low."
      • addedInput schema / properties / priority / items / enum
        Added value: +[
        +  "critical",
        +  "high",
        +  "medium",
        +  "low"
        +]
      • addedInput schema / properties / status / description
        Added value: +"Keep only these statuses; any match passes. One of: backlog, next, doing, review, blocked, deferred, done, discarded."
      • addedInput schema / properties / status / items / enum
        Added value: +[
        +  "backlog",
        +  "next",
        +  "doing",
        +  "review",
        +  "blocked",
        +  "deferred",
        +  "done",
        +  "discarded"
        +]
      • addedInput schema / properties / tags / description
        Added value: +"Keep cards carrying any of these tags."
      • addedInput schema / properties / type / description
        Added value: +"Keep only these card types. One of: epic, idea, feature, bug, task, audit, docs, chore."
      • addedInput schema / properties / type / items / enum
        Added value: +[
        +  "epic",
        +  "idea",
        +  "feature",
        +  "bug",
        +  "task",
        +  "audit",
        +  "docs",
        +  "chore"
        +]
      • addedInput schema / properties / unclaimed / description
        Added value: +"Keep only cards nobody has claimed."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "limit": {
        +      "description": "Maximum this page could contain.",
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset this page started at.",
        +      "type": "integer"
        +    },
        +    "records": {
        +      "description": "Cards matching the filters, in list projection.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A record in list projection: identity and frontmatter without the Markdown body.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "Matches before offset and limit were applied.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "records",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_note6 fields changed
      • addedInput schema / properties / actor / description
        Added value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf."
      • addedInput schema / properties / id / description
        Added value: +"Card to append to."
      • addedInput schema / properties / section / default
        Added value: +"Notes"
      • addedInput schema / properties / section / description
        Added value: +"Heading to append under. Created if it does not exist yet."
      • addedInput schema / properties / text / description
        Added value: +"The line to append. One observation, not a paragraph."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_patch4 fields changed
      • addedInput schema / properties / changes / description
        Added value: +"Frontmatter fields to overwrite, e.g. { priority: \"high\", tags: [\"mcp\"] }. Only the keys present are touched. Use project_card_transition for status and project_card_write for the body; declared axes go under an axes key."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Card to patch."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_release9 fields changed
      • addedInput schema / properties / actor / description
        Added value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / force / default
        Added value: +false
      • addedInput schema / properties / force / description
        Added value: +"Release a claim held by another actor. Requires reason."
      • addedInput schema / properties / id / description
        Added value: +"Card whose claim is being released."
      • addedInput schema / properties / reason / description
        Added value: +"Why another actor's claim is being released. Recorded on the card."
      • addedInput schema / properties / status / description
        Added value: +"Status to leave the card in. Omit to keep the current one — a card just moved to done is not demoted by releasing it — except doing, which becomes next because active work without a claimant is a contradiction. doing is refused as an explicit target."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "next",
        +  "review",
        +  "blocked",
        +  "deferred",
        +  "done",
        +  "discarded"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_reopen7 fields changed
      • addedInput schema / properties / actor / description
        Added value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Archived card to bring back."
      • addedInput schema / properties / status / default
        Added value: +"backlog"
      • addedInput schema / properties / status / description
        Added value: +"Status to reopen into."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "next",
        +  "doing",
        +  "review",
        +  "blocked",
        +  "deferred",
        +  "done",
        +  "discarded"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_transition8 fields changed
      • addedInput schema / properties / actor / description
        Added value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Card to transition."
      • addedInput schema / properties / scope / description
        Added value: +"Repository paths to claim when moving to doing. Ignored by the other statuses."
      • addedInput schema / properties / status / description
        Added value: +"Target status. backlog: identified, uncommitted. next: prioritized. doing: actively worked, and claimed by the actor. review: implemented, awaiting verification. blocked: externally blocked, record why. deferred: postponed on purpose, record why. done: verified where it actually runs. discarded: will not be done, record why."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "next",
        +  "doing",
        +  "review",
        +  "blocked",
        +  "deferred",
        +  "done",
        +  "discarded"
        +]
      • removedInput schema / properties / status / minLength
        Removed value: -1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_card_write4 fields changed
      • addedInput schema / properties / body / description
        Added value: +"The complete new Markdown body. This overwrites, so read the card first unless you intend to discard what is there."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Card whose body is being replaced."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_changelog_add11 fields changed
      • addedInput schema / properties / area / description
        Added value: +"Part of the system that changed. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / body / description
        Added value: +"Markdown body, written below the frontmatter."
      • addedInput schema / properties / cards / description
        Added value: +"IDs of the cards this change came from."
      • addedInput schema / properties / decisions / description
        Added value: +"IDs of decision records this change implements."
      • addedInput schema / properties / issues / description
        Added value: +"External issue or ticket references."
      • addedInput schema / properties / related / description
        Added value: +"IDs of other records worth reading alongside."
      • addedInput schema / properties / tags / description
        Added value: +"Free-form tags for filtering."
      • addedInput schema / properties / title / description
        Added value: +"The change, stated from the reader's side rather than the implementer's."
      • addedInput schema / properties / type / description
        Added value: +"What kind of change this is — added, changed, fixed and so on. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / visibility / description
        Added value: +"Who the entry is rendered for, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_changelog_list9 fields changed
      • addedInput schema / properties / area / description
        Added value: +"Keep only these areas. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / limit / default
        Added value: +50
      • addedInput schema / properties / limit / description
        Added value: +"Maximum records to return."
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"Skip this many matches before the page starts."
      • addedInput schema / properties / released / description
        Added value: +"true keeps only fragments already consumed by a release; false keeps only unreleased ones."
      • addedInput schema / properties / type / description
        Added value: +"Keep only these change types. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / visibility / description
        Added value: +"Keep only these visibilities, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "limit": {
        +      "description": "Maximum this page could contain.",
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset this page started at.",
        +      "type": "integer"
        +    },
        +    "records": {
        +      "description": "Change fragments and releases matching the filters, in list projection.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A record in list projection: identity and frontmatter without the Markdown body.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "Matches before offset and limit were applied.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "records",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_changelog_patch4 fields changed
      • addedInput schema / properties / changes / description
        Added value: +"Frontmatter fields to overwrite — title, type, area, visibility, tags and the relation lists — plus body to replace the Markdown. Only the keys present are touched."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Unreleased fragment to patch, e.g. CHG-0101."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_changelog_preview3 fields changed
      • addedInput schema / properties / fragmentIds / description
        Added value: +"Fragments to include, e.g. CHG-0101. Omit to preview every unreleased fragment."
      • addedInput schema / properties / visibility / description
        Added value: +"Render only entries at this visibility, typically public or internal. Omit to include all of them. Project-declared, so the accepted values vary; project_workspace reports them."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "fragments": {
        +      "description": "Fragments this preview covered.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A record in list projection: identity and frontmatter without the Markdown body.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "groups": {
        +      "description": "Entries bucketed by change type, in render order.",
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "markdown": {
        +      "description": "The release notes as they would be written.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "markdown"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_changelog_release9 fields changed
      • addedInput schema / properties / body / description
        Added value: +"Markdown prelude written above the generated entries."
      • addedInput schema / properties / commit / description
        Added value: +"Commit SHA this release was cut from."
      • addedInput schema / properties / date / description
        Added value: +"Release date, YYYY-MM-DD. Defaults to today."
      • addedInput schema / properties / fragmentIds / description
        Added value: +"Fragments to consume, e.g. CHG-0101. Omit to consume every unreleased fragment."
      • addedInput schema / properties / tags / description
        Added value: +"Free-form tags for filtering."
      • addedInput schema / properties / title / description
        Added value: +"Release title. Defaults to the version itself."
      • addedInput schema / properties / version / description
        Added value: +"Version being cut, e.g. 0.5.4. Validated against changelog.releaseStrategy."
      • addedInput schema / properties / visibility / description
        Added value: +"Visibility of the release record itself, typically public or internal. Project-declared, so the accepted values vary; project_workspace reports them."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "consumedFragments": {
        +      "description": "Fragments that moved into the release directory and no longer exist as unreleased records.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A record in list projection: identity and frontmatter without the Markdown body.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "The release record that was created.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record",
        +    "consumedFragments"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_doc_create13 fields changed
      • addedInput schema / properties / body / description
        Added value: +"Markdown body, written below the frontmatter."
      • addedInput schema / properties / folder / description
        Added value: +"Folder below the managed docs root. Omit to let docs.layout decide; an empty string writes to the root."
      • addedInput schema / properties / kind / description
        Added value: +"What sort of document this is — architecture, runbook, reference and so on. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / owners / description
        Added value: +"Who is answerable for keeping this accurate."
      • addedInput schema / properties / related / description
        Added value: +"IDs of records worth reading alongside this one."
      • addedInput schema / properties / review_after / description
        Added value: +"Date after which this goes stale, YYYY-MM-DD. Defaults to docs.reviewIntervalDays from now."
      • addedInput schema / properties / scope / description
        Added value: +"Subject matter this document covers — topics, not file paths."
      • addedInput schema / properties / source / description
        Added value: +"Where the content came from: a URL, a person, a meeting."
      • addedInput schema / properties / status / description
        Added value: +"Lifecycle status, typically draft or current. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / supersedes / description
        Added value: +"IDs of documents this replaces. They are marked superseded."
      • addedInput schema / properties / tags / description
        Added value: +"Free-form tags for filtering."
      • addedInput schema / properties / title / description
        Added value: +"What the document is about, in one line."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_doc_list8 fields changed
      • addedInput schema / properties / kind / description
        Added value: +"Keep only these document kinds. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / limit / default
        Added value: +50
      • addedInput schema / properties / limit / description
        Added value: +"Maximum documents to return."
      • addedInput schema / properties / managed / description
        Added value: +"true keeps only documents Workfile owns under the managed docs root; false keeps only repository files it merely indexes."
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"Skip this many matches before the page starts."
      • addedInput schema / properties / status / description
        Added value: +"Keep only these document statuses. Project-declared, so the accepted values vary; project_workspace reports them."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "limit": {
        +      "description": "Maximum this page could contain.",
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset this page started at.",
        +      "type": "integer"
        +    },
        +    "records": {
        +      "description": "Documents matching the filters, in list projection.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A record in list projection: identity and frontmatter without the Markdown body.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "Matches before offset and limit were applied.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "records",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_doc_move4 fields changed
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / folder / description
        Added value: +"Destination folder relative to the managed docs root. An empty string moves it to the root."
      • addedInput schema / properties / id / description
        Added value: +"Managed document to move, e.g. DOC-0003."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_doc_patch4 fields changed
      • addedInput schema / properties / changes / description
        Added value: +"Frontmatter fields to overwrite, plus body to replace the Markdown. Only the keys present are touched. Use project_doc_move to change the folder."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Managed document to patch, e.g. DOC-0003."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_doctor3 fields changed
      • addedInput schema / properties / checkPaths / default
        Added value: +true
      • changedInput schema / properties / checkPaths / description
        Previous value: -"Check referenced filesystem paths."New value: +"Also verify that paths referenced by records exist on disk. Set false to skip the filesystem walk on a large repository."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "cards": {
        +      "description": "Cards inspected.",
        +      "type": "integer"
        +    },
        +    "counts": {
        +      "additionalProperties": true,
        +      "description": "Issue counts by severity: error, warning, info.",
        +      "type": "object"
        +    },
        +    "generatedAt": {
        +      "description": "When this run completed, as an RFC 3339 timestamp.",
        +      "type": "string"
        +    },
        +    "issues": {
        +      "description": "Findings, each with a severity, a code and the record it concerns.",
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "modules": {
        +      "additionalProperties": true,
        +      "description": "Record counts per module and collection.",
        +      "type": "object"
        +    },
        +    "ok": {
        +      "description": "True when no error-severity issue was found.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "issues"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_get_record2 fields changed
      • addedInput schema / properties / id / description
        Added value: +"Stable record ID of any family: T-0042, DOC-0003, CHG-0101, REL-0007, ADR-0009."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_memory_add21 fields changed
      • addedInput schema / properties / body / description
        Added value: +"Markdown body, written below the frontmatter."
      • addedInput schema / properties / category / description
        Added value: +"Optional sub-classification within the collection."
      • addedInput schema / properties / collection / description
        Added value: +"Which kind of memory this is. learnings: something discovered that changes how the next attempt goes. decisions: a choice made, with its rationale (ADR). incidents: something that broke, and what it cost. conventions: a rule the project now follows. context: temporary situational state, which expires."
      • addedInput schema / properties / confidence / description
        Added value: +"How well established this is — for learnings, whether it has been seen once or many times."
      • addedInput schema / properties / corrective_actions / description
        Added value: +"For incidents: IDs of the cards that stop it recurring."
      • addedInput schema / properties / deciders / description
        Added value: +"For decisions: who made the call."
      • addedInput schema / properties / expires / description
        Added value: +"For context: the date after which this stops being true, YYYY-MM-DD."
      • addedInput schema / properties / graduated_to / description
        Added value: +"IDs of the durable records a learning has been promoted into."
      • addedInput schema / properties / occurrences / description
        Added value: +"How many times this has been observed."
      • addedInput schema / properties / owners / description
        Added value: +"Who is answerable for keeping this accurate."
      • addedInput schema / properties / related / description
        Added value: +"IDs of records worth reading alongside this one."
      • addedInput schema / properties / resolved_at / description
        Added value: +"For incidents: when it was resolved, YYYY-MM-DD."
      • addedInput schema / properties / review_after / description
        Added value: +"Date after which this should be re-read, YYYY-MM-DD."
      • addedInput schema / properties / scope / description
        Added value: +"Subject matter this applies to — topics, not file paths."
      • addedInput schema / properties / severity / description
        Added value: +"For incidents: how bad it was."
      • addedInput schema / properties / started_at / description
        Added value: +"For incidents: when it began, YYYY-MM-DD."
      • addedInput schema / properties / status / description
        Added value: +"Lifecycle status. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / supersedes / description
        Added value: +"IDs of memory records this replaces. Prefer project_memory_supersede, which updates both sides."
      • addedInput schema / properties / tags / description
        Added value: +"Free-form tags for filtering."
      • addedInput schema / properties / title / description
        Added value: +"The knowledge itself, stated as a claim rather than a topic."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_memory_graduate4 fields changed
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Learning to graduate, e.g. LRN-0015."
      • addedInput schema / properties / targets / description
        Added value: +"IDs of the records that now carry the rule: a convention, a decision or a document."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_memory_list8 fields changed
      • addedInput schema / properties / collection / description
        Added value: +"Keep only these collections: learnings, decisions, incidents, conventions, context."
      • addedInput schema / properties / collection / items / enum
        Added value: +[
        +  "learnings",
        +  "decisions",
        +  "incidents",
        +  "conventions",
        +  "context"
        +]
      • addedInput schema / properties / limit / default
        Added value: +50
      • addedInput schema / properties / limit / description
        Added value: +"Maximum records to return."
      • addedInput schema / properties / offset / default
        Added value: +0
      • addedInput schema / properties / offset / description
        Added value: +"Skip this many matches before the page starts."
      • addedInput schema / properties / status / description
        Added value: +"Keep only these lifecycle statuses. Each collection has its own vocabulary — a decision is proposed or accepted, an incident is open or resolved. Project-declared, so the accepted values vary; project_workspace reports them."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "limit": {
        +      "description": "Maximum this page could contain.",
        +      "type": "integer"
        +    },
        +    "offset": {
        +      "description": "Offset this page started at.",
        +      "type": "integer"
        +    },
        +    "records": {
        +      "description": "Memory records matching the filters, in list projection.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A record in list projection: identity and frontmatter without the Markdown body.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "Matches before offset and limit were applied.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "records",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_memory_patch4 fields changed
      • addedInput schema / properties / changes / description
        Added value: +"Frontmatter fields to overwrite — status, tags, related, owners and the collection-specific fields — plus body to replace the Markdown. Only the keys present are touched."
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Memory record to patch: LRN-, ADR-, INC-, CONV- or CTX-."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "A canonical record with its body, revision and reference graph.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_memory_supersede4 fields changed
      • addedInput schema / properties / expectedRevision / description
        Added value: +"Revision string from an earlier read of this record. The write is refused if it no longer matches, so a concurrent edit is reported rather than overwritten. Omit to skip the check."
      • addedInput schema / properties / id / description
        Added value: +"Memory record being retired."
      • addedInput schema / properties / replacementId / description
        Added value: +"Memory record that replaces it. Must already exist."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "record": {
        +      "additionalProperties": true,
        +      "description": "The superseded record.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "replacement": {
        +      "additionalProperties": true,
        +      "description": "The record that replaces it.",
        +      "properties": {
        +        "archived": {
        +          "description": "Whether the record lives in the archive directory.",
        +          "type": "boolean"
        +        },
        +        "body": {
        +          "description": "Markdown body below the frontmatter.",
        +          "type": "string"
        +        },
        +        "created": {
        +          "description": "Creation date, YYYY-MM-DD.",
        +          "type": "string"
        +        },
        +        "file": {
        +          "description": "File name within the collection directory.",
        +          "type": "string"
        +        },
        +        "id": {
        +          "description": "Stable record ID.",
        +          "type": "string"
        +        },
        +        "incoming": {
        +          "description": "Backlinks: references other records make to this one.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "incomingTotal": {
        +          "description": "Total backlinks, which may exceed the returned page.",
        +          "type": "integer"
        +        },
        +        "issues": {
        +          "description": "Validation findings doctor would report for this record.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "kind": {
        +          "description": "Record family: card, doc, change, release or memory.",
        +          "type": "string"
        +        },
        +        "outgoing": {
        +          "description": "References this record makes to others.",
        +          "items": {
        +            "additionalProperties": true,
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "path": {
        +          "description": "Repository-relative path to the Markdown file.",
        +          "type": "string"
        +        },
        +        "recordType": {
        +          "description": "Type within the family.",
        +          "type": "string"
        +        },
        +        "revision": {
        +          "description": "Content hash to pass back as expectedRevision on the next write.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Lifecycle status.",
        +          "type": "string"
        +        },
        +        "tags": {
        +          "description": "Free-form tags.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "title": {
        +          "description": "Human-readable title.",
        +          "type": "string"
        +        },
        +        "updated": {
        +          "description": "Date of the last write, YYYY-MM-DD.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "record",
        +    "replacement"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_next5 fields changed
      • addedInput schema / properties / actor / description
        Added value: +"Who to attribute this to. Defaults to the MCP client's own name; pass one only to act on another actor's behalf."
      • addedInput schema / properties / area / description
        Added value: +"Rank only cards in these areas. Project-declared, so the accepted values vary; project_workspace reports them."
      • addedInput schema / properties / limit / default
        Added value: +5
      • addedInput schema / properties / limit / description
        Added value: +"Maximum candidates to rank."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "records": {
        +      "description": "Candidates, most actionable first.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A ranked candidate, carrying `reason` — why the ranking surfaced it.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "Actionable cards found before limit was applied.",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "records",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_search9 fields changed
      • addedInput schema / properties / kinds / description
        Added value: +"Restrict to these record families: card, doc, change, release, memory. Omit to search all of them."
      • addedInput schema / properties / limit / default
        Added value: +20
      • addedInput schema / properties / limit / description
        Added value: +"Maximum records to return."
      • addedInput schema / properties / mode / default
        Added value: +"hybrid"
      • addedInput schema / properties / mode / description
        Added value: +"hybrid adds the injected semantic provider when the host configured one and falls back to lexical when it did not. lexical is deterministic."
      • addedInput schema / properties / query / description
        Added value: +"Free text. Matched against titles, bodies and tags; never empty."
      • addedInput schema / properties / view / default
        Added value: +"summary"
      • changedInput schema / properties / view / description
        Previous value: -"summary (default) omits record bodies and returns an excerpt; full returns everything."New value: +"summary omits record bodies and returns an excerpt; full returns everything, which costs far more tokens at the same limit."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "limit": {
        +      "description": "Maximum this page could contain.",
        +      "type": "integer"
        +    },
        +    "mode": {
        +      "description": "Which ranking ran: lexical or hybrid.",
        +      "type": "string"
        +    },
        +    "offset": {
        +      "description": "Offset this page started at.",
        +      "type": "integer"
        +    },
        +    "provider": {
        +      "description": "Semantic provider that contributed, or null when ranking was purely lexical.",
        +      "type": "string"
        +    },
        +    "records": {
        +      "description": "Matches, best-scoring first.",
        +      "items": {
        +        "additionalProperties": true,
        +        "description": "A match, carrying searchScore and — in summary view — excerpt.",
        +        "properties": {
        +          "bodyBytes": {
        +            "description": "Size in bytes of the body this projection left out.",
        +            "type": "integer"
        +          },
        +          "created": {
        +            "description": "Creation date, YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Stable record ID: T-0042, DOC-0003, CHG-0101, ADR-0009.",
        +            "type": "string"
        +          },
        +          "incomingTotal": {
        +            "description": "How many other records link to this one.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "Record family: card, doc, change, release or memory.",
        +            "type": "string"
        +          },
        +          "path": {
        +            "description": "Repository-relative path to the Markdown file.",
        +            "type": "string"
        +          },
        +          "recordType": {
        +            "description": "Type within the family — a card's type, a document's kind, a memory record's collection.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Lifecycle status, in the vocabulary of this record's family.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Human-readable title.",
        +            "type": "string"
        +          },
        +          "updated": {
        +            "description": "Date of the last write, YYYY-MM-DD.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "description": "Matches found before limit was applied.",
        +      "type": "integer"
        +    },
        +    "view": {
        +      "description": "Which projection was applied: summary or full.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "records",
        +    "total"
        +  ],
        +  "type": "object"
        +}
    • Changedproject_workspace1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "name": {
        +      "description": "Project name from project.config.mjs.",
        +      "type": "string"
        +    },
        +    "readOnly": {
        +      "description": "Whether this server refuses mutations, from --read-only or mcp.allowMutations.",
        +      "type": "boolean"
        +    },
        +    "root": {
        +      "description": "Absolute path to the workspace root.",
        +      "type": "string"
        +    },
        +    "schema": {
        +      "additionalProperties": true,
        +      "description": "Effective vocabularies and paths per module: cards (statuses, types, priorities, efforts, areas, axes), docs, memory, changelog, agents, ci, mcp and search.",
        +      "type": "object"
        +    },
        +    "version": {
        +      "additionalProperties": true,
        +      "description": "Schema version the workspace was created with.",
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "name",
        +    "root",
        +    "readOnly"
        +  ],
        +  "type": "object"
        +}
  2. 30 tool updatesv0.1.0
    • First observedproject_agent_context
    • First observedproject_card_archive
    • First observedproject_card_claim
    • First observedproject_card_create
    • First observedproject_card_list
    • First observedproject_card_note
    • First observedproject_card_patch
    • First observedproject_card_release
    • First observedproject_card_reopen
    • First observedproject_card_transition
    • First observedproject_card_write
    • First observedproject_changelog_add
    • First observedproject_changelog_list
    • First observedproject_changelog_patch
    • First observedproject_changelog_preview
    • First observedproject_changelog_release
    • First observedproject_doc_create
    • First observedproject_doc_list
    • First observedproject_doc_move
    • First observedproject_doc_patch
    • First observedproject_doctor
    • First observedproject_get_record
    • First observedproject_memory_add
    • First observedproject_memory_graduate
    • First observedproject_memory_list
    • First observedproject_memory_patch
    • First observedproject_memory_supersede
    • First observedproject_next
    • First observedproject_search
    • First observedproject_workspace

TDQS

A4/5.0
Disambiguation5/5

Every tool targets a distinct resource+action combination. Similar verbs are separated by resource prefix (card_create vs memory_add vs doc_create vs changelog_add), and similar actions on the same resource are disambiguated by purpose: patch vs write vs note on cards, release vs preview on changelog, supersede vs patch on memory. An agent can reliably select among the 30 tools.

Naming Consistency5/5

All tools follow a strict project_<resource>_<action> pattern. Resources are consistent (card, memory, changelog, doc) and verbs are consistent (create, list, patch, get) throughout. Even cross-cutting tools fit the pattern (project_search, project_next, project_doctor, project_workspace). No mixed conventions or stylistic deviations.

Tool Count2/5

At 30 tools, the surface is heavy. While the resource families are each well-scoped, the total exceeds the 15-25 comfortable range and approaches the 25+ threshold. Several tools feel granular (project_changelog_preview vs project_changelog_list; project_memory_graduate vs project_memory_supersede; project_card_note vs project_card_write) and could plausibly be consolidated, suggesting this could be tightened to the low-to-mid 20s.

Completeness5/5

The server provides full lifecycle coverage across multiple domains: cards (create, list, get, claim, transition, patch, write, note, release, archive, reopen), memory (add, list, patch, graduate, supersede), changelog (add, list, patch, preview, release), docs (create, list, move, patch), plus cross-cutting utilities (search, next, doctor, workspace, context bundle). No obvious gaps in the canonical project-management workflow, and dead-end operations are paired with inverses (archive/reopen, claim/release, supersede).

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Persistent, cross-session task management for Claude Code. 24 MCP tools for tasks, projects, dependencies, and docs. 7 skills for planning, standups, and handoffs. Event-sourced storage with per-project isolation.
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Open, Git-native memory protocol for MCP agents: stores memories as Markdown files in a Git repo, enabling portability, auditability, and human-editable memory across different AI agents.
    68
    15
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/illodev/workfile'

If you have feedback or need assistance with the MCP directory API, please join our Discord server