Skip to main content
Glama

Casefile

The task tracker your AI agents keep for each other.

AI agents forget everything between sessions. Casefile gives every task a case file — decisions, failed attempts, findings, open questions — so the next agent picks up exactly where the last one stopped. You watch a live board and answer their questions.

CI MCP server Self-hosted License: MIT Glama score

For anyone whose agents work on tasks longer than one session. A self-hosted MCP server and a web board, free and MIT-licensed. Made for Claude Code; Codex, Cursor and any other MCP client connect the same way.

Install on macOS / Linux

curl -fsSL https://raw.githubusercontent.com/azimov777/casefile/main/install.sh | sh

Install on Windows (PowerShell)

irm https://raw.githubusercontent.com/azimov777/casefile/main/install.ps1 | iex

All you need is Docker. The board opens at http://localhost:8080, and the installer prints the one command that connects your agent. Casefile updates itself to each new release: it checks once an hour and whenever Docker starts.

Or let your agent do it. Paste this into Claude Code, Codex or Cursor:

Install Casefile for me by following https://raw.githubusercontent.com/azimov777/casefile/main/docs/agent-install.md

Why

A session ends or the context fills up, and the next agent starts from scratch: re-reading the code, re-trying what already failed, re-asking what you already answered.

Casefile gives every task a case file — an append-only log the agent writes as it works.

  • Hand-offs that survive a fresh context. The next agent reads the latest summary, the open questions and an index of the case, then carries on. No re-discovery.

  • Built for agents, over MCP. Agents create and split tasks, record decisions and dead ends, ask you questions, and close with a verdict on every check.

  • You stay in the loop. A live board and task pages show what every agent is doing. Answer questions, leave remarks and hand each agent its own access — right from the browser.

  • Guardrails, not bureaucracy. No closing without a summary and a passed verdict per check; no starting a blocked task. Nothing else — no sprints, no estimates, no automation.

  • Yours, on your machine. Runs locally in Docker and listens on localhost only. Nothing leaves your computer — unless you turn on sign-in and put it on your own server for your team (Network mode).

Related MCP server: meridian

How it's different

  • Not a notes file. A CLAUDE.md or handoff.md gets overwritten: the attempt that failed two days ago disappears, and two sessions edit the same file. A case file is append-only — a correction is a new entry that points at the old one. Keep CLAUDE.md for per-repo rules; Casefile is per task.

  • Not a memory server. Memory MCPs recall facts by similarity. Casefile recalls nothing clever: it is a work log per task, read in a fixed order — card, latest summary, open questions, index, then only the entries you need.

  • Not an issue tracker with MCP bolted on. An issue is a description and a thread anyone can edit. Case entries are typed and never edited, and the tracker refuses writes that would break the record.

  • Not an orchestrator. It never starts agents, runs timers or moves tasks by itself. Handing out work and noticing a dead session stay with you and your agent harness.

Connect your agent

The installer prints a ready-made command with your token and its actual MCP address filled in — by default:

claude mcp add --transport http --scope user casefile http://localhost:8100/mcp \
  --header "Authorization: Bearer <token>"

Install the skill too. Connecting gives the agent the tools; the Casefile skill teaches it how to use them. The installer installs it by itself into Claude Code, Codex, Hermes and other agents it finds on the machine, and prints one line per harness. An installation made before v0.8.0 has no skill, and the hourly self-update does not add one: it updates only the service. Run the install line again, or install just the skill without touching the service:

curl -fsSL https://raw.githubusercontent.com/azimov777/casefile/main/install.sh | CASEFILE_SKILL_ONLY=1 sh

How to check whether an agent has the skill, and the commands for each harness, are in step 4 of the agent guide.

