Casefile
This MCP server provides a case-file tracker for tasks: you can manage tasks, projects, case entries, links, and participants over MCP.
Create, search, update, move, and close tasks across projects.
Transition tasks through statuses (
backlog,open,in_progress,done,cancelled) with enforced rules.File and read append-only case entries: summaries, decisions, attempts, findings, artifacts, questions, answers, verdicts, remarks, resolutions, acceptances, and notes.
Ask and answer questions, resolve remarks, and record review verdicts per check.
Manage projects: create, update, archive, restore, list, and set or remove project attributes.
Link tasks (
parent,child,blocks,blocked_by,relates) and unlink them.Register, list, and update participants.
Watch the journal for new entries with
wait_journal.Read full task packages with card, links, features, summary, open questions, remarks, transitions, and case index.
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
One case file per task — shared by every session, agent and person that touches it.
Casefile keeps a case file for every task: the decisions, failed attempts, findings and open questions that agents write down as they work. When a session ends, the next one — the same agent, an agent from another vendor, or you — reads the latest summary and the open questions and carries on. It is a self-hosted MCP server and a web board, MIT-licensed; it assigns and schedules nothing.
For anyone whose agents work on tasks longer than one session. Free to use. 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 connects Claude Code and Codex by itself — a plugin and an OAuth sign-in, no token to copy. Casefile updates itself to each new release: it checks once an hour and whenever Docker starts. A small updater service does it and holds the Docker socket for that; you can turn it off.
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 connects Claude Code and Codex by itself. It installs the Casefile plugin — the skill and a connection to this installation's MCP address — and signs them in with OAuth: no token is copied and none lands in any file. If the installer had no terminal for the sign-in, it prints the commands; run them once:
claude mcp login plugin:casefile:casefile
codex mcp login casefileThe installer asks before it changes anything of another program. The plugin step edits
files that are not Casefile's: Claude Code's ~/.claude/settings.json (one line,
"autoUpdate": true, inside extraKnownMarketplaces.casefile), Codex's
~/.codex/config.toml, the manual MCP entries casefile and tracker that point at this
installation, and ~/.agents/skills. It prints that list and asks [y/N] on your terminal
(also under curl … | sh); N skips the whole plugin step, leaves those files alone and
installs the service as usual. Before the first change to a file it saves a copy next to
it — settings.json.casefile-bak, config.toml.casefile-bak, kept and never overwritten —
and it writes only the line it needs, leaving the rest of the file as it was. The copy
holds whatever the file held, a token of a manual entry the installer removes included:
delete it when you no longer need it. These variables go in front of sh:
CASEFILE_SKILL=0skips the plugin step;CASEFILE_SKILL=1answers the question in advance. Without a terminal (an agent, CI) nothing is asked and the step runs, as it does with1.CASEFILE_PLUGIN_AUTOUPDATE=0installs the Claude Code plugin withoutautoUpdate; update it yourself withclaude plugin update casefile@casefile.
The same commands sign an agent in again after you disconnect it on the board's
Access screen (in a Claude Code session, /mcp → casefile → Re-authenticate).
On your own machine the sign-in needs no password: Claude Code acts as claude, Codex as
codex.
The skill comes with the plugin. Connecting gives the agent the tools; the Casefile
skill teaches it how to use them. The installer puts it 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 no plugin, and the hourly self-update
does not add them: it updates only the service. Run the install line again, or install
just the plugin and the skill without touching the service (add CASEFILE_URL=<address>
for a server that is not on this machine):
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.
Claude Desktop gets an extension for its chat. The chat of the Claude desktop app
(macOS, Windows) does not load the Claude Code plugin; it gets Casefile from
casefile.mcpb,
attached to every release. The installer downloads and opens it when it finds Claude Desktop;
by hand, double-click the file. It signs in with OAuth, needs no Node.js and works while the
installation runs (details).
Hermes signs in with OAuth (auth: oauth in ~/.hermes/config.yaml; the installer
prints the block; not yet checked against a real Hermes). Clients without OAuth use the
agent key. Scripts and any client that cannot
sign in with MCP OAuth connect over streamable HTTP at the MCP address with the agent key
in a header. The installer prints the key in their blocks; read it again with
docker compose run --rm --no-deps -T agent-token cat .secrets/agent-token in
~/casefile. Such a client that takes an mcpServers JSON uses this — with the key 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 key, same case. There is no OAuth over stdio: the agent key 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. Connect an agent on the board shows this installation's MCP address and ready-made snippets. Access lists every way in, in three sections: agent connections (OAuth sign-ins), agent keys and sign-in sessions — yours, or every one of the installation if you are an administrator: who it speaks for, who issued it and when it was last used. A connection is disconnected there and a key revoked. For a client without OAuth you register an agent, issue its own key there and copy the snippet with the key already in it — shown once. Give each agent its own sign-in or key and its case entries are signed with its name. On a shared installation every person does this for their own agents, without the administrator, and sees only the connections and keys 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 the server offers, 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, its discussions, case index and transition targetssearch_tasks— searches tasks by a query-language string, by separate conditions, or by bothcreate_task— creates a task inbacklogin an area of its project (area_requiredwithout one), 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
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 participants in a discussion; asked about a task, it opens the discussion and attaches the task in the same callanswer— answers a question of a discussion or of a task's case, or closes one still unanswered aswithdrawnorreplacedby a later question, with a reason; an answered question cannot be withdrawnresolve— 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, area's or discussion's case, with payload, in number order; filters by number, type, status and a substring of the title or bodyadd_project_entry— files a decision, finding, artifact or note in a project's or an area's case, or a note in a discussion's case
Discussions
add_conclusion— files a discussion's conclusion: what is decided, superseded and still openclose_discussion— closes a discussion with its final conclusion, in one transaction
Links
link— links two tasks and fileslink_addedin both cases, or attaches a task to a discussionunlink— removes a link and fileslink_removedin both cases, or detaches a task from a discussion
Projects & participants
get_project— returns one project by its key, or an area by its address in the same shape: key, title, description, current attribute values, the decisions and findings in force and the index of the rest 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 projectupdate_project— changes a project's title and description, recording each change in its casearchive_project— archives a project with a reason, freezing it and its tasks against changesrestore_project— restores an archived project with a reasonset_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 agentupdate_participant— changes a participant's description
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 updater holds the Docker socket. To replace containers the updater service
mounts /var/run/docker.sock, which is root access to the machine; Casefile gives it to
this one service on purpose (docker-compose.prod.yml says why). The installer tells you
this before it installs and again at the end. To turn auto-update off, put
CASEFILE_AUTO_UPDATE=false into ~/casefile/.env (exactly false: any other value
leaves it on) and run docker compose up -d --no-deps updater in ~/casefile. The
service then idles, so the socket stays mounted; docker compose stop updater stops it
until the next docker compose up or run of the installer. With auto-update off the
board tells you when a new release is out: a note at the bottom of the side panel links
to the release notes, and you update by running the install line again. That note comes
from a read of the latest release on GitHub, at most once an hour;
TRACKER_RELEASE_CHECK=false in .env turns the read off, and the note with it.
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 goes into a Docker volume of
the installation, casefile_updater-snapshot, as 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 not deleted afterwards, neither after a good update nor after
a rollback: it stays in the volume as a copy of the database from before the update, and
docker compose logs updater says where. There is one copy: the next update that changes
the schema replaces it, and a snapshot that fails never replaces the earlier one. How to
restore from it: backup and restore.
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, and the log says how to copy the
snapshot 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 their sessions and every connection and key they 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 sign in with
OAuth behind TLS (below); Connect an agent shows the address from
TRACKER_MCP_PUBLIC_URL. Each person's agent machine gets the plugin, the skill and the
sign-in with one line — no Docker and no service installer there:
curl -fsSL https://raw.githubusercontent.com/azimov777/casefile/main/install.sh | CASEFILE_SKILL_ONLY=1 CASEFILE_URL=https://mcp.casefile.example.com/mcp shThe steps for the agent are in the agent guide.
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.
Agents sign in with OAuth. With sign-in on and TRACKER_MCP_PUBLIC_URL on https, a
client that speaks MCP OAuth (Claude Code, Codex) needs only the address, no token. It
opens a page on the MCP host: the person signs in with email and password and picks which
agent the client acts as. By default it is their own agent, created on the first
sign-in: Alice's Claude Code signs its case entries as claude_alice, her Codex as
codex_alice (agent_<name> for other clients). The list holds their own agents and
agents without an owner, never someone else's. The connection counts as issued by that
person: they see and disconnect it on Access, an administrator sees all. Disabling
the person's account revokes every connection and key they issued — their agents' too:
a connection cannot renew itself and has to be signed in anew once the account is back.
Harnesses without OAuth, and a journal watcher running between sessions, use a key the
person issues to their agent on Access. What the proxy must do:
send the whole MCP host to port 8100, not only
/mcp: sign-in also uses/.well-known/…,/register,/authorize,/tokenand/oauth/…at the root of the host named inTRACKER_MCP_PUBLIC_URL;keep the client's
Hostheader. Caddy does; nginx needsproxy_set_header Host $host;. With sign-in on, MCP answers only on the host ofTRACKER_MCP_PUBLIC_URL, and a request under another name gets421.
Over plain http beyond localhost there is no OAuth at all — agents connect with a key
from Access. On a machine of your own (sign-in off, ports on localhost) an agent is
signed in at once, without a page: Claude Code as claude, Codex as codex, any other
client as agent, each created when first needed.
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 sessions and every connection and key the person issued to their agents: 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 and the agent-facing texts are in Russian for now; design decisions live in the maintainer's tracker, so ask in an issue.
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_entryAdd case entryA
Files an entry without payload: a decision, attempt, finding, artifact, remark, acceptance 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; a choice that outlives the task and that other tasks are to follow is a project decision, filed by `add_project_entry`; - `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`. A remark filed after a `warning` clears it; - `acceptance` — the gap named by an open `warning` is accepted, which clears it; refused with `warning_not_open` without one, and with `acceptance_by_closer` from the signature that closed the task; - `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?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=false and idempotentHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: entries are immutable (no call edits or deletes; correction happens via a new entry referencing the old one in refs) and an empty title is refused with the entry_fields_invalid error listing the offending fields. It still omits auth requirements and rate limits, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly 90 words, front-loaded with the core action and its type set, then immutability, then sibling routing. Sentences earn their place, though the opening "without payload" phrasing is slightly odd given the tool does accept a body and may momentarily confuse an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-type creation tool with a full output schema and complete annotations, the description covers purpose, type selection, immutability semantics, sibling routing and a refusal example. It leaves out any mention of the key or idempotency_key parameters, which the schema carries, so it is strong but not exhaustive.
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 key, body, refs, type and idempotency_key with examples and error contracts; baseline is 3. The description's first sentence partly restates the type enum, and its only additional parameter information is the refusal-on-empty-title error path, which adds marginal value over 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 and resource ("Files an entry") and enumerates the exact entry types the tool accepts, so an agent knows precisely what it creates. It also names the sibling tools that handle the excluded entry kinds (add_summary, ask, answer, add_verdict, resolve), making it distinguishable without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance via the type enumeration in the description and the detailed per-type semantics carried in the schema's enum. It also routes the agent to named alternatives for summaries, questions, answers, verdicts and resolutions, and clarifies edge cases (e.g. an observation about one's own task is a finding, not a remark).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_project_entryAdd 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.
A project decision is in force until a later decision names it in supersedes;
no entry changes, and the status is computed on read. Withdrawing a decision with
no replacement is a decision too, one that supersedes it.
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` — a project decision: an option chosen among several, with the reason, that outlives a task and that other tasks are to follow; - `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 | |
| supersedes | No | Numbers of earlier `decision` entries of this project that the new decision supersedes; accepted only with `decision`. A number outside the project's case or of another entry type is refused with `entry_fields_invalid`, a decision superseded already with `decision_not_in_force`, its successor in `details` | |
| 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 declare non-read-only, non-destructive, non-idempotent, closed-world. The description goes beyond them by disclosing that entries stay as filed, that decisions remain in force until superseded, that status is computed on read, and that an idempotency key changes retry behavior. It does not discuss permissions or rate limits, so it stops short of the top mark.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and each subsequent paragraph covers a distinct concern (numbering/addressing, decision lifecycle, error behavior). The decision-lifecycle paragraph is slightly dense and could be tightened, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers mutation semantics, idempotency, and failure modes (`entry_fields_invalid`, `project_not_found`, `decision_not_in_force`). It is nearly complete for a 7-parameter write tool, missing only permission/auth context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description nonetheless adds real meaning: entry numbering counts inside the project, `TRK#7` addresses a project entry from `refs`, and `supersedes` must name in-force decisions of the same project. This exceeds what the schema descriptions alone convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (files) and resource (an entry in a project's case) and enumerates the entry types it accepts. It explicitly contrasts with the sibling `add_entry` by scoping itself to entries that concern the project rather than one of its tasks, so an agent can disambiguate without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description draws the project-vs-task boundary clearly ('concerns the project rather than one of its tasks') and repeatedly frames behavior relative to `add_entry`, which routes selection well. It stops short of an explicit 'use X when…, use Y when…' directive, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_summaryAdd 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 a wait in `open` it names what is awaited, from whom, and its carrier: a `blocking` question or `blocked_by` | |
| next_step | Yes | The one concrete action a successor starts with. In a summary before a wait in `open` 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?
Annotations only cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds real behavioral detail beyond them: empty parts are refused with `entry_fields_invalid`, and the index title is derived from the first line of `done` and returned in the response. It does not cover permissions or any rate/size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core statement, then definitions and routing. The middle paragraph defining 'a significant step' is somewhat discursive but earns its place by setting the bar for filing. No redundant filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description supplies the error codes, the four-part structure, and the close_task relationship. For a 6-param write tool this is nearly complete; only caller-side concerns like permissions or limits are 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 description coverage is 100%, and the schema already documents the first-line title behavior of `done`, the `nothing` convention for blockers, and the idempotency key semantics. The description's statements about the four non-empty parts and the index title largely restate what the schema provides, 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 and resource ('Files a summary: the handover note of a case, in four parts') and immediately defines what a summary contains. It also distinguishes itself from the sibling close_task, which files the final summary with `unmeasured`, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit criterion for when this tool is warranted ('A significant step is a decision made, a finished part of the work, a failure that changes the plan...') and routes the end-of-task case to close_task. It stops short of naming alternatives like add_entry or stating exclusions, so it is clear context without full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_verdictAdd 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 after a wait in
open 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: - `passed` — ran as written, expected result in full; evidence naming something not done, a substitute or a red run is not `passed`; - `partial` — ran as written, part of the expected result; `evidence` names the missing part; - `unverifiable` — cannot run as written (object or environment out of reach, requirements changed); `evidence` names why and what ran instead; - `failed` — ran as written, expected result absent. An empty `evidence` with `partial` or `unverifiable` is refused with `entry_fields_invalid` | |
| 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 declare the safety profile (readOnly=false, destructive=false, openWorld=false, idempotent=false), but the description adds real behavior: the latest verdict on a check replaces earlier ones, earlier-pass verdicts persist without counting, and replacement happens for both passed and failed outcomes. Auth requirements and error/return behavior are left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, with pass/replacement rules following. It is dense and the sentence about failed/passed filing is slightly convoluted, but no sentence is pure 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?
A mutation tool with a full output schema, so return values need not be explained, and annotations cover safety. The pass semantics and replacement behavior that an agent needs to avoid mis-filing verdicts are present; permission/token requirements are the main omission.
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 key, outcome, check_no, evidence, and idempotency_key in depth. The description adds no parameter-level meaning beyond that, so the 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 and resource: 'Files the outcome of one review check', scoped to the task's current pass and its assignee. It also explicitly names the nearest overlapping sibling ('`close_task` also takes verdicts, together with the closing'), so an agent can separate filing a verdict from closing a 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 establishes when a verdict counts (current pass only, latest replaces earlier) and implies the division of labor with close_task. It stops short of an explicit 'use this tool when / not when' rule and gives no prerequisites for calling it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
answerAnswer questionA
Answers a question of the same task, or closes it unanswered as withdrawn or
replaced. 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. A withdrawn or replaced question
leaves questions of get_task and the open-question counts, and stays in the
case with this entry; a question that already has an answer is not withdrawn.
The tracker builds the title from the question 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 | |
| outcome | No | How the question is closed, and what the body holds: - `answered` — an answer on its merits; the body is the answer; - `withdrawn` — the question is stale and needs no answer; the body gives the reason; - `replaced` — a later question of the same task, named in `replaced_by`, asks instead; the body gives the reason. `withdrawn` and `replaced` require a non-empty body and are accepted only while the question has no answer: otherwise `entry_fields_invalid`, `reason: already_answered` | answered |
| 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` | |
| replaced_by | No | Number of the `question` entry that replaces this one: in the same task and filed after it. Required with `replaced` and refused with any other outcome, both as `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?
Despite annotations covering safety (readOnly=false, destructive=false), the description adds substantial non-obvious behavior: the first answer closes the question while later ones append, neither a question nor an answer changes task status, and withdrawn/replaced drop out of `questions` in `get_task` and the open-question counts but stay in the case. It also discloses the title-construction rule. That is real 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?
Three short paragraphs, front-loaded with the core purpose and outcome list before the state-effect details. Dense but every sentence carries information; only the feathered wording around 'stays in the case with this entry' costs a little clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema coverage, the description does not need to restate returns; it correctly focuses on actor permissions and state transitions for a 6-parameter mutation tool. It is essentially complete, with only the sibling-routing guidance 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 every parameter, including outcome semantics, idempotency binding, and the refusal reasons. The description adds only marginal meaning beyond the schema (the tracker building the title from reference and outcome), so the 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 first sentence gives a specific verb (answers/closes) and resource (a question of the same task) plus the alternate outcomes, so an agent can immediately tell it apart from the paired `ask` and from generic entry-adders like `add_entry` or `add_verdict`. The counterpart semantics (this is the answering side of `ask`) are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states who may call it ('any holder of a `task` token answers, in any task') and when the withdrawn/replaced outcomes are legal, which is useful context. But it never positions the tool against near neighbors (add_entry, resolve, add_verdict) or says when to answer versus add a plain entry, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_projectArchive projectA
Archives a project with a reason and files an archived entry in its case.
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?
Adds a great deal beyond the annotations: the freeze semantics, the exact refusal code `project_archived`, the single exception (`unlink` of a task-linked link), and the fact that reads still work. This also clarifies the non-idempotent annotation by stating a repeated archive is refused rather than a no-op.
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 action and consequence, then details the frozen state and the exception. Three paragraphs is slightly long and repeats `project_archived`, but nearly every sentence carries distinct behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description covers preconditions, postconditions, error behavior, and the one surviving mutation. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `key` and `reason` are already documented with their error codes in the schema. The description adds only the routing context around `reason` being filed in the archived entry, which the schema also states. 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 and resource ('Archives a project') plus the side effect ('files an `archived` entry in its case'). The closing reference to `restore_project` and the refusal codes make it clearly distinguishable from sibling mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong contextual guidance: what gets frozen, what is refused afterward, and that `restore_project` is the inverse operation. It does not explicitly name when to prefer this over other project-mutating siblings, but the preconditions (project must not already be archived) are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
askAsk questionA
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.
A blocking question is the carrier of a wait on its addressee or on an event
outside the tracker that the addressee learns of; any participant files the
answer. The answer to the last such question makes a task in open a candidate
again, with no status move.
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, and refuses entry into `in_progress` with `task_has_open_blocking_questions` while the question is open; 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 already cover the mutating/non-idempotent/non-destructive profile, so the bar is lower. The description adds meaningful behavioral traits beyond annotations: the tracker delivers nothing (unusual semantics), open-question counting, the effect of blocking on in_progress entry, and the status behavior when the last blocking question is 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?
It is front-loaded with the core action, but the body is unfocused and redundant: the delivery/waits/waiting behavior is explained in multiple sentences with some circular phrasing (e.g. 'carrier of a wait on its addressee'), and information spills into prose that could be tighter.
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 tool's unusual lifecycle semantics (open until answered, blocking semantics, effect of the last answer) and hints at reading records via get_task/read_entries. With a 6-param schema and output schema present, this is fairly complete, though the usage boundary against 'answer' and 'resolve' could be clearer.
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 six parameters in detail. The description doesn't add parameter-level semantics beyond what the schema provides, so the baseline 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 and resource: it files a question to registry participants and explains that the tracker delivers nothing, distinguishing it from a notify/message tool. It doesn't explicitly contrast with the sibling 'answer' tool, but the resource and action are clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied but not framed with explicit when/when-not guidance or named alternatives. The final sentence implies that reading existing records uses get_task/read_entries rather than a question, but it's not framed as a routing rule for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_taskClose 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 latest verdict other than failed 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.
A latest verdict partial or unverifiable on any check adds a service entry
warning after the verdicts, naming those checks and outcomes. The task then
enters done with the open_warnings feature at 1 until an acceptance or a
remark is filed after the warning.
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 declare non-destructive and non-read-only, but the description adds crucial behavioral context: atomicity ('in one transaction'), refusal semantics ('files nothing and leaves the status as it was'), the exact exit conditions and their error codes (`checks_not_passed`, `task_has_unclosed_children`, `transition_not_allowed`, `entry_fields_invalid`), warning side effects (`open_warnings` at 1 until acceptance/remark), and the `blocks` side effect. This is far beyond what 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 well-structured: a lead sentence establishing purpose, then paragraphs on refusal, exit conditions, warnings, parent summaries, and downstream effects. It is dense with useful information but every sentence earns its place. Slightly long, but appropriate for the complexity of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the richness of the schema (nested objects with descriptions) and an output schema, the description supplies all the behavioral and transactional context an agent needs: atomicity, refusal outcomes, exit conditions, warning behavior, parent/child summary semantics, and downstream `blocks` effects. Nothing material 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 baseline is 3. The description adds meaning beyond the schema: it specifies the filing order (entries, then verdicts, then summary), clarifies that verdicts may be empty because earlier verdicts count, and notes that the summary reports on the entries and verdicts before it. This gives the agent information not fully explicit in the schema field 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 states the specific verb and resource (closes a task) and enumerates the ordered operations (files entries, verdicts, summary, moves to done) in a single transaction. It also asserts uniqueness ('It is the only way into `done`'), which distinguishes it from `transition` and `add_summary` among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly establishes when to use this tool (to reach `done`) and implicitly when not (any other status transition goes through `transition`). It distinguishes its effect from `add_verdict` by noting that a `failed` verdict sent here leaves no trace if the call is refused. It does not name `transition` or `update_task` as explicit alternatives, so it stays 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.
create_projectCreate projectC
Creates a project with a key, a title and a description.
| 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?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the description only needs to add mutation-specific context. It adds none: nothing about the project appearing in list_projects, key immutability, or the retry behavior that the idempotency_key parameter exists for. The single clause is essentially a restatement of the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler. It is efficient, though its brevity comes partly from omitting information the tool needs.
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 input schema is unusually thorough. However, for a creation tool with zero annotation detail beyond safety flags, the description leaves the agent without any statement of side effects or post-creation state.
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 key format, the 320-character description limit, and idempotency semantics in detail. The description names key/title/description but omits idempotency_key and adds no format detail beyond the schema, so the 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 (creates) and resource (project) with the main fields it accepts, which separates it cleanly from create_task and update_project. It stops short of noting scope or how the new project relates to siblings like list_projects, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to create a project versus using update_project or archive_project, and no prerequisites or alternatives are mentioned. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskCreate 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` | |
| decisions | No | References `PROJECT#N` to `decision` entries of a project's case, up to 20: the project decisions the task relies on. A task entry such as `TRK-42#7` is refused with `task_fields_invalid` (`task_entry`), a project entry of another type with `not_a_decision`. A reference not yet in the field leads to a decision in force; a superseded one is refused with `decision_not_in_force`, its successor in `details` | |
| 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?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, which correctly frame a write), the description discloses lifecycle behavior: tasks start only in backlog, parent linking writes link_added on both tasks and returns parent_entry, and empty title/description is refused with task_fields_invalid. It doesn't disclose idempotency_key semantics (that lives in the schema), but the added behavioral context is substantial.
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 behavior (creation only into backlog) and then covers parent linkage, split criteria, and validation errors in a logical order. The middle paragraph on when a child takes part of the parent's work is somewhat tangential and jargon-heavy for a creation tool, costing a little tightness.
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 needn't be re-explained, yet the description still notes the tracker-issued key. Combined with lifecycle, linkage, and error coverage it is nearly complete for a 9-parameter mutation; only the idempotency_key retry contract is left entirely to 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%, so the baseline is 3; the description earns above that by explaining parent-link side effects (link_added on both tasks, parent_entry in the response) that the schema only sketches. It does not add meaning for assignee, priority, sections, or decisions beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Creates a task in `backlog`') and immediately pins the initial status, so the agent can distinguish it from update_task, close_task, or transition. The parent/child and validation details all reinforce a single unambiguous 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?
Gives real routing guidance: it explains when work should become a child task (parent output splits, checks can't pass in one pass, dependency missing) and names update_task as the follow-up for completing sections. It stops short of an explicit 'when not to use this vs. create_project', so it is strong context without full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_projectGet projectARead-onlyIdempotent
Returns one project by its key: key, title, description, current attribute values, the project decisions in force 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 | |
| decisions | Yes | Project decisions in force, in number order: `decision` entries of the project's case that no later decision names in `supersedes`. Bodies come from `read_project_entries`; the tasks citing a decision, from `search_tasks` with `decision` |
| 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, idempotentHint, and openWorldHint=false, covering the safety profile. The description adds the contents of the returned document, but the unknown-key refusal is already stated in the parameter schema, and a dedicated output schema exists, so little is added beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the action front-loaded; the enumeration of return fields is dense but scannable. The second sentence about `list_projects` earns its place as a key-sourcing hint, though the phrasing 'index of the project's case' is slightly opaque.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with full schema coverage and an output schema, the definition is essentially complete; the return-field enumeration is mildly redundant given the output schema, but nothing an agent needs to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `key` parameter is fully documented in-schema, including case-insensitivity, example, and the `project_not_found` error. The description adds no syntax or format detail beyond what the schema already provides, 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 and resource ('Returns one project by its key') and enumerates the payload, which immediately distinguishes it from the sibling 'list_projects'. An agent can tell single-fetch from bulk-list without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description points to `list_projects` as the source of valid keys, giving the agent a concrete path to satisfy the required `key`. It does not spell out when-not to use this tool or name other alternatives (e.g. search_tasks), but the single-vs-list distinction is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskGet taskARead-onlyIdempotent
Returns everything about one task in a single call: card, parent and children, links from both sides, the project decisions it relies on, 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. parent carries the parent's goal, cut when long (goal_truncated); the full
text, its 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, blocking
questions and children are checked by the transition call itself. Whether
in_progress is open shows in the blocked and open_blocking_questions
features.
| 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 | |
| decisions | Yes | Project decisions the task relies on, in the order of its `decisions` field. The project's other decisions in force are listed by `get_project` |
| questions | Yes | |
| transitions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed world), and the description adds substantial behavioral context beyond them: remarks do not block in_progress or change status and stay until resolve gives an outcome, and transitions lists table targets rather than pre-validated moves. This is exactly the kind of non-obvious behavior 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?
Long and dense for a read tool, but front-loaded with the purpose and organized by return field, with each paragraph carrying semantic content rather than restating the output schema. The field-by-field enumeration is heavier than strictly necessary but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be re-explained, yet the description supplies the semantics the schema cannot express — how parent/children differ from links, how summary `no` bounds coverage, and what a remark does and does not do. Complete for an agent deciding whether and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `key` parameter is fully documented in the schema itself, including the task_not_found refusal and case-insensitivity. The description adds nothing about the parameter, so 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?
States a specific verb and resource — returns everything about one task in a single call — and immediately enumerates the payload (card, parent/children, links, decisions, summary, questions, remarks, index, transitions). An agent can distinguish this from search_tasks or read_entries 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?
No explicit 'when to use' sentence, but it routes the agent within the family: entry bodies come from read_entries, entries beyond the summary come from read_entries with after_no, and actual transition validation belongs to the transition call. That is clear context, though it never states when to prefer get_task over search_tasks for a single known key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkLink tasksA
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?
Annotations only carry the safe/unsafe profile; the description supplies the substantive behavior: duplicate links refused with `link_exists`, cycles with `link_cycle_detected`, self-links with `link_self_not_allowed`, closed-task refusals, and the side effect of raising a task's `blocked` feature and keeping it out of `in_progress`. This is rich, non-redundant 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 lead sentence is front-loaded with the action and effect, and the following paragraphs are organized by topic (kind roles, hierarchy, blocking, closed tasks). It is dense with error codes but each clause carries distinct information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a link-mutation tool with an output schema already covering return shape, the description covers the edge cases an agent needs: valid kinds, one-parent constraint, cycle/self/closed-task refusals, and side effects on cards and the `blocked` feature. Nothing material 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% and the `kind` enum is already well documented in the schema, so baseline is 3. The description adds meaning beyond the schema by explaining that `parent`/`child` set hierarchy shown via `get_task` fields rather than `links`, and how the same link renders from the opposite side.
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 concrete verb and resource ('Links two tasks') plus the side effect ('files `link_added` in both cases'). It also clearly separates this from the sibling `unlink` and from hierarchy operations, so the agent knows exactly what this 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?
Explains the semantics of each `kind` value, the one-parent rule, cycle refusal, and what closed tasks accept, which effectively tells the agent when a link is valid or refused. It never names a competing tool or an explicit 'use X instead' escape hatch (e.g. vs `unlink` or `update_task`), so it stops short of top-tier routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_participantsList 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 readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: the registry contains humans and permanent agents only, and temporary agents are deliberately excluded, which is non-obvious and affects result interpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with what is listed, then the scope qualifier. No filler, no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover the safety profile. The description is complete for a read-only paginated list; only explicit pagination guidance (e.g., how limit/cursor interact) would add much, and that lives in 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 coverage is 100% and both limit and cursor are already documented in the schema, so the description adds nothing about pagination semantics. Baseline 3 is appropriate when the schema does the heavy lifting.
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 (Lists) and resource (participant registry), and defines the resource's scope: humans and permanent agents, the possible addressees of a question. It also carves out what the registry is not (temporary agents are absent), which lets an agent distinguish it from the register_participant/update_participant siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the semantic framing ('the possible addressees of a question'), which tells the agent when the list is relevant, but there is no explicit when-to-use/when-not or reference to alternatives such as register_participant. Adequate but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList 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?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds useful behavior beyond that: results come back paginated 'one page at a time', and it clarifies that archived projects are excluded unless requested while remaining readable by key 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?
Two short sentences with zero filler. The paginated-listing purpose is front-loaded, and the routing note to get_project follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile. The description still supplies pagination behavior and the archived-project nuance, leaving nothing an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, cursor, and include_archived are already fully documented in the schema. The description adds no syntax or default details beyond that, so 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?
States a specific verb and resource ('Lists the installation's projects'), names the exact fields returned (key, title, archive time), and explicitly routes to the sibling `get_project` for descriptions. An agent can distinguish this from get_project and create_project without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for the tool's role and names `get_project` as the alternative when a description is needed. It does not state when NOT to use it (e.g. versus search_tasks or a filtered listing), but the enumeration use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_taskMove task to projectA
Moves a task to another project, recording the move, both keys and the reason
as a moved entry of the task.
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 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 give the generic mutation profile (readOnly=false, destructive=false, idempotent=false). The description goes far beyond by disclosing key-reassignment mechanics (`previous_keys`, one key per project), that status/sections/links/children stay intact, closed tasks move, frozen projects fail, and that a batch refusal of one task leaves others moved.
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?
Dense but well-front-loaded: the core action and key mechanics lead, with error/batch semantics after. Four paragraphs is long for a 3-parameter tool, but nearly every sentence carries distinct behavioral information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still enumerates `results` states (`moved`/`already`/`error`) and failure codes. Combined with the mutation semantics and batch rules, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3 baseline is already met by the schema. The description adds integration meaning: that `reason` is filed in the `moved` entry of the case, that a key list follows list order, and that prior keys continue to address the task — context not present in the schema text itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Moves a task to another project') and immediately enriches it with scoping rules that no sibling like update_task or create_task shares. An agent can distinguish this from every sibling on the strength of the first clause alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Rich operational context: when a move fails (`project_archived`), how batches behave, and what refusals are pre-validated. It does not, however, explicitly name an alternative tool or state when to prefer this over update_task, so it stops short of the 5-tier routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_entriesRead case 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?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed world, so safety is covered. The description adds genuine domain context beyond them: `decision` and `attempt` entries record choices already made and attempts already tried, including failed ones. It does not discuss paging or result shape, but an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and scoping, then a tightly written sentence on filter combination, then a one-line pointer to the sibling. The two filter examples are slightly more elaborate than strictly needed, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 params, full schema coverage, an output schema, and safety annotations, the description only needs to carry filtering and routing semantics, which it does. It is complete enough to call correctly and only marginally omits anything an agent would want.
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, but the description adds real semantics the schema lacks: how `types` and `after_no` compose ('both together the entries of those types filed after it'), with a concrete example. That is value beyond the field-level 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 states a specific verb and resource ('Returns entry bodies of one task's case, with payload, in number order'), which distinguishes it from search_tasks and roughly from read_project_entries via the 'one task's case' scoping. It stops short of explicitly naming the read_project_entries sibling it is most easily confused with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent to `wait_journal` for the opposite need (streaming many cases plus waiting for new entries), and spells out how filters combine with `and`. There is no explicit 'when not to use this' beyond that routing hint, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_project_entriesRead 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 readOnly, idempotent and non-destructive, so safety is covered. The description adds real behavioral context: results are ordered by entry number, payloads are included, filters AND together, and `attribute` narrows to created/changed/removed entries. Pagination mechanics are left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior in the first sentence, followed by scoping and filter semantics. Every sentence carries information, though the middle sentence is dense and packs several distinct facts into one block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers what the case holds versus tracker entries, ordering, filtering and the index alternative. Minor gaps remain around pagination interplay and default page size, but the essential call-shaping information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by explaining that filters combine with `and` and that `attribute` returns the attribute's creation/change/removal history. It does not clarify how `nos`, `after_no`, `cursor` and `limit` interact, so it is above baseline but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the bodies of a project's case entries, payload included, ordered by entry number') and immediately scopes it against siblings: the case index with titles only comes with `get_project`, and filter semantics mirror `read_entries`. An agent can distinguish this from `get_project` and `read_entries` 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 clear routing context ('The case index, titles only, comes with `get_project`') and explains that filters combine with `and`, plus the special semantics of `attribute`. It does not explicitly state when to prefer this over `read_entries` beyond the filter-semantics reference, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_participantRegister participantA
Registers a human or a permanent agent. 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 write semantics (readOnlyHint=false), non-destructive, closed-world, and non-idempotent, so the description only needs to add what they cannot convey. It usefully discloses that the new participant's token is issued through the REST API (i.e. not returned here), but says nothing about authorization needs, side effects on existing data, or error surface.
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 sentences, zero padding: the core action comes first and the alternative-tool routing follows. Nothing is repeated from the title or restated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the return values need not be explained, and annotations plus the rich schema cover safety and argument semantics. The token-issuance detail closes the main behavioral gap, leaving only minor omissions such as permissions or conflict-handling expectations.
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 name format, immutability, error codes, idempotency-key semantics and the description field are all fully documented in the schema itself. The description adds no parameter-level meaning beyond that, which is the baseline expectation here.
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 ('Registers a human or a permanent agent') and explicitly separates this tool from the sibling update_participant, which changes an existing participant's description. The only softness is the unexplained term 'permanent agent', which leaves the human/agent distinction slightly fuzzy beyond the schema enum.
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 second sentence routes the agent away from this tool when the participant already exists ('An existing participant's description is changed by update_participant'), which is a concrete when-not-this condition naming the alternative. It does not, however, state prerequisites or what happens if you call it for something already registered beyond what the schema says.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_attributeRemove 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?
Adds real context beyond the annotations: the removal is not silent (it files a case entry), history is retained, and the operation is effectively recoverable via a later set_attribute — which coherently explains why destructiveHint=false despite a delete-like verb. The trailing 'A `task` token removes attributes' hints at an auth requirement but is too terse to be fully actionable.
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 the action and side effect, then error behavior. The final sentence about a `task` token is cryptic and slightly detracts from an otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers side effects, error codes, history retention and idempotency context. Only the authorization/`task` token statement is underspecified.
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, but the description adds behavior not present in the schema: the refusal code for an unknown attribute name and the fact that the last value is persisted alongside the reason.
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 ('Removes a project attribute') plus the side effect (files an `attribute_removed` entry in the case with the last value and reason). This clearly distinguishes it from the sibling `set_attribute`, which is even named in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the failure condition for a non-matching name (`attribute_not_found`) and tells the agent that re-adding requires a separate `set_attribute` call, so the lifecycle is clear. It stops short of an explicit 'use this when X, use set_attribute when Y' routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolveResolve remarkA
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?
Annotations only declare the safety profile (not read-only, not destructive, not idempotent), so the description adds real value by disclosing that every outcome removes the remark from `open_remarks` while `accepted` parks it in `remarks_in_work` until the continuation task closes, plus how the resulting title is composed. It does not cover permissions or preconditions (e.g. remark must be open), leaving some behavioral gaps.
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 tight sentences with the core action front-loaded and the state-transition nuance following. No filler, though the second sentence is dense enough to require careful reading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter documentation, the description only needs to convey non-obvious behavior, and it does so for state transitions and title construction. Missing preconditions/permission context keeps it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters, including the outcome enum and idempotency_key, are already documented in the schema; baseline is 3. The description adds only the derived-title detail and per-outcome state effects, not new parameter syntax.
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 ("Resolves a remark on a task") and further scopes it with "its outcome and where the work went." An agent can tell this apart from generic entry-writing siblings like add_entry or add_verdict, 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 description explains the effect of each outcome and the state it moves the remark into, which implicitly guides selection of the right outcome, but it never says when to use this tool versus ask/answer/add_verdict. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_projectRestore 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.
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 declare this is a non-read-only, non-destructive, non-idempotent mutation; the description adds substantive behavior beyond that — it writes a `restored` journal entry carrying the reason and resumes task state where archiving left off, plus the refusal code for non-archived projects. It does not discuss idempotency or permissions, but the state-transition detail is well above the annotation baseline.
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 sentences, front-loaded with the core action and followed by the effect and the refusal condition. No filler; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description covers the state transition and the error case. Only minor gaps remain — no explicit mention of the `archive_project` alternative or permission requirements.
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 both `key` and `reason` are fully documented in the schema itself, including the refusal codes. The description's mention of the reason being 'carried in its case' duplicates the schema's statement that it is filed in the `restored` entry, adding little beyond it. 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 and resource ('Brings an archived project back') and describes the concrete effects: filing a `restored` entry and resuming tasks. It doesn't explicitly name `archive_project` as the counterpart, but the archived-project framing makes the inverse relationship inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition and the failure mode for violating it ('A project that is not archived is refused with `project_not_archived`'), which effectively tells the agent when not to call it. It stops short of explicitly routing to the sibling `archive_project` for the opposite operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tasksSearch 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, its parent in parent or a root of its subtree in under. 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`, `decision`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `open_warnings`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`, `under`. 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 | |
| under | No | Root task keys: all their descendants at any depth, without the roots. `parent` is the direct children only. An unknown key is refused | |
| 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`, `open_warnings`, `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 | |
| decision | No | Project decisions `PROJECT#N`: the tasks whose `decisions` field names one of them, in any status, also after the decision is superseded. `empty()` matches tasks that name no decision. An address that is not a `decision` entry of a project's case is refused rather than read as «no tasks» | |
| priority | No | Priorities | |
| open_remarks | No | Exact number of unresolved remarks; ranges go in `query` | |
| open_warnings | No | 1 for tasks with an open `warning`, 0 for the rest | |
| 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?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavior beyond them: archived-project visibility rules, default ordering by key when sort is omitted, truncation of long text with `<field>_truncated`/`<field>_length` markers, and the exact error taxonomy with codes. This is real operational 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?
Front-loaded with the core purpose, then layered detail; every paragraph carries information. Some query examples and operator lists are restated from the query parameter description, and the mid-sentence line breaks make it slightly harder to scan, but there is little pure 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 20-parameter tool with an output schema and full annotations, the description covers the tricky cross-cutting concerns: condition combination, archived scope, ordering defaults, truncation, and error codes. Pagination via cursor is implied by the schema field, and return shape is left to the output schema, so it is complete enough without reaching 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description contributes cross-parameter semantics the schema does not: query and separate conditions combine with `and` and behave as one equivalent string. The query-language operator placement note (operator after the colon, unlike SQL) also reinforces schema content at the call level.
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 (Searches) and resource (tasks) and enumerates the three input modes (query string, separate conditions, or both). It also distinguishes itself from the sibling get_task by noting that a single task in full, with case and links, comes from get_task. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the semantics that drive selection: combined query+condition inputs are ANDed, and no condition at all selects every task of non-archived projects. The archived-project rule and the get_task pointer give contextual routing. It stops short of stating explicit when-not-to-use cases or naming other siblings (e.g. list_projects) as alternatives, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_attributeSet 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?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false): it discloses case-insensitive matching, that the original spelling is retained and never renamed, that values are stored as plain text with no typing or search semantics, and that the reason becomes required only on a value change. The idempotency and error-code behavior is spelled out in the schema, but the semantic consequences are explained here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then three tight bullets for the branch conditions and one for naming persistence. The trailing fragment 'A `task` token sets attributes.' is terse to the point of ambiguity about authorization context, which slightly blunts an otherwise efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description need not describe return values; it instead supplies the mutation semantics, the no-op case, and the reason-required rule. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: it explains the conditional requirement of `reason` in terms of attribute state, and the naming/case behavior that governs `name`. It does not add syntax detail for `idempotency_key` or `key` 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 and resource ('Sets the value of a project attribute') and immediately qualifies what an attribute is. It is distinguishable from the sibling remove_attribute and from add_project_entry, and it clarifies that one call both creates and changes.
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 three bulleted branches give precise conditions for when a call creates, changes, or no-ops, which is the core usage decision for this tool. It stops short of naming alternatives (e.g. remove_attribute or add_project_entry) or stating when an agent should prefer a different tool, so it falls just below the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transitionChange task statusA
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, with
an unanswered blocking question — task_has_open_blocking_questions (question
numbers in details.questions); 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.
A task waiting in open stays there when its carrier closes: neither an answer
nor a closed blocker moves it, and it becomes a candidate again with no
status_changed entry. Each entry into in_progress 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` and for `cancelled` (`transition_reason_required` otherwise), optional elsewhere. Filed in the `status_changed` entry as text only: a wait is held by its carrier, an open `blocking` question or `blocked_by`, and not by the reason |
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 only cover the safety profile (not read-only, not idempotent, not destructive, closed-world); the description goes far beyond them, disclosing named refusal codes with detail payloads, the side effect that `cancelled` clears the `blocked` feature of blocked tasks with no case entry, and the re-entry/pass semantics of `in_progress`.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded in one sentence, and the remaining prose is dense but load-bearing (refusal codes, side effects, open-task semantics). The refusal enumeration is long, but each entry carries distinct information an agent needs.
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-machine transition with a fixed table, the description covers preconditions, refusal reasons, side effects, and edge-case semantics (tasks waiting in `open`), and an output schema already covers the return shape. Nothing material 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 `key`, `to`, and `reason` are already fully documented in the schema, including the `reason`-required cases. The description adds no parameter-level detail beyond that, so the 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 and resource plus the mechanism ('moves a task to another status along the fixed transition table'), and explicitly routes the `done` case to the sibling `close_task`. It does not, however, differentiate itself from `move_task`, which an agent could easily confuse with a status change.
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 refusal catalogue effectively defines when the tool will and will not succeed, and `close_task` is named as the correct alternative for closing. What's missing is a positive statement of when to reach for `transition` versus `update_task` or `move_task`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlinkUnlink tasksA
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 only declare the safety profile (readOnly=false, idempotent=false, destructive=false, openWorld=false); the description goes well beyond that, disclosing the emitted `link_removed`/`task_closed` events, the fact that removal is symmetric across side and kind alias, and the important edge case that `parent`/`blocks` are refused on closed tasks while `relates` is removed. These are exactly the mutation semantics an agent cannot infer from 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?
Front-loads the action in the first sentence, then layers exception behavior; backticked identifiers make it scannable and every sentence carries information. The phrase 'in both cases' is slightly opaque and requires the following sentence to resolve.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers success, the alias/symmetry model, closed-task exceptions, and the `link_not_found` failure mode. It stops short of mentioning permissions or whether the removal is reversible, but is otherwise complete for a 3-parameter mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the kind enum plus `blocks`/`blocked_by` example are already documented in the schema, so the description's explanation of the `kind` alias is largely a restatement. It reinforces rather than extends parameter meaning, making the baseline 3 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?
States a specific verb (removes) plus resource (a link) and immediately names the audit event filed (`link_removed`), so the action and its side effect are unambiguous. It is clearly the inverse of the sibling `link` tool, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the name; there is no explicit statement of when to unlink vs. when to use `link`, nor any prerequisite or exclusion to guide selection. It does supply operational context (symmetric removal, closed-task handling, link_not_found refusal) that helps an agent call it correctly, but this is behavior rather than use-case guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_participantUpdate participantADestructiveIdempotent
Changes a participant's description. 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?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety bar is partly met. The description adds real value by specifying the exact destruction semantics — the prior description is overwritten and not retained — and by clarifying that name is immutable because it 'signs entries already filed'. That explains the destructive/idempotent profile in domain terms.
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 sentences with no filler; the primary action comes first, then the immutability constraint, then the overwrite caveat. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema, complete annotations, and 100%-documented parameters, the description only needed to supply the mutation semantics and immutability rules it does supply. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds only marginal semantics — why name can't change and that description is replaced wholesale — without adding format, length, or validation detail 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 precise verb+resource ('Changes a participant's description') and immediately delineates what is NOT changed ('Name and kind never change'), which cleanly separates it from register_participant, list_participants, and the task/entry tools. An agent can pick this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: edit an existing participant's description, and do not attempt to rename. No sibling or alternative is named, and no precondition (e.g., participant must already exist via register_participant) is spelled out, though the schema's participant_not_found note partially covers that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_projectUpdate projectAIdempotent
Changes a project's title and description; a field left out stays. 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?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so safety is covered. The description adds genuinely non-obvious behavior beyond that: omitted fields are untouched, the key is immutable, and each changed field files a field_changed entry recording old and new values, with no entry for no-op values. It does not cover permissions or behavior on archived projects, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the mutation/secondary-effect facts are front-loaded before the audit-trail detail. Every clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a simple field-update tool with annotations covering the safety profile and a fully documented schema, the description supplies all remaining context an agent needs: partial-update semantics, key immutability, and the journal side effect.
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 schema already documents the null/default omission semantics for title and description. The description adds one piece of meaning the schema lacks: the key never changes, i.e. it is an immutable selector. That is a small but real increment above 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 (changes) and resource scope (a project's title and description), so an agent can tell it mutates an existing project rather than creating one. It does not explicitly contrast itself with adjacent siblings such as set_attribute or archive_project, but the purpose itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: you call this to rename/re-describe an existing project. There is no when-to-use versus when-not guidance, no mention of alternatives like set_attribute for non-title/description fields, and no statement about prerequisites such as project state. Adequate but clearly gapped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskUpdate 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?
Goes well past the annotations (readOnly=false, idempotent=true, destructive=false) by disclosing side effects: which journal entries get filed (section_changed, field_changed, assignee_changed), that editing one check marks earlier verdicts outdated, and that taking over another participant's assignee notifies no one. This is exactly the behavioral context annotations cannot carry.
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 semantic in the first sentence, then adds constraint and side-effect detail in two short paragraphs. Every sentence carries information, though the editability rule is stated twice (description body and schema).
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 and annotations cover the safety profile, so return values need not be described. The description fills in the lock/unlock workflow and journal side effects; only version/optimistic-concurrency behavior is left entirely to 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 coverage is 67% and the nested TaskChanges definitions are already richly annotated (field-level editability, refusal codes, null-clears-assignee). The description restates the partial-update rule already present in the schema rather than adding new per-parameter meaning, so the 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 and resource ('Changes the given fields of a task') and immediately adds the partial-update semantics that distinguish it from a full replace. It does not name a sibling like transition or move_task explicitly, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the editability window ('Title, description and sections are fixed from `open` on') and routes the agent to `transition` as the way to unlock a locked task. That is real when-to-use guidance, though it stops short of explicit when-not-to-use this versus move_task/transition for status work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_journalWait for journal entriesARead-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 cover read-only/idempotent/non-destructive, but the description adds real behavior the annotations cannot: blocking until a match or `timeout`, the 60s cap with `journal_wait_too_long`, that an empty page is not an error, and that no `seq` is ever too old. This is exactly the beyond-annotation context required.
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 behavior and the scoping model before the alternative-tool routing at the end. Dense but every sentence carries information; only the multi-line wrapping slightly hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a 7-parameter, zero-required, blocking streaming tool the description covers pacing, continuation, narrowing, error conditions, and sibling routing — nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the syntax baseline. The description still adds value by explaining the continuation contract between calls ('continues from the `seq` of the last entry received') and how `task`, `types` and `timeout` combine for the answer-wait pattern, which is more than restating field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb, resource, and the blocking behavior ('Returns journal entries after the sequence number `after`, waiting for new ones'). The final paragraph explicitly distinguishes it from siblings read_entries and read_project_entries, so an agent can route correctly 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?
Explains the stream model (all case entries in `seq` order), how to narrow it (`task`, `project`, `types`), the continuation pattern, and a concrete usage recipe ('With types=["answer"] and task, one call covers an answer expected within timeout'). It also names the alternatives for already-filed entries.
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.
16 tool updates
v0.10.1- Changed
add_entry2 fields changed- changed
Input schema / properties / type / descriptionPrevious 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"New value: +"What the entry records:\n- `decision` — an option chosen among several, with the reason; a choice that outlives the task and that other tasks are to follow is a project decision, filed by `add_project_entry`;\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`. A remark filed after a `warning` clears it;\n- `acceptance` — the gap named by an open `warning` is accepted, which clears it; refused with `warning_not_open` without one, and with `acceptance_by_closer` from the signature that closed the task;\n- `note` — an entry that fits none of the types above" - changed
Input schema / properties / type / enumPrevious value: -[ - "decision", - "attempt", - "finding", - "artifact", - "remark", - "note" -]New value: +[ + "decision", + "attempt", + "finding", + "artifact", + "remark", + "acceptance", + "note" +]
- Changed
add_project_entry2 fields changed- added
Input schema / properties / supersedesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Numbers of earlier `decision` entries of this project that the new decision supersedes; accepted only with `decision`. A number outside the project's case or of another entry type is refused with `entry_fields_invalid`, a decision superseded already with `decision_not_in_force`, its successor in `details`", + "title": "Supersedes" +} - changed
Input schema / properties / type / descriptionPrevious value: -"What the entry records about the project:\n- `decision` — an option chosen among several, with the reason;\n- `finding` — an established fact with its source;\n- `artifact` — a pointer to a result;\n- `note` — an entry that fits none of the types above.\nSummaries, questions, attempts, verdicts and remarks exist only in task cases"New value: +"What the entry records about the project:\n- `decision` — a project decision: an option chosen among several, with the reason, that outlives a task and that other tasks are to follow;\n- `finding` — an established fact with its source;\n- `artifact` — a pointer to a result;\n- `note` — an entry that fits none of the types above.\nSummaries, questions, attempts, verdicts and remarks exist only in task cases"
- Changed
add_summary2 fields changed- changed
Input schema / properties / blockers / descriptionPrevious value: -"What stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom"New value: +"What stands in the way, or `nothing`. In a summary before a wait in `open` it names what is awaited, from whom, and its carrier: a `blocking` question or `blocked_by`" - changed
Input schema / properties / next_step / descriptionPrevious 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"New value: +"The one concrete action a successor starts with. In a summary before a wait in `open` 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"
- Changed
add_verdict2 fields changed- changed
Input schema / properties / outcome / descriptionPrevious value: -"Outcome of the check; there is no third state"New value: +"Outcome of the check:\n- `passed` — ran as written, expected result in full; evidence naming something not done, a substitute or a red run is not `passed`;\n- `partial` — ran as written, part of the expected result; `evidence` names the missing part;\n- `unverifiable` — cannot run as written (object or environment out of reach, requirements changed); `evidence` names why and what ran instead;\n- `failed` — ran as written, expected result absent.\nAn empty `evidence` with `partial` or `unverifiable` is refused with `entry_fields_invalid`" - changed
Input schema / properties / outcome / enumPrevious value: -[ - "passed", - "failed" -]New value: +[ + "passed", + "partial", + "unverifiable", + "failed" +]
- Changed
answer2 fields changed- added
Input schema / properties / outcomeAdded value: +{ + "default": "answered", + "description": "How the question is closed, and what the body holds:\n- `answered` — an answer on its merits; the body is the answer;\n- `withdrawn` — the question is stale and needs no answer; the body gives the reason;\n- `replaced` — a later question of the same task, named in `replaced_by`, asks instead; the body gives the reason.\n`withdrawn` and `replaced` require a non-empty body and are accepted only while the question has no answer: otherwise `entry_fields_invalid`, `reason: already_answered`", + "enum": [ + "answered", + "withdrawn", + "replaced" + ], + "type": "string" +} - added
Input schema / properties / replaced_byAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Number of the `question` entry that replaces this one: in the same task and filed after it. Required with `replaced` and refused with any other outcome, both as `entry_fields_invalid`", + "title": "Replaced By" +}
- Changed
ask1 field changed- changed
Input schema / properties / blocking / descriptionPrevious 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"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, and refuses entry into `in_progress` with `task_has_open_blocking_questions` while the question is open; the tracker does nothing else with it"
- Changed
close_task7 fields changed- changed
Input schema / $defs / ClosingEntry / properties / type / descriptionPrevious 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"New value: +"What the entry records:\n- `decision` — an option chosen among several, with the reason; a choice that outlives the task and that other tasks are to follow is a project decision, filed by `add_project_entry`;\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`. A remark filed after a `warning` clears it;\n- `acceptance` — the gap named by an open `warning` is accepted, which clears it; refused with `warning_not_open` without one, and with `acceptance_by_closer` from the signature that closed the task;\n- `note` — an entry that fits none of the types above" - changed
Input schema / $defs / ClosingEntry / properties / type / enumPrevious value: -[ - "decision", - "attempt", - "finding", - "artifact", - "remark", - "note" -]New value: +[ + "decision", + "attempt", + "finding", + "artifact", + "remark", + "acceptance", + "note" +] - changed
Input schema / $defs / ClosingSummary / properties / blockers / descriptionPrevious value: -"What stands in the way, or `nothing`. In a summary before `waiting` it names what is awaited and from whom"New value: +"What stands in the way, or `nothing`. In a summary before a wait in `open` it names what is awaited, from whom, and its carrier: a `blocking` question or `blocked_by`" - changed
Input schema / $defs / ClosingSummary / properties / next_step / descriptionPrevious 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"New value: +"The one concrete action a successor starts with. In a summary before a wait in `open` 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" - changed
Input schema / $defs / ClosingVerdict / properties / outcome / descriptionPrevious value: -"Outcome of the check; there is no third state"New value: +"Outcome of the check:\n- `passed` — ran as written, expected result in full; evidence naming something not done, a substitute or a red run is not `passed`;\n- `partial` — ran as written, part of the expected result; `evidence` names the missing part;\n- `unverifiable` — cannot run as written (object or environment out of reach, requirements changed); `evidence` names why and what ran instead;\n- `failed` — ran as written, expected result absent.\nAn empty `evidence` with `partial` or `unverifiable` is refused with `entry_fields_invalid`" - changed
Input schema / $defs / ClosingVerdict / properties / outcome / enumPrevious value: -[ - "passed", - "failed" -]New value: +[ + "passed", + "partial", + "unverifiable", + "failed" +] - changed
Output schema / properties / status / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +]
- Changed
create_task2 fields changed- added
Input schema / properties / decisionsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "References `PROJECT#N` to `decision` entries of a project's case, up to 20: the project decisions the task relies on. A task entry such as `TRK-42#7` is refused with `task_fields_invalid` (`task_entry`), a project entry of another type with `not_a_decision`. A reference not yet in the field leads to a decision in force; a superseded one is refused with `decision_not_in_force`, its successor in `details`", + "examples": [ + [ + "TRK#15" + ] + ], + "title": "Decisions" +} - changed
Output schema / properties / status / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +]
- Changed
get_project18 fields changed- changed
Output schema / $defs / AnswerFactsView / descriptionPrevious value: -"Answer: the question of the same task it answers."New value: +"Answer: the question of the same task it closes, how, and what replaced it." - added
Output schema / $defs / AnswerFactsView / properties / outcomeAdded value: +{ + "anyOf": [ + { + "description": "How a question was closed by an answer", + "enum": [ + "answered", + "withdrawn", + "replaced" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / $defs / AnswerFactsView / properties / replaced_byAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Replaced By" +} - changed
Output schema / $defs / AnswerFactsView / requiredPrevious value: -[ - "type", - "question_no" -]New value: +[ + "type", + "question_no", + "outcome", + "replaced_by" +] - added
Output schema / $defs / DecisionInForceViewAdded value: +{ + "description": "Project decision in force: its address and the decision in one line.", + "properties": { + "ref": { + "description": "Address of the `decision` entry in the project's case", + "examples": [ + "TRK#15" + ], + "title": "Ref", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + } + }, + "required": [ + "ref", + "title" + ], + "title": "DecisionInForceView", + "type": "object" +} - added
Output schema / $defs / FactsView / discriminator / mapping / acceptanceAdded value: +"#/$defs/NoFactsView" - added
Output schema / $defs / FactsView / discriminator / mapping / warningAdded value: +"#/$defs/WarningFactsView" - 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" - }, - { - "$ref": "#/$defs/AttributeFactsView" - }, - { - "$ref": "#/$defs/MovedFactsView" - } -]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" + }, + { + "$ref": "#/$defs/WarningFactsView" + } +] - changed
Output schema / $defs / FieldChangedFactsView / properties / field / anyOfPrevious value: -[ - { - "description": "Task field", - "enum": [ - "title", - "description", - "goal", - "context", - "constraints", - "output", - "checks", - "status", - "assignee", - "priority" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task field", + "enum": [ + "title", + "description", + "goal", + "context", + "constraints", + "output", + "checks", + "status", + "assignee", + "priority", + "decisions" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / HeadingView / properties / type / enumPrevious 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" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "question", + "answer", + "verdict", + "remark", + "resolution", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" +] - changed
Output schema / $defs / NoFactsView / properties / type / enumPrevious value: -[ - "summary", - "decision", - "attempt", - "finding", - "artifact", - "remark", - "note", - "created", - "archived", - "restored" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "remark", + "acceptance", + "note", + "created", + "archived", + "restored" +] - changed
Output schema / $defs / SectionChangedFactsView / properties / field / anyOfPrevious value: -[ - { - "description": "Task field", - "enum": [ - "title", - "description", - "goal", - "context", - "constraints", - "output", - "checks", - "status", - "assignee", - "priority" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task field", + "enum": [ + "title", + "description", + "goal", + "context", + "constraints", + "output", + "checks", + "status", + "assignee", + "priority", + "decisions" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / StatusChangedFactsView / properties / from_status / anyOfPrevious value: -[ - { - "description": "Task status", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / StatusChangedFactsView / properties / to_status / anyOfPrevious value: -[ - { - "description": "Task status", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / VerdictFactsView / properties / outcome / anyOfPrevious value: -[ - { - "description": "Outcome of a review check", - "enum": [ - "passed", - "failed" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Outcome of a review check", + "enum": [ + "passed", + "partial", + "unverifiable", + "failed" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / $defs / WarningFactsViewAdded value: +{ + "description": "Warning: numbers of the checks closed `partial` and `unverifiable`.", + "properties": { + "partial": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Partial" + }, + "type": { + "const": "warning", + "title": "Type", + "type": "string" + }, + "unverifiable": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Unverifiable" + } + }, + "required": [ + "type", + "partial", + "unverifiable" + ], + "title": "WarningFactsView", + "type": "object" +} - added
Output schema / properties / decisionsAdded value: +{ + "description": "Project decisions in force, in number order: `decision` entries of the project's case that no later decision names in `supersedes`. Bodies come from `read_project_entries`; the tasks citing a decision, from `search_tasks` with `decision`", + "items": { + "$ref": "#/$defs/DecisionInForceView" + }, + "title": "Decisions", + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "key", - "title", - "description", - "archived_at", - "attributes", - "index" -]New value: +[ + "key", + "title", + "description", + "archived_at", + "attributes", + "decisions", + "index" +]
- Changed
get_task27 fields changed- changed
Output schema / $defs / AnswerFactsView / descriptionPrevious value: -"Answer: the question of the same task it answers."New value: +"Answer: the question of the same task it closes, how, and what replaced it." - added
Output schema / $defs / AnswerFactsView / properties / outcomeAdded value: +{ + "anyOf": [ + { + "description": "How a question was closed by an answer", + "enum": [ + "answered", + "withdrawn", + "replaced" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / $defs / AnswerFactsView / properties / replaced_byAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Replaced By" +} - changed
Output schema / $defs / AnswerFactsView / requiredPrevious value: -[ - "type", - "question_no" -]New value: +[ + "type", + "question_no", + "outcome", + "replaced_by" +] - added
Output schema / $defs / CitedDecisionViewAdded value: +{ + "description": "Project decision the task relies on, with its status computed on read.", + "properties": { + "ref": { + "description": "Address of the `decision` entry in the project's case", + "examples": [ + "TRK#15" + ], + "title": "Ref", + "type": "string" + }, + "status": { + "description": "Status of a project decision, computed on read: `superseded` once a later decision of the project names it in `supersedes`", + "enum": [ + "in_force", + "superseded" + ], + "type": "string" + }, + "superseded_by": { + "anyOf": [ + { + "$ref": "#/$defs/DecisionRefView" + }, + { + "type": "null" + } + ], + "description": "The later decision that named this one in `supersedes`, with its own status; `null` while this one is in force" + }, + "title": { + "title": "Title", + "type": "string" + } + }, + "required": [ + "ref", + "title", + "status", + "superseded_by" + ], + "title": "CitedDecisionView", + "type": "object" +} - added
Output schema / $defs / DecisionRefViewAdded value: +{ + "description": "Project decision named by its reference.", + "properties": { + "ref": { + "description": "Address of the `decision` entry in the project's case", + "examples": [ + "TRK#15" + ], + "title": "Ref", + "type": "string" + }, + "status": { + "description": "Status of a project decision, computed on read: `superseded` once a later decision of the project names it in `supersedes`", + "enum": [ + "in_force", + "superseded" + ], + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + } + }, + "required": [ + "ref", + "title", + "status" + ], + "title": "DecisionRefView", + "type": "object" +} - changed
Output schema / $defs / EntryView / properties / type / enumPrevious 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" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "question", + "answer", + "verdict", + "remark", + "resolution", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" +] - added
Output schema / $defs / FactsView / discriminator / mapping / acceptanceAdded value: +"#/$defs/NoFactsView" - added
Output schema / $defs / FactsView / discriminator / mapping / warningAdded value: +"#/$defs/WarningFactsView" - 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" - }, - { - "$ref": "#/$defs/AttributeFactsView" - }, - { - "$ref": "#/$defs/MovedFactsView" - } -]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" + }, + { + "$ref": "#/$defs/WarningFactsView" + } +] - added
Output schema / $defs / FeaturesView / properties / open_warningsAdded value: +{ + "title": "Open Warnings", + "type": "integer" +} - changed
Output schema / $defs / FeaturesView / requiredPrevious value: -[ - "blocked", - "open_questions", - "open_blocking_questions", - "open_remarks", - "last_summary_at", - "last_entry_at" -]New value: +[ + "blocked", + "open_questions", + "open_blocking_questions", + "open_remarks", + "open_warnings", + "last_summary_at", + "last_entry_at" +] - changed
Output schema / $defs / FieldChangedFactsView / properties / field / anyOfPrevious value: -[ - { - "description": "Task field", - "enum": [ - "title", - "description", - "goal", - "context", - "constraints", - "output", - "checks", - "status", - "assignee", - "priority" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task field", + "enum": [ + "title", + "description", + "goal", + "context", + "constraints", + "output", + "checks", + "status", + "assignee", + "priority", + "decisions" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / HeadingView / properties / type / enumPrevious 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" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "question", + "answer", + "verdict", + "remark", + "resolution", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" +] - changed
Output schema / $defs / LinkOtherView / properties / status / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +] - changed
Output schema / $defs / NoFactsView / properties / type / enumPrevious value: -[ - "summary", - "decision", - "attempt", - "finding", - "artifact", - "remark", - "note", - "created", - "archived", - "restored" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "remark", + "acceptance", + "note", + "created", + "archived", + "restored" +] - added
Output schema / $defs / ParentCardViewAdded value: +{ + "description": "Parent task: key, title, status and its goal.", + "properties": { + "goal": { + "description": "The parent's `goal` section, cut at 320 characters", + "title": "Goal", + "type": "string" + }, + "goal_truncated": { + "description": "`true` when `goal` was cut and the full text is longer", + "title": "Goal Truncated", + "type": "boolean" + }, + "key": { + "title": "Key", + "type": "string" + }, + "status": { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "done", + "cancelled" + ], + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + } + }, + "required": [ + "key", + "title", + "status", + "goal", + "goal_truncated" + ], + "title": "ParentCardView", + "type": "object" +} - changed
Output schema / $defs / SectionChangedFactsView / properties / field / anyOfPrevious value: -[ - { - "description": "Task field", - "enum": [ - "title", - "description", - "goal", - "context", - "constraints", - "output", - "checks", - "status", - "assignee", - "priority" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task field", + "enum": [ + "title", + "description", + "goal", + "context", + "constraints", + "output", + "checks", + "status", + "assignee", + "priority", + "decisions" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / StatusChangedFactsView / properties / from_status / anyOfPrevious value: -[ - { - "description": "Task status", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / StatusChangedFactsView / properties / to_status / anyOfPrevious value: -[ - { - "description": "Task status", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / TaskView / properties / status / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +] - changed
Output schema / $defs / VerdictFactsView / properties / outcome / anyOfPrevious value: -[ - { - "description": "Outcome of a review check", - "enum": [ - "passed", - "failed" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Outcome of a review check", + "enum": [ + "passed", + "partial", + "unverifiable", + "failed" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Output schema / $defs / WarningFactsViewAdded value: +{ + "description": "Warning: numbers of the checks closed `partial` and `unverifiable`.", + "properties": { + "partial": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Partial" + }, + "type": { + "const": "warning", + "title": "Type", + "type": "string" + }, + "unverifiable": { + "anyOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Unverifiable" + } + }, + "required": [ + "type", + "partial", + "unverifiable" + ], + "title": "WarningFactsView", + "type": "object" +} - added
Output schema / properties / decisionsAdded value: +{ + "description": "Project decisions the task relies on, in the order of its `decisions` field. The project's other decisions in force are listed by `get_project`", + "items": { + "$ref": "#/$defs/CitedDecisionView" + }, + "title": "Decisions", + "type": "array" +} - changed
Output schema / properties / parent / anyOfPrevious value: -[ - { - "$ref": "#/$defs/LinkOtherView" - }, - { - "type": "null" - } -]New value: +[ + { + "$ref": "#/$defs/ParentCardView" + }, + { + "type": "null" + } +] - changed
Output schema / properties / transitions / items / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +] - changed
Output schema / requiredPrevious value: -[ - "task", - "parent", - "children", - "links", - "features", - "summary", - "questions", - "remarks", - "transitions", - "index" -]New value: +[ + "task", + "parent", + "children", + "links", + "decisions", + "features", + "summary", + "questions", + "remarks", + "transitions", + "index" +]
- Changed
read_entries2 fields changed- changed
Input schema / properties / types / anyOfPrevious 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" - } -]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", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / EntryView / properties / type / enumPrevious 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" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "question", + "answer", + "verdict", + "remark", + "resolution", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" +]
- Changed
read_project_entries2 fields changed- changed
Input schema / properties / types / anyOfPrevious 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" - } -]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", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / EntryView / properties / type / enumPrevious 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" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "question", + "answer", + "verdict", + "remark", + "resolution", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" +]
- Changed
search_tasks9 fields changed- added
Input schema / properties / decisionAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Project decisions `PROJECT#N`: the tasks whose `decisions` field names one of them, in any status, also after the decision is superseded. `empty()` matches tasks that name no decision. An address that is not a `decision` entry of a project's case is refused rather than read as «no tasks»", + "examples": [ + [ + "TRK#15" + ] + ], + "title": "Decision" +} - changed
Input schema / properties / fields / descriptionPrevious 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`"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`, `open_warnings`, `last_summary_at`, `last_entry_at`. `parent` is the parent's key and title, or `null`" - added
Input schema / properties / open_warningsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "1 for tasks with an open `warning`, 0 for the rest", + "title": "Open Warnings" +} - changed
Input schema / properties / query / descriptionPrevious 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"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`, `decision`, `key`, `last_entry_at`, `open_blocking_questions`, `open_questions`, `open_remarks`, `open_warnings`, `parent`, `priority`, `project`, `remarks_in_work`, `status`, `text`, `under`. 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 / status / anyOfPrevious value: -[ - { - "items": { - "description": "Task status", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "done", + "cancelled" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / underAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Root task keys: all their descendants at any depth, without the roots. `parent` is the direct children only. An unknown key is refused", + "examples": [ + [ + "TRK-7" + ] + ], + "title": "Under" +} - added
Output schema / $defs / FeaturesView / properties / open_warningsAdded value: +{ + "title": "Open Warnings", + "type": "integer" +} - changed
Output schema / $defs / FeaturesView / requiredPrevious value: -[ - "blocked", - "open_questions", - "open_blocking_questions", - "open_remarks", - "last_summary_at", - "last_entry_at" -]New value: +[ + "blocked", + "open_questions", + "open_blocking_questions", + "open_remarks", + "open_warnings", + "last_summary_at", + "last_entry_at" +] - changed
Output schema / $defs / FoundTaskView / properties / status / anyOfPrevious value: -[ - { - "description": "Task status", - "enum": [ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "description": "Task status", + "enum": [ + "backlog", + "open", + "in_progress", + "done", + "cancelled" + ], + "type": "string" + }, + { + "type": "null" + } +]
- Changed
transition3 fields changed- changed
Input schema / properties / reason / descriptionPrevious 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"New value: +"Why the task moves. Required for any step back along `backlog < open < in_progress < done` and for `cancelled` (`transition_reason_required` otherwise), optional elsewhere. Filed in the `status_changed` entry as text only: a wait is held by its carrier, an open `blocking` question or `blocked_by`, and not by the reason" - changed
Input schema / properties / to / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +] - changed
Output schema / properties / status / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +]
- Changed
update_task2 fields changed- added
Input schema / $defs / TaskChanges / properties / decisionsAdded value: +{ + "description": "The whole new list, editable in any status but `done` and `cancelled`. References `PROJECT#N` to `decision` entries of a project's case, up to 20: the project decisions the task relies on. A task entry such as `TRK-42#7` is refused with `task_fields_invalid` (`task_entry`), a project entry of another type with `not_a_decision`. A reference not yet in the field leads to a decision in force; a superseded one is refused with `decision_not_in_force`, its successor in `details`. A reference already in the field stays there after its decision is superseded", + "examples": [ + [ + "TRK#15" + ] + ], + "items": { + "type": "string" + }, + "title": "Decisions", + "type": "array" +} - changed
Output schema / properties / status / enumPrevious value: -[ - "backlog", - "open", - "in_progress", - "waiting", - "done", - "cancelled" -]New value: +[ + "backlog", + "open", + "in_progress", + "done", + "cancelled" +]
- Changed
wait_journal2 fields changed- changed
Input schema / properties / types / anyOfPrevious 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" - } -]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", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / $defs / EntryView / properties / type / enumPrevious 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" -]New value: +[ + "summary", + "decision", + "attempt", + "finding", + "artifact", + "question", + "answer", + "verdict", + "remark", + "resolution", + "acceptance", + "note", + "created", + "status_changed", + "section_changed", + "field_changed", + "assignee_changed", + "link_added", + "link_removed", + "moved", + "warning", + "attribute_created", + "attribute_changed", + "attribute_removed", + "archived", + "restored" +]
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"
TDQS
Scored across 30 tools
Each tool targets a clearly distinct resource and action, with explicit boundaries between similar operations (e.g., add_entry vs add_summary vs add_verdict, transition vs close_task). The descriptions explicitly state which tool to use for which purpose, preventing misselection despite the large number of tools.
The vast majority of tools follow a consistent verb_noun pattern (e.g., create_task, get_project, read_entries). A few tools use single verbs (ask, answer, resolve, link, unlink) and one uses a noun/verb (transition), but these are conventional and still readable.
With 30 tools, the set is on the heavy side for an MCP server, though the domain is complex and many tools have specialized roles. Some consolidation could be possible (e.g., entry-filing tools), making the count borderline rather than clearly appropriate.
The tool surface covers the full lifecycle of tasks, projects, entries, participants, attributes, links, and a journal stream. No obvious gaps exist for the stated purpose; operations like archive/restore, attribute management, and entry reading are all present.
Maintenance
Related MCP Connectors
Shared task layer for AI agents: tasks, handoffs and decisions that persist across tools.
- 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.
Related MCP Servers
- AlicenseBqualityCmaintenanceEnables AI agents and humans to collaboratively plan and manage tasks with a shared kanban and dependency graph, all stored locally.3115 npm82MIT
- 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.-
- AlicenseAqualityCmaintenanceShared memory and handoff hub for AI agents, enabling seamless context transfer between sessions with token-budgeted resumes and automatic handoffs.104 npmMIT
- AlicenseAqualityBmaintenanceEnables AI agents to manage a task board by investigating needs, creating well-specified tasks, and executing them end-to-end.61MIT