Casefile
Casefile is a self-hosted MCP task tracker where agents file and work tasks through an append-only "case file" per task, while you watch the board and answer their questions.
Manage tasks: create, search (query language + filters), read a task's full package (card, parent, children, links, features, summary, questions, remarks, index, transitions), update fields, transition along a fixed status table (backlog → open → in_progress → waiting → done/cancelled), close with verdicts and a final summary, and move tasks between projects (main token).
Keep the case file: append decisions, attempts, findings, artifacts, remarks and notes; file four-part summaries as hand-off notes; read entry bodies filtered by number, type or
after_no.Ask and answer: file questions to registered participants (optionally blocking), answer them, and resolve remarks with an outcome (
fixed,accepted,needs_detail,declined).Review work: file a passed/failed verdict per review check, per work pass, with evidence — gates closing the task.
Link tasks: parent/child hierarchy,
blocks/blocked_by, andrelates(cycle, self-link and duplicate checks apply), with entries filed on both sides.Projects and attributes: create/update/archive/restore projects, read a project's case index, set or remove project attributes (e.g. repo, branch) with reason and history.
People and agents: list and register participants (humans, permanent agents), update descriptions; tokens gate privileged
mainoperations.Follow activity live:
wait_journalstreams every case entry installation-wide, filterable by task, project, type and sequence number, with waiting.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Casefilepick up task 12 where the last agent left off and continue"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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 | shInstall on Windows (PowerShell)
irm https://raw.githubusercontent.com/azimov777/casefile/main/install.ps1 | iexAll 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.mdorhandoff.mdgets 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. KeepCLAUDE.mdfor 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 shHow 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 --stdioThe 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 targetssearch_tasks— searches tasks by a query-language string, by separate conditions, or by bothcreate_task— creates a task inbacklog, optionally as a child of a parent taskupdate_task— changes the given fields of a task; fields left out stay as they aretransition— moves a task to another status along the fixed transition tableclose_task— closes a task: files entries, verdicts and the final summary and moves it todone, in one transactionmove_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 (maintoken only)
Case
read_entries— returns entry bodies of one task's case, with payload, in number orderadd_summary— files a summary: the handover note of a case, in four partsadd_entry— files an entry without payload: a decision, attempt, finding, artifact, remark or noteask— files a question to registry participantsanswer— answers a question of the same taskresolve— resolves a remark on a task: its outcome and where the work wentadd_verdict— files the outcome of one review checkread_project_entries— returns entry bodies of one project's case, with payload, in number orderadd_project_entry— files a decision, finding, artifact or note in a project's case
Links
link— links two tasks and fileslink_addedin both casesunlink— removes a link and fileslink_removedin both cases
Projects & participants
get_project— returns one project by its key: key, title, description, current attribute values and the index of its caselist_projects— lists the installation's projects: key, title and archive time; archived ones only when askedlist_participants— lists the participant registry: the possible addressees of a questioncreate_project— creates a project (maintoken only)update_project— changes a project's title and description, recording each change in its case (maintoken only)archive_project— archives a project with a reason, freezing it and its tasks against changes (maintoken only)restore_project— restores an archived project with a reason (maintoken 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 caseremove_attribute— removes a project attribute with a reason, filing its last value in the project's caseregister_participant— registers a human or a permanent agent (maintoken only)update_participant— changes a participant's description (maintoken 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 |
|
Stay on one release |
|
Stop / start |
|
Remove everything, data included |
|
Move to another machine or your own server | |
Back up your data / restore into a clean install |
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.
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 useRun
docker compose up -din~/casefile.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@localhostAdd
--set-passwordto 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.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 aliceIt prints Alice's password once; hand it to her.
--adminmakes her an administrator too.account-listshows everyone,account-update --disablelocks a person out and revokes every token they hold or issued to their agents (their past entries stay signed with their name), andaccount-passwordresets 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 fromand 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_BINDbeyond localhost and sign-in off, the board refuses to start instead of handing the administrator key to the whole network;docker compose logs uisays 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
Hiring? I built Casefile and would be glad to hear about roles at Anthropic or OpenAI — reach me through GitHub.
Available Tools
30 toolsadd_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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| body | No | 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 | |
| refs | No | 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 | |
| type | Yes | What 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 | |
| title | Yes | Entry title: its line in the case index of `get_task`. It states what happened, not how | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Entry number in the task's case; with the key it forms `TRK-42#12` |
| seq | Yes | Journal sequence number, usable as `after` of `wait_journal` |
| title | Yes | 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 |
| author | Yes | |
| task_key | Yes | |
| created_at | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| body | No | 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 | |
| refs | No | 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 | |
| type | Yes | What 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 | |
| title | Yes | Entry title: its line in the case index of `get_project`. It states what happened, not how | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Entry number in the project's case; with the key it forms `TRK#7` |
| seq | Yes | Journal sequence number, usable as `after` of `wait_journal` |
| author | Yes | |
| created_at | Yes | |
| project_key | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| done | Yes | 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 | |
| blockers | Yes | What stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom | |
| next_step | Yes | 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 | |
| remaining | Yes | What remains before the task is done | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Entry number in the task's case; with the key it forms `TRK-42#12` |
| seq | Yes | Journal sequence number, usable as `after` of `wait_journal` |
| title | Yes | 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 |
| author | Yes | |
| task_key | Yes | |
| created_at | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| outcome | Yes | Outcome of the check; there is no third state | |
| check_no | Yes | Number of the review check in the task's list, from 1; a number outside the list is refused with `entry_fields_invalid` | |
| evidence | No | What was run for the check as written and what it showed: the command, its output, a link to the material | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Entry number in the task's case; with the key it forms `TRK-42#12` |
| seq | Yes | Journal sequence number, usable as `after` of `wait_journal` |
| title | Yes | 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 |
| author | Yes | |
| task_key | Yes | |
| created_at | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| body | No | 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 | |
| question_no | Yes | 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` | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Entry number in the task's case; with the key it forms `TRK-42#12` |
| seq | Yes | Journal sequence number, usable as `after` of `wait_journal` |
| title | Yes | 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 |
| author | Yes | |
| task_key | Yes | |
| created_at | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| reason | Yes | Why 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
| Name | Required | Description |
|---|---|---|
| no | Yes | Number of the `archived` or `restored` entry in the project's case |
| key | Yes | |
| archived_at | Yes | When the project was archived; `null` once it is restored |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| body | No | 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 | |
| title | Yes | Entry title: its line in the case index of `get_task`. It states what happened, not how | |
| blocking | Yes | 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 | |
| addressees | Yes | 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` | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Entry number in the task's case; with the key it forms `TRK-42#12` |
| seq | Yes | Journal sequence number, usable as `after` of `wait_journal` |
| title | Yes | 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 |
| author | Yes | |
| task_key | Yes | |
| created_at | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| entries | No | Entries without payload filed before the verdicts, such as `artifact` pointers to the result | |
| summary | Yes | 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 | |
| verdicts | No | 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` | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| status | Yes | Task status |
| entries | No | Filed entries in filing order, ending with `status_changed` |
| version | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Key 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` | |
| title | Yes | Project title | |
| description | No | Short "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_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Task title, one line | |
| parent | No | 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 | |
| project | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| assignee | No | 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` | |
| priority | No | Task priority | normal |
| sections | No | 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` | |
| description | Yes | 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 | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| status | Yes | Task status |
| entries | Yes | 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 |
| version | Yes | Task version after the call |
| parent_entry | No | 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. |
TDQS
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.
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.
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.
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.
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.
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_projectARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| index | Yes | Index 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` |
| title | Yes | |
| attributes | Yes | Current attribute values, ordered by name ignoring case. Their history is in the project's case: `attribute_created`, `attribute_changed` and `attribute_removed` entries |
| archived_at | Yes | When the project was archived, `null` while it is active. An archived project and its tasks refuse changes with `project_archived`; `restore_project` lifts it |
| description | Yes | Short "what this is" of the project, up to 320 characters; may be empty. Every task card carries it too |
TDQS
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.
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.
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.
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.
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.
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_taskARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` |
Output Schema
| Name | Required | Description |
|---|---|---|
| task | Yes | |
| index | Yes | |
| links | Yes | |
| parent | Yes | |
| remarks | Yes | |
| summary | Yes | |
| children | Yes | |
| features | Yes | |
| questions | Yes | |
| transitions | Yes |
TDQS
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.
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.
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.
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.
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.
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.
linkA
Links two tasks and files link_added in both cases.
kind is the role of key: blocks means key blocks other, and the card
of other shows the link as blocked_by. A link is stored once: the same link
from the other side is refused with link_exists, like a repeat. A link closing
a cycle is refused with link_cycle_detected, a link of a task to itself with
link_self_not_allowed.
parent and child set the hierarchy, shown by get_task in the fields
parent and children rather than in links. A task has one parent: a second
one is refused with task_has_parent, the current parent named in
details.parent.
An open blocker raises the blocked feature of the blocked task and keeps it
out of in_progress with task_blocked.
A closed task (done, cancelled) accepts only relates, the link to a
continuation grown from it; parent and blocks on it are refused with
task_closed. Only a link shows the lineage on the cards of both tasks: a key
mentioned in an entry body or in refs does not.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| kind | Yes | 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` | |
| other | Yes | Key of the task on the other side of the link | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| entry | Yes | Number of the `link_added` or `link_removed` entry in the case of `key` |
| other_entry | Yes | Number of the same entry in the case of `other` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description substantially exceeds the annotations by disclosing concrete side effects and failure modes: it files `link_added`, refuses duplicate links with `link_exists`, rejects cycles with `link_cycle_detected`, blocks self-links, enforces the single-parent rule with `task_has_parent`, raises the `blocked` feature, and applies `task_closed` restrictions. This gives the agent a strong behavioral model beyond `readOnlyHint: false` and `destructiveHint: false`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized into topical paragraphs: basic link semantics, hierarchy, blocking, closed-task behavior, and lineage. The core purpose is front-loaded in the first sentence, and every paragraph adds necessary behavioral detail without filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description fully covers what an agent needs: accepted kinds, directional semantics, side effects, error conditions, hierarchical constraints, blocker behavior, and closed-task limitations. An output schema exists, so the lack of explicit return-format detail is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters with high detail, so the baseline is 3. The description adds meaningful semantics by explaining the directional meaning of `kind`, how `parent`/`child` are represented in `get_task`, and how idempotency interacts with repeated calls. It does not add much about the `other` parameter, but the schema already defines it clearly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Links two tasks', and immediately distinguishes the operation from its inverse sibling `unlink` by explaining that a link is stored once and the same link from the other side is refused. It also enumerates the distinct link kinds, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives contextual guidance on when each `kind` is appropriate, especially for closed tasks ('accepts only `relates`') and for hierarchy links (`parent`/`child`). It also clarifies that only a real link shows lineage, not a key mentioned in an entry body or `refs`, which helps agents choose this tool over other ways of referencing tasks. It does not explicitly name alternatives like `unlink`, but the conditions are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_participantsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. Without a value, the installation's default page size | |
| cursor | No | `next_cursor` of the previous page; without it, the first page |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| next_cursor | Yes | Cursor of the next page, sent back as `cursor`; `null` means this page is the last one |
TDQS
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.
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.
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.
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.
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.
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_projectsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. Without a value, the installation's default page size | |
| cursor | No | `next_cursor` of the previous page; without it, the first page | |
| include_archived | No | Also list archived projects; without it they are left out. A project is read by its key with `get_project` either way |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| next_cursor | Yes | Cursor of the next page, sent back as `cursor`; `null` means this page is the last one |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Task 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 | |
| reason | Yes | Why the task moves; a blank one is refused with `task_move_reason_required`. Filed in the `moved` entry of the task's case | |
| project | Yes | Key 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
| Name | Required | Description |
|---|---|---|
| no | No | Number of the `moved` entry in the task's case |
| key | No | Key the task got in the new project |
| results | No | One outcome per listed key, in list order |
| version | No | Task version after the move |
| previous_keys | No | Keys the task had before, in the order they were left |
TDQS
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.
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.
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.
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.
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.
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_entriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| nos | No | Only entries with these numbers | |
| limit | No | Page size. Without a value, the installation's default page size | |
| types | No | Only entries of these types | |
| cursor | No | `next_cursor` of the previous page; without it, the first page | |
| after_no | No | Only entries filed after the entry with this number |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| next_cursor | Yes | Cursor of the next page, sent back as `cursor`; `null` means this page is the last one |
TDQS
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.
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.
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.
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.
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.
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_entriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| nos | No | Only entries with these numbers | |
| limit | No | Page size. Without a value, the installation's default page size | |
| types | No | Only entries of these types | |
| cursor | No | `next_cursor` of the previous page; without it, the first page | |
| after_no | No | Only entries filed after the entry with this number | |
| attribute | No | Only entries about the attribute with this name: `attribute_created`, `attribute_changed`, `attribute_removed`; matching ignores case |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| next_cursor | Yes | Cursor of the next page, sent back as `cursor`; `null` means this page is the last one |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Human or permanent agent | |
| name | Yes | 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` | |
| description | No | Who the participant is: all that a reader of a case learns about the author of an entry | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| name | Yes | Attribute name: Latin letters, digits, `_` and `-`, at most 64 characters (`invalid_attribute_name` otherwise). Matching ignores case | |
| reason | Yes | Why 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_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Number of the `attribute_removed` entry in the project's case |
| name | Yes | Name as it was stored |
| project_key | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| body | No | 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 | |
| task | No | Key of the task the work went to. Required with `accepted` and refused with any other outcome, both as `entry_fields_invalid` | |
| outcome | Yes | How 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_no | Yes | Number of the `remark` entry in the same task; any other number is refused with `entry_fields_invalid` | |
| idempotency_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Entry number in the task's case; with the key it forms `TRK-42#12` |
| seq | Yes | Journal sequence number, usable as `after` of `wait_journal` |
| title | Yes | 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 |
| author | Yes | |
| task_key | Yes | |
| created_at | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| reason | Yes | Why 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
| Name | Required | Description |
|---|---|---|
| no | Yes | Number of the `archived` or `restored` entry in the project's case |
| key | Yes | |
| archived_at | Yes | When the project was archived; `null` once it is restored |
TDQS
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.
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.
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.
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.
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.
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_tasksARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | 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 | |
| sort | No | Sort order, most significant key first; a leading `-` sorts descending. Allowed: `key`, `last_entry_at`, `priority`, `updated_at` | |
| text | No | Substring of the title or description, case-insensitive | |
| limit | No | Page size. Without a value, the installation's default page size | |
| query | No | 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. 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 | |
| cursor | No | `next_cursor` of the previous page; without it, the first page | |
| fields | No | 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` | |
| parent | No | 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» | |
| status | No | Task statuses | |
| blocked | No | Whether the task has `blocked_by` on a task that is neither `done` nor `cancelled` | |
| project | No | Project keys | |
| assignee | No | 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 | |
| priority | No | Priorities | |
| open_remarks | No | Exact number of unresolved remarks; ranges go in `query` | |
| open_questions | No | Exact number of unanswered questions; ranges go in `query` | |
| remarks_in_work | No | Number of remarks resolved as `accepted` whose continuation task is not closed yet | |
| open_blocking_questions | No | Exact number of unanswered `blocking` questions; `0` means none blocks |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| next_cursor | Yes | Cursor of the next page, sent back as `cursor`; `null` means this page is the last one |
TDQS
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.
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.
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.
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.
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.
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_attributeAIdempotent
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_createdentry is filed; the reason is optional.An attribute with another value: the value changes and an
attribute_changedentry 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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| name | Yes | Attribute name: Latin letters, digits, `_` and `-`, at most 64 characters (`invalid_attribute_name` otherwise). Matching ignores case | |
| value | Yes | Attribute 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` | |
| reason | No | Why 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_key | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| no | Yes | Number of the filed entry in the project's case (`TRK#7`); `null` when the value equals the current one and nothing was filed |
| name | Yes | Name as stored: the spelling the attribute was created with |
| value | Yes | |
| project_key | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target status | |
| key | Yes | 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` | |
| reason | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| status | Yes | Task status |
| entries | Yes | 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 |
| version | Yes | Task version after the call |
| parent_entry | No | 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. |
TDQS
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.
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.
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.
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.
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.
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.
unlinkA
Removes a link and files link_removed in both cases.
A link is removed from either side and under either name of its kind: blocks
from TRK-1 to TRK-7 and blocked_by from TRK-7 to TRK-1 are the same
link. On a closed task parent and blocks stay (task_closed), relates is
removed. A link that does not exist is refused with link_not_found.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| kind | Yes | 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` | |
| other | Yes | Key of the task on the other side of the link |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| entry | Yes | Number of the `link_added` or `link_removed` entry in the case of `key` |
| other_entry | Yes | Number of the same entry in the case of `other` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and provide no safety or idempotency context, so the description carries the full behavioral burden. It discloses the success event (`link_removed`), symmetric matching from either side, closed-task exceptions (`parent`/`blocks` stay, `relates` removed), and the failure response (`link_not_found`). This is substantial and honest disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three dense sentences with no filler. The first sentence states the action and observed outcome, and the next two handle symmetric matching and important exceptions. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, this description covers the main success path, a key closed-task behavior, and the primary error case. Minor gaps remain, such as explicit closed-task behavior for `child` and `blocked_by` and any permission requirements, but an agent can still call the tool correctly with high confidence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds semantic value by explaining that `blocks` and `blocked_by` describe the same underlying link and that direction matters relative to `key`/`other`. This goes beyond the schema's field descriptions, though the schema already documents the core parameter roles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Removes a link'. It distinguishes itself from the sibling `link` (which presumably creates links) by describing removal and even notes the symmetric `blocks`/`blocked_by` naming. The core purpose is immediately clear and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for when to call the tool: whenever a link should be removed. It covers edge cases like closed tasks and missing links, but it does not explicitly name alternatives or provide an exclusion like 'use link to create a link instead'. This is clear context without full alternative routing, so a 4 fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_participantADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Participant name, case-insensitive. An unknown name is refused with `participant_not_found` | |
| description | Yes | Who the participant is: all that a reader of a case learns about the author of an entry |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes |
TDQS
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.
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.
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.
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.
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.
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_projectAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Project key, case-insensitive. An unknown key is refused with `project_not_found` | |
| title | No | New title; when left out, the title stays | |
| description | No | New description, up to 320 characters after trimming (`project_description_too_long` otherwise); when left out, the description stays |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes |
TDQS
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.
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.
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.
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.
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.
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_taskAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | 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` | |
| changes | Yes | ||
| version | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| status | Yes | Task status |
| entries | Yes | 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 |
| version | Yes | Task version after the call |
| parent_entry | No | 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. |
TDQS
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.
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.
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.
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.
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.
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_journalARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | 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` | |
| after | No | Journal sequence number `seq` to read after; `0` reads from the start. Entries are permanent: no `seq` is too old | |
| limit | No | Page size. Without a value, the installation's default page size | |
| types | No | Only entries of these types | |
| cursor | No | `next_cursor` of the previous page; without it, the first page | |
| project | No | Only entries of this project: its own case and the cases of its tasks | |
| timeout | No | 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| next_cursor | Yes | Cursor of the next page, sent back as `cursor`; `null` means this page is the last one |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v0.8.1- Changed
add_entry1 field changed- changed
Input schema / properties / refs / descriptionPrevious 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"
- Changed
add_project_entry1 field changed- changed
Input schema / properties / refs / descriptionPrevious 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"
- Changed
close_task1 field changed- changed
Input schema / $defs / ClosingEntry / properties / refs / descriptionPrevious 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"
34 tool updates
v0.5.2- Changed
add_entry19 fields changed- changed
Input schema / properties / body / descriptionPrevious 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" - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / refs / descriptionPrevious 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" - changed
Input schema / properties / refs / examplesPrevious value: -[ - [ - "TRK-42#3" - ] -]New value: +[ + [ + "TRK-42#12" + ] +] - changed
Input schema / properties / title / descriptionPrevious value: -"Заголовок записи: он стоит в описи дела, которую отдаёт `get_task`"New value: +"Entry title: its line in the case index of `get_task`. It states what happened, not how" - removed
Input schema / properties / title / examplesRemoved value: -[ - "Выбран asyncpg вместо psycopg: нужен LISTEN без потока" -] - changed
Input schema / properties / type / descriptionPrevious 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" - removed
Input schema / properties / type / examplesRemoved value: -[ - "decision" -] - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - changed
Output schema / descriptionPrevious 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`." - added
Output schema / properties / no / descriptionAdded value: +"Entry number in the task's case; with the key it forms `TRK-42#12`" - added
Output schema / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / properties / title / descriptionAdded 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"
- Added
add_project_entry - Changed
add_summary20 fields changed- changed
Input schema / properties / blockers / descriptionPrevious value: -"Что мешает. Пустым это поле быть не может: «ничего», если ничего"New value: +"What stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom" - removed
Input schema / properties / blockers / examplesRemoved value: -[ - "Ничего" -] - changed
Input schema / properties / done / descriptionPrevious 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" - removed
Input schema / properties / done / examplesRemoved value: -[ - "Разобрался, где сгорает номер задачи" -] - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / next_step / descriptionPrevious 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" - removed
Input schema / properties / next_step / examplesRemoved value: -[ - "Перенести вызов next_task_number в конец create_task" -] - changed
Input schema / properties / remaining / descriptionPrevious value: -"Что осталось до выхода задачи"New value: +"What remains before the task is done" - removed
Input schema / properties / remaining / examplesRemoved value: -[ - "Перенести выдачу номера после валидации" -] - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - changed
Output schema / descriptionPrevious 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`." - added
Output schema / properties / no / descriptionAdded value: +"Entry number in the task's case; with the key it forms `TRK-42#12`" - added
Output schema / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / properties / title / descriptionAdded 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"
- Changed
add_verdict22 fields changed- removed
Input schema / $defsRemoved value: -{ - "VerdictOutcome": { - "description": "Исход обзорной проверки. Значений ровно два: третьего состояния у проверки нет.", - "enum": [ - "passed", - "failed" - ], - "title": "VerdictOutcome", - "type": "string" - } -} - changed
Input schema / properties / check_no / descriptionPrevious 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`" - removed
Input schema / properties / check_no / examplesRemoved value: -[ - 3 -] - changed
Input schema / properties / evidence / descriptionPrevious value: -"Доказательство исхода: что запустил, что увидел, ссылка на материал"New value: +"What was run for the check as written and what it showed: the command, its output, a link to the material" - removed
Input schema / properties / evidence / examplesRemoved value: -[ - "docker compose run --rm test: 214 passed" -] - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - removed
Input schema / properties / outcome / $refRemoved value: -"#/$defs/VerdictOutcome" - changed
Input schema / properties / outcome / descriptionPrevious value: -"Исход проверки. Третьего состояния нет"New value: +"Outcome of the check; there is no third state" - added
Input schema / properties / outcome / enumAdded value: +[ + "passed", + "failed" +] - removed
Input schema / properties / outcome / examplesRemoved value: -[ - "passed" -] - added
Input schema / properties / outcome / typeAdded value: +"string" - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - changed
Output schema / descriptionPrevious 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`." - added
Output schema / properties / no / descriptionAdded value: +"Entry number in the task's case; with the key it forms `TRK-42#12`" - added
Output schema / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / properties / title / descriptionAdded 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"
- Changed
answer15 fields changed- changed
Input schema / properties / body / descriptionPrevious 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" - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / question_no / descriptionPrevious 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`" - removed
Input schema / properties / question_no / examplesRemoved value: -[ - 7 -] - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - changed
Output schema / descriptionPrevious 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`." - added
Output schema / properties / no / descriptionAdded value: +"Entry number in the task's case; with the key it forms `TRK-42#12`" - added
Output schema / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / properties / title / descriptionAdded 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"
- Added
archive_project - Changed
ask19 fields changed- changed
Input schema / properties / addressees / descriptionPrevious 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`" - removed
Input schema / properties / addressees / examplesRemoved value: -[ - [ - "owner" - ] -] - changed
Input schema / properties / blocking / descriptionPrevious 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" - removed
Input schema / properties / blocking / examplesRemoved value: -[ - true -] - changed
Input schema / properties / body / descriptionPrevious 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" - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / title / descriptionPrevious value: -"Заголовок записи: он стоит в описи дела, которую отдаёт `get_task`"New value: +"Entry title: its line in the case index of `get_task`. It states what happened, not how" - removed
Input schema / properties / title / examplesRemoved value: -[ - "Выбран asyncpg вместо psycopg: нужен LISTEN без потока" -] - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - changed
Output schema / descriptionPrevious 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`." - added
Output schema / properties / no / descriptionAdded value: +"Entry number in the task's case; with the key it forms `TRK-42#12`" - added
Output schema / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / properties / title / descriptionAdded 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"
- Changed
close_task52 fields changed- changed
Input schema / $defs / ClosingEntry / descriptionPrevious value: -"Запись без нагрузки: та же форма, что у `add_entry`."New value: +"An entry without payload, of the same shape as in `add_entry`." - changed
Input schema / $defs / ClosingEntry / properties / body / descriptionPrevious 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" - changed
Input schema / $defs / ClosingEntry / properties / refs / descriptionPrevious 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" - changed
Input schema / $defs / ClosingEntry / properties / refs / examplesPrevious value: -[ - [ - "TRK-42#3" - ] -]New value: +[ + [ + "TRK-42#12" + ] +] - changed
Input schema / $defs / ClosingEntry / properties / title / descriptionPrevious value: -"Заголовок записи: он стоит в описи дела, которую отдаёт `get_task`"New value: +"Entry title: its line in the case index of `get_task`. It states what happened, not how" - removed
Input schema / $defs / ClosingEntry / properties / title / examplesRemoved value: -[ - "Выбран asyncpg вместо psycopg: нужен LISTEN без потока" -] - changed
Input schema / $defs / ClosingEntry / properties / type / descriptionPrevious 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" - removed
Input schema / $defs / ClosingEntry / properties / type / examplesRemoved value: -[ - "decision" -] - changed
Input schema / $defs / ClosingSummary / descriptionPrevious 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." - changed
Input schema / $defs / ClosingSummary / properties / blockers / descriptionPrevious value: -"Что мешает. Пустым это поле быть не может: «ничего», если ничего"New value: +"What stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom" - removed
Input schema / $defs / ClosingSummary / properties / blockers / examplesRemoved value: -[ - "Ничего" -] - changed
Input schema / $defs / ClosingSummary / properties / done / descriptionPrevious 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" - removed
Input schema / $defs / ClosingSummary / properties / done / examplesRemoved value: -[ - "Разобрался, где сгорает номер задачи" -] - changed
Input schema / $defs / ClosingSummary / properties / next_step / descriptionPrevious 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" - removed
Input schema / $defs / ClosingSummary / properties / next_step / examplesRemoved value: -[ - "Перенести вызов next_task_number в конец create_task" -] - changed
Input schema / $defs / ClosingSummary / properties / remaining / descriptionPrevious value: -"Что осталось до выхода задачи"New value: +"What remains before the task is done" - removed
Input schema / $defs / ClosingSummary / properties / remaining / examplesRemoved value: -[ - "Перенести выдачу номера после валидации" -] - changed
Input schema / $defs / ClosingSummary / properties / unmeasured / descriptionPrevious 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" - removed
Input schema / $defs / ClosingSummary / properties / unmeasured / examplesRemoved value: -[ - "Прод-команда экрана не мерилась ни одной проверкой: гонял только дев-путь. Риск считаю теоретическим — команды отличаются одним флагом" -] - changed
Input schema / $defs / ClosingVerdict / descriptionPrevious value: -"Исход одной обзорной проверки с доказательством."New value: +"Outcome of one review check with its evidence." - changed
Input schema / $defs / ClosingVerdict / properties / check_no / descriptionPrevious 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`" - removed
Input schema / $defs / ClosingVerdict / properties / check_no / examplesRemoved value: -[ - 3 -] - changed
Input schema / $defs / ClosingVerdict / properties / evidence / descriptionPrevious value: -"Доказательство исхода: что запустил, что увидел, ссылка на материал"New value: +"What was run for the check as written and what it showed: the command, its output, a link to the material" - removed
Input schema / $defs / ClosingVerdict / properties / evidence / examplesRemoved value: -[ - "docker compose run --rm test: 214 passed" -] - removed
Input schema / $defs / ClosingVerdict / properties / outcome / $refRemoved value: -"#/$defs/VerdictOutcome" - changed
Input schema / $defs / ClosingVerdict / properties / outcome / descriptionPrevious value: -"Исход проверки. Третьего состояния нет"New value: +"Outcome of the check; there is no third state" - added
Input schema / $defs / ClosingVerdict / properties / outcome / enumAdded value: +[ + "passed", + "failed" +] - removed
Input schema / $defs / ClosingVerdict / properties / outcome / examplesRemoved value: -[ - "passed" -] - added
Input schema / $defs / ClosingVerdict / properties / outcome / typeAdded value: +"string" - removed
Input schema / $defs / VerdictOutcomeRemoved value: -{ - "description": "Исход обзорной проверки. Значений ровно два: третьего состояния у проверки нет.", - "enum": [ - "passed", - "failed" - ], - "title": "VerdictOutcome", - "type": "string" -} - changed
Input schema / properties / entries / descriptionPrevious value: -"Записи, которые подшиваются перед вердиктами: обычно `artifact` с указателями на результат"New value: +"Entries without payload filed before the verdicts, such as `artifact` pointers to the result" - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / summary / descriptionPrevious 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" - changed
Input schema / properties / verdicts / descriptionPrevious 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`" - changed
Output schema / $defs / AppendedEntryView / descriptionPrevious 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`." - added
Output schema / $defs / AppendedEntryView / properties / no / descriptionAdded value: +"Entry number in the task's case; with the key it forms `TRK-42#12`" - added
Output schema / $defs / AppendedEntryView / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / $defs / AppendedEntryView / properties / title / descriptionAdded 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" - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - removed
Output schema / $defs / TaskStatusRemoved value: -{ - "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "title": "TaskStatus", - "type": "string" -} - changed
Output schema / descriptionPrevious 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." - added
Output schema / properties / entries / descriptionAdded value: +"Filed entries in filing order, ending with `status_changed`" - removed
Output schema / properties / status / $refRemoved value: -"#/$defs/TaskStatus" - added
Output schema / properties / status / descriptionAdded value: +"Task status" - added
Output schema / properties / status / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - added
Output schema / properties / status / typeAdded value: +"string"
- Added
create_project - Removed
create_queue - Changed
create_task34 fields changed- removed
Input schema / $defs / TaskPriorityRemoved value: -{ - "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.", - "enum": [ - "low", - "normal", - "high", - "critical" - ], - "title": "TaskPriority", - "type": "string" -} - changed
Input schema / $defs / TaskSections / descriptionPrevious value: -"Пять разделов задачи. Правятся только в `backlog`, дальше неизменяемы."New value: +"The five task sections; they are editable only while the task is in `backlog`." - changed
Input schema / $defs / TaskSections / properties / checks / descriptionPrevious value: -"Обзорные проверки по порядку, нумерация с 1: что запустить и что должно получиться"New value: +"Review checks in order, numbered from 1; each names what is run and the expected result" - removed
Input schema / $defs / TaskSections / properties / checks / examplesRemoved value: -[ - [ - "docker compose run --rm test: весь набор зелёный" - ] -] - changed
Input schema / $defs / TaskSections / properties / constraints / descriptionPrevious value: -"Чего не делать, что не входит, чего нельзя менять"New value: +"What is out of scope and what stays unchanged" - changed
Input schema / $defs / TaskSections / properties / context / descriptionPrevious value: -"Что уже есть, на что опираться, какие заметки читать"New value: +"What already exists and what the work relies on" - changed
Input schema / $defs / TaskSections / properties / goal / descriptionPrevious value: -"Зачем задача нужна и что изменится"New value: +"Why the task exists and what will change" - changed
Input schema / $defs / TaskSections / properties / output / descriptionPrevious value: -"Что должно существовать по завершении"New value: +"What exists once the task is done" - changed
Input schema / properties / assignee / descriptionPrevious 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`" - removed
Input schema / properties / assignee / examplesRemoved value: -[ - "release_bot" -] - changed
Input schema / properties / description / descriptionPrevious 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" - removed
Input schema / properties / description / examplesRemoved value: -[ - "Ключ выдаётся до валидации и сгорает на неудачном запросе" -] - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / parent / descriptionPrevious 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" - removed
Input schema / properties / priority / $refRemoved value: -"#/$defs/TaskPriority" - changed
Input schema / properties / priority / descriptionPrevious value: -"Приоритет задачи"New value: +"Task priority" - added
Input schema / properties / priority / enumAdded value: +[ + "low", + "normal", + "high", + "critical" +] - removed
Input schema / properties / priority / examplesRemoved value: -[ - "normal" -] - added
Input schema / properties / priority / typeAdded value: +"string" - added
Input schema / properties / projectAdded value: +{ + "description": "Project key, case-insensitive. An unknown key is refused with `project_not_found`", + "examples": [ + "TRK" + ], + "title": "Project", + "type": "string" +} - removed
Input schema / properties / queueRemoved value: -{ - "description": "Ключ очереди, например `TRK`. Регистр не важен", - "examples": [ - "TRK" - ], - "title": "Queue", - "type": "string" -} - changed
Input schema / properties / sections / descriptionPrevious 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`" - changed
Input schema / properties / title / descriptionPrevious value: -"Название задачи одной строкой"New value: +"Task title, one line" - removed
Input schema / properties / title / examplesRemoved value: -[ - "Починить выдачу ключей задач" -] - changed
Input schema / requiredPrevious value: -[ - "queue", - "title", - "description" -]New value: +[ + "project", + "title", + "description" +] - removed
Output schema / $defsRemoved value: -{ - "TaskStatus": { - "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "title": "TaskStatus", - "type": "string" - } -} - changed
Output schema / descriptionPrevious value: -"Ответ изменяющего инструмента: что стало и чем это подшито, без карточки."New value: +"Task state after the call and the entries it filed; the card in full is returned\nby `get_task`." - added
Output schema / properties / entries / descriptionAdded 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" - added
Output schema / properties / parent_entryAdded 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" +} - removed
Output schema / properties / status / $refRemoved value: -"#/$defs/TaskStatus" - added
Output schema / properties / status / descriptionAdded value: +"Task status" - added
Output schema / properties / status / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - added
Output schema / properties / status / typeAdded value: +"string" - added
Output schema / properties / version / descriptionAdded value: +"Task version after the call"
- Added
get_project - Removed
get_queue - Changed
get_task92 fields changed- changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Output schema / $defs / AnswerFactsView / descriptionPrevious value: -"Ответ: на какой вопрос той же задачи."New value: +"Answer: the question of the same task it answers." - changed
Output schema / $defs / AssigneeChangedFactsView / descriptionPrevious value: -"Смена исполнителя: оба имени."New value: +"Assignee change: both names." - added
Output schema / $defs / AttributeFactsViewAdded 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" +} - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - removed
Output schema / $defs / EntryTypeRemoved 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" -} - changed
Output schema / $defs / EntryView / descriptionPrevious value: -"Запись дела целиком.\n\n`payload` — единственное поле слоя без объявленной формы, и это то же исключение,\nчто и в схеме REST (`docs/notes/api.md`, «`payload` записи дела — исключение из\nтипизации, названное по месту»): нагрузка своя у каждого типа записи, и типизирует\nеё отдельная задача — сразу в обоих интерфейсах, иначе они разойдутся. `JsonValue`,\nа не `Any`: форма свободна, но значение обязано быть представимо в JSON."New value: +"Case entry in full." - added
Output schema / $defs / EntryView / properties / project_keyAdded 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" +} - added
Output schema / $defs / EntryView / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / $defs / EntryView / properties / task_key / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / $defs / EntryView / properties / task_key / descriptionAdded value: +"Key of the owning task; `null` for an entry of a project's case" - removed
Output schema / $defs / EntryView / properties / task_key / typeRemoved value: -"string" - removed
Output schema / $defs / EntryView / properties / type / $refRemoved value: -"#/$defs/EntryType" - added
Output schema / $defs / EntryView / properties / type / descriptionAdded 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" - added
Output schema / $defs / EntryView / properties / type / enumAdded 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" +] - added
Output schema / $defs / EntryView / properties / type / typeAdded value: +"string" - changed
Output schema / $defs / EntryView / requiredPrevious 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" +] - added
Output schema / $defs / FactsView / discriminator / mapping / archivedAdded value: +"#/$defs/NoFactsView" - added
Output schema / $defs / FactsView / discriminator / mapping / attribute_changedAdded value: +"#/$defs/AttributeFactsView" - added
Output schema / $defs / FactsView / discriminator / mapping / attribute_createdAdded value: +"#/$defs/AttributeFactsView" - added
Output schema / $defs / FactsView / discriminator / mapping / attribute_removedAdded value: +"#/$defs/AttributeFactsView" - added
Output schema / $defs / FactsView / discriminator / mapping / movedAdded value: +"#/$defs/MovedFactsView" - added
Output schema / $defs / FactsView / discriminator / mapping / restoredAdded value: +"#/$defs/NoFactsView" - changed
Output schema / $defs / FactsView / oneOfPrevious 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" + } +] - changed
Output schema / $defs / FeaturesView / descriptionPrevious value: -"Вычисляемые признаки задачи (`CONCEPT.md`, 4.3)."New value: +"Computed task features." - changed
Output schema / $defs / FieldChangedFactsView / descriptionPrevious value: -"Правка обвязки: какое поле."New value: +"Change of a non-section field: which one." - changed
Output schema / $defs / FieldChangedFactsView / properties / field / anyOfPrevious 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" + } +] - changed
Output schema / $defs / HeadingView / descriptionPrevious value: -"Строка описи дела: то, что видно о записи, не читая её тела."New value: +"Line of the case index: what is known of an entry without its body." - removed
Output schema / $defs / HeadingView / properties / type / $refRemoved value: -"#/$defs/EntryType" - added
Output schema / $defs / HeadingView / properties / type / descriptionAdded 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" - added
Output schema / $defs / HeadingView / properties / type / enumAdded 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" +] - added
Output schema / $defs / HeadingView / properties / type / typeAdded value: +"string" - changed
Output schema / $defs / LinkFactsView / descriptionPrevious value: -"Связь появилась или снята: её вид и вторая сторона."New value: +"Link added or removed: its kind and the other side." - changed
Output schema / $defs / LinkFactsView / properties / link_kind / anyOfPrevious 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" + } +] - removed
Output schema / $defs / LinkKindRemoved value: -{ - "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.", - "enum": [ - "parent", - "child", - "blocks", - "blocked_by", - "relates" - ], - "title": "LinkKind", - "type": "string" -} - changed
Output schema / $defs / LinkOtherView / descriptionPrevious value: -"Задача на другом конце связи."New value: +"Task on the other side of a link." - removed
Output schema / $defs / LinkOtherView / properties / status / $refRemoved value: -"#/$defs/TaskStatus" - added
Output schema / $defs / LinkOtherView / properties / status / descriptionAdded value: +"Task status" - added
Output schema / $defs / LinkOtherView / properties / status / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - added
Output schema / $defs / LinkOtherView / properties / status / typeAdded value: +"string" - changed
Output schema / $defs / LinkView / descriptionPrevious value: -"Связь со стороны своей задачи: вид назван ролью **этой** задачи."New value: +"Link seen from this task: `kind` is the role of this task." - removed
Output schema / $defs / LinkView / properties / kind / $refRemoved value: -"#/$defs/LinkKind" - added
Output schema / $defs / LinkView / properties / kind / descriptionAdded value: +"Link kind, named by the role of the task the link is shown for" - added
Output schema / $defs / LinkView / properties / kind / enumAdded value: +[ + "parent", + "child", + "blocks", + "blocked_by", + "relates" +] - added
Output schema / $defs / LinkView / properties / kind / typeAdded value: +"string" - added
Output schema / $defs / MovedFactsViewAdded 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" +} - changed
Output schema / $defs / NoFactsView / descriptionPrevious value: -"Фактов нет: заголовок записи пишет её автор."New value: +"No facts: the author writes the entry title." - changed
Output schema / $defs / NoFactsView / properties / type / enumPrevious value: -[ - "summary", - "decision", - "attempt", - "finding", - "artifact", - "remark", - "note", - "created" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "remark", + "note", + "created", + "archived", + "restored" +] - changed
Output schema / $defs / QuestionFactsView / descriptionPrevious value: -"Вопрос: кому адресован и держит ли работу."New value: +"Question: addressees and whether it blocks the work." - removed
Output schema / $defs / QueueRefViewRemoved value: -{ - "description": "Очередь одной строкой: ключ и название.", - "properties": { - "key": { - "title": "Key", - "type": "string" - }, - "title": { - "title": "Title", - "type": "string" - } - }, - "required": [ - "key", - "title" - ], - "title": "QueueRefView", - "type": "object" -} - removed
Output schema / $defs / RemarkOutcomeRemoved value: -{ - "description": "Чем разобрано замечание (`CONCEPT.md`, 3.4).\n\nСписок закрыт и покрывает все четыре судьбы претензии: поправили сразу, приняли в\nработу отдельной задачей, не поняли и ждём уточнения, менять не будем. Свободного\n«прочее» здесь нет намеренно — оно снова сделало бы исход текстом.", - "enum": [ - "fixed", - "accepted", - "needs_detail", - "declined" - ], - "title": "RemarkOutcome", - "type": "string" -} - changed
Output schema / $defs / ResolutionFactsView / descriptionPrevious value: -"Резолюция: какое замечание разобрано, чем и куда ушла работа."New value: +"Resolution: which remark, its outcome and the continuation task." - changed
Output schema / $defs / ResolutionFactsView / properties / outcome / anyOfPrevious value: -[ - { - "$ref": "#/$defs/RemarkOutcome" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "How a remark was resolved", + "enum": [ + "fixed", + "accepted", + "needs_detail", + "declined" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / SectionChangedFactsView / descriptionPrevious value: -"Правка задания: какой раздел, и какая проверка при точечной правке."New value: +"Section change: which field, and which check for a single-check edit." - changed
Output schema / $defs / SectionChangedFactsView / properties / field / anyOfPrevious 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" + } +] - changed
Output schema / $defs / StatusChangedFactsView / descriptionPrevious value: -"Переход статуса: оба конца и был ли назван повод."New value: +"Status change: both ends and whether a reason was given." - changed
Output schema / $defs / StatusChangedFactsView / properties / from_status / anyOfPrevious value: -[ - { - "$ref": "#/$defs/TaskStatus" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / StatusChangedFactsView / properties / to_status / anyOfPrevious value: -[ - { - "$ref": "#/$defs/TaskStatus" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / $defs / TaskFieldRemoved 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" -} - removed
Output schema / $defs / TaskPriorityRemoved value: -{ - "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.", - "enum": [ - "low", - "normal", - "high", - "critical" - ], - "title": "TaskPriority", - "type": "string" -} - added
Output schema / $defs / TaskProjectViewAdded 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" +} - removed
Output schema / $defs / TaskStatusRemoved value: -{ - "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "title": "TaskStatus", - "type": "string" -} - changed
Output schema / $defs / TaskView / descriptionPrevious value: -"Карточка задачи — тот же набор полей, что у `TaskRead` в REST."New value: +"Task card." - added
Output schema / $defs / TaskView / properties / key / descriptionAdded value: +"Current key; changes only when the task moves to another project with `move_task`" - added
Output schema / $defs / TaskView / properties / previous_keysAdded 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" +} - removed
Output schema / $defs / TaskView / properties / priority / $refRemoved value: -"#/$defs/TaskPriority" - added
Output schema / $defs / TaskView / properties / priority / descriptionAdded value: +"Task priority, from lowest to highest" - added
Output schema / $defs / TaskView / properties / priority / enumAdded value: +[ + "low", + "normal", + "high", + "critical" +] - added
Output schema / $defs / TaskView / properties / priority / typeAdded value: +"string" - added
Output schema / $defs / TaskView / properties / projectAdded value: +{ + "$ref": "#/$defs/TaskProjectView" +} - removed
Output schema / $defs / TaskView / properties / queueRemoved value: -{ - "$ref": "#/$defs/QueueRefView" -} - removed
Output schema / $defs / TaskView / properties / status / $refRemoved value: -"#/$defs/TaskStatus" - added
Output schema / $defs / TaskView / properties / status / descriptionAdded value: +"Task status" - added
Output schema / $defs / TaskView / properties / status / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - added
Output schema / $defs / TaskView / properties / status / typeAdded value: +"string" - changed
Output schema / $defs / TaskView / requiredPrevious 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" +] - changed
Output schema / $defs / VerdictFactsView / descriptionPrevious value: -"Вердикт: какая проверка, чем кончилась и не переписали ли её после."New value: +"Verdict: which check, its outcome and whether the check was rewritten since." - changed
Output schema / $defs / VerdictFactsView / properties / outcome / anyOfPrevious value: -[ - { - "$ref": "#/$defs/VerdictOutcome" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Outcome of a review check", + "enum": [ + "passed", + "failed" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / $defs / VerdictOutcomeRemoved value: -{ - "description": "Исход обзорной проверки. Значений ровно два: третьего состояния у проверки нет.", - "enum": [ - "passed", - "failed" - ], - "title": "VerdictOutcome", - "type": "string" -} - changed
Output schema / descriptionPrevious value: -"Пакет преемника: всё, что нужно агенту с чистым контекстом, одним вызовом."New value: +"Everything about one task: card, parent and children, links, features, latest\nsummary, open questions, unresolved remarks, transition targets and case index." - added
Output schema / properties / childrenAdded value: +{ + "items": { + "$ref": "#/$defs/LinkOtherView" + }, + "title": "Children", + "type": "array" +} - added
Output schema / properties / parentAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/LinkOtherView" + }, + { + "type": "null" + } + ] +} - removed
Output schema / properties / transitions / items / $refRemoved value: -"#/$defs/TaskStatus" - added
Output schema / properties / transitions / items / descriptionAdded value: +"Task status" - added
Output schema / properties / transitions / items / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - added
Output schema / properties / transitions / items / typeAdded value: +"string" - changed
Output schema / requiredPrevious value: -[ - "task", - "links", - "features", - "summary", - "questions", - "remarks", - "transitions", - "index" -]New value: +[ + "task", + "parent", + "children", + "links", + "features", + "summary", + "questions", + "remarks", + "transitions", + "index" +]
- Changed
link20 fields changed- removed
Input schema / $defsRemoved value: -{ - "LinkKind": { - "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.", - "enum": [ - "parent", - "child", - "blocks", - "blocked_by", - "relates" - ], - "title": "LinkKind", - "type": "string" - } -} - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - removed
Input schema / properties / kind / $refRemoved value: -"#/$defs/LinkKind" - changed
Input schema / properties / kind / descriptionPrevious 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`" - added
Input schema / properties / kind / enumAdded value: +[ + "parent", + "child", + "blocks", + "blocked_by", + "relates" +] - removed
Input schema / properties / kind / examplesRemoved value: -[ - "blocked_by" -] - added
Input schema / properties / kind / typeAdded value: +"string" - changed
Input schema / properties / other / descriptionPrevious value: -"Ключ задачи на другой стороне связи"New value: +"Key of the task on the other side of the link" - removed
Output schema / $defsRemoved 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" - } -} - changed
Output schema / descriptionPrevious value: -"Связь со стороны своей задачи: вид назван ролью **этой** задачи."New value: +"Entries filed by `link` or `unlink` on both sides of the link." - removed
Output schema / properties / authorRemoved value: -{ - "$ref": "#/$defs/AuthorView" -} - removed
Output schema / properties / created_atRemoved value: -{ - "format": "date-time", - "title": "Created At", - "type": "string" -} - added
Output schema / properties / entryAdded value: +{ + "description": "Number of the `link_added` or `link_removed` entry in the case of `key`", + "title": "Entry", + "type": "integer" +} - added
Output schema / properties / keyAdded value: +{ + "title": "Key", + "type": "string" +} - removed
Output schema / properties / kindRemoved value: -{ - "$ref": "#/$defs/LinkKind" -} - removed
Output schema / properties / otherRemoved value: -{ - "$ref": "#/$defs/LinkOtherView" -} - added
Output schema / properties / other_entryAdded value: +{ + "description": "Number of the same entry in the case of `other`", + "title": "Other Entry", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "kind", - "other", - "author", - "created_at" -]New value: +[ + "key", + "entry", + "other_entry" +] - changed
Output schema / titlePrevious value: -"LinkView"New value: +"LinkFilingView"
- Changed
list_participants10 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page" - changed
Input schema / properties / limit / descriptionPrevious value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size" - removed
Input schema / properties / limit / examplesRemoved value: -[ - 25 -] - removed
Output schema / $defs / ParticipantKindRemoved value: -{ - "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.", - "enum": [ - "human", - "agent" - ], - "title": "ParticipantKind", - "type": "string" -} - changed
Output schema / $defs / ParticipantView / descriptionPrevious value: -"Участник реестра: кому можно адресовать вопрос и что о нём известно."New value: +"Registry participant: a possible addressee of a question." - removed
Output schema / $defs / ParticipantView / properties / kind / $refRemoved value: -"#/$defs/ParticipantKind" - added
Output schema / $defs / ParticipantView / properties / kind / descriptionAdded value: +"Kind of participant. It grants no rights: participants of either kind can make any entry and any transition" - added
Output schema / $defs / ParticipantView / properties / kind / enumAdded value: +[ + "human", + "agent" +] - added
Output schema / $defs / ParticipantView / properties / kind / typeAdded value: +"string" - added
Output schema / properties / next_cursor / descriptionAdded value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
- Added
list_projects - Removed
list_queues - Added
move_task - Changed
read_entries31 fields changed- removed
Input schema / $defsRemoved 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" - } -} - changed
Input schema / properties / after_no / descriptionPrevious value: -"Только записи после этого номера — что случилось с тех пор"New value: +"Only entries filed after the entry with this number" - removed
Input schema / properties / after_no / examplesRemoved value: -[ - 12 -] - changed
Input schema / properties / cursor / descriptionPrevious value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page" - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / limit / descriptionPrevious value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size" - removed
Input schema / properties / limit / examplesRemoved value: -[ - 25 -] - changed
Input schema / properties / nos / descriptionPrevious value: -"Только эти номера записей"New value: +"Only entries with these numbers" - removed
Input schema / properties / nos / examplesRemoved value: -[ - [ - 3, - 12 - ] -] - changed
Input schema / properties / types / anyOfPrevious 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" + } +] - changed
Input schema / properties / types / descriptionPrevious value: -"Только записи этих типов"New value: +"Only entries of these types" - removed
Input schema / properties / types / examplesRemoved value: -[ - [ - "decision", - "attempt" - ] -] - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - removed
Output schema / $defs / EntryTypeRemoved 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" -} - changed
Output schema / $defs / EntryView / descriptionPrevious value: -"Запись дела целиком.\n\n`payload` — единственное поле слоя без объявленной формы, и это то же исключение,\nчто и в схеме REST (`docs/notes/api.md`, «`payload` записи дела — исключение из\nтипизации, названное по месту»): нагрузка своя у каждого типа записи, и типизирует\nеё отдельная задача — сразу в обоих интерфейсах, иначе они разойдутся. `JsonValue`,\nа не `Any`: форма свободна, но значение обязано быть представимо в JSON."New value: +"Case entry in full." - added
Output schema / $defs / EntryView / properties / project_keyAdded 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" +} - added
Output schema / $defs / EntryView / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / $defs / EntryView / properties / task_key / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / $defs / EntryView / properties / task_key / descriptionAdded value: +"Key of the owning task; `null` for an entry of a project's case" - removed
Output schema / $defs / EntryView / properties / task_key / typeRemoved value: -"string" - removed
Output schema / $defs / EntryView / properties / type / $refRemoved value: -"#/$defs/EntryType" - added
Output schema / $defs / EntryView / properties / type / descriptionAdded 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" - added
Output schema / $defs / EntryView / properties / type / enumAdded 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" +] - added
Output schema / $defs / EntryView / properties / type / typeAdded value: +"string" - changed
Output schema / $defs / EntryView / requiredPrevious 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" +] - added
Output schema / properties / next_cursor / descriptionAdded value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
- Added
read_project_entries - Changed
register_participant17 fields changed- removed
Input schema / $defsRemoved value: -{ - "ParticipantKind": { - "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.", - "enum": [ - "human", - "agent" - ], - "title": "ParticipantKind", - "type": "string" - } -} - changed
Input schema / properties / description / descriptionPrevious value: -"Кто это. Всё, что читающий дело узнает об авторе записи"New value: +"Who the participant is: all that a reader of a case learns about the author of an entry" - removed
Input schema / properties / description / examplesRemoved value: -[ - "Релизный бот, ведёт задачи выкладки" -] - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - removed
Input schema / properties / kind / $refRemoved value: -"#/$defs/ParticipantKind" - changed
Input schema / properties / kind / descriptionPrevious value: -"Человек или постоянный агент"New value: +"Human or permanent agent" - added
Input schema / properties / kind / enumAdded value: +[ + "human", + "agent" +] - removed
Input schema / properties / kind / examplesRemoved value: -[ - "agent" -] - added
Input schema / properties / kind / typeAdded value: +"string" - changed
Input schema / properties / name / descriptionPrevious 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`" - removed
Input schema / properties / name / examplesRemoved value: -[ - "release_bot" -] - removed
Output schema / $defsRemoved value: -{ - "ParticipantKind": { - "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.", - "enum": [ - "human", - "agent" - ], - "title": "ParticipantKind", - "type": "string" - } -} - changed
Output schema / descriptionPrevious value: -"Участник реестра: кому можно адресовать вопрос и что о нём известно."New value: +"Participant name in its stored, lower-case form; the registry is returned by\n`list_participants`." - removed
Output schema / properties / descriptionRemoved value: -{ - "title": "Description", - "type": "string" -} - removed
Output schema / properties / kindRemoved value: -{ - "$ref": "#/$defs/ParticipantKind" -} - changed
Output schema / requiredPrevious value: -[ - "kind", - "name", - "description" -]New value: +[ + "name" +] - changed
Output schema / titlePrevious value: -"ParticipantView"New value: +"ParticipantNameView"
- Added
remove_attribute - Changed
resolve22 fields changed- removed
Input schema / $defsRemoved value: -{ - "RemarkOutcome": { - "description": "Чем разобрано замечание (`CONCEPT.md`, 3.4).\n\nСписок закрыт и покрывает все четыре судьбы претензии: поправили сразу, приняли в\nработу отдельной задачей, не поняли и ждём уточнения, менять не будем. Свободного\n«прочее» здесь нет намеренно — оно снова сделало бы исход текстом.", - "enum": [ - "fixed", - "accepted", - "needs_detail", - "declined" - ], - "title": "RemarkOutcome", - "type": "string" - } -} - changed
Input schema / properties / body / descriptionPrevious 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" - changed
Input schema / properties / idempotency_key / descriptionPrevious 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" - changed
Input schema / properties / key / descriptionPrevious 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`" - removed
Input schema / properties / outcome / $refRemoved value: -"#/$defs/RemarkOutcome" - changed
Input schema / properties / outcome / descriptionPrevious 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" - added
Input schema / properties / outcome / enumAdded value: +[ + "fixed", + "accepted", + "needs_detail", + "declined" +] - removed
Input schema / properties / outcome / examplesRemoved value: -[ - "accepted" -] - added
Input schema / properties / outcome / typeAdded value: +"string" - changed
Input schema / properties / remark_no / descriptionPrevious value: -"Номер записи `remark` в этой же задаче"New value: +"Number of the `remark` entry in the same task; any other number is refused with `entry_fields_invalid`" - removed
Input schema / properties / remark_no / examplesRemoved value: -[ - 7 -] - changed
Input schema / properties / task / descriptionPrevious 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`" - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - changed
Output schema / descriptionPrevious 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`." - added
Output schema / properties / no / descriptionAdded value: +"Entry number in the task's case; with the key it forms `TRK-42#12`" - added
Output schema / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / properties / title / descriptionAdded 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"
- Added
restore_project - Changed
search_tasks49 fields changed- removed
Input schema / $defsRemoved 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" - } -} - changed
Input schema / properties / assignee / descriptionPrevious 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" - removed
Input schema / properties / assignee / examplesRemoved value: -[ - [ - "release_bot" - ] -] - changed
Input schema / properties / blocked / descriptionPrevious 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`" - changed
Input schema / properties / cursor / descriptionPrevious value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page" - changed
Input schema / properties / fields / defaultPrevious value: -[ - "key", - "title", - "status", - "assignee", - "priority", - "features", - "parents" -]New value: +[ + "key", + "title", + "status", + "assignee", + "priority", + "features", + "parent" +] - changed
Input schema / properties / fields / descriptionPrevious 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`" - changed
Input schema / properties / key / descriptionPrevious 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" - changed
Input schema / properties / limit / descriptionPrevious value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size" - removed
Input schema / properties / limit / examplesRemoved value: -[ - 25 -] - changed
Input schema / properties / open_blocking_questions / descriptionPrevious value: -"Из них помеченных `blocking`; `0` означает «ничто не мешает»"New value: +"Exact number of unanswered `blocking` questions; `0` means none blocks" - changed
Input schema / properties / open_questions / descriptionPrevious value: -"Ровно столько вопросов без ответа. Для диапазонов есть язык запросов"New value: +"Exact number of unanswered questions; ranges go in `query`" - changed
Input schema / properties / open_remarks / descriptionPrevious value: -"Ровно столько замечаний без резолюции. Для диапазонов есть язык запросов"New value: +"Exact number of unresolved remarks; ranges go in `query`" - changed
Input schema / properties / parent / descriptionPrevious 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»" - changed
Input schema / properties / priority / anyOfPrevious 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" + } +] - changed
Input schema / properties / priority / descriptionPrevious value: -"Приоритеты"New value: +"Priorities" - removed
Input schema / properties / priority / examplesRemoved value: -[ - [ - "high" - ] -] - added
Input schema / properties / projectAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Project keys", + "examples": [ + [ + "TRK" + ] + ], + "title": "Project" +} - changed
Input schema / properties / query / descriptionPrevious 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" - changed
Input schema / properties / query / examplesPrevious 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" +] - removed
Input schema / properties / queueRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Ключи очередей", - "examples": [ - [ - "TRK" - ] - ], - "title": "Queue" -} - changed
Input schema / properties / remarks_in_work / descriptionPrevious value: -"Замечаний, принятых в работу, чья задача-продолжение ещё не закрыта: «разобрано, но работа не доделана»"New value: +"Number of remarks resolved as `accepted` whose continuation task is not closed yet" - changed
Input schema / properties / sort / descriptionPrevious 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`" - changed
Input schema / properties / status / anyOfPrevious 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" + } +] - changed
Input schema / properties / status / descriptionPrevious value: -"Статусы задач"New value: +"Task statuses" - removed
Input schema / properties / status / examplesRemoved value: -[ - [ - "open" - ] -] - changed
Input schema / properties / text / descriptionPrevious value: -"Подстрока в названии или описании, без учёта регистра"New value: +"Substring of the title or description, case-insensitive" - removed
Input schema / properties / text / examplesRemoved value: -[ - "выдача ключей" -] - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - changed
Output schema / $defs / FeaturesView / descriptionPrevious value: -"Вычисляемые признаки задачи (`CONCEPT.md`, 4.3)."New value: +"Computed task features." - changed
Output schema / $defs / FoundTaskView / descriptionPrevious 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." - added
Output schema / $defs / FoundTaskView / properties / parentAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/ParentView" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Output schema / $defs / FoundTaskView / properties / parentsRemoved value: -{ - "anyOf": [ - { - "items": { - "$ref": "#/$defs/ParentView" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Parents" -} - added
Output schema / $defs / FoundTaskView / properties / previous_keysAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Previous Keys" +} - changed
Output schema / $defs / FoundTaskView / properties / priority / anyOfPrevious value: -[ - { - "$ref": "#/$defs/TaskPriority" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task priority, from lowest to highest", + "enum": [ + "low", + "normal", + "high", + "critical" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / $defs / FoundTaskView / properties / projectAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/ProjectRefView" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Output schema / $defs / FoundTaskView / properties / queueRemoved value: -{ - "anyOf": [ - { - "$ref": "#/$defs/QueueRefView" - }, - { - "type": "null" - } - ], - "default": null -} - changed
Output schema / $defs / FoundTaskView / properties / status / anyOfPrevious value: -[ - { - "$ref": "#/$defs/TaskStatus" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / ParentView / descriptionPrevious value: -"Прямой родитель задачи в строке выдачи: ключ и название (`CONCEPT.md`, 4.4)."New value: +"Parent task: key and title." - added
Output schema / $defs / ProjectRefViewAdded 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" +} - removed
Output schema / $defs / QueueRefViewRemoved value: -{ - "description": "Очередь одной строкой: ключ и название.", - "properties": { - "key": { - "title": "Key", - "type": "string" - }, - "title": { - "title": "Title", - "type": "string" - } - }, - "required": [ - "key", - "title" - ], - "title": "QueueRefView", - "type": "object" -} - removed
Output schema / $defs / TaskPriorityRemoved value: -{ - "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.", - "enum": [ - "low", - "normal", - "high", - "critical" - ], - "title": "TaskPriority", - "type": "string" -} - removed
Output schema / $defs / TaskStatusRemoved value: -{ - "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "title": "TaskStatus", - "type": "string" -} - added
Output schema / properties / next_cursor / descriptionAdded value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
- Added
set_attribute - Changed
transition18 fields changed- removed
Input schema / $defsRemoved value: -{ - "TaskStatus": { - "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "title": "TaskStatus", - "type": "string" - } -} - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / reason / descriptionPrevious 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" - removed
Input schema / properties / reason / examplesRemoved value: -[ - "Жду ответа на TRK-42#7" -] - removed
Input schema / properties / to / $refRemoved value: -"#/$defs/TaskStatus" - changed
Input schema / properties / to / descriptionPrevious value: -"Целевой статус"New value: +"Target status" - added
Input schema / properties / to / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - removed
Input schema / properties / to / examplesRemoved value: -[ - "open" -] - added
Input schema / properties / to / typeAdded value: +"string" - removed
Output schema / $defsRemoved value: -{ - "TaskStatus": { - "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "title": "TaskStatus", - "type": "string" - } -} - changed
Output schema / descriptionPrevious value: -"Ответ изменяющего инструмента: что стало и чем это подшито, без карточки."New value: +"Task state after the call and the entries it filed; the card in full is returned\nby `get_task`." - added
Output schema / properties / entries / descriptionAdded 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" - added
Output schema / properties / parent_entryAdded 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" +} - removed
Output schema / properties / status / $refRemoved value: -"#/$defs/TaskStatus" - added
Output schema / properties / status / descriptionAdded value: +"Task status" - added
Output schema / properties / status / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - added
Output schema / properties / status / typeAdded value: +"string" - added
Output schema / properties / version / descriptionAdded value: +"Task version after the call"
- Changed
unlink17 fields changed- removed
Input schema / $defsRemoved value: -{ - "LinkKind": { - "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.", - "enum": [ - "parent", - "child", - "blocks", - "blocked_by", - "relates" - ], - "title": "LinkKind", - "type": "string" - } -} - changed
Input schema / properties / key / descriptionPrevious 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`" - removed
Input schema / properties / kind / $refRemoved value: -"#/$defs/LinkKind" - changed
Input schema / properties / kind / descriptionPrevious 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`" - added
Input schema / properties / kind / enumAdded value: +[ + "parent", + "child", + "blocks", + "blocked_by", + "relates" +] - removed
Input schema / properties / kind / examplesRemoved value: -[ - "blocked_by" -] - added
Input schema / properties / kind / typeAdded value: +"string" - changed
Input schema / properties / other / descriptionPrevious value: -"Ключ задачи на другой стороне связи"New value: +"Key of the task on the other side of the link" - removed
Output schema / $defsRemoved value: -{ - "LinkKind": { - "description": "Вид связи. Перечислены обе стороны каждой пары: клиент адресует любую из них.", - "enum": [ - "parent", - "child", - "blocks", - "blocked_by", - "relates" - ], - "title": "LinkKind", - "type": "string" - } -} - changed
Output schema / descriptionPrevious value: -"Ответ `unlink`: какая связь снята и с какой стороны её назвали."New value: +"Entries filed by `link` or `unlink` on both sides of the link." - added
Output schema / properties / entryAdded value: +{ + "description": "Number of the `link_added` or `link_removed` entry in the case of `key`", + "title": "Entry", + "type": "integer" +} - removed
Output schema / properties / kindRemoved value: -{ - "$ref": "#/$defs/LinkKind" -} - removed
Output schema / properties / otherRemoved value: -{ - "title": "Other", - "type": "string" -} - added
Output schema / properties / other_entryAdded value: +{ + "description": "Number of the same entry in the case of `other`", + "title": "Other Entry", + "type": "integer" +} - removed
Output schema / properties / removedRemoved value: -{ - "title": "Removed", - "type": "boolean" -} - changed
Output schema / requiredPrevious value: -[ - "key", - "kind", - "other", - "removed" -]New value: +[ + "key", + "entry", + "other_entry" +] - changed
Output schema / titlePrevious value: -"UnlinkView"New value: +"LinkFilingView"
- Changed
update_participant10 fields changed- changed
Input schema / properties / description / descriptionPrevious value: -"Кто это. Всё, что читающий дело узнает об авторе записи"New value: +"Who the participant is: all that a reader of a case learns about the author of an entry" - removed
Input schema / properties / description / examplesRemoved value: -[ - "Релизный бот, ведёт задачи выкладки" -] - changed
Input schema / properties / name / descriptionPrevious value: -"Имя участника из реестра. Регистр не важен"New value: +"Participant name, case-insensitive. An unknown name is refused with `participant_not_found`" - removed
Input schema / properties / name / examplesRemoved value: -[ - "release_bot" -] - removed
Output schema / $defsRemoved value: -{ - "ParticipantKind": { - "description": "Род участника.\n\nРолей и прав за родом не стоит: любую запись и любой переход может сделать участник\nлюбого рода (`CONCEPT.md`, 3.1). Род нужен, чтобы читающий дело понимал, кто\nговорит, и чтобы интерфейс человека отличал людей от агентов в списке адресатов.", - "enum": [ - "human", - "agent" - ], - "title": "ParticipantKind", - "type": "string" - } -} - changed
Output schema / descriptionPrevious value: -"Участник реестра: кому можно адресовать вопрос и что о нём известно."New value: +"Participant name in its stored, lower-case form; the registry is returned by\n`list_participants`." - removed
Output schema / properties / descriptionRemoved value: -{ - "title": "Description", - "type": "string" -} - removed
Output schema / properties / kindRemoved value: -{ - "$ref": "#/$defs/ParticipantKind" -} - changed
Output schema / requiredPrevious value: -[ - "kind", - "name", - "description" -]New value: +[ + "name" +] - changed
Output schema / titlePrevious value: -"ParticipantView"New value: +"ParticipantNameView"
- Added
update_project - Removed
update_queue - Changed
update_task34 fields changed- changed
Input schema / $defs / CheckEditArg / descriptionPrevious value: -"Правка одной проверки: её номер и новый текст."New value: +"Rewrite of one check: its number and new text." - changed
Input schema / $defs / CheckEditArg / properties / no / descriptionPrevious value: -"Номер проверки в нынешнем списке задачи, с 1"New value: +"Number of the check in the current list, from 1" - removed
Input schema / $defs / CheckEditArg / properties / no / examplesRemoved value: -[ - 3 -] - changed
Input schema / $defs / CheckEditArg / properties / text / descriptionPrevious value: -"Новая формулировка этой проверки; остальные остаются теми же байтами"New value: +"New wording of this check" - removed
Input schema / $defs / CheckEditArg / properties / text / examplesRemoved value: -[ - "`docker compose run --rm test` зелёный целиком" -] - changed
Input schema / $defs / TaskChanges / descriptionPrevious 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`." - changed
Input schema / $defs / TaskChanges / properties / assignee / descriptionPrevious 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" - removed
Input schema / $defs / TaskChanges / properties / assignee / examplesRemoved value: -[ - "release_bot" -] - changed
Input schema / $defs / TaskChanges / properties / check / descriptionPrevious 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`)" - changed
Input schema / $defs / TaskChanges / properties / checks / descriptionPrevious value: -"Обзорные проверки целиком, списком; только в `backlog`. Этим меняют **состав**: добавляют проверку, снимают, переставляют. Переписать одну — `check`: пересылка восьми строк ради третьей пропускает опечатку в остальных семи молча"New value: +"All review checks as a list: changes their composition — a check added, removed or moved" - changed
Input schema / $defs / TaskChanges / properties / constraints / descriptionPrevious value: -"Раздел «ограничения»; только в `backlog`"New value: +"Section `constraints`" - changed
Input schema / $defs / TaskChanges / properties / context / descriptionPrevious value: -"Раздел «контекст»; только в `backlog`"New value: +"Section `context`" - changed
Input schema / $defs / TaskChanges / properties / description / descriptionPrevious value: -"Описание задачи; только в `backlog`"New value: +"Task description" - changed
Input schema / $defs / TaskChanges / properties / goal / descriptionPrevious value: -"Раздел «цель»; только в `backlog`"New value: +"Section `goal`" - changed
Input schema / $defs / TaskChanges / properties / output / descriptionPrevious value: -"Раздел «выход»; только в `backlog`"New value: +"Section `output`" - removed
Input schema / $defs / TaskChanges / properties / priority / $refRemoved value: -"#/$defs/TaskPriority" - changed
Input schema / $defs / TaskChanges / properties / priority / descriptionPrevious value: -"Приоритет"New value: +"Task priority" - added
Input schema / $defs / TaskChanges / properties / priority / enumAdded value: +[ + "low", + "normal", + "high", + "critical" +] - removed
Input schema / $defs / TaskChanges / properties / priority / examplesRemoved value: -[ - "high" -] - added
Input schema / $defs / TaskChanges / properties / priority / typeAdded value: +"string" - changed
Input schema / $defs / TaskChanges / properties / title / descriptionPrevious value: -"Название задачи; только в `backlog`"New value: +"Task title" - removed
Input schema / $defs / TaskPriorityRemoved value: -{ - "description": "Приоритет. Порядок членов — от низшего к высшему, на него опирается сортировка поиска.", - "enum": [ - "low", - "normal", - "high", - "critical" - ], - "title": "TaskPriority", - "type": "string" -} - changed
Input schema / properties / key / descriptionPrevious 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`" - changed
Input schema / properties / version / descriptionPrevious 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" - removed
Input schema / properties / version / examplesRemoved value: -[ - 3 -] - removed
Output schema / $defsRemoved value: -{ - "TaskStatus": { - "description": "Зашитый список статусов (`CONCEPT.md`, 3.3).", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "title": "TaskStatus", - "type": "string" - } -} - changed
Output schema / descriptionPrevious value: -"Ответ изменяющего инструмента: что стало и чем это подшито, без карточки."New value: +"Task state after the call and the entries it filed; the card in full is returned\nby `get_task`." - added
Output schema / properties / entries / descriptionAdded 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" - added
Output schema / properties / parent_entryAdded 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" +} - removed
Output schema / properties / status / $refRemoved value: -"#/$defs/TaskStatus" - added
Output schema / properties / status / descriptionAdded value: +"Task status" - added
Output schema / properties / status / enumAdded value: +[ + "backlog", + "open", + "in_progress", + "waiting", + "done", + "cancelled" +] - added
Output schema / properties / status / typeAdded value: +"string" - added
Output schema / properties / version / descriptionAdded value: +"Task version after the call"
- Changed
wait_journal33 fields changed- removed
Input schema / $defsRemoved 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" - } -} - changed
Input schema / properties / after / descriptionPrevious 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" - removed
Input schema / properties / after / examplesRemoved value: -[ - 1024 -] - changed
Input schema / properties / cursor / descriptionPrevious value: -"Продолжение выдачи: значение `next_cursor` из прошлого ответа"New value: +"`next_cursor` of the previous page; without it, the first page" - changed
Input schema / properties / limit / descriptionPrevious value: -"Сколько записей вернуть за раз. Без значения — размер страницы установки"New value: +"Page size. Without a value, the installation's default page size" - removed
Input schema / properties / limit / examplesRemoved value: -[ - 25 -] - added
Input schema / properties / projectAdded 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" +} - removed
Input schema / properties / queueRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Только записи задач этой очереди", - "examples": [ - "TRK" - ], - "title": "Queue" -} - changed
Input schema / properties / task / descriptionPrevious 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`" - changed
Input schema / properties / timeout / descriptionPrevious 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" - removed
Input schema / properties / timeout / examplesRemoved value: -[ - 30 -] - changed
Input schema / properties / types / anyOfPrevious 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" + } +] - changed
Input schema / properties / types / descriptionPrevious value: -"Только записи этих типов"New value: +"Only entries of these types" - removed
Input schema / properties / types / examplesRemoved value: -[ - [ - "decision", - "attempt" - ] -] - removed
Output schema / $defs / AuthorKindRemoved value: -{ - "description": "Кто именно сделал действие.\n\n`tracker` — сам трекер: этим родом подписаны служебные записи дела и строки,\nзаведённые командой первичной инициализации. У него нет подписи, потому что\nназывать себя по имени ему незачем: трекер в установке один.", - "enum": [ - "agent", - "human", - "tracker" - ], - "title": "AuthorKind", - "type": "string" -} - changed
Output schema / $defs / AuthorView / descriptionPrevious value: -"Кто сделал действие: род и подпись. У самого трекера подписи нет."New value: +"Who acted: kind and signature. The tracker itself has no signature." - removed
Output schema / $defs / AuthorView / properties / kind / $refRemoved value: -"#/$defs/AuthorKind" - added
Output schema / $defs / AuthorView / properties / kind / descriptionAdded value: +"Kind of author. `tracker` signs the service entries the tracker files itself" - added
Output schema / $defs / AuthorView / properties / kind / enumAdded value: +[ + "agent", + "human", + "tracker" +] - added
Output schema / $defs / AuthorView / properties / kind / typeAdded value: +"string" - removed
Output schema / $defs / EntryTypeRemoved 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" -} - changed
Output schema / $defs / EntryView / descriptionPrevious value: -"Запись дела целиком.\n\n`payload` — единственное поле слоя без объявленной формы, и это то же исключение,\nчто и в схеме REST (`docs/notes/api.md`, «`payload` записи дела — исключение из\nтипизации, названное по месту»): нагрузка своя у каждого типа записи, и типизирует\nеё отдельная задача — сразу в обоих интерфейсах, иначе они разойдутся. `JsonValue`,\nа не `Any`: форма свободна, но значение обязано быть представимо в JSON."New value: +"Case entry in full." - added
Output schema / $defs / EntryView / properties / project_keyAdded 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" +} - added
Output schema / $defs / EntryView / properties / seq / descriptionAdded value: +"Journal sequence number, usable as `after` of `wait_journal`" - added
Output schema / $defs / EntryView / properties / task_key / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / $defs / EntryView / properties / task_key / descriptionAdded value: +"Key of the owning task; `null` for an entry of a project's case" - removed
Output schema / $defs / EntryView / properties / task_key / typeRemoved value: -"string" - removed
Output schema / $defs / EntryView / properties / type / $refRemoved value: -"#/$defs/EntryType" - added
Output schema / $defs / EntryView / properties / type / descriptionAdded 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" - added
Output schema / $defs / EntryView / properties / type / enumAdded 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" +] - added
Output schema / $defs / EntryView / properties / type / typeAdded value: +"string" - changed
Output schema / $defs / EntryView / requiredPrevious 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" +] - added
Output schema / properties / next_cursor / descriptionAdded value: +"Cursor of the next page, sent back as `cursor`; `null` means this page is the last one"
23 tool updates
- First observed
add_entry - First observed
add_summary - First observed
add_verdict - First observed
answer - First observed
ask - First observed
close_task - First observed
create_queue - First observed
create_task - First observed
get_queue - First observed
get_task - First observed
link - First observed
list_participants - First observed
list_queues - First observed
read_entries - First observed
register_participant - First observed
resolve - First observed
search_tasks - First observed
transition - First observed
unlink - First observed
update_participant - First observed
update_queue - First observed
update_task - First observed
wait_journal
TDQS
Scored across 30 tools
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.
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.
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).
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
Related MCP Connectors
- OneLoreOAuthai.onelore
Shared project context for AI agents and teams: docs, tasks, and messages that stay current.
Project management for AI agents: tasks, docs, decisions and time in one shared team context.
Task management for teams building with AI agents. Agents claim tasks and report progress.
Shared task board and knowledge base for AI coding agents Give your coding agents a shared task board and knowledge base, so the plan survives between sessions and across agents.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI agents and humans to collaboratively plan and manage tasks with a shared kanban and dependency graph, all stored locally.3134 npm81MIT
- FlicenseNot gradedqualityBmaintenancePersistent memory and task coordination for AI coding agents. Tracks sprint items, logs tasks, manages session handoffs, and surfaces HITL requests so you stay in control across single or parallel Claude Code, Codex, Cursor, and Windsurf sessions.-
- AlicenseAqualityAmaintenanceShared memory and handoff hub for AI agents, enabling seamless context transfer between sessions with token-budgeted resumes and automatic handoffs.1010 npmMIT
- AlicenseAqualityBmaintenanceEnables AI agents to manage a task board by investigating needs, creating well-specified tasks, and executing them end-to-end.6MIT