Any other MCP client works the same way: streamable HTTP at the MCP address the installer printed (http://localhost:8100/mcp by default) with that header. Clients that take an mcpServers JSON (Cursor, VS Code and others) use this — fill in your token and, if your installer printed a different address, that address instead:

{
  "mcpServers": {
    "casefile": {
      "type": "http",
      "url": "http://localhost:8100/mcp",
      "headers": {
        "Authorization": "Bearer <token>"
      }
    }
  }
}

Over stdio, as an alternative. Streamable HTTP above is the main way in. A client that can only launch a command and talk to it over stdin/stdout gets the same server that way: it starts a short-lived container of your installation, attached to the installation's database — same tools, same token, same case. The token goes in the client's environment, not on the command line:

claude mcp add --scope user casefile-stdio --env TRACKER_MCP_TOKEN=<token> -- \
  docker compose -f ~/casefile/docker-compose.prod.yml run --rm --no-deps -T \
  -e TRACKER_MCP_TOKEN mcp python -m app.mcp --stdio

The installation has to be up: the stdio process brings no database of its own. Each client session is a process of its own, so HTTP stays the lighter choice wherever the client supports it. An installation image older than the stdio mode answers unrecognized arguments: --stdio — update it first.

A second agent, without the terminal. The board carries the same snippets. Connect an agent shows this installation's MCP address and ready-made snippets for Claude Code, Codex and any client that takes an mcpServers JSON — no secret on the screen, a placeholder where the token goes. Access lists your tokens — every token of the installation, if you are an administrator: who it speaks for, what it opens, who issued it and when it was last used. From there you register an agent, issue its own token, copy the snippet with the secret already in it — shown once — and revoke it when that agent is done. Give each agent a token of its own and its case entries are signed with its name instead of one shared agent. On a shared installation every person does this for their own agents, without the administrator, and sees and revokes only the tokens they issued or that speak for them.

Tell it what to do

Connecting the agent is only the wiring. Once it is done, tell the agent these, word for word.

Have work to hand over? Say:

File tasks in Casefile for my work: a project for it if there is none yet, and tasks with all their sections and checks, each small enough for one agent to finish in one go, each naming its environment in context — where the work lives and how to check it is done. Don't start the work itself; if I haven't described it yet, ask me.

Then, in a new agent session, say:

Carry out the tasks for this work from the Casefile tracker. Hand them to agents, one task per agent, to save your own context, and give them cheaper models where those cope.

The two phrases go to different agent sessions: the second agent starts with a clean context and knows only what is in the task cases. The board carries the same phrases, with copy buttons, on its /start page.

Tools

Every MCP tool a task or main token opens, grouped by area (app/mcp/tools/):

Tasks

  • get_task — returns everything about one task in a single call: card, parent and children, links, computed features, latest summary, open questions, unresolved remarks, case index and transition targets

  • search_tasks — searches tasks by a query-language string, by separate conditions, or by both

  • create_task — creates a task in backlog, optionally as a child of a parent task

  • update_task — changes the given fields of a task; fields left out stay as they are

  • transition — moves a task to another status along the fixed transition table

  • close_task — closes a task: files entries, verdicts and the final summary and moves it to done, in one transaction

  • move_task — moves a task, or each task of a list with an outcome per key, to another project with a reason; its previous key keeps leading to it (main token only)

Case

  • read_entries — returns entry bodies of one task's case, with payload, in number order

  • add_summary — files a summary: the handover note of a case, in four parts

  • add_entry — files an entry without payload: a decision, attempt, finding, artifact, remark or note

  • ask — files a question to registry participants

  • answer — answers a question of the same task

  • resolve — resolves a remark on a task: its outcome and where the work went

  • add_verdict — files the outcome of one review check

  • read_project_entries — returns entry bodies of one project's case, with payload, in number order

  • add_project_entry — files a decision, finding, artifact or note in a project's case

Links

  • link — links two tasks and files link_added in both cases

  • unlink — removes a link and files link_removed in both cases

Projects & participants

  • get_project — returns one project by its key: key, title, description, current attribute values and the index of its case

  • list_projects — lists the installation's projects: key, title and archive time; archived ones only when asked

  • list_participants — lists the participant registry: the possible addressees of a question

  • create_project — creates a project (main token only)

  • update_project — changes a project's title and description, recording each change in its case (main token only)

  • archive_project — archives a project with a reason, freezing it and its tasks against changes (main token only)

  • restore_project — restores an archived project with a reason (main token only)

  • set_attribute — sets the value of a project attribute, creating it or changing it with a reason; the history stays in the project's case

  • remove_attribute — removes a project attribute with a reason, filing its last value in the project's case

  • register_participant — registers a human or a permanent agent (main token only)

  • update_participant — changes a participant's description (main token only)

Journal

  • wait_journal — returns journal entries after a sequence number, waiting for new ones

Everyday

Update right now

run the install line again

Turn auto-update off

CASEFILE_AUTO_UPDATE=false in ~/casefile/.env

Stay on one release

CASEFILE_VERSION=0.8.1 in ~/casefile/.env

Stop / start

docker compose stop / docker compose start in ~/casefile

Remove everything, data included

docker compose down -v in ~/casefile

Move to another machine or your own server

docs/moving.md

Back up your data / restore into a clean install

docs/backup-restore.md

Ports and other settings live in ~/casefile/.env — see .env.example.

Updates

A new version of Casefile is a release: a git tag vX.Y.Z with its images on ghcr.io under the version and under the stable channel. Every installation follows stable by default. It checks when Docker starts and then once an hour, at a slightly random minute, so a release reaches it within about an hour and ten minutes, with nothing to restart. Commits to main without a tag never reach an installation. The update recreates the Casefile containers and keeps your data in its volumes. An agent in the middle of an MCP call when that happens gets a dropped connection and has to retry.

The first release on this channel was 0.2.0. An installation from before it (on latest) moves to stable by itself the next time Docker starts, and from then on checks every hour. A release can also bring a new updater: the update to that release is still done by the old one, which is then replaced by itself, so what a new updater adds (such as the rollback below, new in 0.3.0) covers updates from the next release on. If you set CASEFILE_VERSION=latest in .env yourself, remove the line to follow releases.

CASEFILE_UPDATE_INTERVAL sets how often to check (hours, or 30m; 0 means only when Docker starts). If a release fails to start, the installation goes back to the version it ran before and does not try that release again; the next release is installed as usual. docker compose logs updater tells what happened.

A release that changes the database schema costs one more step. Before installing it, the updater takes a snapshot of the database (pg_dump -Fc, the same format as backup and restore). The snapshot stays inside the updater container, at /tmp/casefile-before-update.dump, and takes about as much space as a manual backup. If that release then fails to start after changing the schema, the database goes back to the snapshot before the previous version starts again. So the schema and the data are exactly as they were before the update, and a manual docker compose up -d works as usual. The price: anything written between the snapshot and the rollback is lost. That window is the failed start, up to a few minutes. While the new version is being brought up, the old one keeps answering for a few seconds. The snapshot is deleted once the update succeeds or the database is restored. If the snapshot cannot be taken, that release is not installed this time. If it cannot be restored, the previous version runs on the new schema, the snapshot is kept, and the log says how to copy it out.

Network mode

Out of the box Casefile listens on localhost only, and you type nothing: the installation creates an administrator account for you (owner@localhost) and the board signs into it by itself. To reach it from other machines, turn on sign-in: then everyone signs in with their own email and password, and every entry is signed by the person who made it. It is one team per installation — everyone signed in sees every task. The only role is the administrator flag, and all it opens is managing people.

  1. Add to ~/casefile/.env:

    CASEFILE_LOGIN=password            # everyone signs in with email and password
    CASEFILE_BIND=0.0.0.0              # publish the board and MCP beyond localhost
    TRACKER_MCP_PUBLIC_URL=http://<server>:8100/mcp   # what agents on other machines use
  2. Run docker compose up -d in ~/casefile.

  3. Give yourself a password. The administrator account the installation made has none; this prints a generated one, once:

    docker compose run --rm api python -m app.cli account-password --email owner@localhost

    Add --set-password to type your own instead (12 characters at least, asked twice, no echo). Your email can be changed too: account-update --email owner@localhost --new-email you@example.com.

  4. Add your teammates — on the board, or on the server:

    docker compose run --rm api python -m app.cli account-create --email alice@example.com --name alice

    It prints Alice's password once; hand it to her. --admin makes her an administrator too. account-list shows everyone, account-update --disable locks a person out and revokes every token they hold or issued to their agents (their past entries stay signed with their name), and account-password resets a forgotten password. Casefile sends no mail: there is no address confirmation and no reset link.

The board at http://<server>:8080 now opens with a sign-in screen. Agents keep connecting to MCP with their tokens — sign-in is for people in the browser. Issue each agent its own token on the Access screen; Connect an agent shows the address from TRACKER_MCP_PUBLIC_URL. Each agent's machine also needs the skill: its install commands are in step 4 of the agent guide — they run on the agent's machine and do not need the service installer.

Coming from the owner password. An installation locked with TRACKER_PASSWORD_HASH before accounts existed keeps working after the update: sign-in turns on by itself, and the old password becomes the password of the administrator account owner@localhost — sign in with that email and the same password. The hash in .env is no lock any more; it is only carried over once, and a password you set later is never overwritten by it.

Plain HTTP is a hole. Without TLS the passwords, the session cookies, the keys and the agents' tokens cross the network in clear text for anyone on the path to read. Casefile does not do TLS itself. Anywhere beyond a network you trust, keep CASEFILE_BIND=127.0.0.1 and put a reverse proxy with TLS in front of both ports — for example Caddy, which gets the certificates and sends X-Forwarded-Proto by itself:

casefile.example.com {
    reverse_proxy 127.0.0.1:8080
}
mcp.casefile.example.com {
    reverse_proxy 127.0.0.1:8100
}

with TRACKER_MCP_PUBLIC_URL=https://mcp.casefile.example.com/mcp. A proxy that sends X-Forwarded-Proto: https gets the session cookie marked Secure.

Name your proxy. Sign-in tells guessers apart by address (see Guessing below). Behind a proxy every request arrives from the proxy, so the board must be told which address is the proxy; only then does it take the browser's address from the proxy's X-Forwarded-For. From anyone else that header is ignored — anybody can write it. Add to ~/casefile/.env:

CASEFILE_TRUSTED_PROXIES=172.18.0.1   # the address the board sees the proxy come from

and run docker compose up -d. That address is not the proxy's own: it is whatever Docker shows the board. With the proxy on the same machine and CASEFILE_BIND=127.0.0.1, it is the gateway of the installation's network, on Linux and Docker Desktop alike:

docker network inspect casefile_default -f '{{range .IPAM.Config}}{{.Gateway}}{{end}}'

To check, run docker compose logs ui: each request line starts with the address it came from — with the proxy named, the browser's; without, the proxy's. Several proxies or a network go comma-separated (172.18.0.1,10.0.0.0/8). The network gets its address when it is created, so after docker compose down check the gateway again. Keep CASEFILE_BIND=127.0.0.1 behind a proxy: Docker Desktop shows every connection to a port published to the network as 192.168.65.1, so naming that address would let anyone claim any address. Without this line nothing breaks, but everyone behind the proxy shares one address — and one guesser holds everybody at "try again later" again.

What else to know:

  • No sign-in, no network. With CASEFILE_BIND beyond localhost and sign-in off, the board refuses to start instead of handing the administrator key to the whole network; docker compose logs ui says why.

  • Sessions. A sign-in lasts 7 days (TRACKER_SESSION_HOURS). A session is a token with a deadline, kept in the database: restarting the installation does not end it. Sign out revokes it at once, a changed or reset password ends the person's other sessions, and disabling an account revokes all its tokens, the ones the person issued to their agents included: enabling it again brings none of them back.

  • Guessing. Wrong passwords are counted per address and per email, within a minute. After 5 from one address, sign-in answers "try again later" to that address — the right password included — until the minute has passed; after 5 for one email, from wherever they come, that email waits the same way. Other people sign in as usual. On top of that the whole installation takes at most 100 wrong passwords a minute, to keep guessing from burning the processor; guessing spread over many addresses and many emails that reaches it keeps everyone at "try again later" for as long as it goes on (an IPv6 client counts as its whole /64). Open sessions and the agents, which use tokens, are not affected. A client is the address that opened the connection, or the one your named proxy reports (above). Docker Desktop hides the address of every connection from the network behind one of its own, so there the board tells clients apart only behind a proxy on the same machine.

Under the hood

Python 3.14 · FastAPI · PostgreSQL · MCP over streamable HTTP · React 19 · Vite · Tailwind. The backend sits at the repository root, the web UI in ui/. The web UI speaks English and Russian; the design docs, the developer guide and the agent-facing texts are in Russian for now.

Contributing

Issues and pull requests are welcome — start with CONTRIBUTING.md. Commits need a sign-off (git commit -s): it certifies you have the right to submit the code, and CI checks it.

License

MIT


Hiring? I built Casefile and would be glad to hear about roles at Anthropic or OpenAI — reach me through GitHub.

Available Tools

30 tools
add_entryA

Files an entry without payload: a decision, attempt, finding, artifact, remark or note.

Entries are immutable: no call edits or deletes one, and a mistaken entry is corrected by a new entry that references it in refs. Summaries, questions, answers, verdicts and resolutions have their own tools: add_summary, ask, answer, add_verdict, resolve.

An empty title is refused with entry_fields_invalid, which lists the fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
bodyNoEntry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist
refsNoReferences: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, or a URL with a scheme (`https://…`, `file://…`). Anything else (`7`, `#7`, `docs/x.md`) is refused with `entry_fields_invalid`, as is an entry, task or project that does not exist; URLs are not checked
typeYesWhat the entry records: - `decision` — an option chosen among several, with the reason; - `attempt` — something tried and how it ended, failed attempts included; - `finding` — an established fact with its source, including what was learned from reading; - `artifact` — a pointer to a result; - `remark` — a claim that finished work of a task came out wrong, written from the side of whoever needs the result; the task's assignee resolves it with `resolve`. A remark on a closed task is accepted: the case grows, the task stays as it is. An observation about the caller's own task is a `finding`, not a `remark`; - `note` — an entry that fits none of the types above
titleYesEntry title: its line in the case index of `get_task`. It states what happened, not how
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesEntry number in the task's case; with the key it forms `TRK-42#12`
seqYesJournal sequence number, usable as `after` of `wait_journal`
titleYesThe title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title
authorYes
task_keyYes
created_atYes

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the annotations (readOnly=false, destructive=false, idempotent=false), it discloses the crucial immutability trait: no call edits or deletes an entry, and corrections happen via a new entry referencing the old one in `refs`. It also surfaces failure modes (`entry_fields_invalid`). It does not flag the idempotency_key behavior that the annotation leaves implicit, but the compatibility with destructiveHint=false is consistent.

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 short, front-loaded paragraphs: purpose first, immutability and correction second, sibling routing third. No filler and the most decision-relevant facts come first.

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 schema and an output schema available, the description supplies exactly the runtime facts the structured fields cannot: immutability, correction-by-reference, and the sibling-tool boundaries. The one slightly cryptic phrase is 'without payload', which could confuse an agent about whether `body` is expected.

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; the description nonetheless adds meaning by explaining that `refs` is the correction mechanism for immutable entries and that an empty title is refused. This goes beyond restating parameter names, though the per-parameter detail still lives mostly in the schema.

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

Purpose5/5

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

The description opens with a specific verb+resource ('Files an entry') and enumerates the exact entry types it accepts. It explicitly separates itself from siblings by naming the categories that have their own tools (summaries, questions, answers, verdicts, resolutions).

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 names the alternative tools (`add_summary`, `ask`, `answer`, `add_verdict`, `resolve`) and reserves `add_entry` for the remaining kinds of records. It does not, however, explicitly route the caller away from `add_project_entry` or clarify project-vs-task entry choice, so the guidance is clear but not fully closed.

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

add_project_entryA

Files an entry in a project's case: a decision, finding, artifact or note that concerns the project rather than one of its tasks.

The entry number counts inside the project, and TRK#7 addresses the entry from refs of any task or project case. Like a task entry filed by add_entry, a project entry stays as filed. A task token files project entries as it files task entries.

An empty title, or a reference to a missing entry, task or project, returns entry_fields_invalid naming the offending fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
bodyNoEntry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist
refsNoReferences: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, or a URL with a scheme (`https://…`, `file://…`). Anything else (`7`, `#7`, `docs/x.md`) is refused with `entry_fields_invalid`, as is an entry, task or project that does not exist; URLs are not checked
typeYesWhat the entry records about the project: - `decision` — an option chosen among several, with the reason; - `finding` — an established fact with its source; - `artifact` — a pointer to a result; - `note` — an entry that fits none of the types above. Summaries, questions, attempts, verdicts and remarks exist only in task cases
titleYesEntry title: its line in the case index of `get_project`. It states what happened, not how
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesEntry number in the project's case; with the key it forms `TRK#7`
seqYesJournal sequence number, usable as `after` of `wait_journal`
authorYes
created_atYes
project_keyYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare the write/safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds value beyond that: entries 'stay as filed' (immutability), the numbering is project-scoped, refs addressing via TRK#7, and the entry_fields_invalid failure mode. It does not restate the annotation fields, which is correct.

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 short paragraphs, front-loaded with purpose then addressing then error behavior. Every sentence carries information, though the closing error paragraph partially duplicates what the schema's per-field descriptions already state.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, and the description covers purpose, addressing, immutability, and failure modes. What remains thin is explicit guidance on non-idempotent retries, though the idempotency_key param and idempotentHint=false together convey this.

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 six parameters are already documented including the type enum and refs grammar. The description restates the entry types and error semantics rather than adding syntax not in the schema, so the baseline 3 holds.

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

Purpose5/5

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

States a specific verb and resource ('files an entry in a project's case') and immediately scopes it against the sibling concept: an entry that 'concerns the project rather than one of its tasks'. An agent can distinguish this from add_entry without opening a schema.

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

Usage Guidelines4/5

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

Gives the selecting condition (project-level vs task-level entry) and names the sibling add_entry as the task-side analogue. No explicit when-not-to-use or exclusion list, but the contrast with task entries is a clear routing signal.

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

add_summaryA

Files a summary: the handover note of a case, in four parts, none of them empty (entry_fields_invalid lists the empty ones).

A significant step is a decision made, a finished part of the work, a failure that changes the plan, or any point where a colleague would need an explanation of where the work stands.

Its index title is the first line of done, returned in the response. The final summary, with unmeasured, is filed by close_task.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
doneYesWhat was done since the previous summary, with references to artifacts. Its first line becomes the entry title in the case index: one sentence about what happened; a longer line is cut at a word boundary
blockersYesWhat stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom
next_stepYesThe one concrete action a successor starts with. In a summary before `waiting` it is the action taken once the awaited arrives. A doubt about a decision or a result is recorded here, as what to look at and why, rather than as a verdict
remainingYesWhat remains before the task is done
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesEntry number in the task's case; with the key it forms `TRK-42#12`
seqYesJournal sequence number, usable as `after` of `wait_journal`
titleYesThe title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title
authorYes
task_keyYes
created_atYes

TDQS

A4.4/5.0
Behavior4/5

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

With annotations providing no positive behavioral hints, the description carries the burden, and it discloses meaningful behavior: empty parts are rejected with entry_fields_invalid, the index title comes from the first line of done, and final summaries are handled elsewhere. This goes beyond the schema's required-field checks.

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 compact and front-loads the core purpose before adding behavioral and contextual details. The second paragraph on 'significant step' earns its place even if slightly abstract.

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 description is complete for a tool with a rich 100%-covered schema and an output schema: it covers purpose, validation behavior, title derivation, content guidance, and the boundary with close_task. Nothing essential is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by clarifying the four-part structure, requiring none of them to be empty, and explaining that the first line of done becomes the entry title.

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 ('Files') and a specific resource ('a summary: the handover note of a case'), and further distinguishes it by defining the four non-empty parts. This clearly separates add_summary from sibling tools like add_entry and close_task.

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 on what constitutes a significant step and explicitly notes that the final summary is filed by close_task, an exclusion that prevents misuse. It does not explicitly name alternatives like add_entry, so it stops short of a 5.

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

add_verdictA

Files the outcome of one review check, as run by the task's assignee within the current pass.

A pass starts with each entry into in_progress, a return from waiting included. Only verdicts of the current pass count for closing, and the latest verdict on a check replaces the earlier ones: a failed verdict is filed when it happens, like a passed one. Verdicts of earlier passes stay in the case without counting. close_task also takes verdicts, together with the closing.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
outcomeYesOutcome of the check; there is no third state
check_noYesNumber of the review check in the task's list, from 1; a number outside the list is refused with `entry_fields_invalid`
evidenceNoWhat was run for the check as written and what it showed: the command, its output, a link to the material
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesEntry number in the task's case; with the key it forms `TRK-42#12`
seqYesJournal sequence number, usable as `after` of `wait_journal`
titleYesThe title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title
authorYes
task_keyYes
created_atYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only say this is not read-only/idempotent, so the description carries the behavioral burden. It discloses that the latest verdict replaces earlier ones, that failed verdicts are filed immediately like passed ones, and that earlier-pass verdicts persist without counting. That is substantive stateful behavior beyond what annotations or schema indicate.

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 purpose sentence is front-loaded and the second paragraph earns its place by explaining pass-scoping, replacement, and the close_task overlap. There is no filler or repetition of schema content.

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?

Between the schema (parameters, errors, idempotency) and the description (pass semantics, replacement, close_task overlap), an agent has what it needs to call add_verdict correctly. The main gap is that prerequisites such as assignee permission are implied rather than stated, and the return shape is left to the output 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?

All five parameters are already fully described in the schema (100% coverage), including enums, defaults, errors, and idempotency semantics. The description adds lifecycle context but no additional parameter-level meaning, so the baseline of 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 opening sentence names a specific verb ('Files'), a resource ('outcome of one review check'), and a scope ('as run by the task's assignee within the current pass'). The closing note that close_task also takes verdicts helps an agent distinguish this tool from the sibling that handles verdicts during closing.

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 the operative context: verdicts only count if filed in the current pass, and earlier-pass verdicts remain but do not count. It also points to close_task as the sibling that takes verdicts together with closing, which implies the alternative. It stops short of an explicit 'use X instead when...' rule, so not a 5.

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

answerA

Answers a question of the same task. Any holder of a task token answers, in any task.

The first answer closes the question and later ones add to it; neither a question nor an answer changes the task status. The tracker builds the title from the question reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
bodyNoEntry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist
question_noYesNumber of the `question` entry in the same task. Any other number is refused with `entry_fields_invalid`, `reason: unknown_entry` or `not_a_question`
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesEntry number in the task's case; with the key it forms `TRK-42#12`
seqYesJournal sequence number, usable as `after` of `wait_journal`
titleYesThe title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title
authorYes
task_keyYes
created_atYes

TDQS

A3.7/5.0
Behavior4/5

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

All annotations are negative (false), so the description carries the full burden and it delivers: first answer closes the question while later answers append, neither question nor answer changes task status, and the tracker builds the title from the question reference. These are genuine behavioral disclosures beyond the 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?

Three sentences (~50 words), with the core purpose front-loaded in the first sentence and the two remaining sentences dense with scope and side-effect information. No filler or repetition of schema content.

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

Completeness3/5

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

The description plus 100%-covered schema and output schema make the tool safely invocable on its own. However, the conceptual boundary between `answer` and conceptually adjacent siblings (`ask`, `add_verdict`, `add_entry`) is not clarified, so an agent working within the full 30-tool set still faces selection uncertainty.

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 fully documents all four parameters, baseline 3 applies. The description adds only marginal param-adjacent context (task-token scope, question reference for the title) and no syntax or format details beyond 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?

States a specific verb+resource: 'Answers a question of the same task', with scope ('Any holder of a `task` token answers, in any task'). The claim that answers do not change task status implicitly distinguishes it from state-changing siblings like `resolve` and `close_task`, though no sibling is named explicitly.

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

Usage Guidelines3/5

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

The use case is implied (respond to an open question in a task) and the 'does not change task status' line implicitly cautions against using it for state transitions. However, with 30 siblings including `ask`, `add_verdict`, and `add_entry`, no explicit when-to-use or when-not-to-use guidance is given, leaving selection largely to inference.

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

archive_projectA

Archives a project with a reason and files an archived entry in its case. Only a main token archives.

The project and its tasks freeze as they are: statuses stay, open tasks need no closing. From then on any change in the project or its tasks — a new task, an entry, a transition, an edit, an attribute, a new link — is refused with project_archived, until restore_project. The one change still accepted is unlink of a link with its task: an open archived task keeps blocking its blocked_by tasks and holding its parent until the link is removed. Reads work as before.

An already archived project is refused with project_archived.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
reasonYesWhy the project is archived or restored; a blank one is refused with `project_reason_required`. Filed in the `archived` or `restored` entry of the project's case

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesNumber of the `archived` or `restored` entry in the project's case
keyYes
archived_atYesWhen the project was archived; `null` once it is restored

TDQS

A4.4/5.0
Behavior5/5

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

Discloses rich post-archive behavior far beyond the four boolean annotations: the project and tasks freeze, all change types are refused with `project_archived`, reads still work, and the sole exception is `unlink` of a link. Even the edge case of an open archived task blocking `blocked_by` tasks and holding its parent is spelled out. The description aligns with the annotations (state-changing, non-idempotent, non-destructive), so there is no contradiction.

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

Conciseness4/5

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

Three paragraphs of dense, correctly front-loaded information: purpose in the first sentence, then freeze semantics, the unlink exception, and failure modes. The length is justified by the genuinely complex archive behavior, though the `blocked_by`/parent-holding detail is quite deep. Nothing is redundant with the schema, and each section 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?

Covers preconditions (main token), side effects (case entry), post-conditions (freeze and refusals), the unlink exception, reversibility via `restore_project`, and error codes — all without needing to explain return values since an output schema exists. Nothing an agent needs in order to invoke this tool correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, with both `key` and `reason` already documented including error responses (`project_not_found`, `project_reason_required`) and the case-entry filing behavior. The description only restates that archiving is done 'with a reason', adding no meaning beyond what the schema provides. Baseline 3 is appropriate because the schema carries the parameter documentation.

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

Purpose5/5

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

States a specific verb and resource: 'Archives a project with a reason and files an `archived` entry in its case.' The freeze semantics and the refusal-until-`restore_project` behavior make the operation unmistakable and distinguish it from siblings like `restore_project` and `update_project`.

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?

Describes the effect and preconditions of use — only a `main` token may archive, and an already archived project is refused. It names `restore_project` as the undo path and notes that open tasks need no closing, which implicitly tells the agent not to pre-close tasks. It does not enumerate explicit when-not-to-use alternatives beyond the already-archived refusal, so it falls just short of a 5.

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

askA

Files a question to registry participants. The tracker delivers nothing: an addressee sees the question when reading the feed or their inbox.

A question stays open until an answer with its number is filed in the same task; it counts toward open_questions, and with blocking toward open_blocking_questions.

What the cases of the parent, its ancestors and sibling tasks already record is readable through get_task and read_entries, without a question.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
bodyNoEntry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist
titleYesEntry title: its line in the case index of `get_task`. It states what happened, not how
blockingYesWhether work on the task can go on without the answer. `true` counts toward the `open_blocking_questions` feature, by which such tasks are selected; the tracker does nothing else with it
addresseesYesNames of participants from `list_participants`, at least one. A temporary agent has no registry entry and cannot be addressed. An unknown name is refused with `entry_fields_invalid`, `reason: unknown_participant`
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesEntry number in the task's case; with the key it forms `TRK-42#12`
seqYesJournal sequence number, usable as `after` of `wait_journal`
titleYesThe title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title
authorYes
task_keyYes
created_atYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations are all false, so the description carries the burden and does so well. It discloses that no delivery happens ('the tracker delivers nothing'), that questions count toward `open_questions`/`open_blocking_questions`, and that they stay open until answered.

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 short paragraphs, with the core action in the first sentence and no filler. The additional sentences each add distinct information: delivery behavior, lifecycle/counters, and read alternatives.

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

Completeness5/5

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

Given the rich schema and the presence of an output schema, the description covers all non-obvious behavioral context: no notification, lifecycle, counters, and when to use read tools instead. No important decision-relevant behavior is missing.

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

Parameters3/5

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

The schema already documents every parameter with detailed descriptions, and the input schema coverage is 100%. The description adds a little lifecycle context around `blocking`, but does not need to compensate for schema gaps.

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

Purpose5/5

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

The first sentence names a specific action and resource ('Files a question to registry participants'), and the rest clarifies lifecycle and counters. It distinguishes itself from the sibling `answer` by explaining a question remains open until an answer is filed, and from read tools by noting existing records are readable without asking.

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

Usage Guidelines5/5

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

It explicitly names `get_task` and `read_entries` as alternatives when the information is already recorded ('without a question'). It also explains the question lifecycle with `answer`, giving the agent a clear condition for when a follow-up tool is needed.

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

close_taskA

Closes a task: files the given entries, then the verdicts, then the final summary, and moves the task to done, all in one transaction. It is the only way into done.

A refusal of any part files nothing and leaves the status as it was. The exit conditions are checked after filing: a passing latest verdict on every review check within the current pass (checks_not_passed), closed children (task_has_unclosed_children), the task in in_progress (transition_not_allowed). An empty summary part is refused with entry_fields_invalid.

For a parent task the final summary covers the whole work: the children's results are in their own closing summaries.

Tasks this one blocked (blocks) lose the blocked feature, without an entry in their cases.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
entriesNoEntries without payload filed before the verdicts, such as `artifact` pointers to the result
summaryYesThe summary the task closes with, filed last and reporting the outcome of the entries and verdicts before it: the first line of `done` states how the task ended, `remaining` is `nothing` or the key of the task the rest went to, `next_step` is `no steps` or that key
verdictsNoVerdicts filed by this call. The list may be empty: verdicts filed earlier in the current pass count equally. A refused call files none of them, so a `failed` verdict sent here leaves no trace in the case, unlike one filed with `add_verdict`
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes
statusYesTask status
entriesNoFiled entries in filing order, ending with `status_changed`
versionYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only supply the safety flags; the description carries the real behavioral load: all-or-nothing semantics ('A refusal of any part files nothing and leaves the status as it was'), the post-filing order in which exit conditions are evaluated, and a side effect on other tasks ('Tasks this one blocked (`blocks`) lose the `blocked` feature, without an entry in their cases'). Retry behavior is disclosed via idempotency_key binding to the caller's token for 24 hours. The side effect on blocked tasks is a mild tension with destructiveHint=false but is not a contradiction (no data is destroyed and the behavior is fully disclosed).

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

Conciseness4/5

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

Front-loads the core action and atomicity in the first sentence, then failure semantics, then the downstream side effect. Dense but every paragraph earns its place; the only slight cost is that the trailing `blocks` paragraph reads as an afterthought rather than being surfaced earlier.

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 transactional, multi-part write with an output schema available, the description covers the failure modes, their error codes, ordering, idempotency and external side effects — everything an agent needs to decide and to interpret a refusal. Return-value detail is correctly omitted since an output schema exists.

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 cross-parameter semantics the schema cannot express — the filing order (entries, then verdicts, then summary), that an empty verdicts list is legal because earlier verdicts count, and that the summary reports on the entries and verdicts preceding it. It does not duplicate enum or ref-format detail already in the schema.

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

Purpose5/5

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

Names a specific verb and resource ('Closes a task'), enumerates the ordered sub-operations (entries, verdicts, final summary), states the atomicity ('all in one transaction') and the exclusivity claim ('It is the only way into `done`'). An agent can distinguish this from add_entry, add_summary and add_verdict without opening any schema.

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

Usage Guidelines4/5

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

Gives the entry condition (the only path to `done`), the exact refusal conditions with their error codes (`checks_not_passed`, `task_has_unclosed_children`, `transition_not_allowed`, `entry_fields_invalid`), and one routing rule against a sibling ('a `failed` verdict sent here leaves no trace in the case, unlike one filed with `add_verdict`'). It does not systematically cover the other siblings (add_summary, transition), but the when/when-not guidance is concrete.

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

create_projectB

Creates a project with a key, a title and a description. Only a main token creates projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesKey of the new project: a Latin letter followed by 1–15 Latin letters or digits (`invalid_project_key` otherwise). It is stored upper-case, never changes and prefixes the key of every task of the project. A key already taken, in any case, is refused with `project_key_taken`
titleYesProject title
descriptionNoShort "what this is", up to 320 characters after trimming; a longer one is refused with `project_description_too_long`. It rides in the card of every task of the project
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes

TDQS

B3.4/5.0
Behavior4/5

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

The annotations already indicate this is a write operation (readOnlyHint=false). The description adds a useful non-obvious behavioral constraint: only a `main` token may create projects. This goes beyond what the annotations provide.

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 compact with two short sentences and no filler. The first sentence is somewhat redundant with the tool name and schema, but the second sentence carries important auth context, so the overall structure is reasonably efficient.

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

Completeness3/5

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

For a simple create tool with a rich input schema and an output schema, the description covers the core operation and the critical auth constraint. However, it lacks routing guidance relative to sibling tools and does not describe any side effects beyond the annotations.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents all four parameters in detail. The description merely echoes key, title, and description and adds no additional semantic value beyond what the schema provides.

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

Purpose4/5

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

The description states a specific verb and resource: 'Creates a project', and names the main attributes (key, title, description). It is clear but does not explicitly distinguish itself from sibling tools such as update_project or create_task.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives. The note that only a `main` token creates projects is an authorization precondition, not a routing guideline for choosing create_project over create_task or update_project.

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

create_taskA

Creates a task in backlog; a new task starts in no other status.

With parent, the task is born as the parent's child in the same call: the link files link_added both in the new task's case and in the parent's case, and parent_entry in the response is the number of the parent's entry.

A child task takes a part of the parent's work when the parent's output falls into separate results, its checks cannot all pass in one pass, the work does not fit one pass, or it depends on something that does not exist yet. These signs appear on entry into the parent and after each attempt.

The response carries the key issued by the tracker. An empty title or description is refused with task_fields_invalid.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTask title, one line
parentNoKey of the parent task: the new task is born as its child. A closed parent is refused with `task_closed`. The parent is not closed — neither `done` nor `cancelled` — while any of its children is open
projectYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
assigneeNoParticipant name or temporary agent label. The tracker never sets or clears it by itself; only a caller whose signature matches it moves the task into `in_progress`
priorityNoTask prioritynormal
sectionsNoThe five sections. The task moves from `backlog` to `open` only with four non-empty text sections and at least one check (`task_sections_incomplete` otherwise); until then they can be completed with `update_task`
descriptionYesWhat happened and why it is a task. For a continuation of a closed task it names the task the work grew from; the lineage itself is a `relates` link
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes
statusYesTask status
entriesYesNumbers of the entries filed in this task's case, in filing order. Empty when the sent values were already in place; the version then stays the same
versionYesTask version after the call
parent_entryNoNumber of the `link_added` entry filed into the parent task's own case when `create_task` was given `parent`. `null` when no `parent` was given, and always `null` for `transition` and `update_task`: they touch no other task's case.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations provide no safety hints (readOnly=false, idempotent=false), so the description bears full responsibility for behavioral disclosure. It clearly states the new task's status, the parent-child linking effect (files `link_added`), and the response containing the key. It also mentions the `task_fields_invalid` error for empty title/description. However, it does not cover idempotency behavior or retention of keys, which the schema documents but the description omits. For a mutating create operation, this is reasonable coverage but not exhaustive.

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

Conciseness4/5

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

The description is structured into four paragraphs, each serving a distinct purpose: initial status, parent behavior, child-task rationale, and response/error. It is not overly verbose, but the third paragraph on when child tasks are appropriate is quite detailed and somewhat tangential to the core creation task. Overall, each sentence contributes useful information, though it could be tightened slightly.

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 (3 required) and an output schema, so the description need not restate return values. It covers the essential behavioral context: default status, parent-link behavior, and an error condition. It does not explain the `sections` parameter's role in transitioning to `open` (though the schema covers this), nor does it mention idempotency. Given the complexity, the description is mostly complete for an agent to correctly invoke the tool, with minor gaps filled by the schema.

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

Parameters4/5

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

Schema description coverage is 100%, establishing a baseline of 3. The description adds meaningful semantics beyond the schema by elaborating on the `parent` parameter's behavioral implications (the link event, the parent_entry in response, and the rationale for child tasks). It also highlights that an empty title or description triggers a specific error, which relates to the required parameters. This extra context raises the score to 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 opens with an explicit verb and resource ('Creates a task') and immediately states the initial status ('in `backlog`; a new task starts in no other status'). It clearly distinguishes from siblings like update_task, transition, and close_task by focusing on creation semantics. The specific scope (project, parent, sections) is also hinted, making the purpose 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 implicitly signals when to create a task (to start work in backlog) and provides detailed guidance on using the `parent` parameter to create child tasks under specific conditions. It does not explicitly name alternatives like update_task for modifications, but the creation purpose is so obvious that an agent can infer appropriate usage. The explanation of when child tasks are appropriate adds context, though it lacks explicit 'when-not-to-use' statements.

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

get_projectA
Read-onlyIdempotent

Returns one project by its key: key, title, description, current attribute values and the index of the project's case.

The keys of the installation's projects are listed by list_projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes
indexYesIndex of the project's case, titles only, in number order: decisions, findings, artifacts and notes about the project and the tracker's entries about its card. Entry bodies come from `read_project_entries`
titleYes
attributesYesCurrent attribute values, ordered by name ignoring case. Their history is in the project's case: `attribute_created`, `attribute_changed` and `attribute_removed` entries
archived_atYesWhen the project was archived, `null` while it is active. An archived project and its tasks refuse changes with `project_archived`; `restore_project` lifts it
descriptionYesShort "what this is" of the project, up to 320 characters; may be empty. Every task card carries it too

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, covering the safety profile. The description adds value by specifying the return structure (key, title, description, attribute values, case index), but does not go deeper into behavior like pagination, authentication, or error handling beyond what the schema already notes for the key parameter.

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 purpose and return fields. The second sentence provides a useful pointer to list_projects without waste. 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?

Given a single required parameter, high schema coverage, an output schema, and annotations covering safety, the description is quite complete. It lists the returned fields and how to obtain the key. Minor omission: it doesn't explicitly state fallback behavior for invalid keys, but that is covered in the schema's parameter description.

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

Parameters3/5

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

The input schema has 100% coverage: the key parameter is described with its meaning, case-insensitivity, and error behavior, plus an example. The description only repeats 'by its key' without adding any new semantic detail, so it does not exceed the schema's documentation. Baseline of 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 ('Returns') and resource ('one project by its key'), and enumerates exactly what is returned (key, title, description, attribute values, case index), making it distinct from siblings like list_projects or update_project. It also references list_projects for obtaining keys, further clarifying scope.

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

Usage Guidelines4/5

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

The description implicitly conveys when to use this tool: when you have a project key and want its details. It explicitly points to list_projects for retrieving keys, giving context for the required input. However, it doesn't explicitly state when not to use it (e.g., for bulk retrieval) or mention other alternatives beyond list_projects.

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

get_taskA
Read-onlyIdempotent

Returns everything about one task in a single call: card, parent and children, links from both sides, computed features, latest summary, open questions, unresolved remarks, case index and transition targets.

parent and children are fields of their own and are absent from links, which holds blocks, blocked_by and relates, each named by this task's role. The parent's summary and decisions are in the parent's own case.

The summary covers the case up to its own no; entries with a greater no are returned by read_entries with after_no. The index carries titles only, and entry bodies come from read_entries.

A remark in remarks changes nothing in the task: it does not block in_progress, does not change the status and does not unlock the sections. It stays in remarks and in open_remarks until resolve gives it an outcome.

transitions lists the targets of the transition table from the current status, not moves checked in advance: sections, summary, verdicts, blockers and children are checked by the transition call itself. Whether in_progress is open shows in the blocked feature.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`

Output Schema

ParametersJSON Schema
NameRequiredDescription
taskYes
indexYes
linksYes
parentYes
remarksYes
summaryYes
childrenYes
featuresYes
questionsYes
transitionsYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag readOnly/idempotent/non-destructive; the description goes further by explaining structural relationships (`parent`/`children` absent from `links`), that remarks have no side effects, and that `transitions` are unvalidated targets. No contradiction.

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 opens with a one-sentence summary, then groups related clarifications into paragraphs. Each sentence conveys a distinct behavioral or routing fact; no filler.

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

Completeness5/5

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

For a task-detail tool with a rich output schema and four annotations, the description is complete: it covers composition, relationships, boundary conditions for entries, side-effect-free remarks, and transition semantics. It leaves return-field definitions to the output 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?

The input schema already provides 100% coverage for `key`, including format, case-insensitivity, alias behavior, and `task_not_found`. The description adds no parameter-level detail, so 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?

States a specific verb ('Returns') and a specific resource ('everything about one task'), enumerating the principal content fields. The comprehensive singular-task scope clearly distinguishes it from search_tasks and read_entries.

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

Usage Guidelines5/5

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

Explicitly routes to `read_entries` for entries beyond the summary's `no` and for entry bodies, and to `transition` for actual transition checks. This gives an agent clear conditions for choosing alternatives.

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

list_participantsA
Read-onlyIdempotent

Lists the participant registry: humans and permanent agents, the possible addressees of a question. Temporary agents are not registered and are absent from it.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Without a value, the installation's default page size
cursorNo`next_cursor` of the previous page; without it, the first page

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
next_cursorYesCursor of the next page, sent back as `cursor`; `null` means this page is the last one

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive behavior. The description adds useful behavioral context beyond annotations by revealing the inclusion/exclusion rule for temporary agents and framing the registry as question addressees, which is not visible in the schema or annotations.

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

Conciseness5/5

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

The description is two sentences with no redundancy. The primary purpose is front-loaded, and the temporary-agent exclusion earns its place by adding scoping information that is essential for correct usage.

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 simple read-only list tool with fully documented optional pagination parameters, an output schema, and strong annotations, nothing essential is missing. The description covers the domain context and the key exclusion rule, making the tool's behavior predictable.

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% for both parameters (limit and cursor), so the description carries no additional parameter burden. The baseline of 3 applies; the description adds no special semantics beyond what the schema already documents.

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

Purpose5/5

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

The description states a specific verb and resource ('Lists the participant registry') and precisely defines the scope: humans and permanent agents who are possible addressees. It also distinguishes itself from register/update_participant by clarifying what is listed versus what is maintained.

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 clarifies when this tool is appropriate: to view the registry of possible question addressees, and it explicitly notes that temporary agents are absent. While it doesn't name alternative tools or exclusion conditions explicitly, the scope is clear enough for an agent to choose it over participant mutation tools.

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

list_projectsA
Read-onlyIdempotent

Lists the installation's projects, one page at a time: key, title and archive time. A project's description is returned by get_project.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size. Without a value, the installation's default page size
cursorNo`next_cursor` of the previous page; without it, the first page
include_archivedNoAlso list archived projects; without it they are left out. A project is read by its key with `get_project` either way

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
next_cursorYesCursor of the next page, sent back as `cursor`; `null` means this page is the last one

TDQS

A4.3/5.0
Behavior4/5

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

The annotations already cover read-only, idempotent, and non-destructive behavior, so the description adds useful behavioral context rather than repeating safety traits: it discloses pagination ('one page at a time'), the returned field subset, and that descriptions are intentionally excluded and available via get_project. This is sufficient and complementary.

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 carry purpose, pagination behavior, field scope, and a pointer to the sibling tool for descriptions. Every sentence earns its place; no fluff or repetition.

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 is a simple read-only listing with no required parameters and a full input schema, an output schema, and safety annotations. The description adds the remaining context needed for correct use: paging, returned fields, and the route to get_project for descriptions.

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 no parameter-level detail beyond what the schema already documents for limit, cursor, and include_archived. It therefore neither harms nor materially compensates for the schema, remaining at the baseline.

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 ('Lists'), targets a specific resource ('the installation's projects'), and scopes the result to one page with key, title, and archive time. This clearly distinguishes it from related tools like get_project, which the description explicitly reserves for project descriptions.

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

Usage Guidelines4/5

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

It gives clear context: this is the paged listing of projects, not the detailed view. It names get_project as the tool for descriptions, which is an explicit when-not for that use case, though it doesn't enumerate other sibling alternatives.

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

move_taskA

Moves a task to another project, recording the move, both keys and the reason as a moved entry of the task. Available to a main token alone.

The task gets the next number of the new project, or its own earlier key there when it returns to a project it has been in: a task holds at most one key per project. The key it leaves goes to previous_keys and keeps addressing the task in every call that takes a key; no other task ever gets it. Status, sections, links, parent, children and case stay as they are, and a closed task moves too. One key moves one task: its children stay in their project.

Moving into or out of a frozen project fails with project_archived.

A list of keys moves each task on its own, in list order, so new numbers follow that order; each moved task gets its own moved entry with the one reason. The answer is results, one per listed key, repeats included: moved, already (the task is in that project already) or error with the code a single move would give, such as task_not_found or project_archived of the task's own project. A refusal of one task leaves the others moved. A missing main scope, a blank reason, an unknown or archived target project and a list size out of range refuse the whole call before any move.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive, or a list of 1 to 100 keys; a previous key of a moved task addresses it as well. A list outside that range is refused with `task_move_batch_size_invalid` before any move
reasonYesWhy the task moves; a blank one is refused with `task_move_reason_required`. Filed in the `moved` entry of the task's case
projectYesKey of the project the task moves to, case-insensitive. An unknown key is refused with `project_not_found`, the project the task is already in with `task_already_in_project`

Output Schema

ParametersJSON Schema
NameRequiredDescription
noNoNumber of the `moved` entry in the task's case
keyNoKey the task got in the new project
resultsNoOne outcome per listed key, in list order
versionNoTask version after the move
previous_keysNoKeys the task had before, in the order they were left

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only provide generic hints (readOnly=false, destructive=false, etc.), so the description carries the behavioral disclosure burden. It does so extensively: renumbering, `previous_keys`, preservation of status/sections/links/parent/children/case, closed-task moves, frozen-project failures, partial batch moves, and whole-call refusals. There is no contradiction with the 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?

The description is dense but every sentence earns its place. It front-loads the core action, then methodically covers single moves, batch behavior, error codes, and atomic refusal conditions without filler. The paragraph structure aids scanning.

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

Completeness5/5

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

Given the tool's complexity, the description is complete: it covers auth scope, single and batch moves, key reissuing, preservation of task properties, frozen-project errors, response `results`, and whole-call refusals. Since an output schema exists, the description need not enumerate the full return shape beyond `results`.

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?

Although schema coverage is 100%, the description adds substantial meaning beyond the schema. It explains that previous keys keep addressing the task, that a task holds at most one key per project, how list order determines new numbers, and the exact per-key versus whole-call error semantics. This is far more than the schema descriptions alone provide.

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

Purpose5/5

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

The first sentence states a specific action and resource: 'Moves a task to another project' and distinguishes the operation by detailing recording of the move and the `moved` entry. The description further clarifies scope with 'One key moves one task' and behavior for frozen projects, leaving no ambiguity about what the tool does.

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 context for when to use the tool: moving tasks between projects, including closed tasks and batch moves. It notes the `main` token requirement and the `project_archived` failure condition, but it does not explicitly name alternatives or state when not to use this tool versus a sibling.

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

read_entriesA
Read-onlyIdempotent

Returns entry bodies of one task's case, with payload, in number order.

Filters combine with and: types=["summary"] gives every summary, after_no everything filed after the named entry, and both together the entries of those types filed after it. decision and attempt entries hold the choices already made and the attempts already tried, failed ones included.

Entries of many cases in one stream, with a wait for new ones, come from wait_journal.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
nosNoOnly entries with these numbers
limitNoPage size. Without a value, the installation's default page size
typesNoOnly entries of these types
cursorNo`next_cursor` of the previous page; without it, the first page
after_noNoOnly entries filed after the entry with this number

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
next_cursorYesCursor of the next page, sent back as `cursor`; `null` means this page is the last one

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses ordering ('in number order'), payload inclusion, AND-combination of filters, and the semantic content of decision/attempt entries, including failed attempts. That is genuinely useful behavioral context that the annotations and schema do not state.

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 main capability is front-loaded in the first sentence; the remaining paragraphs add filter semantics, type semantics, and the sibling alternative with no repetition or filler. 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?

With a complete input schema, strong annotations, and an output schema, the description supplies the missing semantics: ordering, filter combination, type meanings, and the boundary with wait_journal. No critical behavioral or routing information is absent.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining how types and after_no combine under 'and' and by giving the meaning of decision/attempt entries, which goes beyond individual property descriptions. It does not need to restate key/limit/cursor.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Returns entry bodies of one task's case, with payload, in number order.' This clearly separates it from wait_journal (many cases in one stream) and, by scope, from read_project_entries. The filter examples reinforce that this is the single-task entry reader.

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

Usage Guidelines4/5

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

It explicitly routes multi-case streaming reads with waiting to wait_journal, and the filter examples ('types=... gives every summary', 'after_no...') teach how to narrow a call. It does not explicitly name read_project_entries as the project-wide alternative, though the 'one task's case' scope makes the boundary reasonably clear.

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

read_project_entriesA
Read-onlyIdempotent

Returns the bodies of a project's case entries, payload included, ordered by entry number.

The project's case holds decisions, findings, artifacts and notes about the project, and the tracker's own entries about its card. Filters combine with and, as in read_entries. attribute gives one attribute's history: attribute_created, attribute_changed, attribute_removed entries with that name. The case index, titles only, comes with get_project.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
nosNoOnly entries with these numbers
limitNoPage size. Without a value, the installation's default page size
typesNoOnly entries of these types
cursorNo`next_cursor` of the previous page; without it, the first page
after_noNoOnly entries filed after the entry with this number
attributeNoOnly entries about the attribute with this name: `attribute_created`, `attribute_changed`, `attribute_removed`; matching ignores case

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
next_cursorYesCursor of the next page, sent back as `cursor`; `null` means this page is the last one

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds meaningful context beyond those hints: ordering by entry number, payload inclusion, filter conjunction semantics, the attribute-history special case, and the fact that the case index is only available via get_project.

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 compact and front-loaded with the primary behavior. Each sentence earns its place: result content, scope/context, filter semantics, attribute behavior, and relationship to get_project. No redundant phrasing.

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 7-parameter read tool with a full input schema, an output schema, and rich annotations, the description covers ordering, payload inclusion, filter combination, attribute filtering, and where to get the case index. Nothing essential is missing for an agent to invoke it correctly.

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

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 parameters well. The description still adds value by explaining that filters combine with 'and', that attribute gives a specific attribute's history, and that the relevant entry types are attribute_created, attribute_changed, and attribute_removed.

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

Purpose5/5

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

The description names a specific verb and resource: it returns the bodies of a project's case entries, payload included, ordered by entry number. It also distinguishes itself from siblings by scoping to the project's case and explicitly pointing to read_entries and get_project for related behavior.

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 clearly frames when to use this tool: to read project case entries, including attribute history. It also explains how filters combine and routes the case index to get_project. It doesn't explicitly state exclusions versus read_entries, but the project-scope wording makes the boundary reasonably clear.

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

register_participantA

Registers a human or a permanent agent. Only a main token registers participants; the new participant's token is issued through the REST API. An existing participant's description is changed by update_participant.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesHuman or permanent agent
nameYesName of the new participant: a Latin letter followed by 1–63 Latin letters, digits or `_` (`invalid_participant_name` otherwise). It is stored lower-case and never changes: it signs the participant's entries. A name already taken, in any case, is refused with `participant_name_taken`
descriptionNoWho the participant is: all that a reader of a case learns about the author of an entry
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false (mutation) and idempotentHint=false, so the description does not need to repeat that. It adds valuable context: the requirement for a `main` token and that the token is issued via REST API, which are behaviors not covered by annotations. This supplements the annotation profile without contradiction.

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 sentences with no filler. The first sentence states the core purpose, and the second sentence adds a constraint and differentiates from a sibling tool. Every clause earns its place, and the most important information is front-loaded.

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's moderate complexity (4 params, output schema present, minimal annotations), the description covers the essential purpose, token issuance, and differentiates from update_participant. It does not explain return values, but the output schema handles that. It omits potential side effects beyond token issuance, but that is a minor gap; an agent can call it correctly with the information provided.

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

Parameters3/5

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

The input schema has 100% description coverage for all four parameters, including detailed explanations of `name`, `description`, and `idempotency_key`. The description adds no additional parameter-level semantics, so it neither improves nor degrades what the schema already provides. The baseline of 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 states a specific verb ('Registers') and resource ('a human or a permanent agent'), and explicitly differentiates itself from update_participant by noting that an existing participant's description is changed by that tool. This makes it unmistakable that register_participant is for creating new participants, distinguishing it from siblings like update_participant and list_participants.

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 a clear usage condition: only a `main` token can register participants, and the new participant's token is issued via the REST API. It also points to update_participant for changing descriptions, implying this tool is for new registrations. However, it does not explicitly list when not to use it or fully describe alternative selection criteria, leaving some room for inference.

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

remove_attributeA

Removes a project attribute and files an attribute_removed entry in the project's case with its last value and the reason. The attribute's history stays in the case; a later set_attribute with the same name creates it anew.

A name that matches no attribute of the project is refused with attribute_not_found. A task token removes attributes.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
nameYesAttribute name: Latin letters, digits, `_` and `-`, at most 64 characters (`invalid_attribute_name` otherwise). Matching ignores case
reasonYesWhy the attribute is removed; a blank one is refused with `attribute_reason_required`. Filed in the `attribute_removed` entry together with the last value
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesNumber of the `attribute_removed` entry in the project's case
nameYesName as it was stored
project_keyYes

TDQS

A4.3/5.0
Behavior5/5

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

The description discloses important behaviors beyond the annotations: history stays in the case, a later set_attribute recreates the attribute, missing attributes are refused, and a task token is required. This adds genuine context that the false annotation hints alone do not provide.

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 concise and well-structured: the main behavior and side effect come first, followed by persistence semantics and error/token constraints. Every sentence earns its place with no filler.

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

Completeness5/5

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

The description covers the operation, side effects, persistence, error cases, and authentication context. Since an output schema exists, return-value details need not be described, and nothing essential appears missing.

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

Parameters3/5

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

The input schema already documents all parameters with validation details and error behavior, giving 100% schema description coverage. The tool description adds little parameter-specific meaning beyond referencing the reason and last value, so the baseline of 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 action and resource: 'Removes a project attribute' and the side effect 'files an attribute_removed entry'. This clearly distinguishes it from siblings such as set_attribute and update_project.

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 use case is implied by 'Removes a project attribute' and the error conditions, but the description never explicitly says when to choose this over set_attribute or other siblings. It does provide useful context about the required task token and the attribute_not_found condition.

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

resolveA

Resolves a remark on a task: its outcome and where the work went.

Any outcome resolves the remark, needs_detail included: the resolution removes it from open_remarks, while accepted keeps it in remarks_in_work until the continuation task is closed. Its title is made of the remark reference and the outcome.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
bodyNoEntry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist
taskNoKey of the task the work went to. Required with `accepted` and refused with any other outcome, both as `entry_fields_invalid`
outcomeYesHow the remark is resolved, and what the body holds: - `fixed` — corrected at once; the body states what changed; - `accepted` — taken into work as a separate task named in `task`; - `needs_detail` — the remark needs clarification; the body holds the concrete question; - `declined` — nothing will change; the body gives the reason
remark_noYesNumber of the `remark` entry in the same task; any other number is refused with `entry_fields_invalid`
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesEntry number in the task's case; with the key it forms `TRK-42#12`
seqYesJournal sequence number, usable as `after` of `wait_journal`
titleYesThe title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title
authorYes
task_keyYes
created_atYes

TDQS

A4.4/5.0
Behavior5/5

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

The annotations provide only basic safety hints, so the description carries the burden of behavior. It discloses key state transitions: any outcome removes the remark from open_remarks, accepted keeps it in remarks_in_work until continuation closes, and title generation rule. This goes well beyond structured data.

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, each earning its place: purpose, behavioral nuance, and title rule. Front-loaded with the core action, no filler or redundancy.

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

Completeness4/5

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

The tool has moderate complexity with six parameters and outcome-dependent behavior, but the schema and output schema cover the details. The description explains the essential state effects needed to call it correctly; it does not repeat schema content. A 4 reflects that it is complete for practical use, though it could theoretically mention more about accepted-task linkage.

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 the schema already documents every parameter with detail, including the outcome enum semantics and the task parameter's constraints. The description reinforces the outcome/task connection but does not add new parameter-level meaning; the baseline of 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 opens with a specific verb+

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 identifies the context (resolving remarks) and the outcome-specific behaviors, which gives a clear sense of when to use it. However, it does not explicitly name alternatives or state when not to use it, so it stops short of the highest bar.

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

restore_projectA

Brings an archived project back: files a restored entry carrying the reason in its case, and its tasks resume where the archive left them. Only a main token restores.

A project that is not archived is refused with project_not_archived.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
reasonYesWhy the project is archived or restored; a blank one is refused with `project_reason_required`. Filed in the `archived` or `restored` entry of the project's case

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesNumber of the `archived` or `restored` entry in the project's case
keyYes
archived_atYesWhen the project was archived; `null` once it is restored

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate a write operation (readOnlyHint=false) but not destructive (destructiveHint=false). The description adds behavior beyond that: filing a 'restored' entry with the reason, resuming tasks, and the token restriction. No contradiction with annotations found.

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 short, dense paragraphs. The primary action and effect are in the first sentence, with a token restriction and an error condition in the second. No filler or redundancy; every line carries information.

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

Completeness4/5

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

For a tool with two required params, an output schema, and annotations, the description covers the core behavior, side effects, a permission restriction, and a common error. It does not describe return values, but the output schema exists. Minor gap: it doesn't address what happens if a project is already restored, but that is not critical for correct invocation.

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 both 'key' and 'reason' are already documented with examples and error handling. The description mentions the reason is filed in the entry, but that is also in the schema's reason description. It adds no additional meaning beyond the schema, so 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 uses a specific verb ('Brings back') and resource ('an archived project'), and describes observable effects (files a 'restored' entry, tasks resume). This clearly distinguishes it from siblings like archive_project without requiring the agent to infer the purpose.

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

Usage Guidelines4/5

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

It gives explicit conditions: only a 'main' token can restore, and non-archived projects are refused with a specific error. It does not name alternatives directly, but the inverse relationship with archive_project is clear from context. The token restriction and error case provide practical guidance for when the tool applies.

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

search_tasksA
Read-onlyIdempotent

Searches tasks by a query language string, by separate conditions, or by both.

Conditions from both sources combine with and and give the same result as one string of the same meaning; no condition at all selects every task of the projects that are not archived. A task of an archived project is found only when the search names it with = or in: its project in project, the task itself in key, or its parent in parent. Rows are ordered by sort, by key when it is left out. A long text is cut at the installation limit and marked by <field>_truncated and <field>_length; one task in full, with its case and links, is returned by get_task.

An unknown field, operator or value is refused with search_field_unknown, search_operator_not_supported or search_value_invalid, the allowed values listed in details.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoTask keys: several named tasks in one call. An unknown key is refused with `search_value_invalid`, `reason: task_not_found`, rather than left out
sortNoSort order, most significant key first; a leading `-` sorts descending. Allowed: `key`, `last_entry_at`, `priority`, `updated_at`
textNoSubstring of the title or description, case-insensitive
limitNoPage size. Without a value, the installation's default page size
queryNoQuery language string. A condition is written `name: [operator] values`: the operator stands **after** the colon, unlike SQL — `status: in open, in_progress`, not `status in (open, in_progress)`. Parentheses group conditions, not values. Without an operator a condition means equality, and comma-separated values mean membership: `status: open, in_progress` equals `status: in open, in_progress`. Fields: `assignee`, `blocked`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`. Operators: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (substring), `!~`, `in`, `not in`; `empty()` matches tasks without a value. Conditions combine with `and` and `or`. Examples: - `project: TRK and status: open and blocked: false` - `status: in open, in_progress` - `priority: >= high and text: ~ login` - `assignee: empty() or open_questions: > 0` A string that does not parse is refused with `invalid_search_query` and the character position, plus the correct form in `details.hint` where the error position determines it
cursorNo`next_cursor` of the previous page; without it, the first page
fieldsNoFields to return: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parent`, `previous_keys`, `priority`, `project`, `status`, `title`, `updated_at`, `version`. The key always comes back; an empty list returns whole tasks. `features` brings the computed features: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `last_summary_at`, `last_entry_at`. `parent` is the parent's key and title, or `null`
parentNoParent task keys: their **direct** children, one level down. `empty()` matches tasks without a parent, the top level of a project. An unknown key is refused rather than read as «no children»
statusNoTask statuses
blockedNoWhether the task has `blocked_by` on a task that is neither `done` nor `cancelled`
projectNoProject keys
assigneeNoAssignee names, exact match; `empty()` matches tasks without an assignee. A name covers every session signed with it: no value selects the tasks of one session
priorityNoPriorities
open_remarksNoExact number of unresolved remarks; ranges go in `query`
open_questionsNoExact number of unanswered questions; ranges go in `query`
remarks_in_workNoNumber of remarks resolved as `accepted` whose continuation task is not closed yet
open_blocking_questionsNoExact number of unanswered `blocking` questions; `0` means none blocks

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
next_cursorYesCursor of the next page, sent back as `cursor`; `null` means this page is the last one

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses important behaviors: conditions combine with 'and', archived projects are excluded unless explicitly named, default ordering by key, truncation markers for long text, and specific error codes for invalid fields, operators, or values. This substantially exceeds what annotations alone provide.

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?

Although the description is long, it is dense and every sentence earns its place given the tool's complexity. The structure is logical: core purpose first, then combination semantics, scoping behavior, ordering, truncation, and error handling. No fluff or repetition.

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 description covers edge cases, error semantics, archived-project behavior, ordering defaults, and distinguishes single-task retrieval via get_task. An output schema exists, so return-value documentation is not required from the description. For a 17-parameter search tool, this is complete and actionable.

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 each parameter already has a rich description, so the baseline is 3. The description still adds meaning beyond the schema by explaining how query and separate condition parameters combine, how archived projects are handled, and how ordering and truncation behave across results.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Searches tasks by a query language string, by separate conditions, or by both.' It clearly distinguishes itself from the sibling get_task by noting that a single task in full is returned by get_task, and it conveys the search scope without ambiguity.

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

Usage Guidelines4/5

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

The description gives clear context on when search_tasks is appropriate: searching by query language, separate conditions, or both, and it explicitly routes full-task retrieval to get_task. It does not enumerate exclusions for every sibling tool, but it provides enough directional guidance for an agent to select the right tool.

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

set_attributeA
Idempotent

Sets the value of a project attribute: a reference fact of the project such as its repository or main branch. One call both creates and changes; which entry it files follows from the attribute's state.

  • No attribute with this name, ignoring case: the attribute is created and an attribute_created entry is filed; the reason is optional.

  • An attribute with another value: the value changes and an attribute_changed entry is filed with the previous value; the reason is required.

  • The same value: nothing changes and nothing is filed.

The name keeps the spelling it was created with; another spelling addresses the same attribute and does not rename it. Attributes carry no types and no search: the tracker stores the text and acts on none of it. A task token sets attributes.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
nameYesAttribute name: Latin letters, digits, `_` and `-`, at most 64 characters (`invalid_attribute_name` otherwise). Matching ignores case
valueYesAttribute value: plain text up to 1000 characters, stored as sent and not interpreted by the tracker; a longer one is refused with `attribute_value_too_long`
reasonNoWhy the value changes. Required when the attribute already exists with another value (`attribute_reason_required` otherwise); optional when the call creates it. Filed in the entry with the previous and the new value
idempotency_keyNoRetry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours

Output Schema

ParametersJSON Schema
NameRequiredDescription
noYesNumber of the filed entry in the project's case (`TRK#7`); `null` when the value equals the current one and nothing was filed
nameYesName as stored: the spelling the attribute was created with
valueYes
project_keyYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses meaningful side effects: filed entries (`attribute_created`, `attribute_changed`), preservation of the previous value, no-op behavior on identical values, and case-insensitive addressing that never renames. It also explains that the tracker stores attributes as inert text and does not interpret or search them, which is valuable behavioral context the annotations do not provide.

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 front-loaded with the core purpose, then uses a compact bulleted list to lay out the state transitions. Each sentence contributes either to the conceptual model or to operational behavior; there is no filler or unnecessary repetition.

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

Completeness5/5

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

Given the tool's complexity, the description covers every meaningful behavioral case: creation, update, no-op, entry filing, reason requirements, naming semantics, and lack of type/search interpretation. The output schema and rich input schema handle return values and parameter formatting, so nothing essential is missing for correct invocation.

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

Parameters4/5

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

The schema already provides 100% parameter coverage, but the description adds useful semantic nuance: the name keeps its original spelling and a different spelling addresses the same attribute without renaming it. It also reinforces when `reason` is required versus optional, complementing the schema's parameter descriptions.

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

Purpose5/5

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

The description names the exact operation ('Sets the value of a project attribute') and clarifies what kind of attribute is meant ('a reference fact of the project such as its repository or main branch'). It also states the create-or-change duality, making the tool's purpose distinct from sibling tools like remove_attribute.

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 usage context by explaining the three possible states (absent, different value, same value) and the resulting behavior. It does not explicitly name alternatives or say 'use this instead of remove_attribute', but the scope and constraints ('Attributes carry no types and no search') provide enough practical guidance for an agent to select it appropriately.

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

transitionA

Moves a task to another status along the fixed transition table.

Refusals: leaving in_progress without a summary filed since the last entry into it — summary_required; entering in_progress without an assignee — assignee_required, by anyone but the assignee — assignee_mismatch (assignee and caller signature in details), with an open blocker — task_blocked; open with incomplete sections — task_sections_incomplete; cancelled with open children — task_has_unclosed_children; done — closing_not_a_transition, since a task is closed by close_task; a move outside the table — transition_not_allowed, the allowed targets in details.allowed.

The tracker never moves a task into or out of waiting by itself: both moves are the caller's. Each entry into in_progress, from any status including waiting, starts a new pass of the task.

cancelled takes no verdicts. It clears the blocked feature of the tasks this one blocked (blocks), with no entry in their cases.

The response names the new status and version and the number of the filed status_changed entry.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesTarget status
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
reasonNoWhy the task moves. Required for any step back along `backlog < open < in_progress < done`, for `cancelled` and for `waiting` (`transition_reason_required` otherwise), optional elsewhere. For `waiting` it is the only record of what the task waits for. Filed in the `status_changed` entry

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes
statusYesTask status
entriesYesNumbers of the entries filed in this task's case, in filing order. Empty when the sent values were already in place; the version then stays the same
versionYesTask version after the call
parent_entryNoNumber of the `link_added` entry filed into the parent task's own case when `create_task` was given `parent`. `null` when no `parent` was given, and always `null` for `transition` and `update_task`: they touch no other task's case.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the all-false annotations, the description discloses many side effects and invariants: waiting is never moved automatically, entering in_progress starts a new pass, cancelled clears the blocked feature on dependent tasks without adding an entry, and the response includes the new status, version, and status_changed entry number. This is exactly the behavioral context an agent needs.

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

Conciseness5/5

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

Although dense, the description is front-loaded with the core action and every subsequent sentence carries distinct information about refusals, side effects, or response shape. No filler or redundant restatement of the schema is present.

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 state-transition tool with an output schema, the description covers allowed targets, refusal codes, side effects, caller responsibilities, and response contents. An agent has enough information to decide when to call it and what to expect, including the close_task alternative.

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, and the description adds extra meaning: it explains that for waiting the reason is 'the only record of what the task waits for' and ties refusal conditions to specific target statuses. The main description does not need to repeat the schema's parameter documentation.

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

Purpose5/5

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

The opening sentence 'Moves a task to another status along the fixed transition table' states a specific verb and resource and immediately scopes the operation to a predefined table. It further differentiates from the sibling close_task by saying a move to done is not a transition and 'a task is closed by close_task'.

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 gives explicit refusal conditions that tell an agent when the transition cannot be performed, and names close_task as the alternative for closing. It also states who must perform certain transitions ('both moves are the caller's') and when reason is required, giving clear usage context.

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

update_participantA
DestructiveIdempotent

Changes a participant's description. Only a main token edits participants. Name and kind never change: the name signs entries already filed. The previous description is not kept.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesParticipant name, case-insensitive. An unknown name is refused with `participant_not_found`
descriptionYesWho the participant is: all that a reader of a case learns about the author of an entry

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes

TDQS

A4.5/5.0
Behavior5/5

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

Adds key behavioral context beyond annotations: only a main token can edit, name/kind are immutable because the name signs entries already filed, and the previous description is not kept. This clarifies and extends the destructiveHint annotation with specific consequences.

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 concise sentences with no filler. Front-loaded with the primary action, then each subsequent sentence adds a distinct piece of information: permission, immutability, and destructiveness. 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?

Complete for a simple two-parameter update tool. The description covers the permission requirement, immutability of name/kind, and the destructive nature of overwriting. An output schema exists, so return values are not needed. No critical information is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds minimal parameter-level detail beyond the schema, only referencing the description field and the immutability of name/kind, which does not substantially enhance parameter understanding.

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

Purpose5/5

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

States a specific verb (changes) and resource (participant's description), and distinguishes itself by explicitly saying name and kind never change. This differentiates it from any potential create/update participant tools and clarifies its scope.

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

Usage Guidelines4/5

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

Implies usage for updating participant descriptions and gives a clear prerequisite (only a `main` token can edit). It also provides an exclusion (name and kind never change), which helps agents understand what not to attempt. Lacks explicit naming of alternative tools, but no direct sibling for this action exists in the list.

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

update_projectA
Idempotent

Changes a project's title and description; a field left out stays. Only a main token edits projects. The key never changes. Each changed field files a field_changed entry with the previous and the new value in the project's case; a value equal to the current one files nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesProject key, case-insensitive. An unknown key is refused with `project_not_found`
titleNoNew title; when left out, the title stays
descriptionNoNew description, up to 320 characters after trimming (`project_description_too_long` otherwise); when left out, the description stays

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes

TDQS

A4.7/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the annotations: partial-update semantics, the requirement for a `main` token, the key never changing, event-log entries with previous/new values, and no-op behavior when values are unchanged. These are exactly the non-obvious traits an agent needs to predict side effects.

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

Conciseness5/5

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

Three sentences, each carrying necessary information: the core action, the authorization constraint, and the event-log side effects. Important behavioral facts are front-loaded before lower-level details.

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 three-parameter tool with a full output schema, rich annotations, and schema descriptions for all parameters, the description covers the remaining behavioral essentials: authorization, partial updates, immutability of the key, and event recording. Nothing needed for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining that omitted fields stay unchanged, equal values file no event, and the key is immutable — details beyond the schema's property descriptions and examples.

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

Purpose5/5

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

The description names a specific verb ('Changes'), a specific resource ('a project'), and the exact fields affected ('title and description'). This clearly distinguishes update_project from sibling tools like update_task and update_participant without needing to inspect schemas.

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

Usage Guidelines4/5

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

The description makes it clear this tool is for editing project title and description, which is sufficient context for selecting it. It does not explicitly name alternatives or exclusion conditions, but the resource and field specificity separate it from siblings.

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

update_taskA
Idempotent

Changes the given fields of a task; fields left out stay as they are.

Title, description and sections are fixed from open on. A task past backlog has them edited by a return to backlog through transition with a reason, this call, and a move forward again to open and in_progress.

Each changed field files section_changed or field_changed, an assignee change files assignee_changed. An edit of one check names its number, and the earlier verdicts on that check become outdated.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesTask key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`
changesYes
versionNoTask version read earlier. When given and the task has changed since, the call is refused with `version_conflict` instead of overwriting the other change; when left out, the edit applies on top of the current version

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes
statusYesTask status
entriesYesNumbers of the entries filed in this task's case, in filing order. Empty when the sent values were already in place; the version then stays the same
versionYesTask version after the call
parent_entryNoNumber of the `link_added` entry filed into the parent task's own case when `create_task` was given `parent`. `null` when no `parent` was given, and always `null` for `transition` and `update_task`: they touch no other task's case.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important side effects: each changed field files `section_changed` or `field_changed`, assignee changes file `assignee_changed`, and editing a check marks earlier verdicts as `outdated`. It also reveals the editability constraint based on task state, which annotations alone do not 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 compact and front-loaded: the core behavior is in the first sentence, followed by state constraints and then side effects. Every sentence contributes unique, decision-relevant information without repetition or filler.

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

Completeness5/5

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

The description covers the operational workflow, editability constraints, and behavioral side effects, while the schema and output schema handle field-level details and return structure. An agent has enough information to decide when to call this tool and what to expect from doing so.

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 schema already documents most parameters richly, including nested field meanings and constraints. The description adds value by explaining the partial-update contract and field-editing restrictions, which helps interpret the `changes` parameter even though the top-level parameter itself lacks a direct schema description.

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

Purpose5/5

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

The description opens with 'Changes the given fields of a task; fields left out stay as they are,' which clearly identifies the verb (change), the resource (a task), and the patch semantics. It is distinguishable from siblings like create_task, transition, and move_task because it is explicitly about field-level edits rather than state changes or creation.

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 concrete guidance on when this tool is and is not appropriate: title, description, and sections are fixed from `open` onward, and editing them for tasks past `backlog` requires the transition-back/edit/transition-forward workflow. It does not explicitly name sibling alternatives, but it provides enough workflow context to steer an agent correctly.

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

wait_journalA
Read-onlyIdempotent

Returns journal entries after the sequence number after, waiting for new ones.

The journal is every case entry of the installation in one stream, task cases and project cases alike, in seq order; task, project and types narrow it. The call returns as soon as a matching entry appears, and after timeout seconds at the latest. The next call continues from the seq of the last entry received. With types=["answer"] and task, one call covers an answer expected within timeout.

Entries already filed in one case, by number, are returned by read_entries and read_project_entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskNoOnly entries of these tasks: one key or a list of at most 50. One wait covers all of them, and an entry in any of them ends it. More keys are refused with `journal_too_many_tasks`, an unknown key with `task_not_found`
afterNoJournal sequence number `seq` to read after; `0` reads from the start. Entries are permanent: no `seq` is too old
limitNoPage size. Without a value, the installation's default page size
typesNoOnly entries of these types
cursorNo`next_cursor` of the previous page; without it, the first page
projectNoOnly entries of this project: its own case and the cases of its tasks
timeoutNoSeconds to wait for the first matching entry when none is there yet, at most 60 (`journal_wait_too_long` beyond); `0` answers at once. An empty page after the wait means nothing happened and is not an error

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
next_cursorYesCursor of the next page, sent back as `cursor`; `null` means this page is the last one

TDQS

A4.7/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 covered. The description adds valuable behavioral context beyond annotations: it explains the waiting semantics, the continuation behavior ('The next call continues from the `seq` of the last entry received'), and the non-error empty page after timeout. It also clarifies that entries are permanent and no `seq` is too old. This is more than the annotations alone provide, though it doesn't detail pagination or cursor behavior in depth.

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 compact and front-loaded. The first sentence states the core function immediately. The second paragraph adds necessary context about the journal stream and sibling tools without redundancy. Every sentence earns its place, and the description is appropriately sized for a tool with 7 parameters and complex waiting semantics.

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

Completeness5/5

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

Given the tool's complexity (waiting semantics, filtering, pagination, continuation), the description is complete. It covers the stream model, filtering options, timeout behavior, continuation, and distinguishes from sibling tools. The output schema exists, so return values are documented elsewhere. The description provides everything an agent needs to decide when to call this tool and what to expect.

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 schema already documents all 7 parameters thoroughly. The description adds meaningful context beyond the schema: it explains the overall stream semantics, how `task`, `project`, and `types` narrow the stream, and the practical use case for `types=["answer"]`. It doesn't repeat parameter-by-parameter details, which is appropriate given the schema's completeness, but it does add cross-parameter context that helps an agent understand how the parameters interact.

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's function: 'Returns journal entries after the sequence number `after`, waiting for new ones.' It specifies the resource (journal entries), the operation (wait and return), and the key parameter (`after`). It also distinguishes itself from siblings by noting that entries filed in one case are returned by `read_entries` and `read_project_entries`, which helps an agent differentiate it from those alternatives.

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 provides explicit usage context: it explains the journal is a single stream of all case entries, how `task`, `project`, and `types` narrow it, and when the call returns (as soon as a matching entry appears or after `timeout` seconds). It also gives a concrete use case: 'With `types=["answer"]` and `task`, one call covers an answer expected within `timeout`.' This is strong guidance for when to use this tool.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.8.1
    • Changedadd_entry1 field changed
      • changedInput schema / properties / refs / description
        Previous value: -"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, URLs. An entry, task or project that does not exist is refused with `entry_fields_invalid`; URLs are not checked"New value: +"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, or a URL with a scheme (`https://…`, `file://…`). Anything else (`7`, `#7`, `docs/x.md`) is refused with `entry_fields_invalid`, as is an entry, task or project that does not exist; URLs are not checked"
    • Changedadd_project_entry1 field changed
      • changedInput schema / properties / refs / description
        Previous value: -"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, URLs. An entry, task or project that does not exist is refused with `entry_fields_invalid`; URLs are not checked"New value: +"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, or a URL with a scheme (`https://…`, `file://…`). Anything else (`7`, `#7`, `docs/x.md`) is refused with `entry_fields_invalid`, as is an entry, task or project that does not exist; URLs are not checked"
    • Changedclose_task1 field changed
      • changedInput schema / $defs / ClosingEntry / properties / refs / description
        Previous value: -"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, URLs. An entry, task or project that does not exist is refused with `entry_fields_invalid`; URLs are not checked"New value: +"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, or a URL with a scheme (`https://…`, `file://…`). Anything else (`7`, `#7`, `docs/x.md`) is refused with `entry_fields_invalid`, as is an entry, task or project that does not exist; URLs are not checked"
  2. 34 tool updatesv0.5.2
    • Changedadd_entry19 fields changed
      • changedInput schema / properties / body / description
        Previous value: -"Тело записи в markdown; хранится и отдаётся как есть"New value: +"Entry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist"
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / refs / description
        Previous value: -"Ссылки: записи `TRK-42#12`, задачи `TRK-7`, адреса. Записи и задачи проверяются на существование, адреса — нет"New value: +"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, URLs. An entry, task or project that does not exist is refused with `entry_fields_invalid`; URLs are not checked"
      • changedInput schema / properties / refs / examples
        Previous value: -[
        -  [
        -    "TRK-42#3"
        -  ]
        -]New value: +[
        +  [
        +    "TRK-42#12"
        +  ]
        +]
      • changedInput schema / properties / title / description
        Previous value: -"Заголовок записи: он стоит в описи дела, которую отдаёт `get_task`"New value: +"Entry title: its line in the case index of `get_task`. It states what happened, not how"
      • removedInput schema / properties / title / examples
        Removed value: -[
        -  "Выбран asyncpg вместо psycopg: нужен LISTEN без потока"
        -]
      • changedInput schema / properties / type / description
        Previous value: -"Что случилось: `decision` — выбран вариант из нескольких, `attempt` — попытка и чем кончилась (провал ценнее успеха), `finding` — установленный факт с источником, `artifact` — указатель на результат, `remark` — замечание «вышло не то» к чужой сделанной работе, `note` — всё остальное, и это последний выбор. Сводка, вопрос, ответ, вердикт и резолюция подшиваются своими инструментами"New value: +"What the entry records:\n- `decision` — an option chosen among several, with the reason;\n- `attempt` — something tried and how it ended, failed attempts included;\n- `finding` — an established fact with its source, including what was learned from reading;\n- `artifact` — a pointer to a result;\n- `remark` — a claim that finished work of a task came out wrong, written from the side of whoever needs the result; the task's assignee resolves it with `resolve`. A remark on a closed task is accepted: the case grows, the task stays as it is. An observation about the caller's own task is a `finding`, not a `remark`;\n- `note` — an entry that fits none of the types above"
      • removedInput schema / properties / type / examples
        Removed value: -[
        -  "decision"
        -]
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • changedOutput schema / description
        Previous value: -"Ответ подшивающего инструмента: чем запись адресуют, без самой записи.\n\n`title` непуст только там, где заголовок собрал трекер: у сводки, ответа, вердикта и\nрезолюции его не принимают вовсе (`app/domain/case.py`, `TITLED_ENTRY_TYPES`). Где\nзаголовок прислал агент, здесь стоит `null` — «в описи ровно то, что ты прислал»."New value: +"A filed entry, by its address rather than its content; the entry in full is\nreturned by `read_entries`."
      • addedOutput schema / properties / no / description
        Added value: +"Entry number in the task's case; with the key it forms `TRK-42#12`"
      • addedOutput schema / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / properties / title / description
        Added value: +"The title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title"
    • Addedadd_project_entry
    • Changedadd_summary20 fields changed
      • changedInput schema / properties / blockers / description
        Previous value: -"Что мешает. Пустым это поле быть не может: «ничего», если ничего"New value: +"What stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom"
      • removedInput schema / properties / blockers / examples
        Removed value: -[
        -  "Ничего"
        -]
      • changedInput schema / properties / done / description
        Previous value: -"Что сделано с прошлой сводки, со ссылками на артефакты. Первая строка становится заголовком записи в описи — одной фразой о случившемся; слишком длинную трекер обрежет по границе слова"New value: +"What was done since the previous summary, with references to artifacts. Its first line becomes the entry title in the case index: one sentence about what happened; a longer line is cut at a word boundary"
      • removedInput schema / properties / done / examples
        Removed value: -[
        -  "Разобрался, где сгорает номер задачи"
        -]
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / next_step / description
        Previous value: -"Одно конкретное действие, с которого начнёт преемник"New value: +"The one concrete action a successor starts with. In a summary before `waiting` it is the action taken once the awaited arrives. A doubt about a decision or a result is recorded here, as what to look at and why, rather than as a verdict"
      • removedInput schema / properties / next_step / examples
        Removed value: -[
        -  "Перенести вызов next_task_number в конец create_task"
        -]
      • changedInput schema / properties / remaining / description
        Previous value: -"Что осталось до выхода задачи"New value: +"What remains before the task is done"
      • removedInput schema / properties / remaining / examples
        Removed value: -[
        -  "Перенести выдачу номера после валидации"
        -]
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • changedOutput schema / description
        Previous value: -"Ответ подшивающего инструмента: чем запись адресуют, без самой записи.\n\n`title` непуст только там, где заголовок собрал трекер: у сводки, ответа, вердикта и\nрезолюции его не принимают вовсе (`app/domain/case.py`, `TITLED_ENTRY_TYPES`). Где\nзаголовок прислал агент, здесь стоит `null` — «в описи ровно то, что ты прислал»."New value: +"A filed entry, by its address rather than its content; the entry in full is\nreturned by `read_entries`."
      • addedOutput schema / properties / no / description
        Added value: +"Entry number in the task's case; with the key it forms `TRK-42#12`"
      • addedOutput schema / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / properties / title / description
        Added value: +"The title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title"
    • Changedadd_verdict22 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "VerdictOutcome": {
        -    "description": "Исход обзорной проверки. Значений ровно два: третьего состояния у проверки нет.",
        -    "enum": [
        -      "passed",
        -      "failed"
        -    ],
        -    "title": "VerdictOutcome",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / check_no / description
        Previous value: -"Номер обзорной проверки в списке задачи, с 1"New value: +"Number of the review check in the task's list, from 1; a number outside the list is refused with `entry_fields_invalid`"
      • removedInput schema / properties / check_no / examples
        Removed value: -[
        -  3
        -]
      • changedInput schema / properties / evidence / description
        Previous value: -"Доказательство исхода: что запустил, что увидел, ссылка на материал"New value: +"What was run for the check as written and what it showed: the command, its output, a link to the material"
      • removedInput schema / properties / evidence / examples
        Removed value: -[
        -  "docker compose run --rm test: 214 passed"
        -]
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • removedInput schema / properties / outcome / $ref
        Removed value: -"#/$defs/VerdictOutcome"
      • changedInput schema / properties / outcome / description
        Previous value: -"Исход проверки. Третьего состояния нет"New value: +"Outcome of the check; there is no third state"
      • addedInput schema / properties / outcome / enum
        Added value: +[
        +  "passed",
        +  "failed"
        +]
      • removedInput schema / properties / outcome / examples
        Removed value: -[
        -  "passed"
        -]
      • addedInput schema / properties / outcome / type
        Added value: +"string"
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • changedOutput schema / description
        Previous value: -"Ответ подшивающего инструмента: чем запись адресуют, без самой записи.\n\n`title` непуст только там, где заголовок собрал трекер: у сводки, ответа, вердикта и\nрезолюции его не принимают вовсе (`app/domain/case.py`, `TITLED_ENTRY_TYPES`). Где\nзаголовок прислал агент, здесь стоит `null` — «в описи ровно то, что ты прислал»."New value: +"A filed entry, by its address rather than its content; the entry in full is\nreturned by `read_entries`."
      • addedOutput schema / properties / no / description
        Added value: +"Entry number in the task's case; with the key it forms `TRK-42#12`"
      • addedOutput schema / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / properties / title / description
        Added value: +"The title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title"
    • Changedanswer15 fields changed
      • changedInput schema / properties / body / description
        Previous value: -"Тело записи в markdown; хранится и отдаётся как есть"New value: +"Entry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist"
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / question_no / description
        Previous value: -"Номер записи `question` в этой же задаче"New value: +"Number of the `question` entry in the same task. Any other number is refused with `entry_fields_invalid`, `reason: unknown_entry` or `not_a_question`"
      • removedInput schema / properties / question_no / examples
        Removed value: -[
        -  7
        -]
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • changedOutput schema / description
        Previous value: -"Ответ подшивающего инструмента: чем запись адресуют, без самой записи.\n\n`title` непуст только там, где заголовок собрал трекер: у сводки, ответа, вердикта и\nрезолюции его не принимают вовсе (`app/domain/case.py`, `TITLED_ENTRY_TYPES`). Где\nзаголовок прислал агент, здесь стоит `null` — «в описи ровно то, что ты прислал»."New value: +"A filed entry, by its address rather than its content; the entry in full is\nreturned by `read_entries`."
      • addedOutput schema / properties / no / description
        Added value: +"Entry number in the task's case; with the key it forms `TRK-42#12`"
      • addedOutput schema / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / properties / title / description
        Added value: +"The title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title"
    • Addedarchive_project
    • Changedask19 fields changed
      • changedInput schema / properties / addressees / description
        Previous value: -"Имена участников из `list_participants`, хотя бы одно. Временного агента адресовать нельзя: строки в реестре у него нет"New value: +"Names of participants from `list_participants`, at least one. A temporary agent has no registry entry and cannot be addressed. An unknown name is refused with `entry_fields_invalid`, `reason: unknown_participant`"
      • removedInput schema / properties / addressees / examples
        Removed value: -[
        -  [
        -    "owner"
        -  ]
        -]
      • changedInput schema / properties / blocking / description
        Previous value: -"Можно ли продолжать работу без ответа. Значения по умолчанию нет намеренно: это знаешь только ты. `true` считается признаком `open_blocking_questions`, по которому задачу находят отбором; больше трекер с ним ничего не делает"New value: +"Whether work on the task can go on without the answer. `true` counts toward the `open_blocking_questions` feature, by which such tasks are selected; the tracker does nothing else with it"
      • removedInput schema / properties / blocking / examples
        Removed value: -[
        -  true
        -]
      • changedInput schema / properties / body / description
        Previous value: -"Тело записи в markdown; хранится и отдаётся как есть"New value: +"Entry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist"
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / title / description
        Previous value: -"Заголовок записи: он стоит в описи дела, которую отдаёт `get_task`"New value: +"Entry title: its line in the case index of `get_task`. It states what happened, not how"
      • removedInput schema / properties / title / examples
        Removed value: -[
        -  "Выбран asyncpg вместо psycopg: нужен LISTEN без потока"
        -]
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • changedOutput schema / description
        Previous value: -"Ответ подшивающего инструмента: чем запись адресуют, без самой записи.\n\n`title` непуст только там, где заголовок собрал трекер: у сводки, ответа, вердикта и\nрезолюции его не принимают вовсе (`app/domain/case.py`, `TITLED_ENTRY_TYPES`). Где\nзаголовок прислал агент, здесь стоит `null` — «в описи ровно то, что ты прислал»."New value: +"A filed entry, by its address rather than its content; the entry in full is\nreturned by `read_entries`."
      • addedOutput schema / properties / no / description
        Added value: +"Entry number in the task's case; with the key it forms `TRK-42#12`"
      • addedOutput schema / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / properties / title / description
        Added value: +"The title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title"
    • Changedclose_task52 fields changed
      • changedInput schema / $defs / ClosingEntry / description
        Previous value: -"Запись без нагрузки: та же форма, что у `add_entry`."New value: +"An entry without payload, of the same shape as in `add_entry`."
      • changedInput schema / $defs / ClosingEntry / properties / body / description
        Previous value: -"Тело записи в markdown; хранится и отдаётся как есть"New value: +"Entry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist"
      • changedInput schema / $defs / ClosingEntry / properties / refs / description
        Previous value: -"Ссылки: записи `TRK-42#12`, задачи `TRK-7`, адреса. Записи и задачи проверяются на существование, адреса — нет"New value: +"References: task entries `TRK-42#12`, project entries `TRK#7`, tasks `TRK-7`, URLs. An entry, task or project that does not exist is refused with `entry_fields_invalid`; URLs are not checked"
      • changedInput schema / $defs / ClosingEntry / properties / refs / examples
        Previous value: -[
        -  [
        -    "TRK-42#3"
        -  ]
        -]New value: +[
        +  [
        +    "TRK-42#12"
        +  ]
        +]
      • changedInput schema / $defs / ClosingEntry / properties / title / description
        Previous value: -"Заголовок записи: он стоит в описи дела, которую отдаёт `get_task`"New value: +"Entry title: its line in the case index of `get_task`. It states what happened, not how"
      • removedInput schema / $defs / ClosingEntry / properties / title / examples
        Removed value: -[
        -  "Выбран asyncpg вместо psycopg: нужен LISTEN без потока"
        -]
      • changedInput schema / $defs / ClosingEntry / properties / type / description
        Previous value: -"Что случилось: `decision` — выбран вариант из нескольких, `attempt` — попытка и чем кончилась (провал ценнее успеха), `finding` — установленный факт с источником, `artifact` — указатель на результат, `remark` — замечание «вышло не то» к чужой сделанной работе, `note` — всё остальное, и это последний выбор. Сводка, вопрос, ответ, вердикт и резолюция подшиваются своими инструментами"New value: +"What the entry records:\n- `decision` — an option chosen among several, with the reason;\n- `attempt` — something tried and how it ended, failed attempts included;\n- `finding` — an established fact with its source, including what was learned from reading;\n- `artifact` — a pointer to a result;\n- `remark` — a claim that finished work of a task came out wrong, written from the side of whoever needs the result; the task's assignee resolves it with `resolve`. A remark on a closed task is accepted: the case grows, the task stays as it is. An observation about the caller's own task is a `finding`, not a `remark`;\n- `note` — an entry that fits none of the types above"
      • removedInput schema / $defs / ClosingEntry / properties / type / examples
        Removed value: -[
        -  "decision"
        -]
      • changedInput schema / $defs / ClosingSummary / description
        Previous value: -"Финальная сводка. Заголовка не принимает: им становится первая строка `done`.\n\nНа одну часть длиннее промежуточной: `unmeasured` есть только здесь. Обязателен —\nзначение по умолчанию превратило бы «чего не измерили» в поле, которое молча\nопускают ровно в тех делах, где оно и нужно."New value: +"Final summary: the four parts of `add_summary` plus `unmeasured`. It takes no\ntitle: the first line of `done` becomes it."
      • changedInput schema / $defs / ClosingSummary / properties / blockers / description
        Previous value: -"Что мешает. Пустым это поле быть не может: «ничего», если ничего"New value: +"What stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom"
      • removedInput schema / $defs / ClosingSummary / properties / blockers / examples
        Removed value: -[
        -  "Ничего"
        -]
      • changedInput schema / $defs / ClosingSummary / properties / done / description
        Previous value: -"Что сделано с прошлой сводки, со ссылками на артефакты. Первая строка становится заголовком записи в описи — одной фразой о случившемся; слишком длинную трекер обрежет по границе слова"New value: +"What was done since the previous summary, with references to artifacts. Its first line becomes the entry title in the case index: one sentence about what happened; a longer line is cut at a word boundary"
      • removedInput schema / $defs / ClosingSummary / properties / done / examples
        Removed value: -[
        -  "Разобрался, где сгорает номер задачи"
        -]
      • changedInput schema / $defs / ClosingSummary / properties / next_step / description
        Previous value: -"Одно конкретное действие, с которого начнёт преемник"New value: +"The one concrete action a successor starts with. In a summary before `waiting` it is the action taken once the awaited arrives. A doubt about a decision or a result is recorded here, as what to look at and why, rather than as a verdict"
      • removedInput schema / $defs / ClosingSummary / properties / next_step / examples
        Removed value: -[
        -  "Перенести вызов next_task_number в конец create_task"
        -]
      • changedInput schema / $defs / ClosingSummary / properties / remaining / description
        Previous value: -"Что осталось до выхода задачи"New value: +"What remains before the task is done"
      • removedInput schema / $defs / ClosingSummary / properties / remaining / examples
        Removed value: -[
        -  "Перенести выдачу номера после валидации"
        -]
      • changedInput schema / $defs / ClosingSummary / properties / unmeasured / description
        Previous value: -"Какая часть цели не измерена ни одной обзорной проверкой — и какой риск ты сам считаешь теоретическим. Вердикт отвечает проверке, а не цели: назови то, что ты сделал, но не доказал, что запускал руками вместо проверки и где судил по сходству, а не по замеру. «Ничего» — законный ответ, когда проверки покрыли цель целиком, но это ответ, а не отписка: если в голове вертится «вообще-то я не пробовал…» — это и есть содержание поля"New value: +"Which part of the task's goal no review check measured, and which risks the author considers theoretical: what was done but not proven, what was run by hand instead of a check, where a conclusion rests on similarity rather than measurement. A verdict answers its check, not the goal. `nothing` is a valid value when the checks covered the whole goal"
      • removedInput schema / $defs / ClosingSummary / properties / unmeasured / examples
        Removed value: -[
        -  "Прод-команда экрана не мерилась ни одной проверкой: гонял только дев-путь. Риск считаю теоретическим — команды отличаются одним флагом"
        -]
      • changedInput schema / $defs / ClosingVerdict / description
        Previous value: -"Исход одной обзорной проверки с доказательством."New value: +"Outcome of one review check with its evidence."
      • changedInput schema / $defs / ClosingVerdict / properties / check_no / description
        Previous value: -"Номер обзорной проверки в списке задачи, с 1"New value: +"Number of the review check in the task's list, from 1; a number outside the list is refused with `entry_fields_invalid`"
      • removedInput schema / $defs / ClosingVerdict / properties / check_no / examples
        Removed value: -[
        -  3
        -]
      • changedInput schema / $defs / ClosingVerdict / properties / evidence / description
        Previous value: -"Доказательство исхода: что запустил, что увидел, ссылка на материал"New value: +"What was run for the check as written and what it showed: the command, its output, a link to the material"
      • removedInput schema / $defs / ClosingVerdict / properties / evidence / examples
        Removed value: -[
        -  "docker compose run --rm test: 214 passed"
        -]
      • removedInput schema / $defs / ClosingVerdict / properties / outcome / $ref
        Removed value: -"#/$defs/VerdictOutcome"
      • changedInput schema / $defs / ClosingVerdict / properties / outcome / description
        Previous value: -"Исход проверки. Третьего состояния нет"New value: +"Outcome of the check; there is no third state"
      • addedInput schema / $defs / ClosingVerdict / properties / outcome / enum
        Added value: +[
        +  "passed",
        +  "failed"
        +]
      • removedInput schema / $defs / ClosingVerdict / properties / outcome / examples
        Removed value: -[
        -  "passed"
        -]
      • addedInput schema / $defs / ClosingVerdict / properties / outcome / type
        Added value: +"string"
      • removedInput schema / $defs / VerdictOutcome
        Removed value: -{
        -  "description": "Исход обзорной проверки. Значений ровно два: третьего состояния у проверки нет.",
        -  "enum": [
        -    "passed",
        -    "failed"
        -  ],
        -  "title": "VerdictOutcome",
        -  "type": "string"
        -}
      • changedInput schema / properties / entries / description
        Previous value: -"Записи, которые подшиваются перед вердиктами: обычно `artifact` с указателями на результат"New value: +"Entries without payload filed before the verdicts, such as `artifact` pointers to the result"
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / summary / description
        Previous value: -"Сводка, которой задача закрывается. Подшивается последней, после присланных записей и вердиктов, поэтому в описи она стоит ниже их и говорит об их исходе"New value: +"The summary the task closes with, filed last and reporting the outcome of the entries and verdicts before it: the first line of `done` states how the task ended, `remaining` is `nothing` or the key of the task the rest went to, `next_step` is `no steps` or that key"
      • changedInput schema / properties / verdicts / description
        Previous value: -"Вердикты, которые подшиваются этим же вызовом. Список может быть пуст: вердикты, подшитые раньше по ходу работы, засчитываются наравне, а требование «положительный последний вердикт по каждой проверке» проверяет сам переход"New value: +"Verdicts filed by this call. The list may be empty: verdicts filed earlier in the current pass count equally. A refused call files none of them, so a `failed` verdict sent here leaves no trace in the case, unlike one filed with `add_verdict`"
      • changedOutput schema / $defs / AppendedEntryView / description
        Previous value: -"Ответ подшивающего инструмента: чем запись адресуют, без самой записи.\n\n`title` непуст только там, где заголовок собрал трекер: у сводки, ответа, вердикта и\nрезолюции его не принимают вовсе (`app/domain/case.py`, `TITLED_ENTRY_TYPES`). Где\nзаголовок прислал агент, здесь стоит `null` — «в описи ровно то, что ты прислал»."New value: +"A filed entry, by its address rather than its content; the entry in full is\nreturned by `read_entries`."
      • addedOutput schema / $defs / AppendedEntryView / properties / no / description
        Added value: +"Entry number in the task's case; with the key it forms `TRK-42#12`"
      • addedOutput schema / $defs / AppendedEntryView / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / $defs / AppendedEntryView / properties / title / description
        Added value: +"The title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title"
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • removedOutput schema / $defs / TaskStatus
        Removed value: -{
        -  "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -  "enum": [
        -    "backlog",
        -    "open",
        -    "in_progress",
        -    "waiting",
        -    "done",
        -    "cancelled"
        -  ],
        -  "title": "TaskStatus",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Ответ закрытия: чем стала задача и чем это подшито, без карточки и без записей.\n\nЭлемент списка — то же `AppendedEntryView`, каким отвечает подшивающий инструмент,\nпоэтому ключ задачи повторяется в каждом: восьмое представление ради двадцати\nсэкономленных байт развело бы две формы одной и той же записи, которые разойдутся\nпри первой правке.\n\nПоле, добавленное сюда позже, обязано иметь значение по умолчанию: ответ создающего\nинструмента живёт сутки в ключах идемпотентности, и вчерашнее тело без нового поля\nне поднимется (`docs/notes/mcp.md`, «Сузить форму ответа создающего инструмента\nможно, расширить — нельзя»)."New value: +"Closed task: key, new status and version, and every entry the call filed."
      • addedOutput schema / properties / entries / description
        Added value: +"Filed entries in filing order, ending with `status_changed`"
      • removedOutput schema / properties / status / $ref
        Removed value: -"#/$defs/TaskStatus"
      • addedOutput schema / properties / status / description
        Added value: +"Task status"
      • addedOutput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • addedOutput schema / properties / status / type
        Added value: +"string"
    • Addedcreate_project
    • Removedcreate_queue
    • Changedcreate_task34 fields changed
      • removedInput schema / $defs / TaskPriority
        Removed value: -{
        -  "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.",
        -  "enum": [
        -    "low",
        -    "normal",
        -    "high",
        -    "critical"
        -  ],
        -  "title": "TaskPriority",
        -  "type": "string"
        -}
      • changedInput schema / $defs / TaskSections / description
        Previous value: -"Пять разделов задачи. Правятся только в `backlog`, дальше неизменяемы."New value: +"The five task sections; they are editable only while the task is in `backlog`."
      • changedInput schema / $defs / TaskSections / properties / checks / description
        Previous value: -"Обзорные проверки по порядку, нумерация с 1: что запустить и что должно получиться"New value: +"Review checks in order, numbered from 1; each names what is run and the expected result"
      • removedInput schema / $defs / TaskSections / properties / checks / examples
        Removed value: -[
        -  [
        -    "docker compose run --rm test: весь набор зелёный"
        -  ]
        -]
      • changedInput schema / $defs / TaskSections / properties / constraints / description
        Previous value: -"Чего не делать, что не входит, чего нельзя менять"New value: +"What is out of scope and what stays unchanged"
      • changedInput schema / $defs / TaskSections / properties / context / description
        Previous value: -"Что уже есть, на что опираться, какие заметки читать"New value: +"What already exists and what the work relies on"
      • changedInput schema / $defs / TaskSections / properties / goal / description
        Previous value: -"Зачем задача нужна и что изменится"New value: +"Why the task exists and what will change"
      • changedInput schema / $defs / TaskSections / properties / output / description
        Previous value: -"Что должно существовать по завершении"New value: +"What exists once the task is done"
      • changedInput schema / properties / assignee / description
        Previous value: -"Имя участника или метка временного агента. Трекер сам его не ставит и не снимает; в `in_progress` задачу переводит только тот, чья подпись с ним совпадает"New value: +"Participant name or temporary agent label. The tracker never sets or clears it by itself; only a caller whose signature matches it moves the task into `in_progress`"
      • removedInput schema / properties / assignee / examples
        Removed value: -[
        -  "release_bot"
        -]
      • changedInput schema / properties / description / description
        Previous value: -"Описание задачи: что случилось и почему это задача"New value: +"What happened and why it is a task. For a continuation of a closed task it names the task the work grew from; the lineage itself is a `relates` link"
      • removedInput schema / properties / description / examples
        Removed value: -[
        -  "Ключ выдаётся до валидации и сгорает на неудачном запросе"
        -]
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / parent / description
        Previous value: -"Ключ родительской задачи. Ребёнок рождается со ссылкой на родителя; родитель не закроется — ни в `done`, ни в `cancelled`, — пока дети не закрыты. Закрытую задачу родителем назначить нельзя"New value: +"Key of the parent task: the new task is born as its child. A closed parent is refused with `task_closed`. The parent is not closed — neither `done` nor `cancelled` — while any of its children is open"
      • removedInput schema / properties / priority / $ref
        Removed value: -"#/$defs/TaskPriority"
      • changedInput schema / properties / priority / description
        Previous value: -"Приоритет задачи"New value: +"Task priority"
      • addedInput schema / properties / priority / enum
        Added value: +[
        +  "low",
        +  "normal",
        +  "high",
        +  "critical"
        +]
      • removedInput schema / properties / priority / examples
        Removed value: -[
        -  "normal"
        -]
      • addedInput schema / properties / priority / type
        Added value: +"string"
      • addedInput schema / properties / project
        Added value: +{
        +  "description": "Project key, case-insensitive. An unknown key is refused with `project_not_found`",
        +  "examples": [
        +    "TRK"
        +  ],
        +  "title": "Project",
        +  "type": "string"
        +}
      • removedInput schema / properties / queue
        Removed value: -{
        -  "description": "Ключ очереди, например `TRK`. Регистр не важен",
        -  "examples": [
        -    "TRK"
        -  ],
        -  "title": "Queue",
        -  "type": "string"
        -}
      • changedInput schema / properties / sections / description
        Previous value: -"Пять разделов задачи. Без четырёх непустых разделов и хотя бы одной проверки задача не откроется; дописать их можно, пока она в `backlog`"New value: +"The five sections. The task moves from `backlog` to `open` only with four non-empty text sections and at least one check (`task_sections_incomplete` otherwise); until then they can be completed with `update_task`"
      • changedInput schema / properties / title / description
        Previous value: -"Название задачи одной строкой"New value: +"Task title, one line"
      • removedInput schema / properties / title / examples
        Removed value: -[
        -  "Починить выдачу ключей задач"
        -]
      • changedInput schema / required
        Previous value: -[
        -  "queue",
        -  "title",
        -  "description"
        -]New value: +[
        +  "project",
        +  "title",
        +  "description"
        +]
      • removedOutput schema / $defs
        Removed value: -{
        -  "TaskStatus": {
        -    "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -    "enum": [
        -      "backlog",
        -      "open",
        -      "in_progress",
        -      "waiting",
        -      "done",
        -      "cancelled"
        -    ],
        -    "title": "TaskStatus",
        -    "type": "string"
        -  }
        -}
      • changedOutput schema / description
        Previous value: -"Ответ изменяющего инструмента: что стало и чем это подшито, без карточки."New value: +"Task state after the call and the entries it filed; the card in full is returned\nby `get_task`."
      • addedOutput schema / properties / entries / description
        Added value: +"Numbers of the entries filed in this task's case, in filing order. Empty when the sent values were already in place; the version then stays the same"
      • addedOutput schema / properties / parent_entry
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Number of the `link_added` entry filed into the parent task's own case when `create_task` was given `parent`. `null` when no `parent` was given, and always `null` for `transition` and `update_task`: they touch no other task's case.",
        +  "title": "Parent Entry"
        +}
      • removedOutput schema / properties / status / $ref
        Removed value: -"#/$defs/TaskStatus"
      • addedOutput schema / properties / status / description
        Added value: +"Task status"
      • addedOutput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • addedOutput schema / properties / status / type
        Added value: +"string"
      • addedOutput schema / properties / version / description
        Added value: +"Task version after the call"
    • Addedget_project
    • Removedget_queue
    • Changedget_task92 fields changed
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedOutput schema / $defs / AnswerFactsView / description
        Previous value: -"Ответ: на какой вопрос той же задачи."New value: +"Answer: the question of the same task it answers."
      • changedOutput schema / $defs / AssigneeChangedFactsView / description
        Previous value: -"Смена исполнителя: оба имени."New value: +"Assignee change: both names."
      • addedOutput schema / $defs / AttributeFactsView
        Added value: +{
        +  "description": "Project attribute created, changed or removed: its name.",
        +  "properties": {
        +    "name": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "Name"
        +    },
        +    "type": {
        +      "enum": [
        +        "attribute_created",
        +        "attribute_changed",
        +        "attribute_removed"
        +      ],
        +      "title": "Type",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "type",
        +    "name"
        +  ],
        +  "title": "AttributeFactsView",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • removedOutput schema / $defs / EntryType
        Removed value: -{
        -  "description": "Тип записи дела. Записи агента и человека — до `NOTE`, служебные — после.",
        -  "enum": [
        -    "summary",
        -    "decision",
        -    "attempt",
        -    "finding",
        -    "artifact",
        -    "question",
        -    "answer",
        -    "verdict",
        -    "remark",
        -    "resolution",
        -    "note",
        -    "created",
        -    "status_changed",
        -    "section_changed",
        -    "field_changed",
        -    "assignee_changed",
        -    "link_added",
        -    "link_removed"
        -  ],
        -  "title": "EntryType",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / EntryView / description
        Previous value: -"Запись дела целиком.\n\n`payload` — единственное поле слоя без объявленной формы, и это то же исключение,\nчто и в схеме REST (`docs/notes/api.md`, «`payload` записи дела — исключение из\nтипизации, названное по месту»): нагрузка своя у каждого типа записи, и типизирует\nеё отдельная задача — сразу в обоих интерфейсах, иначе они разойдутся. `JsonValue`,\nа не `Any`: форма свободна, но значение обязано быть представимо в JSON."New value: +"Case entry in full."
      • addedOutput schema / $defs / EntryView / properties / project_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Key of the owning project for an entry of a project's case (`TRK#7`); `null` for a task entry",
        +  "title": "Project Key"
        +}
      • addedOutput schema / $defs / EntryView / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / $defs / EntryView / properties / task_key / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / $defs / EntryView / properties / task_key / description
        Added value: +"Key of the owning task; `null` for an entry of a project's case"
      • removedOutput schema / $defs / EntryView / properties / task_key / type
        Removed value: -"string"
      • removedOutput schema / $defs / EntryView / properties / type / $ref
        Removed value: -"#/$defs/EntryType"
      • addedOutput schema / $defs / EntryView / properties / type / description
        Added value: +"Case entry type. Types up to `note` are written by agents and humans; the types after it are filed by the tracker itself with the change they record"
      • addedOutput schema / $defs / EntryView / properties / type / enum
        Added value: +[
        +  "summary",
        +  "decision",
        +  "attempt",
        +  "finding",
        +  "artifact",
        +  "question",
        +  "answer",
        +  "verdict",
        +  "remark",
        +  "resolution",
        +  "note",
        +  "created",
        +  "status_changed",
        +  "section_changed",
        +  "field_changed",
        +  "assignee_changed",
        +  "link_added",
        +  "link_removed",
        +  "moved",
        +  "attribute_created",
        +  "attribute_changed",
        +  "attribute_removed",
        +  "archived",
        +  "restored"
        +]
      • addedOutput schema / $defs / EntryView / properties / type / type
        Added value: +"string"
      • changedOutput schema / $defs / EntryView / required
        Previous value: -[
        -  "id",
        -  "seq",
        -  "no",
        -  "task_key",
        -  "type",
        -  "author",
        -  "title",
        -  "body",
        -  "payload",
        -  "refs",
        -  "created_at"
        -]New value: +[
        +  "id",
        +  "seq",
        +  "no",
        +  "task_key",
        +  "project_key",
        +  "type",
        +  "author",
        +  "title",
        +  "body",
        +  "payload",
        +  "refs",
        +  "created_at"
        +]
      • addedOutput schema / $defs / FactsView / discriminator / mapping / archived
        Added value: +"#/$defs/NoFactsView"
      • addedOutput schema / $defs / FactsView / discriminator / mapping / attribute_changed
        Added value: +"#/$defs/AttributeFactsView"
      • addedOutput schema / $defs / FactsView / discriminator / mapping / attribute_created
        Added value: +"#/$defs/AttributeFactsView"
      • addedOutput schema / $defs / FactsView / discriminator / mapping / attribute_removed
        Added value: +"#/$defs/AttributeFactsView"
      • addedOutput schema / $defs / FactsView / discriminator / mapping / moved
        Added value: +"#/$defs/MovedFactsView"
      • addedOutput schema / $defs / FactsView / discriminator / mapping / restored
        Added value: +"#/$defs/NoFactsView"
      • changedOutput schema / $defs / FactsView / oneOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/NoFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/StatusChangedFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/SectionChangedFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/FieldChangedFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/AssigneeChangedFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/LinkFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/QuestionFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/AnswerFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/VerdictFactsView"
        -  },
        -  {
        -    "$ref": "#/$defs/ResolutionFactsView"
        -  }
        -]New value: +[
        +  {
        +    "$ref": "#/$defs/NoFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/StatusChangedFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/SectionChangedFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/FieldChangedFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/AssigneeChangedFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/LinkFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/QuestionFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/AnswerFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/VerdictFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/ResolutionFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/AttributeFactsView"
        +  },
        +  {
        +    "$ref": "#/$defs/MovedFactsView"
        +  }
        +]
      • changedOutput schema / $defs / FeaturesView / description
        Previous value: -"Вычисляемые признаки задачи (`CONCEPT.md`, 4.3)."New value: +"Computed task features."
      • changedOutput schema / $defs / FieldChangedFactsView / description
        Previous value: -"Правка обвязки: какое поле."New value: +"Change of a non-section field: which one."
      • changedOutput schema / $defs / FieldChangedFactsView / properties / field / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/TaskField"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Task field",
        +    "enum": [
        +      "title",
        +      "description",
        +      "goal",
        +      "context",
        +      "constraints",
        +      "output",
        +      "checks",
        +      "status",
        +      "assignee",
        +      "priority"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / HeadingView / description
        Previous value: -"Строка описи дела: то, что видно о записи, не читая её тела."New value: +"Line of the case index: what is known of an entry without its body."
      • removedOutput schema / $defs / HeadingView / properties / type / $ref
        Removed value: -"#/$defs/EntryType"
      • addedOutput schema / $defs / HeadingView / properties / type / description
        Added value: +"Case entry type. Types up to `note` are written by agents and humans; the types after it are filed by the tracker itself with the change they record"
      • addedOutput schema / $defs / HeadingView / properties / type / enum
        Added value: +[
        +  "summary",
        +  "decision",
        +  "attempt",
        +  "finding",
        +  "artifact",
        +  "question",
        +  "answer",
        +  "verdict",
        +  "remark",
        +  "resolution",
        +  "note",
        +  "created",
        +  "status_changed",
        +  "section_changed",
        +  "field_changed",
        +  "assignee_changed",
        +  "link_added",
        +  "link_removed",
        +  "moved",
        +  "attribute_created",
        +  "attribute_changed",
        +  "attribute_removed",
        +  "archived",
        +  "restored"
        +]
      • addedOutput schema / $defs / HeadingView / properties / type / type
        Added value: +"string"
      • changedOutput schema / $defs / LinkFactsView / description
        Previous value: -"Связь появилась или снята: её вид и вторая сторона."New value: +"Link added or removed: its kind and the other side."
      • changedOutput schema / $defs / LinkFactsView / properties / link_kind / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/LinkKind"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Link kind, named by the role of the task the link is shown for",
        +    "enum": [
        +      "parent",
        +      "child",
        +      "blocks",
        +      "blocked_by",
        +      "relates"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / $defs / LinkKind
        Removed value: -{
        -  "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.",
        -  "enum": [
        -    "parent",
        -    "child",
        -    "blocks",
        -    "blocked_by",
        -    "relates"
        -  ],
        -  "title": "LinkKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / LinkOtherView / description
        Previous value: -"Задача на другом конце связи."New value: +"Task on the other side of a link."
      • removedOutput schema / $defs / LinkOtherView / properties / status / $ref
        Removed value: -"#/$defs/TaskStatus"
      • addedOutput schema / $defs / LinkOtherView / properties / status / description
        Added value: +"Task status"
      • addedOutput schema / $defs / LinkOtherView / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • addedOutput schema / $defs / LinkOtherView / properties / status / type
        Added value: +"string"
      • changedOutput schema / $defs / LinkView / description
        Previous value: -"Связь со стороны своей задачи: вид назван ролью **этой** задачи."New value: +"Link seen from this task: `kind` is the role of this task."
      • removedOutput schema / $defs / LinkView / properties / kind / $ref
        Removed value: -"#/$defs/LinkKind"
      • addedOutput schema / $defs / LinkView / properties / kind / description
        Added value: +"Link kind, named by the role of the task the link is shown for"
      • addedOutput schema / $defs / LinkView / properties / kind / enum
        Added value: +[
        +  "parent",
        +  "child",
        +  "blocks",
        +  "blocked_by",
        +  "relates"
        +]
      • addedOutput schema / $defs / LinkView / properties / kind / type
        Added value: +"string"
      • addedOutput schema / $defs / MovedFactsView
        Added value: +{
        +  "description": "Task moved to another project: the key it left and the key it got.",
        +  "properties": {
        +    "from_key": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "From Key"
        +    },
        +    "to_key": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "title": "To Key"
        +    },
        +    "type": {
        +      "const": "moved",
        +      "title": "Type",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "type",
        +    "from_key",
        +    "to_key"
        +  ],
        +  "title": "MovedFactsView",
        +  "type": "object"
        +}
      • changedOutput schema / $defs / NoFactsView / description
        Previous value: -"Фактов нет: заголовок записи пишет её автор."New value: +"No facts: the author writes the entry title."
      • changedOutput schema / $defs / NoFactsView / properties / type / enum
        Previous value: -[
        -  "summary",
        -  "decision",
        -  "attempt",
        -  "finding",
        -  "artifact",
        -  "remark",
        -  "note",
        -  "created"
        -]New value: +[
        +  "summary",
        +  "decision",
        +  "attempt",
        +  "finding",
        +  "artifact",
        +  "remark",
        +  "note",
        +  "created",
        +  "archived",
        +  "restored"
        +]
      • changedOutput schema / $defs / QuestionFactsView / description
        Previous value: -"Вопрос: кому адресован и держит ли работу."New value: +"Question: addressees and whether it blocks the work."
      • removedOutput schema / $defs / QueueRefView
        Removed value: -{
        -  "description": "Очередь одной строкой: ключ и название.",
        -  "properties": {
        -    "key": {
        -      "title": "Key",
        -      "type": "string"
        -    },
        -    "title": {
        -      "title": "Title",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "key",
        -    "title"
        -  ],
        -  "title": "QueueRefView",
        -  "type": "object"
        -}
      • removedOutput schema / $defs / RemarkOutcome
        Removed value: -{
        -  "description": "Чем разобрано замечание (`CONCEPT.md`, 3.4).\n\nСписок закрыт и покрывает все четыре судьбы претензии: поправили сразу, приняли в\nработу отдельной задачей, не поняли и ждём уточнения, менять не будем. Свободного\n«прочее» здесь нет намеренно — оно снова сделало бы исход текстом.",
        -  "enum": [
        -    "fixed",
        -    "accepted",
        -    "needs_detail",
        -    "declined"
        -  ],
        -  "title": "RemarkOutcome",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / ResolutionFactsView / description
        Previous value: -"Резолюция: какое замечание разобрано, чем и куда ушла работа."New value: +"Resolution: which remark, its outcome and the continuation task."
      • changedOutput schema / $defs / ResolutionFactsView / properties / outcome / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/RemarkOutcome"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "How a remark was resolved",
        +    "enum": [
        +      "fixed",
        +      "accepted",
        +      "needs_detail",
        +      "declined"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / SectionChangedFactsView / description
        Previous value: -"Правка задания: какой раздел, и какая проверка при точечной правке."New value: +"Section change: which field, and which check for a single-check edit."
      • changedOutput schema / $defs / SectionChangedFactsView / properties / field / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/TaskField"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Task field",
        +    "enum": [
        +      "title",
        +      "description",
        +      "goal",
        +      "context",
        +      "constraints",
        +      "output",
        +      "checks",
        +      "status",
        +      "assignee",
        +      "priority"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / StatusChangedFactsView / description
        Previous value: -"Переход статуса: оба конца и был ли назван повод."New value: +"Status change: both ends and whether a reason was given."
      • changedOutput schema / $defs / StatusChangedFactsView / properties / from_status / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/TaskStatus"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Task status",
        +    "enum": [
        +      "backlog",
        +      "open",
        +      "in_progress",
        +      "waiting",
        +      "done",
        +      "cancelled"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / StatusChangedFactsView / properties / to_status / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/TaskStatus"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Task status",
        +    "enum": [
        +      "backlog",
        +      "open",
        +      "in_progress",
        +      "waiting",
        +      "done",
        +      "cancelled"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / $defs / TaskField
        Removed value: -{
        -  "description": "Поле задачи в записи об изменении и в правилах редактирования.\n\nЗначения совпадают с именами полей в API: по ним строится `details.fields` ошибки и\n`payload.field` записи `section_changed`, и читающий видит то же имя, что в схеме.",
        -  "enum": [
        -    "title",
        -    "description",
        -    "goal",
        -    "context",
        -    "constraints",
        -    "output",
        -    "checks",
        -    "status",
        -    "assignee",
        -    "priority"
        -  ],
        -  "title": "TaskField",
        -  "type": "string"
        -}
      • removedOutput schema / $defs / TaskPriority
        Removed value: -{
        -  "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.",
        -  "enum": [
        -    "low",
        -    "normal",
        -    "high",
        -    "critical"
        -  ],
        -  "title": "TaskPriority",
        -  "type": "string"
        -}
      • addedOutput schema / $defs / TaskProjectView
        Added value: +{
        +  "description": "Project of the task: key, title, its short description and archive time.",
        +  "properties": {
        +    "archived_at": {
        +      "anyOf": [
        +        {
        +          "format": "date-time",
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "When the project was archived; `null` while it is active",
        +      "title": "Archived At"
        +    },
        +    "description": {
        +      "description": "Short \"what this is\" of the project, up to 320 characters; may be empty. Attributes and the project's case are returned by `get_project`",
        +      "title": "Description",
        +      "type": "string"
        +    },
        +    "key": {
        +      "title": "Key",
        +      "type": "string"
        +    },
        +    "title": {
        +      "title": "Title",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "key",
        +    "title",
        +    "description",
        +    "archived_at"
        +  ],
        +  "title": "TaskProjectView",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / TaskStatus
        Removed value: -{
        -  "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -  "enum": [
        -    "backlog",
        -    "open",
        -    "in_progress",
        -    "waiting",
        -    "done",
        -    "cancelled"
        -  ],
        -  "title": "TaskStatus",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / TaskView / description
        Previous value: -"Карточка задачи — тот же набор полей, что у `TaskRead` в REST."New value: +"Task card."
      • addedOutput schema / $defs / TaskView / properties / key / description
        Added value: +"Current key; changes only when the task moves to another project with `move_task`"
      • addedOutput schema / $defs / TaskView / properties / previous_keys
        Added value: +{
        +  "description": "Keys the task had before moves, in the order they were left; empty for a task never moved. Each one is accepted wherever a task key is",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Previous Keys",
        +  "type": "array"
        +}
      • removedOutput schema / $defs / TaskView / properties / priority / $ref
        Removed value: -"#/$defs/TaskPriority"
      • addedOutput schema / $defs / TaskView / properties / priority / description
        Added value: +"Task priority, from lowest to highest"
      • addedOutput schema / $defs / TaskView / properties / priority / enum
        Added value: +[
        +  "low",
        +  "normal",
        +  "high",
        +  "critical"
        +]
      • addedOutput schema / $defs / TaskView / properties / priority / type
        Added value: +"string"
      • addedOutput schema / $defs / TaskView / properties / project
        Added value: +{
        +  "$ref": "#/$defs/TaskProjectView"
        +}
      • removedOutput schema / $defs / TaskView / properties / queue
        Removed value: -{
        -  "$ref": "#/$defs/QueueRefView"
        -}
      • removedOutput schema / $defs / TaskView / properties / status / $ref
        Removed value: -"#/$defs/TaskStatus"
      • addedOutput schema / $defs / TaskView / properties / status / description
        Added value: +"Task status"
      • addedOutput schema / $defs / TaskView / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • addedOutput schema / $defs / TaskView / properties / status / type
        Added value: +"string"
      • changedOutput schema / $defs / TaskView / required
        Previous value: -[
        -  "id",
        -  "key",
        -  "queue",
        -  "title",
        -  "description",
        -  "goal",
        -  "context",
        -  "constraints",
        -  "output",
        -  "checks",
        -  "status",
        -  "assignee",
        -  "priority",
        -  "version",
        -  "created_by",
        -  "created_at",
        -  "updated_at"
        -]New value: +[
        +  "id",
        +  "key",
        +  "previous_keys",
        +  "project",
        +  "title",
        +  "description",
        +  "goal",
        +  "context",
        +  "constraints",
        +  "output",
        +  "checks",
        +  "status",
        +  "assignee",
        +  "priority",
        +  "version",
        +  "created_by",
        +  "created_at",
        +  "updated_at"
        +]
      • changedOutput schema / $defs / VerdictFactsView / description
        Previous value: -"Вердикт: какая проверка, чем кончилась и не переписали ли её после."New value: +"Verdict: which check, its outcome and whether the check was rewritten since."
      • changedOutput schema / $defs / VerdictFactsView / properties / outcome / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/VerdictOutcome"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Outcome of a review check",
        +    "enum": [
        +      "passed",
        +      "failed"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / $defs / VerdictOutcome
        Removed value: -{
        -  "description": "Исход обзорной проверки. Значений ровно два: третьего состояния у проверки нет.",
        -  "enum": [
        -    "passed",
        -    "failed"
        -  ],
        -  "title": "VerdictOutcome",
        -  "type": "string"
        -}
      • changedOutput schema / description
        Previous value: -"Пакет преемника: всё, что нужно агенту с чистым контекстом, одним вызовом."New value: +"Everything about one task: card, parent and children, links, features, latest\nsummary, open questions, unresolved remarks, transition targets and case index."
      • addedOutput schema / properties / children
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/LinkOtherView"
        +  },
        +  "title": "Children",
        +  "type": "array"
        +}
      • addedOutput schema / properties / parent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/LinkOtherView"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • removedOutput schema / properties / transitions / items / $ref
        Removed value: -"#/$defs/TaskStatus"
      • addedOutput schema / properties / transitions / items / description
        Added value: +"Task status"
      • addedOutput schema / properties / transitions / items / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • addedOutput schema / properties / transitions / items / type
        Added value: +"string"
      • changedOutput schema / required
        Previous value: -[
        -  "task",
        -  "links",
        -  "features",
        -  "summary",
        -  "questions",
        -  "remarks",
        -  "transitions",
        -  "index"
        -]New value: +[
        +  "task",
        +  "parent",
        +  "children",
        +  "links",
        +  "features",
        +  "summary",
        +  "questions",
        +  "remarks",
        +  "transitions",
        +  "index"
        +]
    • Changedlink20 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "LinkKind": {
        -    "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.",
        -    "enum": [
        -      "parent",
        -      "child",
        -      "blocks",
        -      "blocked_by",
        -      "relates"
        -    ],
        -    "title": "LinkKind",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • removedInput schema / properties / kind / $ref
        Removed value: -"#/$defs/LinkKind"
      • changedInput schema / properties / kind / description
        Previous value: -"Кем приходится задача из `key` задаче из `other`, а не наоборот: `link(key='TRK-1', kind='blocks', other='TRK-7')` — это «TRK-1 блокирует TRK-7». В карточке TRK-7 та же связь показана как `blocked_by TRK-1`"New value: +"Role of the task `key` toward the task `other`: `link(key='TRK-1', kind='blocks', other='TRK-7')` means TRK-1 blocks TRK-7, and the card of TRK-7 shows the same link as `blocked_by`"
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "parent",
        +  "child",
        +  "blocks",
        +  "blocked_by",
        +  "relates"
        +]
      • removedInput schema / properties / kind / examples
        Removed value: -[
        -  "blocked_by"
        -]
      • addedInput schema / properties / kind / type
        Added value: +"string"
      • changedInput schema / properties / other / description
        Previous value: -"Ключ задачи на другой стороне связи"New value: +"Key of the task on the other side of the link"
      • removedOutput schema / $defs
        Removed value: -{
        -  "AuthorKind": {
        -    "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -    "enum": [
        -      "agent",
        -      "human",
        -      "tracker"
        -    ],
        -    "title": "AuthorKind",
        -    "type": "string"
        -  },
        -  "AuthorView": {
        -    "description": "Кто сделал действие: род и подпись. У самого трекера подписи нет.",
        -    "properties": {
        -      "kind": {
        -        "$ref": "#/$defs/AuthorKind"
        -      },
        -      "signature": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "title": "Signature"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "signature"
        -    ],
        -    "title": "AuthorView",
        -    "type": "object"
        -  },
        -  "LinkKind": {
        -    "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.",
        -    "enum": [
        -      "parent",
        -      "child",
        -      "blocks",
        -      "blocked_by",
        -      "relates"
        -    ],
        -    "title": "LinkKind",
        -    "type": "string"
        -  },
        -  "LinkOtherView": {
        -    "description": "Задача на другом конце связи.",
        -    "properties": {
        -      "key": {
        -        "title": "Key",
        -        "type": "string"
        -      },
        -      "status": {
        -        "$ref": "#/$defs/TaskStatus"
        -      },
        -      "title": {
        -        "title": "Title",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "key",
        -      "title",
        -      "status"
        -    ],
        -    "title": "LinkOtherView",
        -    "type": "object"
        -  },
        -  "TaskStatus": {
        -    "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -    "enum": [
        -      "backlog",
        -      "open",
        -      "in_progress",
        -      "waiting",
        -      "done",
        -      "cancelled"
        -    ],
        -    "title": "TaskStatus",
        -    "type": "string"
        -  }
        -}
      • changedOutput schema / description
        Previous value: -"Связь со стороны своей задачи: вид назван ролью **этой** задачи."New value: +"Entries filed by `link` or `unlink` on both sides of the link."
      • removedOutput schema / properties / author
        Removed value: -{
        -  "$ref": "#/$defs/AuthorView"
        -}
      • removedOutput schema / properties / created_at
        Removed value: -{
        -  "format": "date-time",
        -  "title": "Created At",
        -  "type": "string"
        -}
      • addedOutput schema / properties / entry
        Added value: +{
        +  "description": "Number of the `link_added` or `link_removed` entry in the case of `key`",
        +  "title": "Entry",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / key
        Added value: +{
        +  "title": "Key",
        +  "type": "string"
        +}
      • removedOutput schema / properties / kind
        Removed value: -{
        -  "$ref": "#/$defs/LinkKind"
        -}
      • removedOutput schema / properties / other
        Removed value: -{
        -  "$ref": "#/$defs/LinkOtherView"
        -}
      • addedOutput schema / properties / other_entry
        Added value: +{
        +  "description": "Number of the same entry in the case of `other`",
        +  "title": "Other Entry",
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "kind",
        -  "other",
        -  "author",
        -  "created_at"
        -]New value: +[
        +  "key",
        +  "entry",
        +  "other_entry"
        +]
      • changedOutput schema / title
        Previous value: -"LinkView"New value: +"LinkFilingView"
    • Changedlist_participants10 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page"
      • changedInput schema / properties / limit / description
        Previous value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size"
      • removedInput schema / properties / limit / examples
        Removed value: -[
        -  25
        -]
      • removedOutput schema / $defs / ParticipantKind
        Removed value: -{
        -  "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.",
        -  "enum": [
        -    "human",
        -    "agent"
        -  ],
        -  "title": "ParticipantKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / ParticipantView / description
        Previous value: -"Участник реестра: кому можно адресовать вопрос и что о нём известно."New value: +"Registry participant: a possible addressee of a question."
      • removedOutput schema / $defs / ParticipantView / properties / kind / $ref
        Removed value: -"#/$defs/ParticipantKind"
      • addedOutput schema / $defs / ParticipantView / properties / kind / description
        Added value: +"Kind of participant. It grants no rights: participants of either kind can make any entry and any transition"
      • addedOutput schema / $defs / ParticipantView / properties / kind / enum
        Added value: +[
        +  "human",
        +  "agent"
        +]
      • addedOutput schema / $defs / ParticipantView / properties / kind / type
        Added value: +"string"
      • addedOutput schema / properties / next_cursor / description
        Added value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
    • Addedlist_projects
    • Removedlist_queues
    • Addedmove_task
    • Changedread_entries31 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "EntryType": {
        -    "description": "Тип записи дела. Записи агента и человека — до `NOTE`, служебные — после.",
        -    "enum": [
        -      "summary",
        -      "decision",
        -      "attempt",
        -      "finding",
        -      "artifact",
        -      "question",
        -      "answer",
        -      "verdict",
        -      "remark",
        -      "resolution",
        -      "note",
        -      "created",
        -      "status_changed",
        -      "section_changed",
        -      "field_changed",
        -      "assignee_changed",
        -      "link_added",
        -      "link_removed"
        -    ],
        -    "title": "EntryType",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / after_no / description
        Previous value: -"Только записи после этого номера — что случилось с тех пор"New value: +"Only entries filed after the entry with this number"
      • removedInput schema / properties / after_no / examples
        Removed value: -[
        -  12
        -]
      • changedInput schema / properties / cursor / description
        Previous value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / limit / description
        Previous value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size"
      • removedInput schema / properties / limit / examples
        Removed value: -[
        -  25
        -]
      • changedInput schema / properties / nos / description
        Previous value: -"Только эти номера записей"New value: +"Only entries with these numbers"
      • removedInput schema / properties / nos / examples
        Removed value: -[
        -  [
        -    3,
        -    12
        -  ]
        -]
      • changedInput schema / properties / types / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "$ref": "#/$defs/EntryType"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "description": "Case entry type. Types up to `note` are written by agents and humans; the types after it are filed by the tracker itself with the change they record",
        +      "enum": [
        +        "summary",
        +        "decision",
        +        "attempt",
        +        "finding",
        +        "artifact",
        +        "question",
        +        "answer",
        +        "verdict",
        +        "remark",
        +        "resolution",
        +        "note",
        +        "created",
        +        "status_changed",
        +        "section_changed",
        +        "field_changed",
        +        "assignee_changed",
        +        "link_added",
        +        "link_removed",
        +        "moved",
        +        "attribute_created",
        +        "attribute_changed",
        +        "attribute_removed",
        +        "archived",
        +        "restored"
        +      ],
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / types / description
        Previous value: -"Только записи этих типов"New value: +"Only entries of these types"
      • removedInput schema / properties / types / examples
        Removed value: -[
        -  [
        -    "decision",
        -    "attempt"
        -  ]
        -]
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • removedOutput schema / $defs / EntryType
        Removed value: -{
        -  "description": "Тип записи дела. Записи агента и человека — до `NOTE`, служебные — после.",
        -  "enum": [
        -    "summary",
        -    "decision",
        -    "attempt",
        -    "finding",
        -    "artifact",
        -    "question",
        -    "answer",
        -    "verdict",
        -    "remark",
        -    "resolution",
        -    "note",
        -    "created",
        -    "status_changed",
        -    "section_changed",
        -    "field_changed",
        -    "assignee_changed",
        -    "link_added",
        -    "link_removed"
        -  ],
        -  "title": "EntryType",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / EntryView / description
        Previous value: -"Запись дела целиком.\n\n`payload` — единственное поле слоя без объявленной формы, и это то же исключение,\nчто и в схеме REST (`docs/notes/api.md`, «`payload` записи дела — исключение из\nтипизации, названное по месту»): нагрузка своя у каждого типа записи, и типизирует\nеё отдельная задача — сразу в обоих интерфейсах, иначе они разойдутся. `JsonValue`,\nа не `Any`: форма свободна, но значение обязано быть представимо в JSON."New value: +"Case entry in full."
      • addedOutput schema / $defs / EntryView / properties / project_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Key of the owning project for an entry of a project's case (`TRK#7`); `null` for a task entry",
        +  "title": "Project Key"
        +}
      • addedOutput schema / $defs / EntryView / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / $defs / EntryView / properties / task_key / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / $defs / EntryView / properties / task_key / description
        Added value: +"Key of the owning task; `null` for an entry of a project's case"
      • removedOutput schema / $defs / EntryView / properties / task_key / type
        Removed value: -"string"
      • removedOutput schema / $defs / EntryView / properties / type / $ref
        Removed value: -"#/$defs/EntryType"
      • addedOutput schema / $defs / EntryView / properties / type / description
        Added value: +"Case entry type. Types up to `note` are written by agents and humans; the types after it are filed by the tracker itself with the change they record"
      • addedOutput schema / $defs / EntryView / properties / type / enum
        Added value: +[
        +  "summary",
        +  "decision",
        +  "attempt",
        +  "finding",
        +  "artifact",
        +  "question",
        +  "answer",
        +  "verdict",
        +  "remark",
        +  "resolution",
        +  "note",
        +  "created",
        +  "status_changed",
        +  "section_changed",
        +  "field_changed",
        +  "assignee_changed",
        +  "link_added",
        +  "link_removed",
        +  "moved",
        +  "attribute_created",
        +  "attribute_changed",
        +  "attribute_removed",
        +  "archived",
        +  "restored"
        +]
      • addedOutput schema / $defs / EntryView / properties / type / type
        Added value: +"string"
      • changedOutput schema / $defs / EntryView / required
        Previous value: -[
        -  "id",
        -  "seq",
        -  "no",
        -  "task_key",
        -  "type",
        -  "author",
        -  "title",
        -  "body",
        -  "payload",
        -  "refs",
        -  "created_at"
        -]New value: +[
        +  "id",
        +  "seq",
        +  "no",
        +  "task_key",
        +  "project_key",
        +  "type",
        +  "author",
        +  "title",
        +  "body",
        +  "payload",
        +  "refs",
        +  "created_at"
        +]
      • addedOutput schema / properties / next_cursor / description
        Added value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
    • Addedread_project_entries
    • Changedregister_participant17 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "ParticipantKind": {
        -    "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.",
        -    "enum": [
        -      "human",
        -      "agent"
        -    ],
        -    "title": "ParticipantKind",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / description / description
        Previous value: -"Кто это. Всё, что читающий дело узнает об авторе записи"New value: +"Who the participant is: all that a reader of a case learns about the author of an entry"
      • removedInput schema / properties / description / examples
        Removed value: -[
        -  "Релизный бот, ведёт задачи выкладки"
        -]
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • removedInput schema / properties / kind / $ref
        Removed value: -"#/$defs/ParticipantKind"
      • changedInput schema / properties / kind / description
        Previous value: -"Человек или постоянный агент"New value: +"Human or permanent agent"
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "human",
        +  "agent"
        +]
      • removedInput schema / properties / kind / examples
        Removed value: -[
        -  "agent"
        -]
      • addedInput schema / properties / kind / type
        Added value: +"string"
      • changedInput schema / properties / name / description
        Previous value: -"Имя участника из реестра. Регистр не важен"New value: +"Name of the new participant: a Latin letter followed by 1–63 Latin letters, digits or `_` (`invalid_participant_name` otherwise). It is stored lower-case and never changes: it signs the participant's entries. A name already taken, in any case, is refused with `participant_name_taken`"
      • removedInput schema / properties / name / examples
        Removed value: -[
        -  "release_bot"
        -]
      • removedOutput schema / $defs
        Removed value: -{
        -  "ParticipantKind": {
        -    "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.",
        -    "enum": [
        -      "human",
        -      "agent"
        -    ],
        -    "title": "ParticipantKind",
        -    "type": "string"
        -  }
        -}
      • changedOutput schema / description
        Previous value: -"Участник реестра: кому можно адресовать вопрос и что о нём известно."New value: +"Participant name in its stored, lower-case form; the registry is returned by\n`list_participants`."
      • removedOutput schema / properties / description
        Removed value: -{
        -  "title": "Description",
        -  "type": "string"
        -}
      • removedOutput schema / properties / kind
        Removed value: -{
        -  "$ref": "#/$defs/ParticipantKind"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "kind",
        -  "name",
        -  "description"
        -]New value: +[
        +  "name"
        +]
      • changedOutput schema / title
        Previous value: -"ParticipantView"New value: +"ParticipantNameView"
    • Addedremove_attribute
    • Changedresolve22 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "RemarkOutcome": {
        -    "description": "Чем разобрано замечание (`CONCEPT.md`, 3.4).\n\nСписок закрыт и покрывает все четыре судьбы претензии: поправили сразу, приняли в\nработу отдельной задачей, не поняли и ждём уточнения, менять не будем. Свободного\n«прочее» здесь нет намеренно — оно снова сделало бы исход текстом.",
        -    "enum": [
        -      "fixed",
        -      "accepted",
        -      "needs_detail",
        -      "declined"
        -    ],
        -    "title": "RemarkOutcome",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / body / description
        Previous value: -"Тело записи в markdown; хранится и отдаётся как есть"New value: +"Entry body in markdown, stored and returned as is. It holds what a successor needs to continue; file contents and long outputs stay outside it, represented by a pointer and the gist"
      • changedInput schema / properties / idempotency_key / description
        Previous value: -"Ключ повтора, который ты придумываешь сам (обычно UUID). Повтор вызова с тем же ключом и теми же аргументами отвечает первым результатом и второго объекта не заводит; тот же ключ с другими аргументами отклоняется. Ключ живёт в паре с твоим токеном и помнится 24 часа"New value: +"Retry key chosen by the caller, e.g. a UUID. A repeat with the same key and the same arguments returns the first result and creates nothing; the same key with other arguments is refused with `idempotency_key_reused`. A key is bound to the caller's token and kept for 24 hours"
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • removedInput schema / properties / outcome / $ref
        Removed value: -"#/$defs/RemarkOutcome"
      • changedInput schema / properties / outcome / description
        Previous value: -"Чем разобрано замечание: `fixed` — поправлено сразу, `accepted` — принято в работу отдельной задачей (тогда обязателен `task`), `needs_detail` — нужно уточнение, `declined` — менять не будем, причина в теле"New value: +"How the remark is resolved, and what the body holds:\n- `fixed` — corrected at once; the body states what changed;\n- `accepted` — taken into work as a separate task named in `task`;\n- `needs_detail` — the remark needs clarification; the body holds the concrete question;\n- `declined` — nothing will change; the body gives the reason"
      • addedInput schema / properties / outcome / enum
        Added value: +[
        +  "fixed",
        +  "accepted",
        +  "needs_detail",
        +  "declined"
        +]
      • removedInput schema / properties / outcome / examples
        Removed value: -[
        -  "accepted"
        -]
      • addedInput schema / properties / outcome / type
        Added value: +"string"
      • changedInput schema / properties / remark_no / description
        Previous value: -"Номер записи `remark` в этой же задаче"New value: +"Number of the `remark` entry in the same task; any other number is refused with `entry_fields_invalid`"
      • removedInput schema / properties / remark_no / examples
        Removed value: -[
        -  7
        -]
      • changedInput schema / properties / task / description
        Previous value: -"Ключ задачи, в которую ушла работа. Только с исходом `accepted` и там обязателен: «приняли» без адреса это обещание без ссылки"New value: +"Key of the task the work went to. Required with `accepted` and refused with any other outcome, both as `entry_fields_invalid`"
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • changedOutput schema / description
        Previous value: -"Ответ подшивающего инструмента: чем запись адресуют, без самой записи.\n\n`title` непуст только там, где заголовок собрал трекер: у сводки, ответа, вердикта и\nрезолюции его не принимают вовсе (`app/domain/case.py`, `TITLED_ENTRY_TYPES`). Где\nзаголовок прислал агент, здесь стоит `null` — «в описи ровно то, что ты прислал»."New value: +"A filed entry, by its address rather than its content; the entry in full is\nreturned by `read_entries`."
      • addedOutput schema / properties / no / description
        Added value: +"Entry number in the task's case; with the key it forms `TRK-42#12`"
      • addedOutput schema / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / properties / title / description
        Added value: +"The title the tracker built, for entry types whose title is not sent (summary, answer, verdict, resolution, service entries); `null` when the caller sent the title"
    • Addedrestore_project
    • Changedsearch_tasks49 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "TaskPriority": {
        -    "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.",
        -    "enum": [
        -      "low",
        -      "normal",
        -      "high",
        -      "critical"
        -    ],
        -    "title": "TaskPriority",
        -    "type": "string"
        -  },
        -  "TaskStatus": {
        -    "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -    "enum": [
        -      "backlog",
        -      "open",
        -      "in_progress",
        -      "waiting",
        -      "done",
        -      "cancelled"
        -    ],
        -    "title": "TaskStatus",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / assignee / description
        Previous value: -"Исполнители, точным совпадением; `empty()` находит задачи без исполнителя"New value: +"Assignee names, exact match; `empty()` matches tasks without an assignee. A name covers every session signed with it: no value selects the tasks of one session"
      • removedInput schema / properties / assignee / examples
        Removed value: -[
        -  [
        -    "release_bot"
        -  ]
        -]
      • changedInput schema / properties / blocked / description
        Previous value: -"Есть ли у задачи `blocked_by` на задачу не в `done` и не в `cancelled`. Вход в `in_progress` при `true` отклоняется"New value: +"Whether the task has `blocked_by` on a task that is neither `done` nor `cancelled`"
      • changedInput schema / properties / cursor / description
        Previous value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page"
      • changedInput schema / properties / fields / default
        Previous value: -[
        -  "key",
        -  "title",
        -  "status",
        -  "assignee",
        -  "priority",
        -  "features",
        -  "parents"
        -]New value: +[
        +  "key",
        +  "title",
        +  "status",
        +  "assignee",
        +  "priority",
        +  "features",
        +  "parent"
        +]
      • changedInput schema / properties / fields / description
        Previous value: -"Какие поля вернуть: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parents`, `priority`, `queue`, `status`, `title`, `updated_at`, `version`. Ключ приходит всегда, пустой список означает «задачу целиком»: разделы длинные. `features` приносит вычисляемые признаки строки: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `last_summary_at`, `last_entry_at`. `parents` — прямые родители: ключ и название"New value: +"Fields to return: `assignee`, `checks`, `constraints`, `context`, `created_at`, `created_by`, `description`, `features`, `goal`, `id`, `key`, `output`, `parent`, `previous_keys`, `priority`, `project`, `status`, `title`, `updated_at`, `version`. The key always comes back; an empty list returns whole tasks. `features` brings the computed features: `blocked`, `open_questions`, `open_blocking_questions`, `open_remarks`, `last_summary_at`, `last_entry_at`. `parent` is the parent's key and title, or `null`"
      • changedInput schema / properties / key / description
        Previous value: -"Ключи задач: спросить про несколько названных разом, а не по вызову на каждую. Несуществующий ключ отвечает отказом, а не пустой выдачей"New value: +"Task keys: several named tasks in one call. An unknown key is refused with `search_value_invalid`, `reason: task_not_found`, rather than left out"
      • changedInput schema / properties / limit / description
        Previous value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size"
      • removedInput schema / properties / limit / examples
        Removed value: -[
        -  25
        -]
      • changedInput schema / properties / open_blocking_questions / description
        Previous value: -"Из них помеченных `blocking`; `0` означает «ничто не мешает»"New value: +"Exact number of unanswered `blocking` questions; `0` means none blocks"
      • changedInput schema / properties / open_questions / description
        Previous value: -"Ровно столько вопросов без ответа. Для диапазонов есть язык запросов"New value: +"Exact number of unanswered questions; ranges go in `query`"
      • changedInput schema / properties / open_remarks / description
        Previous value: -"Ровно столько замечаний без резолюции. Для диапазонов есть язык запросов"New value: +"Exact number of unresolved remarks; ranges go in `query`"
      • changedInput schema / properties / parent / description
        Previous value: -"Ключи родительских задач: в выдаче их **прямые** дети, на одно колено. `empty()` находит задачи без родителя — верхний уровень очереди. Несуществующий ключ отвечает отказом, а не пустой выдачей: пустота здесь читается как «детей нет», и опечатка спряталась бы за ответом"New value: +"Parent task keys: their **direct** children, one level down. `empty()` matches tasks without a parent, the top level of a project. An unknown key is refused rather than read as «no children»"
      • changedInput schema / properties / priority / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "$ref": "#/$defs/TaskPriority"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "description": "Task priority, from lowest to highest",
        +      "enum": [
        +        "low",
        +        "normal",
        +        "high",
        +        "critical"
        +      ],
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / priority / description
        Previous value: -"Приоритеты"New value: +"Priorities"
      • removedInput schema / properties / priority / examples
        Removed value: -[
        -  [
        -    "high"
        -  ]
        -]
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Project keys",
        +  "examples": [
        +    [
        +      "TRK"
        +    ]
        +  ],
        +  "title": "Project"
        +}
      • changedInput schema / properties / query / description
        Previous value: -"Строка языка запросов. Условие пишется `имя: [оператор] значения` — оператор стоит **после** двоеточия, и это главное, чем язык отличается от SQL: `status: in open, in_progress`, а не `status in (open, in_progress)`. Скобки в языке есть, но группируют они условия, а не значения.\n\nБез оператора условие означает равенство, а несколько значений через запятую — вхождение в набор: `status: open, in_progress` то же самое, что `status: in open, in_progress`.\n\nПоля: `assignee`, `blocked`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `parent`, `priority`, `queue`, `remarks_in_work`, `status`, `text`. Операторы: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (вхождение подстроки), `!~`, `in`, `not in`; `empty()` находит задачи без значения. Условия связываются `and` и `or`.\n\nПримеры:\n- `queue: TRK and status: open and blocked: false`\n- `status: in open, in_progress`\n- `priority: >= high and text: ~ ключ`\n- `assignee: empty() or open_questions: > 0`\n\nОшибка разбора приходит с позицией символа, а там, где верная форма выводима из места ошибки, — и с ней самой в `details.hint`"New value: +"Query language string. A condition is written `name: [operator] values`: the operator stands **after** the colon, unlike SQL — `status: in open, in_progress`, not `status in (open, in_progress)`. Parentheses group conditions, not values.\n\nWithout an operator a condition means equality, and comma-separated values mean membership: `status: open, in_progress` equals `status: in open, in_progress`.\n\nFields: `assignee`, `blocked`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`. Operators: `=`, `!=`, `>`, `>=`, `<`, `<=`, `~` (substring), `!~`, `in`, `not in`; `empty()` matches tasks without a value. Conditions combine with `and` and `or`.\n\nExamples:\n- `project: TRK and status: open and blocked: false`\n- `status: in open, in_progress`\n- `priority: >= high and text: ~ login`\n- `assignee: empty() or open_questions: > 0`\n\nA string that does not parse is refused with `invalid_search_query` and the character position, plus the correct form in `details.hint` where the error position determines it"
      • changedInput schema / properties / query / examples
        Previous value: -[
        -  "queue: TRK and status: open and blocked: false",
        -  "status: in open, in_progress",
        -  "priority: >= high and text: ~ ключ",
        -  "assignee: empty() or open_questions: > 0"
        -]New value: +[
        +  "project: TRK and status: open and blocked: false",
        +  "status: in open, in_progress",
        +  "priority: >= high and text: ~ login",
        +  "assignee: empty() or open_questions: > 0"
        +]
      • removedInput schema / properties / queue
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Ключи очередей",
        -  "examples": [
        -    [
        -      "TRK"
        -    ]
        -  ],
        -  "title": "Queue"
        -}
      • changedInput schema / properties / remarks_in_work / description
        Previous value: -"Замечаний, принятых в работу, чья задача-продолжение ещё не закрыта: «разобрано, но работа не доделана»"New value: +"Number of remarks resolved as `accepted` whose continuation task is not closed yet"
      • changedInput schema / properties / sort / description
        Previous value: -"Порядок, старший ключ первым; `-` в начале — по убыванию. Допустимы: `key`, `last_entry_at`, `priority`, `updated_at`"New value: +"Sort order, most significant key first; a leading `-` sorts descending. Allowed: `key`, `last_entry_at`, `priority`, `updated_at`"
      • changedInput schema / properties / status / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "$ref": "#/$defs/TaskStatus"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "description": "Task status",
        +      "enum": [
        +        "backlog",
        +        "open",
        +        "in_progress",
        +        "waiting",
        +        "done",
        +        "cancelled"
        +      ],
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / status / description
        Previous value: -"Статусы задач"New value: +"Task statuses"
      • removedInput schema / properties / status / examples
        Removed value: -[
        -  [
        -    "open"
        -  ]
        -]
      • changedInput schema / properties / text / description
        Previous value: -"Подстрока в названии или описании, без учёта регистра"New value: +"Substring of the title or description, case-insensitive"
      • removedInput schema / properties / text / examples
        Removed value: -[
        -  "выдача ключей"
        -]
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • changedOutput schema / $defs / FeaturesView / description
        Previous value: -"Вычисляемые признаки задачи (`CONCEPT.md`, 4.3)."New value: +"Computed task features."
      • changedOutput schema / $defs / FoundTaskView / description
        Previous value: -"Строка выдачи поиска: карточка задачи, у которой любое поле может отсутствовать.\n\nЕдинственная модель слоя с необязательными полями, и это не послабление типизации, а\nеё предмет. Список умеет отдавать подмножество полей (`fields`), и схема обязана\nчестно это показывать — ровно так же, как `TaskSearchRead` в REST.\n\nОтсюда же сериализатор ниже. SDK сворачивает результат вызовом\n`model_dump(mode=\"json\")` — **без** `exclude_unset`, — и незапрошенное поле приезжало\nбы агенту как `null`. Это не то же самое, что «поля нет»: пакет обязан совпадать с\nответом REST поле в поле, а тот отдаётся с `response_model_exclude_unset`.\n\nСхему сериализатор не портит, и это проверено: SDK строит `outputSchema` через\n`TypeAdapter(...).json_schema()`, у которого режим по умолчанию — **валидация**, а\nобёрточный сериализатор действует только на схему сериализации. У FastAPI режим\nпротивоположный, поэтому предупреждение заметки `docs/notes/api.md` («Отбросить\nпустые поля в ответе — значит потерять схему у клиента») сюда не переносится."New value: +"Search result row: the requested fields of one task."
      • addedOutput schema / $defs / FoundTaskView / properties / parent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/ParentView"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedOutput schema / $defs / FoundTaskView / properties / parents
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "items": {
        -        "$ref": "#/$defs/ParentView"
        -      },
        -      "type": "array"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Parents"
        -}
      • addedOutput schema / $defs / FoundTaskView / properties / previous_keys
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Previous Keys"
        +}
      • changedOutput schema / $defs / FoundTaskView / properties / priority / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/TaskPriority"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Task priority, from lowest to highest",
        +    "enum": [
        +      "low",
        +      "normal",
        +      "high",
        +      "critical"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / $defs / FoundTaskView / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/ProjectRefView"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
      • removedOutput schema / $defs / FoundTaskView / properties / queue
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "$ref": "#/$defs/QueueRefView"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • changedOutput schema / $defs / FoundTaskView / properties / status / anyOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/TaskStatus"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "Task status",
        +    "enum": [
        +      "backlog",
        +      "open",
        +      "in_progress",
        +      "waiting",
        +      "done",
        +      "cancelled"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / $defs / ParentView / description
        Previous value: -"Прямой родитель задачи в строке выдачи: ключ и название (`CONCEPT.md`, 4.4)."New value: +"Parent task: key and title."
      • addedOutput schema / $defs / ProjectRefView
        Added value: +{
        +  "description": "Project in one line: key and title.",
        +  "properties": {
        +    "key": {
        +      "title": "Key",
        +      "type": "string"
        +    },
        +    "title": {
        +      "title": "Title",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "key",
        +    "title"
        +  ],
        +  "title": "ProjectRefView",
        +  "type": "object"
        +}
      • removedOutput schema / $defs / QueueRefView
        Removed value: -{
        -  "description": "Очередь одной строкой: ключ и название.",
        -  "properties": {
        -    "key": {
        -      "title": "Key",
        -      "type": "string"
        -    },
        -    "title": {
        -      "title": "Title",
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "key",
        -    "title"
        -  ],
        -  "title": "QueueRefView",
        -  "type": "object"
        -}
      • removedOutput schema / $defs / TaskPriority
        Removed value: -{
        -  "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.",
        -  "enum": [
        -    "low",
        -    "normal",
        -    "high",
        -    "critical"
        -  ],
        -  "title": "TaskPriority",
        -  "type": "string"
        -}
      • removedOutput schema / $defs / TaskStatus
        Removed value: -{
        -  "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -  "enum": [
        -    "backlog",
        -    "open",
        -    "in_progress",
        -    "waiting",
        -    "done",
        -    "cancelled"
        -  ],
        -  "title": "TaskStatus",
        -  "type": "string"
        -}
      • addedOutput schema / properties / next_cursor / description
        Added value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
    • Addedset_attribute
    • Changedtransition18 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "TaskStatus": {
        -    "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -    "enum": [
        -      "backlog",
        -      "open",
        -      "in_progress",
        -      "waiting",
        -      "done",
        -      "cancelled"
        -    ],
        -    "title": "TaskStatus",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / reason / description
        Previous value: -"Почему задача идёт туда. Обязательна для любого шага назад по цепочке `backlog < open < in_progress < done`, для `cancelled` и для `waiting`; в остальных переходах необязательна. У `waiting` она называет, чего ждём, — больше это записать негде. Попадает в дело записью `status_changed`"New value: +"Why the task moves. Required for any step back along `backlog < open < in_progress < done`, for `cancelled` and for `waiting` (`transition_reason_required` otherwise), optional elsewhere. For `waiting` it is the only record of what the task waits for. Filed in the `status_changed` entry"
      • removedInput schema / properties / reason / examples
        Removed value: -[
        -  "Жду ответа на TRK-42#7"
        -]
      • removedInput schema / properties / to / $ref
        Removed value: -"#/$defs/TaskStatus"
      • changedInput schema / properties / to / description
        Previous value: -"Целевой статус"New value: +"Target status"
      • addedInput schema / properties / to / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • removedInput schema / properties / to / examples
        Removed value: -[
        -  "open"
        -]
      • addedInput schema / properties / to / type
        Added value: +"string"
      • removedOutput schema / $defs
        Removed value: -{
        -  "TaskStatus": {
        -    "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -    "enum": [
        -      "backlog",
        -      "open",
        -      "in_progress",
        -      "waiting",
        -      "done",
        -      "cancelled"
        -    ],
        -    "title": "TaskStatus",
        -    "type": "string"
        -  }
        -}
      • changedOutput schema / description
        Previous value: -"Ответ изменяющего инструмента: что стало и чем это подшито, без карточки."New value: +"Task state after the call and the entries it filed; the card in full is returned\nby `get_task`."
      • addedOutput schema / properties / entries / description
        Added value: +"Numbers of the entries filed in this task's case, in filing order. Empty when the sent values were already in place; the version then stays the same"
      • addedOutput schema / properties / parent_entry
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Number of the `link_added` entry filed into the parent task's own case when `create_task` was given `parent`. `null` when no `parent` was given, and always `null` for `transition` and `update_task`: they touch no other task's case.",
        +  "title": "Parent Entry"
        +}
      • removedOutput schema / properties / status / $ref
        Removed value: -"#/$defs/TaskStatus"
      • addedOutput schema / properties / status / description
        Added value: +"Task status"
      • addedOutput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • addedOutput schema / properties / status / type
        Added value: +"string"
      • addedOutput schema / properties / version / description
        Added value: +"Task version after the call"
    • Changedunlink17 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "LinkKind": {
        -    "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.",
        -    "enum": [
        -      "parent",
        -      "child",
        -      "blocks",
        -      "blocked_by",
        -      "relates"
        -    ],
        -    "title": "LinkKind",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • removedInput schema / properties / kind / $ref
        Removed value: -"#/$defs/LinkKind"
      • changedInput schema / properties / kind / description
        Previous value: -"Кем приходится задача из `key` задаче из `other`, а не наоборот: `link(key='TRK-1', kind='blocks', other='TRK-7')` — это «TRK-1 блокирует TRK-7». В карточке TRK-7 та же связь показана как `blocked_by TRK-1`"New value: +"Role of the task `key` toward the task `other`: `link(key='TRK-1', kind='blocks', other='TRK-7')` means TRK-1 blocks TRK-7, and the card of TRK-7 shows the same link as `blocked_by`"
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "parent",
        +  "child",
        +  "blocks",
        +  "blocked_by",
        +  "relates"
        +]
      • removedInput schema / properties / kind / examples
        Removed value: -[
        -  "blocked_by"
        -]
      • addedInput schema / properties / kind / type
        Added value: +"string"
      • changedInput schema / properties / other / description
        Previous value: -"Ключ задачи на другой стороне связи"New value: +"Key of the task on the other side of the link"
      • removedOutput schema / $defs
        Removed value: -{
        -  "LinkKind": {
        -    "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.",
        -    "enum": [
        -      "parent",
        -      "child",
        -      "blocks",
        -      "blocked_by",
        -      "relates"
        -    ],
        -    "title": "LinkKind",
        -    "type": "string"
        -  }
        -}
      • changedOutput schema / description
        Previous value: -"Ответ `unlink`: какая связь снята и с какой стороны её назвали."New value: +"Entries filed by `link` or `unlink` on both sides of the link."
      • addedOutput schema / properties / entry
        Added value: +{
        +  "description": "Number of the `link_added` or `link_removed` entry in the case of `key`",
        +  "title": "Entry",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / kind
        Removed value: -{
        -  "$ref": "#/$defs/LinkKind"
        -}
      • removedOutput schema / properties / other
        Removed value: -{
        -  "title": "Other",
        -  "type": "string"
        -}
      • addedOutput schema / properties / other_entry
        Added value: +{
        +  "description": "Number of the same entry in the case of `other`",
        +  "title": "Other Entry",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / removed
        Removed value: -{
        -  "title": "Removed",
        -  "type": "boolean"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "key",
        -  "kind",
        -  "other",
        -  "removed"
        -]New value: +[
        +  "key",
        +  "entry",
        +  "other_entry"
        +]
      • changedOutput schema / title
        Previous value: -"UnlinkView"New value: +"LinkFilingView"
    • Changedupdate_participant10 fields changed
      • changedInput schema / properties / description / description
        Previous value: -"Кто это. Всё, что читающий дело узнает об авторе записи"New value: +"Who the participant is: all that a reader of a case learns about the author of an entry"
      • removedInput schema / properties / description / examples
        Removed value: -[
        -  "Релизный бот, ведёт задачи выкладки"
        -]
      • changedInput schema / properties / name / description
        Previous value: -"Имя участника из реестра. Регистр не важен"New value: +"Participant name, case-insensitive. An unknown name is refused with `participant_not_found`"
      • removedInput schema / properties / name / examples
        Removed value: -[
        -  "release_bot"
        -]
      • removedOutput schema / $defs
        Removed value: -{
        -  "ParticipantKind": {
        -    "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.",
        -    "enum": [
        -      "human",
        -      "agent"
        -    ],
        -    "title": "ParticipantKind",
        -    "type": "string"
        -  }
        -}
      • changedOutput schema / description
        Previous value: -"Участник реестра: кому можно адресовать вопрос и что о нём известно."New value: +"Participant name in its stored, lower-case form; the registry is returned by\n`list_participants`."
      • removedOutput schema / properties / description
        Removed value: -{
        -  "title": "Description",
        -  "type": "string"
        -}
      • removedOutput schema / properties / kind
        Removed value: -{
        -  "$ref": "#/$defs/ParticipantKind"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "kind",
        -  "name",
        -  "description"
        -]New value: +[
        +  "name"
        +]
      • changedOutput schema / title
        Previous value: -"ParticipantView"New value: +"ParticipantNameView"
    • Addedupdate_project
    • Removedupdate_queue
    • Changedupdate_task34 fields changed
      • changedInput schema / $defs / CheckEditArg / description
        Previous value: -"Правка одной проверки: её номер и новый текст."New value: +"Rewrite of one check: its number and new text."
      • changedInput schema / $defs / CheckEditArg / properties / no / description
        Previous value: -"Номер проверки в нынешнем списке задачи, с 1"New value: +"Number of the check in the current list, from 1"
      • removedInput schema / $defs / CheckEditArg / properties / no / examples
        Removed value: -[
        -  3
        -]
      • changedInput schema / $defs / CheckEditArg / properties / text / description
        Previous value: -"Новая формулировка этой проверки; остальные остаются теми же байтами"New value: +"New wording of this check"
      • removedInput schema / $defs / CheckEditArg / properties / text / examples
        Removed value: -[
        -  "`docker compose run --rm test` зелёный целиком"
        -]
      • changedInput schema / $defs / TaskChanges / description
        Previous value: -"Что поменять в задаче. Непереданное поле не трогается.\n\nСтатуса здесь нет — он меняется `transition`; ключа нет — он неизменяем. У\n`assignee` осмыслен `null`: он снимает исполнителя. У остальных полей `null` смысла\nне имеет, и схема его не пропустит."New value: +"Fields to change; a field left out stays as it is. Title, description, sections\nand checks are editable only in `backlog`; elsewhere they are refused with\n`task_field_locked`."
      • changedInput schema / $defs / TaskChanges / properties / assignee / description
        Previous value: -"Имя участника или метка временного агента; `null` снимает исполнителя"New value: +"Participant name or temporary agent label; `null` clears it. The name is compared with the caller's signature regardless of case, and every session signed with that name counts as the assignee. Replacing another participant's name takes the task over from them: the tracker accepts it, files `assignee_changed` and informs no one"
      • removedInput schema / $defs / TaskChanges / properties / assignee / examples
        Removed value: -[
        -  "release_bot"
        -]
      • changedInput schema / $defs / TaskChanges / properties / check / description
        Previous value: -"Переписывает одну проверку на месте, не трогая остальные; только в `backlog`. Главный способ правки: переписывают обычно одну — «эту проверку выполнить нельзя», — а состав меняют редко. Вместе с `checks` не принимается: это два разных ответа на один вопрос"New value: +"Rewrites one check in place; the other checks stay byte for byte, and the `section_changed` entry names the check number. Refused together with `checks` (`task_fields_invalid`)"
      • changedInput schema / $defs / TaskChanges / properties / checks / description
        Previous value: -"Обзорные проверки целиком, списком; только в `backlog`. Этим меняют **состав**: добавляют проверку, снимают, переставляют. Переписать одну — `check`: пересылка восьми строк ради третьей пропускает опечатку в остальных семи молча"New value: +"All review checks as a list: changes their composition — a check added, removed or moved"
      • changedInput schema / $defs / TaskChanges / properties / constraints / description
        Previous value: -"Раздел «ограничения»; только в `backlog`"New value: +"Section `constraints`"
      • changedInput schema / $defs / TaskChanges / properties / context / description
        Previous value: -"Раздел «контекст»; только в `backlog`"New value: +"Section `context`"
      • changedInput schema / $defs / TaskChanges / properties / description / description
        Previous value: -"Описание задачи; только в `backlog`"New value: +"Task description"
      • changedInput schema / $defs / TaskChanges / properties / goal / description
        Previous value: -"Раздел «цель»; только в `backlog`"New value: +"Section `goal`"
      • changedInput schema / $defs / TaskChanges / properties / output / description
        Previous value: -"Раздел «выход»; только в `backlog`"New value: +"Section `output`"
      • removedInput schema / $defs / TaskChanges / properties / priority / $ref
        Removed value: -"#/$defs/TaskPriority"
      • changedInput schema / $defs / TaskChanges / properties / priority / description
        Previous value: -"Приоритет"New value: +"Task priority"
      • addedInput schema / $defs / TaskChanges / properties / priority / enum
        Added value: +[
        +  "low",
        +  "normal",
        +  "high",
        +  "critical"
        +]
      • removedInput schema / $defs / TaskChanges / properties / priority / examples
        Removed value: -[
        -  "high"
        -]
      • addedInput schema / $defs / TaskChanges / properties / priority / type
        Added value: +"string"
      • changedInput schema / $defs / TaskChanges / properties / title / description
        Previous value: -"Название задачи; только в `backlog`"New value: +"Task title"
      • removedInput schema / $defs / TaskPriority
        Removed value: -{
        -  "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.",
        -  "enum": [
        -    "low",
        -    "normal",
        -    "high",
        -    "critical"
        -  ],
        -  "title": "TaskPriority",
        -  "type": "string"
        -}
      • changedInput schema / properties / key / description
        Previous value: -"Ключ задачи, например `TRK-42`. Регистр не важен"New value: +"Task key `PROJECT-N`, case-insensitive; a previous key of a moved task addresses it as well. An unknown key is refused with `task_not_found`"
      • changedInput schema / properties / version / description
        Previous value: -"Версия задачи, прочитанная раньше. Присланная обратно, она превращает потерянное чужое изменение в отказ `version_conflict` вместо тихой перезаписи; не передана — правка ложится поверх текущей версии"New value: +"Task version read earlier. When given and the task has changed since, the call is refused with `version_conflict` instead of overwriting the other change; when left out, the edit applies on top of the current version"
      • removedInput schema / properties / version / examples
        Removed value: -[
        -  3
        -]
      • removedOutput schema / $defs
        Removed value: -{
        -  "TaskStatus": {
        -    "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).",
        -    "enum": [
        -      "backlog",
        -      "open",
        -      "in_progress",
        -      "waiting",
        -      "done",
        -      "cancelled"
        -    ],
        -    "title": "TaskStatus",
        -    "type": "string"
        -  }
        -}
      • changedOutput schema / description
        Previous value: -"Ответ изменяющего инструмента: что стало и чем это подшито, без карточки."New value: +"Task state after the call and the entries it filed; the card in full is returned\nby `get_task`."
      • addedOutput schema / properties / entries / description
        Added value: +"Numbers of the entries filed in this task's case, in filing order. Empty when the sent values were already in place; the version then stays the same"
      • addedOutput schema / properties / parent_entry
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Number of the `link_added` entry filed into the parent task's own case when `create_task` was given `parent`. `null` when no `parent` was given, and always `null` for `transition` and `update_task`: they touch no other task's case.",
        +  "title": "Parent Entry"
        +}
      • removedOutput schema / properties / status / $ref
        Removed value: -"#/$defs/TaskStatus"
      • addedOutput schema / properties / status / description
        Added value: +"Task status"
      • addedOutput schema / properties / status / enum
        Added value: +[
        +  "backlog",
        +  "open",
        +  "in_progress",
        +  "waiting",
        +  "done",
        +  "cancelled"
        +]
      • addedOutput schema / properties / status / type
        Added value: +"string"
      • addedOutput schema / properties / version / description
        Added value: +"Task version after the call"
    • Changedwait_journal33 fields changed
      • removedInput schema / $defs
        Removed value: -{
        -  "EntryType": {
        -    "description": "Тип записи дела. Записи агента и человека — до `NOTE`, служебные — после.",
        -    "enum": [
        -      "summary",
        -      "decision",
        -      "attempt",
        -      "finding",
        -      "artifact",
        -      "question",
        -      "answer",
        -      "verdict",
        -      "remark",
        -      "resolution",
        -      "note",
        -      "created",
        -      "status_changed",
        -      "section_changed",
        -      "field_changed",
        -      "assignee_changed",
        -      "link_added",
        -      "link_removed"
        -    ],
        -    "title": "EntryType",
        -    "type": "string"
        -  }
        -}
      • changedInput schema / properties / after / description
        Previous value: -"Сквозной номер `seq`, после которого читать. 0 — с самого начала: записи постоянны, слишком старого курсора не бывает"New value: +"Journal sequence number `seq` to read after; `0` reads from the start. Entries are permanent: no `seq` is too old"
      • removedInput schema / properties / after / examples
        Removed value: -[
        -  1024
        -]
      • changedInput schema / properties / cursor / description
        Previous value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page"
      • changedInput schema / properties / limit / description
        Previous value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size"
      • removedInput schema / properties / limit / examples
        Removed value: -[
        -  25
        -]
      • addedInput schema / properties / project
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only entries of this project: its own case and the cases of its tasks",
        +  "examples": [
        +    "TRK"
        +  ],
        +  "title": "Project"
        +}
      • removedInput schema / properties / queue
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Только записи задач этой очереди",
        -  "examples": [
        -    "TRK"
        -  ],
        -  "title": "Queue"
        -}
      • changedInput schema / properties / task / description
        Previous value: -"Только записи этих задач: ключ или список ключей, не больше 50. Несколько дел спрашиваются одним ожиданием, а не по вызову на каждое. Превышение — `journal_too_many_tasks` с числом в подробностях; несуществующий ключ — `task_not_found`, а не пустая лента"New value: +"Only entries of these tasks: one key or a list of at most 50. One wait covers all of them, and an entry in any of them ends it. More keys are refused with `journal_too_many_tasks`, an unknown key with `task_not_found`"
      • changedInput schema / properties / timeout / description
        Previous value: -"Сколько секунд ждать первую подходящую запись, если хвост пуст; не больше 60. 0 — ответить сразу. Пустой список по истечении ожидания означает «ничего не случилось» и ошибкой не является"New value: +"Seconds to wait for the first matching entry when none is there yet, at most 60 (`journal_wait_too_long` beyond); `0` answers at once. An empty page after the wait means nothing happened and is not an error"
      • removedInput schema / properties / timeout / examples
        Removed value: -[
        -  30
        -]
      • changedInput schema / properties / types / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "$ref": "#/$defs/EntryType"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "description": "Case entry type. Types up to `note` are written by agents and humans; the types after it are filed by the tracker itself with the change they record",
        +      "enum": [
        +        "summary",
        +        "decision",
        +        "attempt",
        +        "finding",
        +        "artifact",
        +        "question",
        +        "answer",
        +        "verdict",
        +        "remark",
        +        "resolution",
        +        "note",
        +        "created",
        +        "status_changed",
        +        "section_changed",
        +        "field_changed",
        +        "assignee_changed",
        +        "link_added",
        +        "link_removed",
        +        "moved",
        +        "attribute_created",
        +        "attribute_changed",
        +        "attribute_removed",
        +        "archived",
        +        "restored"
        +      ],
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / types / description
        Previous value: -"Только записи этих типов"New value: +"Only entries of these types"
      • removedInput schema / properties / types / examples
        Removed value: -[
        -  [
        -    "decision",
        -    "attempt"
        -  ]
        -]
      • removedOutput schema / $defs / AuthorKind
        Removed value: -{
        -  "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.",
        -  "enum": [
        -    "agent",
        -    "human",
        -    "tracker"
        -  ],
        -  "title": "AuthorKind",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / AuthorView / description
        Previous value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature."
      • removedOutput schema / $defs / AuthorView / properties / kind / $ref
        Removed value: -"#/$defs/AuthorKind"
      • addedOutput schema / $defs / AuthorView / properties / kind / description
        Added value: +"Kind of author. `tracker` signs the service entries the tracker files itself"
      • addedOutput schema / $defs / AuthorView / properties / kind / enum
        Added value: +[
        +  "agent",
        +  "human",
        +  "tracker"
        +]
      • addedOutput schema / $defs / AuthorView / properties / kind / type
        Added value: +"string"
      • removedOutput schema / $defs / EntryType
        Removed value: -{
        -  "description": "Тип записи дела. Записи агента и человека — до `NOTE`, служебные — после.",
        -  "enum": [
        -    "summary",
        -    "decision",
        -    "attempt",
        -    "finding",
        -    "artifact",
        -    "question",
        -    "answer",
        -    "verdict",
        -    "remark",
        -    "resolution",
        -    "note",
        -    "created",
        -    "status_changed",
        -    "section_changed",
        -    "field_changed",
        -    "assignee_changed",
        -    "link_added",
        -    "link_removed"
        -  ],
        -  "title": "EntryType",
        -  "type": "string"
        -}
      • changedOutput schema / $defs / EntryView / description
        Previous value: -"Запись дела целиком.\n\n`payload` — единственное поле слоя без объявленной формы, и это то же исключение,\nчто и в схеме REST (`docs/notes/api.md`, «`payload` записи дела — исключение из\nтипизации, названное по месту»): нагрузка своя у каждого типа записи, и типизирует\nеё отдельная задача — сразу в обоих интерфейсах, иначе они разойдутся. `JsonValue`,\nа не `Any`: форма свободна, но значение обязано быть представимо в JSON."New value: +"Case entry in full."
      • addedOutput schema / $defs / EntryView / properties / project_key
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Key of the owning project for an entry of a project's case (`TRK#7`); `null` for a task entry",
        +  "title": "Project Key"
        +}
      • addedOutput schema / $defs / EntryView / properties / seq / description
        Added value: +"Journal sequence number, usable as `after` of `wait_journal`"
      • addedOutput schema / $defs / EntryView / properties / task_key / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / $defs / EntryView / properties / task_key / description
        Added value: +"Key of the owning task; `null` for an entry of a project's case"
      • removedOutput schema / $defs / EntryView / properties / task_key / type
        Removed value: -"string"
      • removedOutput schema / $defs / EntryView / properties / type / $ref
        Removed value: -"#/$defs/EntryType"
      • addedOutput schema / $defs / EntryView / properties / type / description
        Added value: +"Case entry type. Types up to `note` are written by agents and humans; the types after it are filed by the tracker itself with the change they record"
      • addedOutput schema / $defs / EntryView / properties / type / enum
        Added value: +[
        +  "summary",
        +  "decision",
        +  "attempt",
        +  "finding",
        +  "artifact",
        +  "question",
        +  "answer",
        +  "verdict",
        +  "remark",
        +  "resolution",
        +  "note",
        +  "created",
        +  "status_changed",
        +  "section_changed",
        +  "field_changed",
        +  "assignee_changed",
        +  "link_added",
        +  "link_removed",
        +  "moved",
        +  "attribute_created",
        +  "attribute_changed",
        +  "attribute_removed",
        +  "archived",
        +  "restored"
        +]
      • addedOutput schema / $defs / EntryView / properties / type / type
        Added value: +"string"
      • changedOutput schema / $defs / EntryView / required
        Previous value: -[
        -  "id",
        -  "seq",
        -  "no",
        -  "task_key",
        -  "type",
        -  "author",
        -  "title",
        -  "body",
        -  "payload",
        -  "refs",
        -  "created_at"
        -]New value: +[
        +  "id",
        +  "seq",
        +  "no",
        +  "task_key",
        +  "project_key",
        +  "type",
        +  "author",
        +  "title",
        +  "body",
        +  "payload",
        +  "refs",
        +  "created_at"
        +]
      • addedOutput schema / properties / next_cursor / description
        Added value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
  3. 23 tool updates
    • First observedadd_entry
    • First observedadd_summary
    • First observedadd_verdict
    • First observedanswer
    • First observedask
    • First observedclose_task
    • First observedcreate_queue
    • First observedcreate_task
    • First observedget_queue
    • First observedget_task
    • First observedlink
    • First observedlist_participants
    • First observedlist_queues
    • First observedread_entries
    • First observedregister_participant
    • First observedresolve
    • First observedsearch_tasks
    • First observedtransition
    • First observedunlink
    • First observedupdate_participant
    • First observedupdate_queue
    • First observedupdate_task
    • First observedwait_journal

TDQS

A4/5.0

Scored across 30 tools

Disambiguation4/5

Most tools target clearly distinct resource+action pairs, and descriptions explicitly delineate entry types (summary, verdict, question, answer, resolution, generic entry). A couple of near-overlaps exist: transition (status change) vs move_task (project move), and add_entry vs add_project_entry share the same action on different scopes, which could cause occasional misselection.

Naming Consistency4/5

The dominant pattern is consistent snake_case verb_noun (read_project_entries, create_task, update_task, close_task, add_verdict, etc.). A handful of tools break it with bare verbs (link, unlink, ask, answer, resolve, transition), and the get_/read_ prefix usage is not perfectly uniform, but everything remains readable and lowercase.

Tool Count3/5

30 tools is above the comfortable range and feels heavy, but the domain is genuinely broad (projects, tasks, entries, links, participants, attributes, journal). Each tool maps to a distinct operation, yet the surface could likely be consolidated (e.g. entry-creation variants).

Completeness5/5

Full lifecycle coverage: project create/update/archive/restore/list/get, task create/update/move/transition/close/get/search, entry add/read, links link/unlink, participant register/update/list, attributes set/remove, and a journal stream. Entries are intentionally immutable and projects archived rather than deleted, so no obvious dead ends.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers