OMP Tandem
OMP Tandem is an MCP server that gives a coding agent an independent AI peer for consultation, design, implementation, and review through Oh My Pi, with persistent conversations and project-scoped tools.
Start and manage tasks: Launch tasks in
think,analyze, orworkmodes viatandem_start, continue conversations with new goals (tandem_continue), cancel tasks (tandem_cancel), and list recent tasks (tandem_list).Retrieve results and handle questions: Get answers, work outcomes, and next actions (
tandem_result), reply to clarification questions (tandem_reply), and wait efficiently for multiple tasks (tandem_wait).Share immutable artifacts: Publish versioned, content-addressed artifacts (
tandem_publish_artifact) and read them with paging (tandem_read_artifact) for coordination and evidence.Manage product knowledge: Coordinators can publish/read/list project contexts (
tandem_project_context) with rules, decisions, and components; explicitly export/import contexts between projects (tandem_export_context,tandem_import_context).Inspect project boundaries: Check the launch-project scope and legacy import status (
tandem_scope).Optional push delivery: Configure and manage Claude Code Channels webhooks, probe ack, pending events, and recovery (
tandem_channel).
Integrates with Git for version-bound review bundles, staged/index snapshots, worktree comparisons, and shared task claims/submissions requiring a Git repository with an immutable HEAD commit.
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., "@OMP TandemAsk OMP to independently challenge this design while I inspect the API constraints."
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.
OMP Tandem
Give your coding agent an independent AI peer.
Consult, design, implement, and review together through Oh My Pi, with persistent conversations and project-isolated MCP tools.
Quick start · Full guide · Releases · Contributing
Why OMP Tandem?
A second agent should do more than approve the first agent's work. OMP Tandem lets your coordinator ask for independent reasoning, explore alternatives, delegate a separate implementation slice, and compare findings against evidence.
Real OMP, your provider. Uses the official
omp_rpcclient andomp --mode rpc, not a substitute direct-API wrapper.Proportional planning. Independent assessment, one comparison, a concrete plan, then implementation and cross-checking—not a fresh whole-project audit for every local fix.
Persistent conversations. Continue a discussion while replacing the current goal and preserving its base constraints.
Scoped knowledge. Separate project histories, optional versioned product rules, and explicit cross-project sharing.
Honest results. Structured outcomes, questions with deadlines, and recoverable intermediate artifacts.
Version-bound reviews. Choose worktree or staged-only material, then use independent-first comparison, stale-result detection and finding history. Review workflow.
Bounded waiting and visible usage. Claude watchdog with polling fallback, explicit live diagnostics, and depth/budget settings separate from permissions. Profiles and usage.
Portable integration. Claude Code plugin, Agent Plugins package for Codex, and ordinary local stdio MCP for other hosts.
No company-specific policies or hardcoded project paths are bundled.
Related MCP server: forge-mcp
Quick start
1. Install the prerequisites
Requires macOS/Linux, or WSL with Linux tools, plus uv and OMP on PATH.
With Homebrew:
brew install uv
brew install can1357/tap/omp
omp setupUse OMP's setup flow to authenticate your own supported provider and select a tool-capable model. The host agent has its own separate login. For Linux/standalone installation, API keys, OAuth, and local models, see the setup guide.
2. Install for your host
Claude Code
claude plugin marketplace add Flyozzzz/omp-tandem-public
claude plugin install omp-tandem@omp-tandemCodex CLI
codex plugin marketplace add Flyozzzz/omp-tandem-public
codex plugin add omp-tandem@omp-tandem --jsonStart a new session from your project's directory. Do not keep an old standalone registration enabled alongside the plugin. This repository is public; no invitation is required.
Python dependencies are prepared automatically in a private cache. OMP installation and provider authentication remain explicit user setup. Other clients can use the standard MCP configuration.
3. Check this project's setup
In Claude, run /omp-tandem:setup and ask for local diagnosis only. Confirm that Tandem is bound to your project, not the plugin/cache directory, and inspect runtime and delivery prerequisites. This does not call a model or prove provider authentication; a separate live diagnostic is optional and needs your approval.
4. Review your prepared commit
Stage the intended changes, then use /omp-tandem:tandem or ask in natural language:
Use OMP Tandem to review my prepared commit, using staged changes only. Use this task's requirements and acceptance criteria; ask me if they are missing. Do not edit files. Report correctness risks with evidence and identify missing context.
The agent uses tandem_review_run, not a manual sequence of low-level tools: one independent read-only assessment, then at most one comparison with separately supplied author proposal/rationale. Without author material there is only one stage. Progress stays compact; the terminal result includes the full stage answers. The default 600-second total budget covers capture, startup, stages, and questions—not 600 seconds per stage. The scenario neither edits files nor runs supplied test commands.
The review uses a saved staged/index snapshot, not unstaged working files. Include requirements, criteria, and explicitly needed unchanged callers/tests in that capture. Missing source context requires a fresh expanded snapshot and review, never silently joining live files to an old review. You do not need to learn the low-level tool catalog. Client command prefixes vary; natural-language instructions work with connected Tandem tools.
For development, scale planning to uncertainty: a known local fix needs a brief risk/criteria check and a small plan, not a new audit of the whole project or a re-proof of user-confirmed facts. After one independent assessment and one comparison, choose an approach, run a distinguishing experiment, or state the unresolved question for the user. Do not loop until the agents agree.
5. Give both agents one shared task
Use OMP Tandem to agree a shared task for this feature. Record the goal, constraints, acceptance criteria, module owners and distinct reviewers. Split independent modules, add a final integration step, and keep the checklist and blockers current. Do not launch unattended work until I grant its limits.
tandem_work exposes the same durable card to both participants, including a readable Markdown view. Work survives a conversation ending; a saved task is not a running agent. Existing-client work is manual; opt-in unattended execution uses a separate bounded controller, dedicated Claude/OMP attempts and isolated Git worktrees. Accepted results are not silently merged into your current branch. Shared-task workflow and operator commands.
Two entry paths in 3.5.0
Prepared change: use
tandem_review_runwithsource="staged"for the intended commit's index snapshot; it is a read-only review, not implementation or test execution.Shared development: use
tandem_workfor a two-agent plan, file ownership, claims, committed submissions and distinct review. The bound project root must be a Git repository with a HEAD commit for claim/submit; launching from its parent folder can produceWork execution requires a Git repository with an immutable HEAD commit. A taskcwdcannot repair the launch boundary.Operator grant: inspect
authorize --previewbefore activating.--claude-model(defaultsonnet) and--omp-model(alias of--model) go beforeauthorize;--max-attempt-cost-usd,--allow-shelland deprecated--allow-testsgo after it. Shell means arbitrary execution, not a test sandbox. The grant'spreview.permissionsand reserve policy disclose the actual permissions and default attempt ceiling (half the total budget, independent of launch count); model selections are pinned, not proof of observed model identity.Independent-first review:
report→ optional singlecompare→accept/reject. Author interpretation stays withheld through the independent report until comparison opens. Managed reviewers read only the pinned commit snapshot; a shell-granted review creates an operator blocker before launch, not a silently unrestricted review. A successful report is not acceptance.Migration and limits: unresolved blockers survive
propose; removed steps leave card-level blockers. Only the blocker author/operator can resolve them with evidence. Legacy grants retain total-budget/max_launchesattempt ceilings andallow_testsdecoding; legacy review attempts are labelledlegacy_disclosure, not retrospectively independent. No migration restarts work. Acceptance does not apply code: stop/recovery and explicit operator apply remain separate.
Operator commands and migration details. Helper compatibility records five unsatisfied gates: child-tool restriction inheritance, project scout replacement, task-wide settings snapshots, exclusive parent usage, and extra model calls per spawn. Helpers remain disabled (delegation.available=false); stages C–F and helper savings are not released.
How it works
flowchart LR
A[Coding agent] <-->|MCP stdio| T[OMP Tandem]
T <-->|official omp_rpc| O[Oh My Pi]
O <--> M[Your configured model]
T <--> D[(Project data)]Mode | Use it for | Project access |
| Consultation and reasoning over supplied context | No project/shell tools; collaboration tools remain available |
| Investigation and review | Read/search/web search; no edits or shell |
| Explicitly authorized implementation | Edit/write/shell and related tools; not a sandbox |
New tasks create independent conversations. Follow-ups retain native OMP history but replace the current objective. Questions and intermediate artifacts keep uncertainty visible instead of turning missing information into assumed success.
Evidence, not a promise
In our real review case, the first attempt was blocked by missing context (80.558 s wall time). An expanded review found a real deadline/cancellation bug, but its 300 s total budget ended in a timeout after 331.723 s wall time. A focused recheck completed in 186.127 s wall time and identified a distinct shared-SQLite publication-lock risk, not yet runtime-verified in that episode. Completion is not proof of bug-free code; the case preserves failures and remaining uncertainty.
The publication-lock risk was then reproduced and fixed before release; the case separates that passing runtime follow-up from the original static report.
Compatibility checks use an actual pinned OMP binary and RPC SDK with a deterministic localhost provider in CI—no paid account is needed. Evidence applies to the exact tested combination, not a broad version range or every provider. The benchmark document is a comparative protocol only: no comparative results or superiority claim.
Boundaries that matter
Project data is bound to trusted client workspace information, never a task's model-supplied
cwd. Foreign IDs do not open another project's history.The package does not sandbox processes with your OS permissions. Host shell sandbox settings do not automatically constrain an external OMP process.
Reports are claims, not independent acceptance.
completeddoes not provesuccess.Optional hooks diagnose prerequisites and provide a bounded Claude watchdog; they never install tools, read provider credentials, approve permissions, or replace polling when unavailable.
Polling works without Channels. Claude push/webhooks are optional and remain subject to client and organization policy.
Local storage is not offline inference: configured providers receive task context.
Read the security policy before reporting a vulnerability. Never include credentials, private conversations, or runtime databases in issues or pull requests.
Documentation
Topic | Reference |
Installation, providers, and clients | |
Start Claude and the webhook with one short command | |
Tasks, modes, results, questions, and artifacts | |
Product rules and decisions | |
Workspace isolation and explicit sharing | |
All MCP tools and limits | |
Local data upgrades and migration | |
Claude Channels, webhook protocol, and managed setups | |
Development and contributions |
Full guides are also available in Russian and Simplified Chinese.
Development
uv sync --frozen --group dev
uv run pytest -q
uv run --frozen ruff check .
uv run --frozen ruff format --check .
uv build --wheelpytest is a declared development dependency; uv installs the project package and its omp_rpc dependency into the same environment. Tests use temporary stores and local fault peers, not provider credentials. CI runs pytest, Ruff, wheel building, and distribution checks on Linux and macOS.
This repository begins with a reviewed snapshot of earlier private development. The 3.x version series preserves that lineage without importing its Git history. “Legacy history” refers to local OMP conversation data, not hidden Git commits.
License
MIT, copyright (c) 2026 Flyozzzz. Commercial use, modification, and redistribution are allowed with the copyright and permission notice retained. The software is provided AS IS, without warranty. Dependencies keep their own licenses.
Available Tools
20 toolstandem_cancelA
Stop a task, including while it waits for clarification. Does not undo edits.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It usefully reveals that cancellation does not undo edits and works during clarification waits, but it does not disclose whether cancellation is reversible, whether completed tasks can be cancelled, or any other state-change side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, front-loads the core action, and each sentence adds value. The second sentence prevents a likely misinterpretation about undoing edits.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema, the description is mostly complete: it states the action, a special case, and a key non-effect. It falls slightly short only by not addressing cancellation permanence or behavior on already-completed tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has a single task_id parameter with no description, and the tool description does not explain its format, origin, or usage. The parameter is self-explanatory by name, but the description adds no explicit parameter-level meaning despite low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Stop a task') and adds a meaningful nuance about stopping while waiting for clarification. This clearly distinguishes it from sibling tools like start, continue, wait, and result.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: to stop any task, including one waiting for clarification. It also notes a relevant limitation ('Does not undo edits'), but it does not explicitly name alternatives or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_channelA
Manage optional Claude Code Channels push delivery; ordinary polling always remains available.
probe sends a receipt challenge only through the channel; ack with its probe_token confirms delivery. watchdog_token acknowledges an actual independent hook wake, never a tool-response assertion. ack with event_id acknowledges a webhook. pending lists unacknowledged events (include_previous explicitly includes earlier sessions). recover replays one event_id or a completed task_id; never changes task outcomes or reruns work. Token-file contents are secret.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| action | No | status | |
| task_id | No | ||
| event_id | No | ||
| probe_token | No | ||
| watchdog_token | No | ||
| include_previous | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it discloses that polling remains available, that watchdog_token must reflect an actual independent hook wake, that recover never changes task outcomes or reruns work, and that token-file contents are secret. It does not fully spell out state-changing effects like whether an ack consumes the event, leaving a small transparency gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with an overview, then delivers one compact clause per action with caveats attached to the relevant operation. Every sentence earns its place, including the final security note about token-file contents. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers most of the tool's complex behavior and an output schema exists, so return-value documentation is not required. But the 'status' action in the enum is never explained, and 'limit' is undocumented. For a 7-parameter, 5-action tool with no annotations, these are meaningful gaps.
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 0%, so the description must compensate. It successfully connects probe_token, watchdog_token, event_id, task_id, include_previous, and the action values to their behaviors. However, the 'limit' parameter is never mentioned, and the allowed ack combinations are implied rather than fully explicit.
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 and resource: 'Manage optional Claude Code Channels push delivery' and contrasts it with 'ordinary polling.' It is clear and not tautological, but it does not name or distinguish any sibling tool, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete per-action conditions: probe is for a receipt challenge, ack confirms via probe_token/watchdog_token/event_id, pending lists unacknowledged events, and recover replays event_id or task_id. It does not explicitly name alternative tools or say when not to use this tool, but the action-level context is clear enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_continueA
Start a NEW current goal after completion; supply exactly one of prompt or turn contract.
History/base policy/mode/cwd persist, but old goals/acceptance do not. The product snapshot stays pinned unless explicitly changed to another revision of the same project. Question timeout is inherited unless explicitly set here. For waiting_input use tandem_reply.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | No | ||
| contract | No | ||
| execution | No | ||
| review_id | No | ||
| review_stage | No | ||
| conversation_id | Yes | ||
| timeout_seconds | No | ||
| project_context_id | No | ||
| question_timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses highly non-obvious state semantics: history/base policy/mode/cwd persist, old goals/acceptance do not, the product snapshot stays pinned unless explicitly changed, and the question timeout is inherited unless overridden. This is exactly the behavioral context an agent needs before invoking a continuation tool.
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?
Around 60 words, with the primary action and the one critical rule in the first sentence, followed by terse, high-value persistence notes. Every sentence earns its place and nothing is redundant.
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 stateful 9-parameter tool with no annotations, the description covers core continuation semantics (what persists, what resets, snapshot pinning, timeout inheritance) and routes the waiting_input case to tandem_reply. It does not explain the optional execution or review-related fields, but the output schema and nested property descriptions cover return values, leaving only a moderate gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 0%, so the description must compensate; it usefully clarifies the prompt/contract mutual exclusion and timeout inheritance. However, it leaves several parameters (execution, review_id, review_stage, project_context_id) without explanatory text, and the input schema itself supplies most of the remaining structured constraints. The contribution is meaningful but partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete action ('Start a NEW current goal') and the condition 'after completion', which clearly separates it from tandem_start and similar siblings. It also explicitly names tandem_reply for the waiting_input case, so the tool's scope is unmistakable.
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 when to use the tool ('after completion') and gives an explicit exclusion ('For waiting_input use tandem_reply'). It also imposes the critical selection rule 'supply exactly one of prompt or turn contract.' It does not enumerate every sibling alternative, but the central routing guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_diagnoseA
Diagnose this client session's project, OMP execution, actual model and delivery.
live=true starts one short provider request and may incur a charge: use only for a user-requested live check. Default checks local state without contacting a provider. If still running, inspect the returned task_id instead of starting another check. A separate CLI process cannot certify this session's push receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| live | No | ||
| task_id | No | ||
| wait_seconds | No | ||
| timeout_seconds | No | ||
| expected_project | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of disclosing behavior. It discloses that live=true contacts a provider, may incur a charge, defaults to local state, returns a task_id when still running, and that a separate CLI process cannot certify the push receipt. This is strong behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the main purpose in the first sentence and operational constraints in the next three. Every sentence adds necessary information; there is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema presumably covers return values, and the description covers the core behavior and safety considerations. However, the missing semantics for three parameters and lack of routing among sibling tools leave the description incomplete for a tool with this many controls.
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 0%, so the description must compensate. It explains live and task_id, but wait_seconds, timeout_seconds, and expected_project are left undocumented. An agent cannot fully understand how to set or interpret these parameters from the description alone.
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 starts with 'Diagnose this client session's project, OMP execution, actual model and delivery,' which names a specific action and target. It is clear what the tool does, though it does not explicitly differentiate it from sibling tools like tandem_review or tandem_findings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains when to use live=true versus the default local check, and instructs the agent to inspect an existing task_id instead of starting another check. It provides useful context but does not name alternative sibling tools or explicit when-not-to-use conditions beyond live checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_export_contextA
Explicitly offer this project's selected rules and referenced evidence to one recipient.
Use only when the user intends cross-project sharing. No tasks/history are shared. The returned transfer_id is a private capability, not a public link. The recipient must separately call tandem_import_context in its own coordinator session. This grants no permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| context_id | Yes | ||
| target_project_root | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations are absent, the description reveals important behavioral traits: the transfer_id is a private capability rather than a public link, the operation grants no permissions, and no tasks/history are shared. This is precisely the kind of context an agent needs beyond the bare 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?
The description is compact and front-loaded: the core purpose comes first, followed by usage constraints, privacy implications, and security caveats. Every sentence earns its place with no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, when to use, security, return value semantics, and the follow-up action on the recipient side. The main gap is the lack of explicit parameter documentation; otherwise, an agent would have enough context to invoke the tool safely and understand the result.
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 0%, and the description does not explicitly explain the two required parameters. 'context_id' and 'target_project_root' are somewhat inferable from their names and the surrounding text, but the description never states how to obtain context_id, what format target_project_root should take, or how they map to the described behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('Explicitly offer') and a clear resource ('this project's selected rules and referenced evidence') directed at 'one recipient.' It also distinguishes itself from tandem_import_context and siblings by describing what it does and does not do.
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 usage condition: 'Use only when the user intends cross-project sharing.' It also clarifies that no tasks/history are shared and that the recipient must separately call tandem_import_context, which prevents misuse and clearly scopes the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_findingsA
Track version-bound review findings without rewriting their history.
Validity and resolution are separate. A claimed fix is not verified; verify_fixed needs evidence and a completed verification task for its snapshot. Update requires the current expected_revision. Get by stable finding_id or conversation_id plus human number.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| action | Yes | ||
| change | No | ||
| number | No | ||
| offset | No | ||
| finding | No | ||
| task_id | No | ||
| review_id | No | ||
| finding_id | No | ||
| conversation_id | No | ||
| expected_revision | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden and does so well. It discloses that history is immutable, validity and resolution are tracked separately, claimed fixes are not automatically verified, and updates require an expected revision. It does not cover every side effect or status transition, but the most important behavioral traps are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences with no filler. The key invariant is front-loaded, and the following sentences deliver high-value operational constraints. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so omitting return-value details is acceptable. The description covers the hardest domain rules around versioning and verification, but leaves list/create parameter selection and the roles of review_id and task_id to inference from the schema. For an 11-parameter tool with no annotations, this is minimally viable but not 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 description coverage is 0%, so the description must compensate for 11 undocumented parameters. It adds meaning for expected_revision, finding_id, conversation_id, number, evidence, and verification_task_id, but leaves action, change, finding, task_id, review_id, limit, and offset largely unexplained. This partial coverage is insufficient for a schema of this size.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('version-bound review findings') and a governing behavior ('without rewriting their history'), which makes the tool's purpose reasonably clear and distinguishes it from the other tandem_* siblings. It does not explicitly enumerate the create/update/get/list actions from the schema, but the core purpose is still identifiable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete operational guidance for suboperations: update requires current expected_revision, get uses finding_id or conversation_id plus human number, and verify_fixed needs evidence and a completed verification task. However, it does not explicitly say when to prefer this tool over a sibling such as tandem_review or tandem_result, so cross-tool usage guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_import_contextA
Explicitly accept a product snapshot offered to this launch project.
Only recipient-bound exports can be imported; no foreign database is browsed. Creates fresh local context/evidence IDs, preserving source provenance, not granting approval. Existing product revisions require expected_revision. Retrying one transfer is idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| transfer_id | Yes | ||
| expected_revision | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well. It discloses that the operation creates fresh local IDs, preserves provenance, does not grant approval, is idempotent on retry, and cannot browse a foreign database.
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?
Four compact sentences with no filler. The purpose is front-loaded, and the remaining sentences each add a distinct, useful constraint or behavioral note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and an output schema already present, the description covers all critical invocation details: import scope, provenance handling, revision expectations, idempotency, and the non-approval side effect. An agent has enough information to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explicitly explains expected_revision ('Existing product revisions require expected_revision') and implies transfer_id from 'recipient-bound exports' and 'Retrying one transfer.' However, transfer_id is never named or formally defined, leaving a minor ambiguity.
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: 'Explicitly accept a product snapshot offered to this launch project.' The description also distinguishes the tool from browsing or generic import by noting that only recipient-bound exports can be imported and no foreign database is browsed.
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?
Provides clear context about when the tool is appropriate: importing only recipient-bound exports, requiring expected_revision for existing revisions, and supporting idempotent retries. It does not explicitly name sibling alternatives or say 'use this instead of X,' but the constraints effectively delineate the correct use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_listA
List recent task/conversation IDs, statuses, outcomes and next actions without large bodies.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It clearly discloses that the tool returns lightweight metadata fields and deliberately omits large bodies. It does not mention ordering, recency semantics, or side effects, but 'List' strongly signals a read-only operation.
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?
A single front-loaded sentence with no filler. Every element—'recent', the listed fields, and 'without large bodies'—contributes directly to the tool's behavior and selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-parameter list tool with an output schema, the description is mostly sufficient. However, it lacks explicit usage guidance, does not explain the 'limit' parameter, and relies on the tool name to convey read-only status because no annotations exist. These are real but non-fatal gaps.
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 0% and the description never mentions the only parameter, 'limit', so it does not compensate for the missing schema field description. The parameter name and constraints supply some meaning, but the description adds no guidance on how limit affects the returned items.
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 ('List') and a precise resource: recent task/conversation IDs, statuses, outcomes, and next actions. The phrase 'without large bodies' clearly scopes it to metadata and distinguishes it from body-oriented siblings like tandem_read_artifact.
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 phrase 'without large bodies' implies this is for overviews rather than full content, but it never names an alternative or states explicit when-to-use/when-not-to-use conditions. Siblings such as tandem_read_artifact likely cover the body-heavy case, but that routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_project_contextA
Coordinator-only product knowledge: source-backed rules, examples and settled decisions.
publish creates an immutable snapshot; updating a project requires its current expected_revision. get uses an exact context_id; list optionally filters project_id. Pass context_id to tandem_start/continue explicitly. Publishing never changes active tasks. Workers may propose changes in their answer but do not get this publishing tool. Do not approve invented rules.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| action | Yes | ||
| context | No | ||
| context_id | No | ||
| project_id | No | ||
| expected_revision | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: it discloses immutability of published snapshots, the expected_revision requirement, that publishing never changes active tasks, and that workers cannot access this publishing tool. This adds meaningful behavioral context beyond the raw 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?
The description is dense but every sentence earns its place: purpose, action behavior, revision requirement, parameter routing, side-effect guarantee, and permission boundary. The most important information is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description covers the critical invariants and action-specific semantics. Minor omissions are the exact role of the context parameter and the limit parameter, but the schema provides enough defaults and names to make invocation feasible.
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 0%, so the description must compensate. It adds semantics for action, expected_revision, context_id, and project_id, and hints at content types through 'rules, examples and settled decisions.' It does not explain limit or the full context object relationship, but the schema names and defaults reduce the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as coordinator-only product knowledge for source-backed rules, examples, and settled decisions, and names the three actions (publish, get, list). It conveys the resource and its primary operations, though it does not explicitly contrast with siblings like tandem_scope or tandem_publish_artifact.
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 coordinator-only usage, explains when expected_revision is needed, specifies that get requires an exact context_id, and that list filters by project_id. It also gives cross-tool guidance to pass context_id to tandem_start/continue. It does not name an alternative tool or provide an explicit when-not-to-use instruction, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_publish_artifactA
Publish immutable shared context; each same-name publication creates a new version.
Return artifact_id to the partner in a follow-up or contract.artifact_ids. Content max 4MiB UTF8. Logical names are not filesystem paths; no file is read or modified by this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| content | Yes | ||
| media_type | No | text/plain | |
| conversation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| sha256 | Yes | |
| created | Yes | |
| task_id | Yes | |
| version | Yes | |
| characters | Yes | |
| context_id | No | |
| media_type | Yes | |
| artifact_id | Yes | |
| conversation_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and succeeds: it discloses immutability, version-on-republish, a 4MiB UTF8 content limit, and that logical names are not filesystem paths. It also explicitly states 'no file is read or modified,' which prevents a common false assumption about artifact handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with the core operation and versioning behavior front-loaded, followed by return guidance and practical constraints. Every sentence earns its place, and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a publication tool with an output schema, the description covers the essential operational facts: what is published, versioning semantics, how to use the returned artifact_id, content size/encoding limits, and the non-filesystem caveat. The main missing context is clearer guidance on when to use this versus reading or exporting artifacts, but that is a usage guideline gap rather than a completeness failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful semantics for two parameters: content is limited to 4MiB UTF8, and name is a logical, versioned identifier rather than a filesystem path. However, media_type and conversation_id are left unexplained in both the schema and the description, so the agent must infer their roles from the enum and parameter names alone.
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 leads with a specific verb and resource: 'Publish immutable shared context,' and immediately clarifies versioning behavior with 'each same-name publication creates a new version.' This clearly distinguishes it as a publication tool from siblings like tandem_read_artifact, tandem_list, or tandem_export_context.
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 usage is implied: you publish a named artifact for a partner, then return artifact_id in a follow-up. However, it does not explicitly say when to prefer this tool over tandem_read_artifact, tandem_export_context, or other siblings, nor does it describe exclusions or alternative conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_read_artifactA
Read an immutable artifact version shared by the coordinator and OMP; page using next_offset.
Offsets count Unicode characters; limit 1..50000. IDs never resolve arbitrary local files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| artifact_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses immutability, Unicode character-based offsets, the limit range, pagination via next_offset, and an important security property that IDs never resolve local files.
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 with no filler: the first states purpose and pagination, the second gives parameter semantics and a security caveat. Every sentence earns its place and key constraints are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required. The description covers purpose, pagination behavior, parameter semantics, and security. The only noticeable gap is a lack of explicit guidance on when to prefer this over other read/list siblings.
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 0%, so the description must explain parameters. It clarifies artifact_id as a coordinator/OMP-shared immutable artifact ID, limit as 1..50000, and offset as Unicode character count, though it leaves defaults to 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: 'Read an immutable artifact version shared by the coordinator and OMP'. This distinguishes it from sibling writing/publishing tools like tandem_publish_artifact and from broader listing tools, so an agent can understand what it targets.
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 context is clear: this tool reads immutable artifact versions and paginates with next_offset. It does not explicitly name alternatives or when-not-to-use conditions, but the shared-by-coordinator-and-OMP framing plus the 'never resolve arbitrary local files' caveat provides practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_receiptB
Gate result processing separately from reading/acknowledging notification events.
Claim before applying a terminal result; only an authorized fresh claim may proceed. Complete with its token after handling. Duplicate reads do not authorize repeated effects. A stranded claim is uncertain, never automatically released: reconcile external state. Claims grant no filesystem/external permissions. External effects still need their own idempotency/transaction boundary.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| action | No | status | |
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description correctly carries the behavioral burden. It explicitly discloses that duplicate reads do not authorize repeated effects, stranded claims are never automatically released, claims grant no filesystem/external permissions, and external effects need their own idempotency/transaction boundary. This is substantial behavioral content, though it leaves definitions like 'terminal result' implicit.
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 terse and well-packaged: every sentence adds a distinct rule about claiming, completing, or safety boundaries, and the core for the central purpose is front-loaded. No filler or repetition is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an output schema, the description covers the lifecycle and several important corner cases. Yet it is cryptic about what a receipt represents in practice, does not define the reported status action, and relies heavily on domain-specific vocabulary without orienting an unfamiliar agent.
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 0%, so the description should compensate. It does: 'claim' and 'complete' map to the action enum and 'token' is explained as the outcome of a claim. However, it never mentions the task_id parameter or describes the 'status' action, leaving part of the parameter surface under-documented.
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 indicates the tool coordinates result processing via claim, status, and complete, and says it is separate from reading/acknowledging events. However, the verb 'gate' is vague and the description never states plainly what the tool is or differentiates it from siblings like tandem_result or tandem_review.
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 useful procedural guidance: claim before applying a terminal result, complete with the token after handling, and do not rely on duplicate claims. Still, it never explicitly says when to prefer this tool over alternatives or when not to use it, so the usage guidance is largely inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_replyA
Answer exactly the pending clarification, resuming the same worker. Expired/stale IDs fail.
Duplicate identical answers are idempotent; different second answers are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| answer | Yes | ||
| task_id | Yes | ||
| question_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose key stateful behavior: idempotency for identical duplicates, rejection of conflicting second answers, and failure on stale IDs. It does not detail unrelated side effects, but the output schema covers return behavior.
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 terse sentences put the core purpose first and then capture edge-case behavior with no filler or repeated schema details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-string tool with an output schema, the description covers the critical invocation context: pending clarifications, stale failures, and duplicate behavior. Minor gaps—how IDs are obtained and where this fits among the sibling tools—are not essential to making a correct call.
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 0%, but the description adds contextual meaning: IDs must refer to a pending clarification and can go stale, and the 'answer' is the exact clarification response. It never names the parameters explicitly or describes formats, so it only partially compensates for the lack of schema 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 opens with a specific action ('Answer exactly the pending clarification') and identifies the resource: a clarification associated with a task and question. 'Resuming the same worker' adds useful context that separates it from generic start/list tools, though no sibling alternative is explicitly named.
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 indicates the tool is for replying to a pending clarification and notes edge cases where it should not be used ('Expired/stale IDs fail'; a different second answer is rejected). It does not explicitly enumerate alternatives among the tandem_* siblings, so it falls 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.
tandem_resultA
Get the actual answer, work outcome and next_action. Questions return immediately.
wait_seconds: 0..25. completed is turn completion, not proof of success. answer holds the requested text; summary only describes the work. When answer_truncated, read answer_artifact_id. details=true includes the full answer/report/contract/diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| details | No | ||
| task_id | Yes | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it warns that 'completed is turn completion, not proof of success', distinguishes 'answer holds the requested text; summary only describes the work', and explains truncation handling. This adds meaningful behavioral context beyond 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?
Three or four compact sentences, front-loaded with the tool's purpose, then precise warnings and routing instructions. No filler or repeated schema boilerplate; each sentence adds new 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?
Given an output schema exists and the safety-relevant behavior is disclosed, the description covers the essential call semantics, truncation path, and details switch. It is only slightly incomplete because task_id provenance is not described and the exact relationship to sibling tools is left implicit.
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 0%, so the description must compensate. It adds semantics for details ('details=true includes the full answer/report/contract/diagnostics') and wait_seconds (0..25), but it never explains task_id, the only required parameter, leaving a meaningful gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Get the actual answer, work outcome and next_action.' It also distinguishes the tool from siblings by stating questions return immediately and by routing artifact reads to answer_artifact_id, so an agent can tell it apart from tandem_read_artifact and tandem_wait.
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 on when to use the tool ('Questions return immediately', retrieve answer/outcome) and an explicit condition for routing: 'When answer_truncated, read answer_artifact_id.' It does not name sibling tools directly or discuss when tandem_continue/tandem_wait would be preferable, so it is not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_reviewA
Capture or read an immutable review bundle, or compare it with current selected files.
request.source selects base-to-worktree (default) or base-to-staged Git index material. Staged captures exclude unstaged/untracked content; source also governs applicability checks. Capture includes requirements, supplied checks and boundaries without executing tests. Bind review_id to a think task for snapshot-only review. Author rationale is withheld unless explicitly revealed in a comparison turn. Read pages by next_offset, not the live working directory. assess reports applicability at observation time, not whole-system correctness.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| limit | No | ||
| action | Yes | ||
| offset | No | ||
| request | No | ||
| section | No | manifest | |
| review_id | No | ||
| reveal_author | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that bundles are immutable, that capture records requirements/checks/boundaries without executing tests, that author rationale is withheld until explicitly revealed, and that reads page from the captured bundle rather than the live working directory. It does not cover permissions, rate limits, or what state create persists.
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 capability is front-loaded in the first sentence and the remaining sentences are information-dense with little filler. The run-on line-wrapped prose mixing source semantics, capture behavior, and assess scope is less scannable than short labeled lines would be.
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-action, 8-parameter tool with an output schema present, the description covers the operationally important unknowns: source semantics, immutability, non-execution of tests, rationale withholding, and the snapshot-vs-live distinction. Return-value detail is legitimately delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 0% across 8 parameters, so the description must compensate and only partly does: it explains request.source and review_id but says nothing about path, limit, offset, section, or the check/criteria shapes. It also refers to paging by 'next_offset', a name that does not exist among the input parameters, which risks confusion.
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 gives a specific verb set (capture, read, compare) and a well-defined resource (an immutable review bundle), and the action enum semantics (create/read/assess) are spelled out later. It does not, however, differentiate itself from the clearly related sibling tandem_review_run, so an agent must infer the boundary.
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 real conditional guidance: request.source selects base-to-worktree by default vs base-to-staged index, staged captures exclude unstaged/untracked content, and review_id can be bound to a think task for snapshot-only review. What is missing is any explicit when-not or named alternative (e.g. tandem_review_run), so the routing is only partly resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_review_runA
Run one read-only review scenario without manually coordinating its native turns.
start: supply ReviewRequest and a stable request_key for this logical request. Reusing the key returns the same run; a different payload conflicts. Code captures the snapshot, runs independent think review, then at most one comparison if author material was supplied and the independent report succeeded. Total budget defaults to 600 seconds, including startup, both stages and questions. It never edits files or runs supplied test commands. status/reply/cancel: use the returned run_id, never start again to wait. Replies require the current question_id. Full stage answers, findings, applicability and peer-only usage are assembled by code. Claims are not automatically accepted or applied. Missing context needs an explicit new capture (context_paths), not hidden live reads.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| answer | No | ||
| run_id | No | ||
| compare | No | ||
| request | No | ||
| execution | No | ||
| question_id | No | ||
| request_key | No | ||
| wait_seconds | No | ||
| budget_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: read-only, never edits files or runs supplied test commands, runs an independent review and at most one comparison, default budget, code-assembled outputs, and claims are not automatically accepted. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and then organizes action-specific guidance under start and status/reply/cancel. The text is dense but mostly earns its place; a few clauses are opaque but not wasteful enough to damage 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?
For a complex 10-parameter orchestrator with an output schema, the description covers the workflow, budget behavior, context capture rules, and claim handling. It does not fully document every parameter or distinguish sibling tools, but it gives enough to invoke the tool correctly in most cases.
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 0% across 10 parameters, so the description must compensate. It explains action, request_key, request/ReviewRequest, run_id, question_id, and budget_seconds, but leaves answer, compare, execution, wait_seconds, and most nested request fields unexplained, so coverage is only partial.
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: 'Run one read-only review scenario.' The action enum is explained, but the description never explicitly distinguishes this multiplexer from siblings such as tandem_start, tandem_review, tandem_reply, or tandem_cancel, so an agent must infer the boundary.
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?
Provides clear action-level guidance: start needs a ReviewRequest and stable request_key; status/reply/cancel use the returned run_id; replies need the current question_id; never start again to wait. It does not name alternative tools or state when not to use this tool, but the action usage is well covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_scopeA
Inspect the immutable project boundary and available computation profile defaults.
Separate launch folders have separate data even with one user-wide MCP registration. Additional client-granted directories permit working there, not reading their MCP history. This is data isolation, not an OS filesystem sandbox. execution_profiles describes defaults, not effective/actual settings after overrides; deep means more time, not higher thinking.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior, and it does so well: it states the boundary is immutable, clarifies that data isolation is not an OS sandbox, and warns that execution_profiles reflects defaults rather than effective overrides. It does not explicitly say 'read-only', but 'inspect' plus 'immutable' conveys it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose, followed by three dense clarifications that each prevent a common misinterpretation. No wasted words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter introspection tool with an output schema, the description covers the essential semantics: what scope is, how folder boundaries work, what execution_profiles represents, and what it does not mean (effective settings, OS sandbox). This is sufficient for an agent to invoke it appropriately and interpret results without further 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?
The tool has no parameters, so the baseline is 4. The description adds useful conceptual context about what 'scope' includes—project boundary, launch folders, and profile defaults—which helps the agent interpret any returned fields even without parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action and object: 'Inspect the immutable project boundary and available computation profile defaults.' This clearly frames the tool as an inspection utility. It doesn't name sibling tools for contrast, but the term 'scope' plus the 'immutable' boundary and 'defaults' caveats make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no direct 'use this when' guidance or reference to alternatives. It does add context about what the tool reports (launch-folder isolation, client-granted directories, defaults vs effective settings), which helps an agent understand relevance, but the agent must infer when to call it relative to siblings like tandem_start or tandem_continue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_startA
Start a task with exactly one of prompt or structured contract. Returns immediately.
Base constraints/owned files stay fixed; each follow-up has a new goal and criteria. project_context_id pins product rules/decisions. Only the coordinator sets question timeout. Think: collaboration; analyze: read/search; work: edits/shell, NOT sandboxed.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | Yes | ||
| mode | No | analyze | |
| prompt | No | ||
| contract | No | ||
| execution | No | ||
| review_id | No | ||
| review_stage | No | ||
| timeout_seconds | No | ||
| project_context_id | No | ||
| question_timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses immediate return, non-sandboxed work mode, and a permission constraint. However, it omits error handling, side effects, or what happens on invalid input (e.g., both prompt and contract given). This is adequate but not thorough.
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. The mode explanation is efficient and the 'NOT sandboxed' note is critical. No redundancy, though structure could be improved with headers.
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 10 parameters and no annotations, the description is incomplete. It fails to explain the execution sub-object, review parameters, project_context_id beyond a single note, and the overall flow. The output schema covers return values, but parameter semantics are under-specified for a tool of this complexity.
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 0%, so the description must compensate. It adds meaning to the mode parameter and clarifies the exclusivity of prompt/contract. It does not explain cwd, execution, review_id, review_stage, timeout_seconds, or question_timeout_seconds (beyond a note). Partial compensation, but significant gaps remain.
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 'Start a task' and the key constraint 'exactly one of prompt or structured contract'. It clearly distinguishes the tool's entry-point role from siblings like tandem_continue and tandem_review, and mentions immediate return.
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?
Provides context on follow-up behavior ('each follow-up has a new goal and criteria'), explains mode semantics (think/analyze/work), and notes a coordination rule (only the coordinator sets question timeout). It does not explicitly exclude use cases for siblings, but the guidance is clear enough for typical selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_waitA
Wait for ANY selected task to finish or ask a question, not 25s per task.
Returns ready IDs/questions, not full answers. Read ready terminal results with tandem_result and remove them from later wait sets; reply directly to a returned question. Does not acknowledge terminal events or rerun work. Await events only with a live independent watchdog.
| Name | Required | Description | Default |
|---|---|---|---|
| task_ids | Yes | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it does well. It explicitly states that the tool does not acknowledge terminal events, does not rerun work, and should only await events with a live independent watchdogikuha. It also explains that it returns ready IDs/questions, not full answers, which is critical for correct agent behavior. The only minor gap is not detailing side effects on the wait set state beyond removal, but the key behaviors are transparent.
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 succinct and well-structured. The core purpose is front-loaded in the first sentence, and subsequent statements efficiently cover key behavior without redundancy. Every sentence adds value, and the language is direct and actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (2 parameters, no nested objects, but with an output schema), the description is largely complete. It covers the behavioral nuances, references the output schema for return values, and provides clear usage guidance. It could be improved by explicitly clarifying the param semantics as noted, but the description is sufficient for an agent to call the tool 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 0%, meaning the schema's parameter descriptions are empty, so the description must compensate. The description mentions 'task_ids' implicitly through 'selected task' and 'ready IDs', and 'wait_seconds' through the time constraint ('not 25s per task'). However, it doesn't explicitly explain the meaning of task_ids (e.g., what format they should be in) or wait_seconds (e.g., the 25-second max and default 20). For a tool with 2 parameters, the description adds some meaning but not enough to fully compensate for the 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool waits for any selected task to finish or ask a question, with a specific verb ('wait'), resource ('selected task'), and scope ('ANY...not 25s per task'). It distinguishes itself from sibling tools by positioning the wait behavior and clarifying that it does not return full answers or acknowledge terminal events, which is unique among the 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?
The description provides clear guidance on when to use this tool: to wait for tasks or questions, and instructs to use tandem_result for reading terminal results, tandem_reply for questions, and to remove resolved tasks from later wait sets. However, it doesn't explicitly state when not to use this tool or name alternative siblings for different wait scenarios, so it just misses a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tandem_workA
Maintain one durable shared task and its role-bound checklist.
To create, send action="create", expected_revision=0, a unique operation_id, and plan; omit work_id. The plan must have one final integration step that depends directly or transitively on every other step, including investigations. For later mutations, get the card first and use its current revision as expected_revision. Use a new operation_id for a new or corrected request; reuse an ID only for an exact retry. list/get/history need no operation_id. Plan agreement, worker submission and independent acceptance are separate. Waiting observes committed changes, not permission to start an agent. Autonomous grants and uncertain-attempt reconciliation are operator CLI actions.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Shared-task command. create requires plan, expected_revision=0, a stable operation_id, and no work_id. All other mutations require the current revision from get and a stable operation_id. list/get/history need no operation_id. | |
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the plan invariant (one final integration step depending transitively on all others), the operation_id retry-vs-new-request semantics, the need to re-read the card for the current revision before mutating, and that autonomous grants/reconciliation are out-of-band CLI actions. It stops short of stating what happens on a stale revision or permission failures.
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, followed by short, information-dense sentences grouped by concern (create, later mutations, idempotency, exclusions). No filler, though the telegraphic style occasionally makes the action-to-parameter mapping hard to follow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is highly complex (18 actions, nested plan object), and an output schema exists so return values need not be described. The description covers the creation contract, mutation preconditions, and idempotency, but omits the ordered propose/agree/claim/submit/accept lifecycle and stale-revision conflict behavior, which an agent would need for non-create actions.
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 50%, so the description must compensate: it covers action, expected_revision, operation_id, plan, and work_id (create path) meaningfully. But many parameters (condition, blocker_id, submission_id, resolution, commit, note, evidence) are left entirely to the schema, and the description does not explain which of the 18 actions require which of them.
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 ('Maintain') and resource ('one durable shared task and its role-bound checklist'), which tells an agent this is the lifecycle manager rather than a read-only or artifact tool. It does not explicitly distinguish itself from siblings like tandem_review or tandem_wait, so it stops short of a 5.
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 when-rules: use action="create" with expected_revision=0 and omit work_id; for later mutations fetch the card first and use its current revision; list/get/history need no operation_id. It even cautions that 'waiting observes committed changes, not permission to start an agent.' However, it never says when to reach for tandem_work versus the other tandem_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v3.5.0- Changed
tandem_review1 field changed- changed
Input schema / properties / request / anyOfPrevious value: -[ - { - "properties": { - "author_proposal": { - "default": "", - "maxLength": 200000, - "type": "string" - }, - "author_rationale": { - "default": "", - "maxLength": 200000, - "type": "string" - }, - "base": { - "default": "HEAD", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "checks": { - "items": { - "properties": { - "code_fingerprint": { - "anyOf": [ - { - "pattern": "^[0-9a-f]{64}$", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "command": { - "anyOf": [ - { - "maxLength": 4000, - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "name": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "output": { - "maxLength": 1048576, - "type": "string" - }, - "source": { - "default": "coordinator supplied", - "maxLength": 1000, - "type": "string" - } - }, - "required": [ - "name", - "output" - ], - "type": "object" - }, - "maxItems": 32, - "type": "array" - }, - "context_paths": { - "description": "Explicit additional saved context; staged reviews use index bytes, never live files.", - "items": { - "type": "string" - }, - "maxItems": 256, - "type": "array" - }, - "criteria": { - "items": { - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "external_boundaries": { - "items": { - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "maxItems": 256, - "minItems": 1, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null - }, - "requirements": { - "maxLength": 200000, - "minLength": 1, - "type": "string" - }, - "source": { - "default": "worktree", - "description": "Select worktree bytes or Git index bytes compared with base. Staged capture never reads live files.", - "enum": [ - "worktree", - "staged" - ], - "type": "string" - } - }, - "required": [ - "requirements" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "author_proposal": { + "default": "", + "maxLength": 200000, + "type": "string" + }, + "author_rationale": { + "default": "", + "maxLength": 200000, + "type": "string" + }, + "base": { + "default": "HEAD", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "checks": { + "items": { + "properties": { + "code_fingerprint": { + "anyOf": [ + { + "pattern": "^[0-9a-f]{64}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "command": { + "anyOf": [ + { + "maxLength": 4000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "name": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "output": { + "maxLength": 1048576, + "type": "string" + }, + "source": { + "default": "coordinator supplied", + "maxLength": 1000, + "type": "string" + } + }, + "required": [ + "name", + "output" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + }, + "commit": { + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required with source=commit: the exact committed snapshot to review against base." + }, + "context_paths": { + "description": "Explicit additional saved context; staged reviews use index bytes, never live files.", + "items": { + "type": "string" + }, + "maxItems": 256, + "type": "array" + }, + "criteria": { + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "external_boundaries": { + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "paths": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "requirements": { + "maxLength": 200000, + "minLength": 1, + "type": "string" + }, + "source": { + "default": "worktree", + "description": "Select worktree bytes, Git index bytes, or the tree of an existing commit compared with base. Staged and commit captures never read live files.", + "enum": [ + "worktree", + "staged", + "commit" + ], + "type": "string" + } + }, + "required": [ + "requirements" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
tandem_review_run1 field changed- changed
Input schema / properties / request / anyOfPrevious value: -[ - { - "properties": { - "author_proposal": { - "default": "", - "maxLength": 200000, - "type": "string" - }, - "author_rationale": { - "default": "", - "maxLength": 200000, - "type": "string" - }, - "base": { - "default": "HEAD", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "checks": { - "items": { - "properties": { - "code_fingerprint": { - "anyOf": [ - { - "pattern": "^[0-9a-f]{64}$", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "command": { - "anyOf": [ - { - "maxLength": 4000, - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "name": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "output": { - "maxLength": 1048576, - "type": "string" - }, - "source": { - "default": "coordinator supplied", - "maxLength": 1000, - "type": "string" - } - }, - "required": [ - "name", - "output" - ], - "type": "object" - }, - "maxItems": 32, - "type": "array" - }, - "context_paths": { - "description": "Explicit additional saved context; staged reviews use index bytes, never live files.", - "items": { - "type": "string" - }, - "maxItems": 256, - "type": "array" - }, - "criteria": { - "items": { - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "external_boundaries": { - "items": { - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "maxItems": 256, - "minItems": 1, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null - }, - "requirements": { - "maxLength": 200000, - "minLength": 1, - "type": "string" - }, - "source": { - "default": "worktree", - "description": "Select worktree bytes or Git index bytes compared with base. Staged capture never reads live files.", - "enum": [ - "worktree", - "staged" - ], - "type": "string" - } - }, - "required": [ - "requirements" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "author_proposal": { + "default": "", + "maxLength": 200000, + "type": "string" + }, + "author_rationale": { + "default": "", + "maxLength": 200000, + "type": "string" + }, + "base": { + "default": "HEAD", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "checks": { + "items": { + "properties": { + "code_fingerprint": { + "anyOf": [ + { + "pattern": "^[0-9a-f]{64}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "command": { + "anyOf": [ + { + "maxLength": 4000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "name": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "output": { + "maxLength": 1048576, + "type": "string" + }, + "source": { + "default": "coordinator supplied", + "maxLength": 1000, + "type": "string" + } + }, + "required": [ + "name", + "output" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + }, + "commit": { + "anyOf": [ + { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required with source=commit: the exact committed snapshot to review against base." + }, + "context_paths": { + "description": "Explicit additional saved context; staged reviews use index bytes, never live files.", + "items": { + "type": "string" + }, + "maxItems": 256, + "type": "array" + }, + "criteria": { + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "external_boundaries": { + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "paths": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "requirements": { + "maxLength": 200000, + "minLength": 1, + "type": "string" + }, + "source": { + "default": "worktree", + "description": "Select worktree bytes, Git index bytes, or the tree of an existing commit compared with base. Staged and commit captures never read live files.", + "enum": [ + "worktree", + "staged", + "commit" + ], + "type": "string" + } + }, + "required": [ + "requirements" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Added
tandem_work
4 tool updates
v3.3.0- Changed
tandem_continue1 field changed- changed
Input schema / properties / execution / anyOfPrevious value: -[ - { - "properties": { - "model": { - "anyOf": [ - { - "minLength": 1, - "pattern": "\\S", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "profile": { - "default": "balanced", - "enum": [ - "quick", - "balanced", - "deep" - ], - "type": "string" - }, - "thinking": { - "anyOf": [ - { - "enum": [ - "off", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "timeout_seconds": { - "anyOf": [ - { - "maximum": 7200, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "model": { + "anyOf": [ + { + "minLength": 1, + "pattern": "\\S", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "profile": { + "default": "balanced", + "description": "Profile defaults: quick: Defaults to low thinking with a 600-second deadline. balanced: Defaults to high thinking with a 1800-second deadline. deep: Defaults to high thinking with a 3600-second deadline. Uses the same thinking level as balanced with a longer deadline, not higher reasoning. These are default choices; overrides, effective settings, and actual settings are reported separately.", + "enum": [ + "quick", + "balanced", + "deep" + ], + "type": "string" + }, + "thinking": { + "anyOf": [ + { + "enum": [ + "off", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "timeout_seconds": { + "anyOf": [ + { + "maximum": 7200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "type": "object" + }, + { + "type": "null" + } +]
- Changed
tandem_review1 field changed- changed
Input schema / properties / request / anyOfPrevious value: -[ - { - "properties": { - "author_proposal": { - "default": "", - "maxLength": 200000, - "type": "string" - }, - "author_rationale": { - "default": "", - "maxLength": 200000, - "type": "string" - }, - "base": { - "default": "HEAD", - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "checks": { - "items": { - "properties": { - "code_fingerprint": { - "anyOf": [ - { - "pattern": "^[0-9a-f]{64}$", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "command": { - "anyOf": [ - { - "maxLength": 4000, - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "name": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "output": { - "maxLength": 1048576, - "type": "string" - }, - "source": { - "default": "coordinator supplied", - "maxLength": 1000, - "type": "string" - } - }, - "required": [ - "name", - "output" - ], - "type": "object" - }, - "maxItems": 32, - "type": "array" - }, - "criteria": { - "items": { - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "external_boundaries": { - "items": { - "type": "string" - }, - "maxItems": 100, - "type": "array" - }, - "paths": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "maxItems": 256, - "minItems": 1, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null - }, - "requirements": { - "maxLength": 200000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "requirements" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "author_proposal": { + "default": "", + "maxLength": 200000, + "type": "string" + }, + "author_rationale": { + "default": "", + "maxLength": 200000, + "type": "string" + }, + "base": { + "default": "HEAD", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "checks": { + "items": { + "properties": { + "code_fingerprint": { + "anyOf": [ + { + "pattern": "^[0-9a-f]{64}$", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "command": { + "anyOf": [ + { + "maxLength": 4000, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "name": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "output": { + "maxLength": 1048576, + "type": "string" + }, + "source": { + "default": "coordinator supplied", + "maxLength": 1000, + "type": "string" + } + }, + "required": [ + "name", + "output" + ], + "type": "object" + }, + "maxItems": 32, + "type": "array" + }, + "context_paths": { + "description": "Explicit additional saved context; staged reviews use index bytes, never live files.", + "items": { + "type": "string" + }, + "maxItems": 256, + "type": "array" + }, + "criteria": { + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "external_boundaries": { + "items": { + "type": "string" + }, + "maxItems": 100, + "type": "array" + }, + "paths": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "maxItems": 256, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + }, + "requirements": { + "maxLength": 200000, + "minLength": 1, + "type": "string" + }, + "source": { + "default": "worktree", + "description": "Select worktree bytes or Git index bytes compared with base. Staged capture never reads live files.", + "enum": [ + "worktree", + "staged" + ], + "type": "string" + } + }, + "required": [ + "requirements" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Added
tandem_review_run - Changed
tandem_start1 field changed- changed
Input schema / properties / execution / anyOfPrevious value: -[ - { - "properties": { - "model": { - "anyOf": [ - { - "minLength": 1, - "pattern": "\\S", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "profile": { - "default": "balanced", - "enum": [ - "quick", - "balanced", - "deep" - ], - "type": "string" - }, - "thinking": { - "anyOf": [ - { - "enum": [ - "off", - "minimal", - "low", - "medium", - "high", - "xhigh", - "max" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "default": null - }, - "timeout_seconds": { - "anyOf": [ - { - "maximum": 7200, - "minimum": 1, - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "properties": { + "model": { + "anyOf": [ + { + "minLength": 1, + "pattern": "\\S", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "profile": { + "default": "balanced", + "description": "Profile defaults: quick: Defaults to low thinking with a 600-second deadline. balanced: Defaults to high thinking with a 1800-second deadline. deep: Defaults to high thinking with a 3600-second deadline. Uses the same thinking level as balanced with a longer deadline, not higher reasoning. These are default choices; overrides, effective settings, and actual settings are reported separately.", + "enum": [ + "quick", + "balanced", + "deep" + ], + "type": "string" + }, + "thinking": { + "anyOf": [ + { + "enum": [ + "off", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "timeout_seconds": { + "anyOf": [ + { + "maximum": 7200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "type": "object" + }, + { + "type": "null" + } +]
7 tool updates
v3.1.0- Changed
tandem_channel1 field changed- added
Input schema / properties / watchdog_tokenAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +}
- Changed
tandem_continue8 fields changed- added
Input schema / properties / executionAdded value: +{ + "anyOf": [ + { + "properties": { + "model": { + "anyOf": [ + { + "minLength": 1, + "pattern": "\\S", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "profile": { + "default": "balanced", + "enum": [ + "quick", + "balanced", + "deep" + ], + "type": "string" + }, + "thinking": { + "anyOf": [ + { + "enum": [ + "off", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "timeout_seconds": { + "anyOf": [ + { + "maximum": 7200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / review_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / review_stageAdded value: +{ + "anyOf": [ + { + "enum": [ + "independent", + "comparison" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / timeout_seconds / anyOfAdded value: +[ + { + "maximum": 7200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / timeout_seconds / defaultPrevious value: -1800New value: +null - removed
Input schema / properties / timeout_seconds / maximumRemoved value: -7200 - removed
Input schema / properties / timeout_seconds / minimumRemoved value: -1 - removed
Input schema / properties / timeout_seconds / typeRemoved value: -"integer"
- Added
tandem_diagnose - Added
tandem_findings - Added
tandem_receipt - Added
tandem_review - Changed
tandem_start8 fields changed- added
Input schema / properties / executionAdded value: +{ + "anyOf": [ + { + "properties": { + "model": { + "anyOf": [ + { + "minLength": 1, + "pattern": "\\S", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "profile": { + "default": "balanced", + "enum": [ + "quick", + "balanced", + "deep" + ], + "type": "string" + }, + "thinking": { + "anyOf": [ + { + "enum": [ + "off", + "minimal", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + }, + "timeout_seconds": { + "anyOf": [ + { + "maximum": 7200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / review_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / review_stageAdded value: +{ + "anyOf": [ + { + "enum": [ + "independent", + "comparison" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +} - added
Input schema / properties / timeout_seconds / anyOfAdded value: +[ + { + "maximum": 7200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / timeout_seconds / defaultPrevious value: -1800New value: +null - removed
Input schema / properties / timeout_seconds / maximumRemoved value: -7200 - removed
Input schema / properties / timeout_seconds / minimumRemoved value: -1 - removed
Input schema / properties / timeout_seconds / typeRemoved value: -"integer"
14 tool updates
v3.0.1- First observed
tandem_cancel - First observed
tandem_channel - First observed
tandem_continue - First observed
tandem_export_context - First observed
tandem_import_context - First observed
tandem_list - First observed
tandem_project_context - First observed
tandem_publish_artifact - First observed
tandem_read_artifact - First observed
tandem_reply - First observed
tandem_result - First observed
tandem_scope - First observed
tandem_start - First observed
tandem_wait
TDQS
Scored across 20 tools
Several tools have genuinely overlapping territory: tandem_start vs tandem_continue (both begin task/goal execution), tandem_review vs tandem_review_run (both produce review bundles/runs), and tandem_result vs tandem_reply vs tandem_wait (all mediate interacting with a running task). The very detailed descriptions help an agent differentiate them, but the boundaries are subtle enough that misselection is plausible.
Every tool uses the same tandem_ prefix with snake_case verb_noun or noun forms (tandem_start, tandem_result, tandem_reply, tandem_cancel, tandem_list). Minor noun-only names like tandem_channel or tandem_scope remain fully readable and predictable within the established convention.
Twenty tools is on the heavy side for the rubric's 16-25 'borderline heavy' band. The domain is genuinely complex (task orchestration, review lifecycle, context sharing, channels, diagnostics), so most tools earn a place, but the surface is larger than an agent can comfortably hold.
The lifecycle is well covered: starting, continuing, waiting, reading results, replying, cancelling, listing, plus review, findings, artifacts, context publication/export/import, channels, receipts, and diagnosis. Few obvious dead ends exist, though some operations (e.g. task mutation nuances) lean on one large multi-action tool rather than dedicated endpoints.
Maintenance
Related MCP Connectors
Coordinate coding agents through MCP using existing AI plans, saved work, and independent checks.
The project brain for AI coding agents — memory, decisions, sprints, knowledge base via MCP.
StremAI MCP: shared memory for AI coding agents. Connected agents can recall. OAuth + local stdio.
- OolkinOAuthcom.oolkin
AI colleagues that keep your standards, your project and their reasoning between sessions
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEmpower any MCP-compatible AI Agent(MCP Client) with engineering-grade capabilities to understand, modify, run, and deliver real-world code repositories.993Apache 2.0
- AlicenseNot gradedqualityBmaintenanceProvides MCP tools for AI-powered code review, research, and book writing via a fleet of coding agents.Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables AI coding assistants to manage persistent memory, search project context, generate tests, review architecture, and orchestrate workflows through 15 MCP tools, enhancing context-aware code generation.-
- FlicenseNot gradedqualityBmaintenanceEnables Claude Code to delegate work to persistent oh-my-pi (omp) subagents via an MCP server with 7 tools (spawn, send, output, status, list, stop, prune), wrapping omp RPC mode with enforcement hooks for descriptive agent naming, model configuration, denylists, write-scope ownership, and cooperative locking.-