Skip to main content
Glama

Harness-Mesh

Run one coding ticket across Claude Code, OpenAI Codex, DeepSeek Harness, Google Antigravity and ZCode. A ticket owns one isolated Git worktree; individual assignments may fail over between harnesses, models and sessions while the worktree and partial work stay in place.

中文文档 · Security · Docs · Contributing · MIT License

What the product is

Harness-Mesh is a local orchestration layer, shipped as:

  • a Python package (harness_mesh) with a typed data model and SQLite ledger;

  • a CLI, hmesh, for status, model discovery, dispatch, context and patches;

  • an stdio MCP server, hmesh-mcp, exposing 18 tools to a controller harness;

  • a local runtime directory, .harness-mesh/, holding state, worktrees and paged resources.

It does not provide a model, a hosted service, a web UI or a multi-user scheduler. It orchestrates the harness CLIs you already have installed and authenticated on the machine. Prompts and code are sent to those CLIs; the mesh process itself keeps a local ledger and bounded summaries.

Related MCP server: agentbus

Who it is for

  • Developers who use more than one coding harness and want one task queue instead of copying prompts between terminals.

  • Platform and agent-infrastructure engineers who need quota-aware routing, worktree isolation and auditable assignment history.

  • Researchers and reviewers evaluating cross-harness scheduling, failover and shared-context behaviour.

It is not a replacement for a harness's permission model, sandbox, or vendor terms. It assumes you have legitimate access to each CLI and its models.

Scope

In scope

Out of scope

Dynamic discovery of locally authorised models from configuration, environment, live model endpoints and CLI enumeration

Maintaining a fixed or hosted model catalogue

Difficulty tiers plus market-aware routing by task kind, and skill/plugin injection

Training or hosting models

Ticket/Assignment failover on quota exhaustion, unauthorised models, credential failures and transient errors

Multi-tenant authentication, RBAC or billing

Git worktree isolation, dirty-workspace sync, dependency pre-apply and explicit patch application

Merging worktrees automatically without review

Shared project instructions, a cross-harness memory blackboard and dependency context

Uploading project data to a remote service

Claude Code, Codex, DSH, Antigravity and ZCode adapters

Changing a vendor CLI's own protocol beyond the configured template

Requirements

  • Python 3.11+.

  • One or more supported harness CLIs installed and logged in. A harness that Harness-Mesh runs as a worker needs its own command-line login; see Logins: controller versus worker.

  • Git available on PATH for isolated worktrees.

  • macOS is the primary target for the shipped App Bundle paths. Linux/WSL works with binaries on PATH; real-machine tests skip when the macOS bundles are absent.

Install

python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"

Two entry points are installed:

  • hmesh — operator CLI.

  • hmesh-mcp — MCP stdio server.

Optional Antigravity Python SDK support:

.venv/bin/pip install -e ".[antigravity]"

One-command install into desktop harnesses

After installing the Python package, register Harness-Mesh in every detected desktop harness with one command:

cd /path/to/your/project
hmesh install

What it installs:

Harness

Integration

Claude Code

claude mcp add user-scope MCP server

OpenAI Codex / ChatGPT desktop

codex mcp add MCP server in ~/.codex/config.toml

Google Antigravity

agy mcp add MCP server in ~/.gemini/config/mcp_config.json

ZCode

Generates a local MCP plugin + marketplace, registers/installs it through zcode plugins; if the CLI is unavailable, leaves the marketplace ready for the UI

DeepSeek Harness

Adds an @deepseek-ai/dsh-mcp-client entry to ~/.dsh/profiles/{desktop,headless}/cordis.patch.yml (with backup)

Useful options:

hmesh install --dry-run                 # print planned commands/files, change nothing
hmesh install --yes                     # non-interactive install
hmesh install --approve read            # pre-approve 11 read-only MCP tools
hmesh install --harness zcode           # one harness only (repeatable)
hmesh install --workspace /path/project # pin the MCP workspace explicitly
hmesh install --uninstall               # remove integrations

Without --dry-run, hmesh install prints the planned files and commands and asks for confirmation. A non-interactive shell must pass --yes.

MCP tool pre-approvals

Interactive sessions ask before an MCP tool runs. Headless commands such as codex exec and agy -p cannot answer that prompt, so hmesh install writes per-tool allow rules:

hmesh install --approve dispatch   # default: 14 read and dispatch tools
hmesh install --approve read       # 11 read-only tools
hmesh install --approve all        # 16 tools; apply_task_patch and install_integration stay manual
hmesh install --approve none       # write nothing and remove rules written by hmesh

dispatch, the default, approves the eleven read tools plus dispatch_task, parallel_dispatch and cancel_task. Dispatched work runs in an isolated worktree; its changes reach the primary checkout only through apply_task_patch. The four write tools stay manual: apply_task_patch, report_quota_status, update_project_context and install_integration change the primary workspace, shared state or another application's configuration. --approve all pre-approves report_quota_status and update_project_context as well, but apply_task_patch and install_integration are always manual and are never written into a harness allow rule. Independently of harness approvals, the MCP server refuses every write tool under HARNESS_MESH_READ_ONLY=1 and refuses workers the controller-only write tools; hmesh apply and hmesh install apply the same gate.

Harness

File

Rule

Claude Code

~/.claude/settings.json

permissions.allow gains mcp__harness-mesh__<tool>

Codex

~/.codex/config.toml

A managed block holds [mcp_servers.harness-mesh.tools.<tool>] with approval_mode = "approve"

Antigravity

~/.gemini/config/config.json

userSettings.globalPermissionGrants.allow gains mcp(harness-mesh/<tool>)

ZCode, DeepSeek Harness

none

Workers call MCP tools without approval settings

The installer is idempotent. It keeps a <file>.harness-mesh.bak copy before the first edit, writes through a temporary file, re-parses the result and restores the previous bytes if validation fails. Lowering the level or uninstalling removes only entries with the mcp__harness-mesh__ or mcp(harness-mesh/ prefix, plus the Codex managed block; other rules stay in place. --dry-run prints the approval count and each entry without touching files. hmesh doctor reports approved and missing tools against the default dispatch level and changes no files; on Codex, a service-wide default_tools_approval_mode = "approve" counts as covering every tool.

Headless runs cannot answer approval prompts. Measured on the real harnesses (2026-11-01): codex exec denies the MCP call with "approval policy is never" unless the server is approved; agy -p auto-denies it unless permissions.allow holds a matching rule such as mcp(harness-mesh/list_harnesses). The per-tool rules above cover the selected level; the service-wide Codex setting -c 'mcp_servers.harness-mesh.default_tools_approval_mode="approve"' remains a manual alternative that approves every tool. ZCode and DeepSeek Harness workers call the tools without extra configuration, and Claude Code shows the server as connected. Interactive sessions prompt as usual.

ZCode's --scope project still records the marketplace and plugin in the global state files ~/.zcode/cli/plugins/known_marketplaces.json and installed_plugins.json, even though the plugin and its cache are project-scoped. hmesh install --uninstall removes both entries; the matching zcode plugins uninstall and zcode plugins marketplace remove commands do the same by hand.

Restart the desktop application after installation and start a new chat/task. Existing chats may keep a cached tool list. The installer is idempotent; editing an existing DSH entry or re-adding an MCP server replaces the previous registration rather than duplicating it.

When another harness arrives later

Claude Code and Codex are often installed first; ZCode or another supported harness may follow. The two roles need different handling.

Worker. No action. Dispatch re-resolves the binary for every assignment and routing re-checks adapter runnability, so the next ticket can use the new harness. Only the model inventory is cached, for five minutes.

Controller. The harness must have the Mesh MCP server or plugin registered before it can call these tools. Mesh reports the gap and leaves the decision to you:

  • hmesh integrations lists every configured harness as integrated, detected_not_integrated, stale (registered but the command no longer runs), not_detected or ignored.

  • hmesh doctor and hmesh status end with one line naming the detected harness and the install command.

  • Inside a controller conversation, list_harnesses adds integration_hints. The agent explains the hint, calls plan_integration to show the files, approval entries and commands, and calls install_integration only after you agree.

plan_integration returns a plan_id: the first 16 hex characters of a SHA-256 over the normalised plan and the current content of the target files. install_integration recomputes the plan and refuses any id that no longer matches, so editing a config file between review and install forces a new review. It is a write tool; the default dispatch level leaves it for manual approval. Workers are refused through the same lineage resolution as nested dispatch, HARNESS_MESH_READ_ONLY=1 blocks it, and the target harness must restart before its tool list appears.

hmesh integrations ignore zcode stops the reminder and unignore restores it. The command writes only integration.ignore in the Mesh config; it never edits another application's configuration.

Logins: controller versus worker

A harness can play two roles, and each role uses a different login.

Role

Who calls the model

Login it needs

Controller

You, inside the harness, for example the Claude Code desktop app calling the harness-mesh tools

The login the harness application already has

Worker

Harness-Mesh starts the harness command-line tool as a subprocess to run a ticket

The command-line tool's own credentials

The two logins can differ. Measured on macOS with the Claude Code desktop app (2026-11-01): the app was logged in and called every harness-mesh tool as a controller, while the bundled claude command reported loggedIn: false and Not logged in · Please run /login. The desktop app hands credentials to the sessions it hosts through its own channel; no keychain item, credentials file or API key existed for a separately started claude to read. A command-line Claude Code used as a controller is itself the command line, so it needs the command-line login too.

When a worker is not logged in, Harness-Mesh does not fail the ticket. The first attempt returns not_logged_in, the harness circuit opens (hmesh quota shows claude_code/*: state=open reason=not_logged_in), routing skips that harness and the ticket moves to another one, for example Claude models served through Antigravity. Probes run automatically and the circuit closes once the login works.

To use the Claude Code command line as a worker, log in once in a terminal and confirm it:

claude auth login        # or set ANTHROPIC_API_KEY
claude auth status       # loggedIn must be true

The same rule applies to every harness: a worker uses that tool's own login. hmesh status and hmesh quota show which harnesses are usable. Not verified: whether a worker started by a Harness-Mesh server hosted inside the desktop app can inherit the desktop login; on the test machine it could not.

Quick start

# Discover installed harnesses, real CLI versions and authorised models.
hmesh status

# Force the three-layer model discovery and the tier mapping.
hmesh models --refresh

# Inspect quota circuits and waiting tickets.
hmesh quota --probe

# Fetch market prices and evaluation scores, then preview a route.
hmesh market refresh
hmesh market show --unmatched
hmesh route --objective "Design the migration plan" --kind plan

# List indexed SKILL.md files and MCP/plugin manifests.
hmesh skills

# Write and read a shared project fact.
hmesh context set arch.overview "Federated Harness Mesh" --category architecture
hmesh context list

# Print the MCP configuration for a controller harness.
hmesh init-mcp --print

# Dispatch a ticket and inspect the result.
hmesh dispatch --harness deepseek \
  --objective "Create a short design note in docs/mesh.md" \
  --difficulty medium --fallback codex --fallback zcode

hmesh tasks
hmesh read <task_id> diff --limit 4000
hmesh apply <task_id> --strategy patch
hmesh apply <task_id> --strategy copy --force-copy
hmesh doctor

Start the MCP server with background recovery, effects consumption and market refresh (the default):

hmesh-mcp

Disable every background worker for a pure request/response server:

hmesh-mcp --no-monitor

The server reads HARNESS_MESH_WORKSPACE for the primary project root and HARNESS_MESH_CONFIG for an optional YAML configuration. Without that variable the loader reads $XDG_CONFIG_HOME/harness-mesh/config.yaml (usually ~/.config/harness-mesh/config.yaml) and then ~/.harness-mesh/config.yaml.

Supported harnesses

The defaults target the real macOS installations observed on a developer machine. All paths and command templates are configuration, not code.

Harness

Default binary search

Real non-interactive protocol

Model discovery

Claude Code

~/Library/Application Support/Claude/claude-code/*/*/claude.app/Contents/MacOS/claude

claude -p <prompt> --output-format json --model <model> --effort <effort> ...; write mode adds --dangerously-skip-permissions, read-only adds --permission-mode plan, resume adds --resume <id>

~/.claude/cache/model-catalog/*.json, ~/.claude.json, settings, env, /v1/models

OpenAI Codex

/Applications/ChatGPT.app/Contents/Resources/codex-cli/bin/codex and plugin app-server path

codex exec ... --json ...; write mode adds --full-auto, read-only adds --sandbox read-only, reasoning uses -c model_reasoning_effort=...

~/.codex/config.toml, ~/.codex/models_cache.json, env, /v1/models

DeepSeek Harness

/Applications/DeepSeek Harness.app/Contents/Resources/runtime/cli/bin/dsh

dsh --profile headless --patch <overlay> --json <prompt>; generated overlay re-enables local credentials and merges the desktop model/provider row

~/.dsh/profiles/*/cordis.patch.yml, env, optional API, plus the built-in runtime channel

Google Antigravity

/Applications/Gemini.app/Contents/Helpers/agy

agy -p <prompt> --output-format json --model <model> --effort <effort>; write mode adds --dangerously-skip-permissions, read-only --mode plan, resume --conversation <id>

agy models CLI (spinner frames cleaned), local settings, env, Gemini API

ZCode

/Applications/ZCode.app/... wrapped into .harness-mesh/bin/zcode

wrapper runs the Electron binary with the CJS entry and provider config; `zcode -p --cwd --json --mode plan

yolo, resume --resume `

hmesh status returns available: true only when the binary resolves and its version command succeeds. Model lists are runtime data and are never hard-coded.

How it works

Ticket, Assignment and failover

Ticket task_x (one Git worktree)
  ├── Assignment #1  claude_code/claude-opus-<version>   ended_quota
  ├── Assignment #2  codex/gpt-<version>-<variant>             completed
  └── failover_history: quota_exhausted:rate_limit_429
  1. dispatch creates a ticket and an isolated worktree. If the primary checkout has uncommitted files, sync_uncommitted copies them into the worktree and records a baseline commit.

  2. The router selects an authorised, quota-healthy model for the task's difficulty tier and runs one adapter.

  3. On quota exhaustion, an unauthorised model, a harness-wide login failure, or a transient error, it records a ContinuationCheckpoint and creates a new assignment on the next harness/model. The worktree is reused.

  4. Recovery Notes force the next agent to inspect git status and git diff before continuing. The final diff is measured against the baseline commit, so only the ticket's net changes are returned.

  5. Outputs are capped: summary, diff preview and raw logs are bounded; full content is saved as diff, transcript and assignments resources and read page by page with read_task_resource.

Quota policies:

  • failover (default): create a new assignment on the next healthy candidate.

  • wait_and_resume: suspend the ticket as waiting_for_quota and resume it after a real provider probe succeeds.

  • fail: fail immediately.

Circuits are CLOSED / OPEN / HALF_OPEN. A probe makes one deliberately tiny real model call; local configuration alone never closes a quota circuit. A successful assignment also closes it.

Shared project context

  • ProjectContextManager scans AGENTS.md, CLAUDE.md, .harness-mesh/PROJECT_CONTEXT.md, .cursorrules and .github/copilot-instructions.md, with a character budget.

  • update_project_context writes architecture notes, conventions, API contracts, decisions, pitfalls and notes to a SQLite blackboard. Later tickets receive <project_shared_memory>.

  • context_files are rendered as bounded <context_file_previews> so the child agent does not start with a blind search.

  • depends_on injects upstream summaries, modified files and diffs as <upstream_task_outputs> and pre-applies the upstream diff into the downstream worktree baseline.

  • auto_record_context records a completed ticket's summary as a shared note.

These blocks are project data, not instructions that override the ticket objective or the security policy.

Sessions and permissions

TaskRequest.session_id flows through MCP and AdapterCall. Adapters map it to --resume (Claude/ZCode), codex exec resume <id>, --session-id (DSH) or --conversation (Antigravity). Write-mode templates inject each CLI's approval bypass; read-only tickets use plan/read-only modes and run in a disposable worktree.

Market data and model routing

The mesh can rank models by published price and evaluation score instead of relying only on the four difficulty tiers. The data layer is read-only and separate from dispatch.

Sources

Source

Authentication

Fields used

OpenRouter /api/v1/models

none

list price per token, context window, reasoning and tool flags

models.dev /api.json

none

list price per million tokens, context window, release date

Epoch AI benchmark_data.zip

none

reasoning and coding benchmark percentiles, benchmark dates

Artificial Analysis /api/v2/language/models/free

ARTIFICIAL_ANALYSIS_API_KEY

intelligence index, list price, output speed

models.dev lists the same model once per provider, including hundreds of resale gateways. Those rows fold onto one canonical model per name. The price comes from the model vendor's own entry (listed in market.first_party_providers), then from OpenRouter, then from the median of every priced offer. An entry that prices input and output at zero counts as unknown, not free.

Epoch AI publishes the CC BY 4.0 "Capabilities & benchmarking" archive and needs no key, so it is the default evaluation source. Each benchmark contributes one percentile computed inside a 540-day reference window (market.epoch.reference_window_days); an axis with fewer than three scored benchmarks stays empty (market.epoch.min_benchmarks). The two axes are intelligence_reasoning and intelligence_coding, and intelligence is the equal-weight mean of the axes a model has. Artificial Analysis takes precedence when ARTIFICIAL_ANALYSIS_API_KEY is set. Without either source the mesh computes a labelled heuristic from the existing discovery score, the price percentile, the reasoning flag and the release date.

The heuristic is not an evaluation. Every score carries intelligence_source: epoch_ai, artificial_analysis, override or heuristic. hmesh market show and the get_model_market MCP tool print that field.

Epoch AI data is CC BY 4.0 and requires attribution. hmesh market show ends with Benchmark data: Epoch AI, 'Capabilities & benchmarking', https://epoch.ai/benchmarks (CC BY 4.0); --json carries the same string in attribution, and every routing decision includes it.

hmesh market refresh writes a snapshot to .harness-mesh/state.db. The default lifetime is six hours. Epoch AI and Artificial Analysis are cached for at least twelve hours; Artificial Analysis is also limited to 20 requests per process per day. A failed refresh keeps the previous snapshot and marks it stale. Cached data older than seven days still works and is flagged expired.

market.enabled: false or HARNESS_MESH_OFFLINE=1 stops every outbound request.

Hands-off refresh

The cache stays current without a manual step. The MCP server refreshes in the background at start-up when a source is missing or past its TTL, then on a TTL cadence. The first dispatch that finds no market data at all waits at most market.wait_seconds (8 s) and then continues with the local tiers while the refresh finishes in the background. One-shot commands (dispatch, route, status, models, market show) run the same refresh synchronously under the same 8 s bound and fall back to the previous snapshot or the heuristic when a source is slow or down. A failed refresh only logs a warning.

The controller sends an objective, nothing else. dispatch_task over MCP and hmesh dispatch default target_harness to auto, so the mesh routes across every installed harness and picks the model. The MCP initialize response states the same rule to every client. Passing model or target_harness explicitly keeps the previous behaviour.

On a machine with only some of the five harnesses, hmesh status, hmesh models and list_harnesses report a missing harness as not installed with the reason and leave its models and tier map empty; hmesh doctor ends with N of 5 harnesses installed. hmesh install --dry-run returns skipped for a missing binary, and ZCode is skipped as ZCode not found without writing a plugin when neither its CLI nor its app is present.

The market score also drives discovery: when a harness model matches the catalogue, its capability_score, assigned_tiers and tier map come from the market intelligence instead of the local heuristic. hmesh models, hmesh status and list_harnesses show each model's intelligence, intelligence_source and blended price, so the tier a user reads, the model dispatch picks and the route preview agree. hmesh doctor adds a read-only market row with the sources, the last successful refresh, staleness, the match rate and the unmatched models.

Task kinds and tiers

task_kind is plan, audit, review, implement, refactor, debug, test, docs or auto. auto reads the objective (Chinese and English keywords) and otherwise follows evaluate_difficulty.

Tier

Task kinds and difficulty

Rule

premium

plan, audit, review, or critical

highest intelligence; ties go to the lower blended price

balanced

refactor, debug, or high

highest intelligence per blended dollar among candidates at or above 85% of the best score

value

implement, test, docs, or low/medium

cheapest candidate at or above a difficulty floor (0.55 for low, 0.70 for medium)

blended_price = (3 * input + output) / 4 in USD per million tokens. A model with no known price is left out of price comparisons and used only when nothing else qualifies.

routing.axis_weights decides which evaluation axis a task kind is scored on: plan, audit and review use reasoning 0.7 / coding 0.3; implement, refactor, debug and test use coding 0.7 / reasoning 0.3; docs uses reasoning 1.0. When a model has only one axis, that axis carries full weight.

Claude Code and Codex bill through a subscription quota rather than per token. The router uses the API list price as a proxy for quota consumption and states that in every decision record.

Routing modes

routing.mode defaults to auto. manual keeps the model you pass; off uses the four difficulty tiers. HARNESS_MESH_ROUTING overrides the configured default, and a request-level routing_mode wins over both.

routing.pins fixes {harness, model} for one task kind. routing.premium_hints and routing.value_hints add weight to matching models; routing.strict_hints: true turns them into a hard filter. The example configuration uses exact glm-5.3, so it does not match glm-5.3-flash.

When no market snapshot exists, no harness model matches the catalogue, or the planner returns no choice, dispatch falls back to discovery.resolve_model(harness, difficulty). The decision record keeps the reason.

Decision record

Every result carries a routing object: mode, task kind, tier, chosen harness/model/effort, intelligence and its source, axis_scores (both axis scores with the weights used), benchmarks_used, the attribution string, list prices, the top three alternatives with scores, the data sources, fetched_at, stale, expired and the match confidence. The same block appears at the top of the transcript.

Not connected

The Aider polyglot leaderboard has no data after 2025-10. The community LMArena snapshot (oolong-tea-2026/arena-ai-leaderboards) has returned empty leaderboards every day since 2026-10-20. api.llm-stats.com returns vendor-reported scores marked verified: false, only four models carry an AA-Index, and its terms page returns 404. None of the three is used.

MCP tools (18)

Tool

Purpose

list_harnesses

Installed harnesses, real binary, version, authorised models, tier map and quota state

discover_harness_models

Force three-layer discovery for one or all harnesses

get_model_market

Read cached list prices, context windows and intelligence scores; intelligence_source names the source

preview_routing

Rank a task without dispatching: task kind, tier, chosen model and alternatives

list_skills_and_plugins

Search indexed SKILL.md files and MCP/plugin manifests

dispatch_task

Create a ticket, choose a model and run assignments with failover

parallel_dispatch

Dispatch several tickets concurrently

get_task_status

Ticket status plus assignments and failover history

read_task_resource

Page through diff, transcript or assignments

get_quota_status

Circuits, waiting queue; probe_now probes and resumes

get_integration_status

Five-state integration report for every enabled harness; read-only

plan_integration

Reviewable install plan and plan_id; writes nothing

install_integration

Write tool: installs only when plan_id still matches; workers and read-only mode are refused

report_quota_status

Manual reset, open or half_open

apply_task_patch

Apply a completed isolated worktree to the primary workspace with patch or merge (copy stays CLI-only)

cancel_task

Cancel a running or waiting ticket; child processes are killed

get_project_context

Read shared memory entries and scanned instruction files

update_project_context

Write or update one shared project fact/contract

CLI

hmesh install [--dry-run] [--yes] [--approve LEVEL] [--harness H]... [--uninstall]
hmesh doctor [--harness H] [--json]
hmesh status [--refresh] [--json]
hmesh integrations [--json]
hmesh integrations ignore|unignore NAME [--json]
hmesh models [--refresh] [--harness H]
hmesh quota [--probe]
hmesh route --objective O [--kind K] [--difficulty D] [--harness H] [--json]
hmesh market refresh [--source S]... [--json]
hmesh market show [--model GLOB] [--axis reasoning|coding] [--unmatched] [--json]
hmesh skills [--query Q]
hmesh dispatch --objective O [--harness H] [--difficulty D] [--kind K] [--routing-mode M] [--fallback H]...
hmesh tasks [--status S]
hmesh read <task_id> [diff|transcript|assignments] [--offset N] [--limit N]
hmesh apply <task_id> [--strategy patch|merge|copy] [--force-copy]
hmesh context list [--category C] [--json]
hmesh context set <key> <content> [--category C] [--author A] [--task-id T]
hmesh init-mcp [--print] [--target PATH]
hmesh version

Configuration

The template lives at config/harnesses.example.yaml. Copy it to ~/.config/harness-mesh/config.yaml (or any path passed via --config / HARNESS_MESH_CONFIG). Files inside the checkout (config/harnesses.yaml, .harness-mesh/config.yaml) are treated as untrusted repository content and are ignored by default: a cloned repository must not be able to choose which binary runs or where credentials are sent. HARNESS_MESH_TRUST_WORKSPACE_CONFIG=1 merges only non-executable fields (market, routing, sizes, quotas) from the workspace file; --config and HARNESS_MESH_CONFIG are always trusted because the operator named them explicitly. Resolution order is: the command name on PATH (for example claude, codex, dsh, agy, zcode), then the configured binary_paths (built-in macOS app-bundle locations plus any you add), then the macOS ZCode shim. A standard CLI install that lands on PATH therefore needs no configuration and no absolute path; the bundled paths only help desktop-app installs that do not put their CLI on PATH. If a harness lives outside PATH, add it to binary_paths in the user-level config file. Binary search supports ~ and * globs and selects the newest version. ZCode on macOS is wrapped automatically into .harness-mesh/bin/zcode.

The ledger lives under state_dir: the directory is created/tightened to 0700, and state.db plus its -wal/-shm side files to 0600. Transcripts, diffs and checkpoints are redacted before they are stored; the transcript resource is capped by transcript_max_chars (default 200000). If you upgrade from 0.4.1, the first 0.4.2 process rewrites legacy credential-shaped provider rows and vacuums the ledger; restart every harness that runs hmesh-mcp so the hardened server is the one in use.

Templates support {prompt}, {system_prompt}, {system_prompt_file}, {model}, {effort}, {workdir}, {mcp_config}, {task_id} and {assignment_id}. Empty flag/value pairs are dropped, so <cli_active_default> means "use the harness's own active model".

Key settings:

Setting

Default

Meaning

state_dir

.harness-mesh

Ledger, worktrees, generated MCP configs

allowed_workspace_roots

service workspace

Optional allowlist for request-level workspace_root; symlinks are resolved before containment checks

auto_init_repo

false

Refuse a non-Git workspace unless it is explicitly enabled

auto_approve_shared_write

false

Injection of approval-bypass flags when workspace_mode=shared_write

ZCode extra.restricted_mode

build

Mode used when approval is withheld (build, edit or plan); zcode -p would otherwise default to yolo

max_active_assignments

8

Global cap on simultaneously running assignments

summary_max_chars

1500

Summary returned to the controller

diff_preview_max_chars

4000

Diff preview returned to the controller

transcript_max_chars

200000

Cap for the paged transcript resource; head and tail are kept

max_call_depth

3

Nested dispatch depth limit

max_failover_attempts

4

Maximum failovers per ticket

quota_probe_interval_seconds

60

Background recovery probe interval

difficulty_timeout_seconds

600/1200/1800/3600

Per-tier assignment timeout

market.enabled

true

Read-only market data and its snapshot cache

market.ttl_seconds

21600

Snapshot lifetime for OpenRouter and models.dev

market.wait_seconds

8

Longest automatic refresh before dispatch or a command continues

market.sources

four sources

Providers to refresh

market.first_party_providers

[] (the example config lists twelve)

Vendors whose own models.dev entry sets the list price

market.epoch.reasoning_benchmarks

six benchmarks

Benchmarks that feed the reasoning axis

market.epoch.coding_benchmarks

nine benchmarks

Benchmarks that feed the coding axis

market.epoch.reference_window_days

540

Percentile window before a benchmark's latest release

market.epoch.min_benchmarks

3

Minimum scored benchmarks before an axis counts

market.aliases

{}

Map a harness model id or glob to a market key

market.overrides

{}

Glob-keyed intelligence and price overrides

routing.mode

auto

auto, manual or off; HARNESS_MESH_ROUTING wins

routing.floors

0.55/0.70

Value-tier intelligence floor by difficulty

routing.axis_weights

per task kind

Reasoning/coding weights used to score a task

routing.premium_hints / routing.value_hints

[]

Model globs weighted per tier

routing.strict_hints

false

Turn hint weighting into a filter

routing.pins

{}

Fixed harness/model per task kind

integration.ignore

[]

Harness names whose integration hints are suppressed

Testing

.venv/bin/ruff check src tests
.venv/bin/python -m compileall -q src tests
.venv/bin/pytest -v

The fast suite uses mocked adapters, temporary Git repositories, httpx.MockTransport market providers and cached snapshots. It opens no sockets. Live HTTP checks live in tests/test_real_machine_market.py and run only with HARNESS_MESH_REAL_MACHINE=1; the Artificial Analysis branch also needs ARTIFICIAL_ANALYSIS_API_KEY. tests/test_local_machine_harnesses.py additionally exercises the real locally installed harnesses when the macOS bundles are present; it asserts real binary resolution, real model inventories, and a real DeepSeek ticket that creates a file in a worktree and applies it back. See CONTRIBUTING.md for the development workflow.

Operational notes

  • The mesh state directory may contain source excerpts and prompts. Keep it out of commits and shared archives.

  • Approval-bypass flags make a disposable worktree convenient, not safe. Built-in harnesses default to auto_approve: true for isolated worktrees; shared_write suppresses bypass unless auto_approve_shared_write: true. Use isolated worktrees, review diffs, and respect provider terms.

  • The DeepSeek built-in runtime strips credential-shaped environment variables from its shell tool. That reduces accidental key exposure but does not create a sandbox.

  • A one-shot hmesh dispatch --policy wait_and_resume exits after scheduling the suspension; the long-lived MCP server runs the background monitor and effects consumer. Use hmesh quota --probe or the MCP tool to resume manually.

  • Antigravity SDK timeouts cancel waiting but cannot kill a third-party worker thread.

  • Codex CLI versions differ in accepted approval flags. The built-in default injects --full-auto; the example YAML overrides it with --dangerously-bypass-approvals-and-sandbox for codex-cli 0.166. Adjust execute_template or extra.auto_approve_args for your version.

Workspace and context boundaries

  • The MCP server and CLI require a Git workspace; startup fails from $HOME, /, or a directory without Git.

  • Request-level workspace_root must resolve (including symlinks) inside allowed_workspace_roots, which defaults to the service workspace.

  • Sensitive filtering covers .env and real credential/key files, plus .ssh, .aws, .gnupg, and .git path segments. .env.example, .env.sample, .env.template, .env.dist, ordinary credentials_service.py-style source, and public *.pub keys stay visible. Every skipped path is reported in skipped_sensitive and warnings; Mesh no longer edits the user's .git/info/exclude.

  • Worktree symlinks are rewritten as relative links into the worktree. Escaping or dangling links are reported; apply rejects symlink diffs that leave the target root.

  • Approval bypass flags are suppressed for shared_write unless auto_approve_shared_write: true; the DeepSeek built-in shell drops credential-shaped environment variables, cloud key names, SSH agent sockets, and URLs containing passwords.

  • Shared memory is capped at 128 characters per key, 4,000 per entry and 6,000 rendered characters. Only controller entries render as verified; worker and auto entries render in a separate unverified block. Author validation checks the name only.

  • Mesh Git commands disable hooks, fsmonitor, pager, external diff and protocol.ext, record a per-task metadata guard once, and reject apply or abort the ticket when metadata changes after task start.

  • MCP call depth can be recovered from the worktree cwd or lineage marker when inherited environment variables are unavailable; max_active_assignments caps running assignments.

Trademarks and independence

Harness-Mesh is an independent open-source project. It is not affiliated with, sponsored by, or endorsed by Anthropic, OpenAI, DeepSeek, Google, or ZCode. Claude, Codex, DeepSeek Harness, Google Antigravity, and ZCode are names or trademarks of their respective owners, used here only to describe interoperability. Each harness remains governed by its own licence, acceptable-use policy, and data terms.

License

MIT. See LICENSE.

Available Tools

18 tools
apply_task_patchB

Apply the isolated worktree changes back into the primary workspace.

Only patch and merge are exposed over MCP. The copy strategy is destructive and remains a CLI-only operation.

NameRequiredDescriptionDefault
task_idYes
strategyNopatch

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of disclosure. It usefully flags that the copy strategy is destructive and CLI-only, but for a mutation tool it omits critical behavior: what happens to the worktree after applying, how merge conflicts surface, and whether the operation is reversible.

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

Conciseness4/5

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

Two short sentences, front-loaded with the core action and followed by the one constraint that matters. The reStructuredText double-backtick markup is slightly noisy but not wasteful, and nothing is repeated.

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

Completeness3/5

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

An output schema exists, so return values need not be described. Still, for a no-annotation mutation tool with an entirely undocumented parameter schema, the description should say more about side effects and failure modes before an agent commits to applying a patch.

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

Parameters3/5

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

Schema coverage is 0%, so the description must compensate. It does add real meaning for 'strategy' by revealing the two accepted values and excluding copy, but 'task_id' is left completely undefined in both schema and description, and the difference between patch and merge is never explained.

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

Purpose4/5

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

The description names a specific verb and resource: apply isolated worktree changes back into the primary workspace. That distinguishes it from siblings like dispatch_task and cancel_task without needing to name them. It stops short of a 5 because it never explicitly contrasts itself with any sibling tool.

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

Usage Guidelines3/5

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

It constrains the strategy argument by stating only patch and merge are available over MCP, which tells the agent what not to pass. However, it never states the precondition for calling it (for example, that a task must have completed with worktree changes) or what to use instead when the conditions aren't met.

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

cancel_taskB

Cancel a running or waiting ticket. The worktree is retained for inspection.

NameRequiredDescriptionDefault
task_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With zero annotations, the description carries the full burden, and it does disclose one valuable effect: the worktree is retained for inspection, implying it is not deleted. It says nothing about whether cancellation is reversible, whether partial work is discarded, what permissions or auth are needed, or whether the call waits for termination.

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

Conciseness5/5

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

Two short sentences, zero filler, with the effective scope front-loaded and the side effect second. Nothing could be removed without losing information.

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

Completeness4/5

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

An output schema exists, so the description needn't explain return values, and the core action plus the retained-worktree behavior is covered. The remaining gap is that this is an unannotated state-mutating tool whose parameters, idempotency, and permission requirements go unexplained.

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

Parameters2/5

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

Schema description coverage is 0% and the single parameter task_id is never mentioned in the description, so the agent gets no meaning beyond the bare property name and string type. Since the schema does no work here, the description should have identified what identifier is expected and where to obtain it.

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

Purpose4/5

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

States a specific verb plus resource ("Cancel a running or waiting ticket") and even narrows the applicable states, so the action is unambiguous. It loses a point for calling the resource a "ticket" when the tool and sibling names use "task", and for not distinguishing itself from nearby siblings like get_task_status or dispatch_task.

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

Usage Guidelines3/5

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

The phrase "running or waiting" implicitly tells the agent which task states are eligible for cancellation, which is real usage guidance. However, there is no statement of when not to cancel, whether a stopped/completed task can be passed, or which sibling to use instead for inspecting status before cancelling.

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

discover_harness_modelsC

Run the three-layer model discovery waterfall for one or all harnesses.

NameRequiredDescriptionDefault
harnessNo
force_refreshNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

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

With no annotations, the description carries the full burden and discloses almost nothing: whether discovery hits remote providers, how long it takes, whether it mutates cached state, or what happens on failure is unstated. The word 'waterfall' hints at a fallback chain but the layers and their consequences are never explained.

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

Conciseness4/5

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

A single well-formed sentence with no filler and the scope constraint placed up front. It is efficient, though efficiency here reflects under-specification rather than tight writing.

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

Completeness2/5

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

An output schema exists, so return values need not be described, but with zero parameter documentation, no annotations, and an opaque 'three-layer waterfall' concept, this one-liner leaves an agent unable to predict cost, latency, side effects, or the role of force_refresh.

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

Parameters2/5

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 does clarify that the harness parameter is optional ('one or all harnesses'), covering roughly one of two parameters, but force_refresh is never mentioned — including its default of true, which means every call refreshes unless the agent knows to override it.

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

Purpose3/5

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

The verb-plus-resource ('model discovery' for 'harnesses') is identifiable, and the scope ('one or all harnesses') is stated. However, 'three-layer model discovery waterfall' is unexplained jargon, so an agent cannot tell what actually happens or what the result represents, and no sibling (list_harnesses, get_model_market) is distinguished.

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

Usage Guidelines2/5

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

There is no guidance on when to call this versus list_harnesses, get_model_market, or preview_routing, which plausibly overlap in the model/harness domain. Nothing says when a discovery run is warranted or what condition should prompt a refresh.

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

dispatch_taskB

Dispatch a ticket.

Only the objective is required. Leave target_harness at "auto" and model unset to let the mesh choose; pass task_kind when it is known. Quota exhaustion creates a new Assignment on another harness and resumes in the same worktree.

NameRequiredDescriptionDefault
modelNo
skillsNo
pluginsNo
task_idNo
objectiveYes
task_kindNoauto
call_depthNo
checkpointNo
depends_onNo
difficultyNoauto
session_idNo
trace_chainNo
routing_modeNo
context_filesNo
context_notesNo
target_harnessNoauto
workspace_modeNoisolated_worktree
workspace_rootNo
timeout_secondsNo
min_intelligenceNo
reasoning_effortNo
sync_uncommittedNo
auto_match_skillsNo
fallback_harnessesNo
max_price_per_mtokNo
on_quota_exhaustedNofailover
auto_record_contextNo
max_failover_attemptsNo
include_project_contextNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full load, and it does disclose one genuinely valuable behavior: quota exhaustion spawns a new Assignment on another harness and resumes in the same worktree. It is silent on other significant traits an agent needs, notably whether dispatch is asynchronous (returning a task id), that a worktree is created and uncommitted changes may be synced, and any cost or timeout implications across the 29-parameter surface.

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

Conciseness4/5

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

The description is short and the essential constraint (only objective required) is front-loaded immediately after the purpose statement. The stray line breaks are cosmetic; no sentence is wasted, though the space devoted to four parameters rather than the riskiest ones is a mild misallocation.

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

Completeness2/5

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

The output schema excuse applies to return values, but for a 29-parameter dispatch tool with zero annotation and zero schema description coverage, the description is far too thin. It omits the lifecycle model (async vs blocking), workspace creation side effects, and the meaning of the majority of arguments, so an agent must guess on most of the call surface.

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

Parameters4/5

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

Schema description coverage is 0%, so the schema is bare and explanation must come from<|place_holder_mm_span_0442|> text. The description covers only objective, target_harness, model, and task_kind out of 29 parameters. Opaque fields such as checkpoint, trace_chain, call_depth, min_intelligence, routing_mode, on_quota_exhausted, and auto_record_context receive no semantics, leaving most of the parameter surface undefined for the agent.

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

Purpose4/5

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

The description opens with a specific verb+resource, 'Dispatch a ticket,' which makes the core action unambiguous. It does not differentiate this tool from siblings such as parallel_dispatch or preview_routing, and the word 'ticket' is inconsistent with the tool/resource name 'task', but an agent can still tell broadly what the tool does.

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

Usage Guidelines3/5

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

It gives fill-in guidance for defaults ('Leave target_harness at "auto" and model unset', 'pass task_kind when it is known') and states that only objective is required, which is useful. However, there is no when-to-use-this-vs-alternatives guidance at all, so the agent must infer that dispatch_task is the single-task path and parallel_dispatch the multi-task path.

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

get_integration_statusA

Report whether each installed harness can reach Mesh as a controller.

States are integrated, detected_not_integrated, stale, not_detected and ignored. Read-only: detection never writes.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full burden, and it does meaningful work: 'Read-only: detection never writes' explicitly declares the safety profile, and the enumerated state vocabulary ('integrated', 'detected_not_integrated', 'stale', 'not_detected', 'ignored') tells the agent what the operation can conclude. It does not say whether detection triggers a fresh probe or returns cached state, which is exactly what 'stale' implies an agent might want to know.

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

Conciseness4/5

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

Two sentences, front-loaded with the purpose, then the state vocabulary. No filler. Minor deduction for the leftover RST literal markup (double backticks) and the escaped quoting artifacts, which add noise without meaning.

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

Completeness4/5

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

An output schema exists, so the description need not explain return values, and with zero parameters there is little surface area to cover. What remains missing is the operational follow-through — what a given state implies the agent should do next — but the definition is otherwise sufficient to call the tool correctly.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to disambiguate beyond the implicit scope of 'each installed harness', which the schema cannot express.

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

Purpose4/5

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

The description opens with a specific verb and resource: 'Report whether each installed harness can reach Mesh as a controller.' That is concrete enough that an agent can distinguish it from list_harnesses (which enumerates harnesses) and install_integration (which mutates). It stops short of naming a sibling explicitly, so it lands at 4 rather than 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: an agent infers this is the diagnostic to run when it needs to know whether a harness is wired up. There is no explicit 'use this when X, use install_integration when Y', and no statement of prerequisites or what to do with a 'stale' or 'not_detected' result. The routing to sibling tools 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.

get_model_marketB

Read cached model prices, context windows and intelligence scores.

intelligence_source says whether a score came from Artificial Analysis, a user override or the local heuristic. This tool never refreshes the cache and never performs a network request.

NameRequiredDescriptionDefault
limitNo
queryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

With no annotations, the description carries the full load and does disclose the most important behavioral trait: it reads cache only, never refreshes, and performs no network request. It also explains what `intelligence_source` means (Artificial Analysis, user override, or local heuristic), which is genuine value. It stops short of describing ordering, truncation, or what happens when the cache is empty.

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

Conciseness4/5

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

Three short sentences, front-loaded with the resource description followed by the two behavioral facts. Some markdown formatting noise (backticks, hard wrapping) but no filler content; every clause carries information.

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

Completeness3/5

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

An output schema exists, so return values need not be explained, and the staleness/network behavior is well covered. The gap is on the input side: for a searchable listing tool with an undocumented `query` and `limit`, an agent lacks enough to call it confidently, and there is no mention of what the cache does not contain.

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

Parameters2/5

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

Schema description coverage is 0%, so the two parameters (`limit`, `query`) are undocumented in both schema and description. The description never explains what `query` matches (model name? provider? fuzzy or exact?) or how `limit` interacts with results, leaving the agent to guess at the primary filtering controls.

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

Purpose4/5

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

States a specific verb and resource set: reading cached model prices, context windows, and intelligence scores. It is clear enough to distinguish from siblings like discover_harness_models or preview_routing, though it never explicitly names an alternative or explains how it differs from live model discovery.

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

Usage Guidelines3/5

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

Usage is implied by the 'cached' framing and the explicit statement that the tool never refreshes and never makes a network request, which tells an agent this is a stale-data read. However, there is no explicit when-to-use/when-not-to-use guidance and no named alternative for getting fresh prices, so the agent must infer the routing decision.

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

get_project_contextC

Read the cross-harness project memory blackboard and instruction files.

NameRequiredDescriptionDefault
categoryNo
include_instructionsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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 behavioral disclosure. It implies a read-only operation by saying 'Read', but does not explain scope, permissions, whether instruction files are included by default, or how the cross-harness memory is aggregated.

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

Conciseness4/5

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

The definition is a single front-loaded sentence with no filler. Its brevity is efficient, though it borders on under-specification rather than being genuinely concise.

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

Completeness2/5

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

The output schema exists, so return values need not be explained in the description. However, with no annotations and no parameter descriptions, the description is too thin to fully prepare an agent to call this tool correctly, especially regarding the category filter and default instruction behavior.

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

Parameters2/5

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

Schema description coverage is 0%, so the description needs to compensate for undocumented parameters. It only vaguely hints at include_instructions via 'instruction files' and says nothing about the category parameter, its valid values, or the effect of defaults.

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

Purpose4/5

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

The description uses a specific verb ('Read') and identifies the resources: project memory blackboard and instruction files. It is understandable, though the term 'cross-harness project memory blackboard' is jargon and it does not explicitly distinguish itself from the sibling tool update_project_context.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool, when not to use it, or which sibling alternatives it competes with. An agent must infer that this is the read counterpart to update_project_context from the name alone.

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

get_quota_statusA

Show quota circuits and the waiting_for_quota queue.

probe_now triggers recovery probes and resumes waiting tickets.

NameRequiredDescriptionDefault
probe_nowNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full load, and it does disclose the critical trait: probe_now is not a passive read — it triggers recovery probes and resumes waiting tickets. That is exactly the side-effect an agent needs to know before flipping a boolean. It stops short of saying whether that action can fail, is idempotent, or requires permissions.

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

Conciseness4/5

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

Two tight sentences with the resource list front-loaded and the parameter effect immediately after. The stray double-backtick markup around probe_now is minor packaging noise rather than a comprehension problem.

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

Completeness4/5

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

For a one-optional-parameter read tool with an output schema, this covers what is returned and the one behavioral wrinkle of the parameter. The only meaningful gap is the lack of explicit routing guidance versus the closely named sibling report_quota_status.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate for the single parameter, and it does: probe_now is explained as triggering recovery probes plus resuming waiting tickets. The default of false is visible in the schema, but the description doesn't note that omitting the flag leaves the queue untouched.

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

Purpose4/5

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

The description uses a concrete verb ("Show") and names both resources it surfaces: quota circuits and the waiting_for_quota queue. That is clear enough to distinguish it from a status-writing sibling like report_quota_status, though the description never makes that contrast explicit.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is the diagnostic view for quota circuits and stuck tickets, and that probe_now is the nudge to unstick them. There is no explicit statement of when to call this versus report_quota_status or get_integration_status, and no warning about when probe_now should be avoided.

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

get_task_statusC

Return ticket status plus every assignment and failover hop.

NameRequiredDescriptionDefault
task_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden. It never states that this is a non-mutating read, what happens for an unknown or already-completed task_id, whether the assignment history is bounded or paginated, or any permission requirements.

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

Conciseness4/5

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

One short, front-loaded sentence with no filler; the returned payload is stated first. It is arguably under-specified rather than verbose, but nothing in it is wasted.

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

Completeness3/5

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

An output schema exists, so the description needn't enumerate return fields, and for a single-parameter read tool the scope is roughly adequate. Still missing is the task_id meaning and any indication of error or empty-result behavior, which matters for a status lookup that could silently return nothing.

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

Parameters2/5

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

The single parameter has 0% schema description coverage, so the description must explain task_id but says nothing about it — not whether it is the dispatcher's task ID, whether it accepts a ticket key, or what format is expected. The reference to 'ticket status' actually muddies the parameter's meaning.

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

Purpose4/5

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

States a concrete verb ('Return') and a concrete payload ('ticket status plus every assignment and failover hop'), which tells an agent this is a status/history read rather than a resource read like read_task_resource. However, it calls the entity a 'ticket' while the tool and its parameter are named 'task', introducing a terminology mismatch that weakens precision.

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

Usage Guidelines2/5

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

There is no guidance on when to choose this over the many sibling read tools (read_task_resource, get_quota_status, get_integration_status) or over dispatching/cancelling. The agent must infer usage purely from the name and the one-line payload summary.

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

install_integrationA

Install one harness after the user approved the reviewed plan.

This is a write tool: it refuses workers and HARNESS_MESH_READ_ONLY=1, and it refuses any plan_id that no longer matches a freshly computed plan. The target harness must restart before the tools appear.

NameRequiredDescriptionDefault
harnessYes
plan_idNo
approve_levelNodispatch

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations at all, the description carries the full burden and does well: it declares the operation is a write, names the refusal conditions (read-only mode, worker context, stale plan hash), and states the post-condition that the harness must restart before tools appear. It does not address reversibility of the install or what a partial failure leaves behind, which keeps it from a 5.

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

Conciseness5/5

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

Four short sentences: purpose first, then safety/refusal behavior, then the operational post-condition. No redundant restatement of the tool name and no filler.

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

Completeness4/5

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

For a write tool with zero annotation coverage, the description covers the critical risks (authorization mode, worker refusal, plan staleness, restart requirement), and return values are covered by the existing output schema. The one real hole is `approve_level`, undocumented in both the schema and the description.

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

Parameters3/5

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

Schema description coverage is 0%, so the schema contributes no meaning. The description clarifies `harness` (the target that must restart) and `plan_id` (must match a freshly computed plan), but says nothing about `approve_level`, a parameter with a non-obvious default of "dispatch" whose accepted values an agent cannot guess.

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

Purpose4/5

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

The description gives a specific verb and resource ("Install one harness") plus a precondition ("after the user approved the reviewed plan"), which implicitly contrasts with the sibling plan_integration. It stops short of naming the sibling tool or stating that only one harness per call is installed, so differentiation is inferred rather than spelled out.

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

Usage Guidelines4/5

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

It states the triggering condition clearly (user approval of the reviewed plan) and lists three when-not conditions: worker contexts, HARNESS_MESH_READ_ONLY=1, and a plan_id that no longer matches a freshly computed plan. It never explicitly points at plan_integration as the required preceding step, leaving the workflow link to inference.

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

list_harnessesC

List locally available harnesses, discovered authorised models, tier bindings and quota state.

NameRequiredDescriptionDefault
refresh_modelsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden. It signals that results are local, yet the presence of a refresh_models flag implies an outbound discovery/authorisation call whose cost, permissions, or side effects are never disclosed. Nothing is said about whether the quota/tier data is cached or live.

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

Conciseness4/5

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

A single front-loaded sentence with no filler, and the resource is stated first. It is arguably over-dense in that four distinct data categories are crammed into one clause, but no sentence is wasted.

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

Completeness4/5

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

An output schema exists, so return-value shape needn't be restated, and the description correctly avoids it. What is missing is the refresh_models behavior and any routing hint against the many overlapping siblings — meaningful but bounded gaps.

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

Parameters2/5

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

Schema description coverage is 0%, so the lone boolean refresh_models has no documented meaning anywhere. The description mentions "discovered authorised models" but never connects discovery to the flag, leaving the agent unable to judge when to set it or what changes if it does.

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

Purpose4/5

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

The description uses a specific verb ("List") with a named resource ("harnesses") and enumerates the payload contents: discovered authorised models, tier bindings, and quota state. An agent knows what comes back. It stops short of differentiating from siblings such as discover_harness_models or get_quota_status, which overlap on the listed contents.

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

Usage Guidelines2/5

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

"Locally available" implies a cheap offline inventory versus the discovery-oriented sibling, but this is inference rather than stated guidance. There is no when-to-use, when-not-to-use, or named alternative (e.g. discover_harness_models, get_quota_status), so an agent has to guess which of the overlapping tools to call.

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

list_skills_and_pluginsC

Search indexed SKILL.md files and MCP/plugin manifests.

NameRequiredDescriptionDefault
queryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations at all, the description carries the full burden of behavioral disclosure and falls short. It hints at an index ("indexed") but does not say whether results are ranked, whether an empty query lists everything, how many results come back, or whether the operation is read-only in any sense beyond the verb.

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

Conciseness4/5

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

One short sentence with no filler, and the resource scope is front-loaded. Its terseness is efficient rather than padded, though it borders on being too short to be actionable.

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

Completeness2/5

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

The presence of an output schema excuses not documenting return values, but the definition still omits when to call it, what the query does, and how the index behaves. For a zero-annotation, zero-schema-coverage search tool, that leaves meaningful gaps.

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

Parameters2/5

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

The single `query` parameter has 0% schema description coverage (only a string type and an empty-string default), and the description never mentions it. It therefore does not clarify whether an empty default means "list all" or "no results", nor whether matching is substring, keyword, or semantic over the indexed content.

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

Purpose4/5

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

The description names a specific verb ("Search") and concrete resources ("indexed SKILL.md files and MCP/plugin manifests"), which is enough to separate it from the harness/model/task siblings. The one weakness is the mismatch with the tool name "list_skills_and_plugins", so an agent cannot tell from the name alone whether this enumerates or searches.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of when not to use it, and no named alternative. The description never explains the relationship to discovery siblings such as discover_harness_models or get_integration_status, so the agent must infer the choice from resource vocabulary.

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

parallel_dispatchA

Dispatch multiple tickets concurrently.

Every task accepts the same fields as dispatch_task, including task_kind, routing_mode, max_price_per_mtok and min_intelligence. target_harness is optional and defaults to auto.

NameRequiredDescriptionDefault
tasksYes
max_concurrencyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It mentions concurrency and that task fields mirror dispatch_task, but it does not explain max_concurrency behavior, partial-failure semantics, ordering, rate limits, permissions, or what happens when some dispatches fail.

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

Conciseness5/5

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

The description is short, front-loaded with the core action, and contains no filler. The second sentence efficiently routes the reader to dispatch_task for the task schema.

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

Completeness3/5

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

An output schema exists, so return values need not be explained. However, for a concurrent dispatch tool with no annotations and no schema descriptions, the definition still leaves important operational details unstated, especially max_concurrency semantics and failure behavior.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must add parameter meaning. It helpfully names task fields such as task_kind, routing_mode, max_price_per_mtok and min_intelligence, and notes target_harness defaults to auto, but it completely omits the max_concurrency parameter and does not clarify task object requirements.

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

Purpose5/5

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

The description states a specific verb and resource: 'Dispatch multiple tickets concurrently.' It distinguishes the tool from the single-task sibling dispatch_task by emphasizing multiple concurrent tickets, so an agent can tell them apart without opening the schema.

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

Usage Guidelines3/5

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

Usage is implied by 'multiple tickets concurrently' and by the reference to dispatch_task fields, but there is no explicit guidance on when to use this instead of calling dispatch_task repeatedly, and no exclusions or prerequisites are given.

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

plan_integrationA

Return the exact installation plan and plan_id without writing.

harness must be an enabled configured name and approve_level one of read, dispatch, all or none. Show this plan to the user and ask for consent before calling install_integration.

NameRequiredDescriptionDefault
harnessYes
approve_levelNodispatch

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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 that no write occurs, that a plan_id is produced, and that harness must be an already-enabled configured name — a real precondition an agent would otherwise miss. It omits plan lifetime/expiry, whether the plan is deterministic, and what happens if the config changes between plan and install.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core behavior and the no-write guarantee, then the preconditions and consent requirement. Nothing is padded; the only noise is the RST-style double backticks, which are cosmetic.

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

Completeness4/5

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

An output schema exists, so return-shape explanation is unnecessary, and the description covers the dry-run semantics, harness precondition, and consent workflow. The main remaining gap is the semantic meaning of approve_level values, which matters for a planning tool whose output depends on that choice.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it largely does: it enumerates the legal approve_level values (read, dispatch, all, none) which the schema leaves as a bare string with only a default. It still does not explain what each level actually authorizes, which is the meaning an agent most needs.

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

Purpose5/5

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

The first sentence states a specific verb and resource ('Return the exact installation plan and plan_id') plus a crucial scope qualifier ('without writing'). That qualifier cleanly separates it from the sibling install_integration, so an agent can pick correctly without opening either schema.

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

Usage Guidelines4/5

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

It gives an explicit workflow: show the plan to the user and obtain consent before calling install_integration. That is clear when-to-use guidance tied to a named alternative. It does not address edge cases such as re-planning after a failed install or whether a plan can be reused, 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.

preview_routingB

Preview the routing decision for an objective without dispatching it.

NameRequiredDescriptionDefault
objectiveYes
task_kindNoauto
difficultyNoauto
target_harnessNoauto

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose the most important behavioral fact, that nothing is dispatched, which signals a safe read-only preview. It says nothing about whether the preview calls any external provider, the cost/latency of previewing, or any prerequisites, so it is not fully transparent.

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

Conciseness4/5

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

One front-loaded sentence with no filler, and the scope qualifier ('without dispatching') is placed where it will be read. It is efficient, though the terseness leaves no room for any parameter cue.

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

Completeness2/5

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

An output schema exists, so return values need not be explained here. But a four-parameter tool with zero schema descriptions and three 'auto'-defaulted routing knobs is not adequately covered by a single sentence; the agent cannot tell what the optional parameters do or how they shape the preview.

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

Parameters2/5

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

Schema description coverage is 0% across four parameters, and the description never mentions a single one. The meanings of task_kind, difficulty, and target_harness, and what their 'auto' default does, are entirely undocumented in both the schema and the description.

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

Purpose4/5

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

The description gives a specific verb ('Preview'), resource ('the routing decision'), and input ('for an objective'), and the phrase 'without dispatching it' implicitly marks the difference from dispatch_task. It stops short of naming a sibling explicitly, so the differentiation is inferable rather than stated.

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

Usage Guidelines3/5

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

'without dispatching it' implies a dry-run/inspection use case before real dispatch, which is genuine usage context. However, there is no explicit when-to-use or when-not-to-use rule, and no sibling is named (dispatch_task, parallel_dispatch, discover_harness_models) to route the agent elsewhere.

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

read_task_resourceB

Page through a large diff/transcript/assignments payload to protect the controller context window.

NameRequiredDescriptionDefault
limitNo
offsetNo
task_idYes
resourceNodiff

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses only one trait, paging to conserve context, and says nothing about read-only safety, whether content is truncated or lossy, what happens at the end of a payload, or what error conditions exist for an invalid resource or task_id.

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

Conciseness4/5

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

A single tight sentence with no filler, and the rationale (protecting the context window) is front-loaded alongside the action. It is under-specified rather than verbose, so the only cost is that nothing follows the one sentence.

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

Completeness2/5

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

For a 4-parameter paginated read tool with zero annotation and zero schema-description coverage, the definition leaves too much implicit: it never mentions task_id, does not explain how limit and offset interact, and gives no hint of how this relates to the sibling tools that produce or inspect tasks. The existing output schema offsets the need to describe return values, but not the missing call semantics.

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

Parameters3/5

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

Schema description coverage is 0% and the 'resource' parameter has no enum, so the description's enumeration of diff/transcript/assignments is genuinely the only documentation of valid values. Beyond that, task_id, limit, and offset are left untouched, with only the phrase 'Page through' hinting at offset/limit semantics and no indication of what units limit uses.

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

Purpose4/5

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

The description gives a specific verb ('Page through') and enumerates the payload types it reads (diff/transcript/assignments), which maps onto the 'resource' parameter. It is clear enough to distinguish the operation from sibling task tools like get_task_status or dispatch_task, though 'payload' is vague about where the content comes from.

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

Usage Guidelines3/5

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

The clause 'to protect the controller context window' implicitly states the condition for use: call this when a payload is too large to read at once. However, no alternative is named (e.g., when to use this instead of preview/status tools), and there is no guidance on when a full read is acceptable or on typical paging strategy.

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

report_quota_statusC

Manually reset or mark a quota circuit (actions: reset, open, half_open).

NameRequiredDescriptionDefault
modelNo*
actionNoreset
harnessYes
cooldown_secondsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden for what is clearly a state mutation. It does not say what a reset actually does (clear cooldown? re-enable traffic?), whether the change is reversible, what 'open' versus 'half_open' mean operationally, or what side effects a manual override has. Only the action vocabulary is disclosed, not the consequences.

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

Conciseness4/5

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

A single front-loaded sentence with no filler and the action list parenthesized at the end. It is efficient, though the brevity reflects under-specification rather than tight editing per se.

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

Completeness2/5

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

An output schema exists, so return values need not be explained, but everything else is missing: this is a mutation tool with zero annotations and zero schema description coverage, and the description never covers scope (which harness/model is affected) or the effect of the cooldown. For a four-parameter write operation, this is substantially under-described.

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

Parameters2/5

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

Schema description coverage is 0% across four parameters, and the schema defines no enums, so the description is the only source of meaning. It supplies the valid action values (reset, open, half_open) but never explains what each does, and leaves 'model', 'harness', and especially 'cooldown_seconds' entirely undefined despite cooldown being the key knob for a circuit tool.

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

Purpose3/5

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

The description names a specific verb and resource (reset/mark a quota circuit) and enumerates three actions, so the mutation intent is visible. However, the tool name 'report_quota_status' suggests a read/report operation, and the sibling 'get_quota_status' is the obvious read counterpart that the description never mentions. An agent must reconcile the misleading name against the description to understand this is a write tool.

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

Usage Guidelines2/5

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

'Manually' implies this is the override path versus some automatic circuit behavior, which is a faint usage cue. There is no explicit when-to-use guidance, no statement of when to prefer 'get_quota_status' instead, and no prerequisites such as required permissions or operational state needed before resetting a circuit.

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

update_project_contextC

Write or update one shared project fact or interface contract.

NameRequiredDescriptionDefault
keyYes
contentYes
task_idNo
categoryNonote
author_harnessNocontroller

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It says 'write or update' but does not disclose overwrite vs. merge semantics, whether a key collision replaces existing content, permission requirements, or conflict behavior — critical for a mutation tool with five parameters.

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

Conciseness4/5

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

The description is a single front-loaded sentence with no filler. It is concise, though its brevity comes at the cost of necessary detail rather than being efficiently informative.

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

Completeness2/5

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

An output schema exists, so return values needn't be explained. However, for a five-parameter mutation tool with zero annotation coverage and no schema descriptions, the definition omits nearly all the context an agent needs to call it correctly.

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

Parameters1/5

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, yet it only vaguely gestures at 'key' and 'content'. It adds no meaning for task_id, category (default 'note'), or author_harness (default 'controller'), leaving three of five parameters completely unexplained.

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

Purpose4/5

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

The description states a specific verb-plus-resource action: 'Write or update' a 'shared project fact or interface contract'. This is clearly a mutation counterpart to the sibling get_project_context, though it doesn't explicitly name that sibling or clarify what a 'key' represents.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus get_project_context, nor when to supply task_id, category, or author_harness. 'Shared project fact' implies project-level scope, but the description leaves all selection criteria to inference.

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

Tool Schema Changelog

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

  1. 18 tool updatesv0.4.2
    • First observedapply_task_patch
    • First observedcancel_task
    • First observeddiscover_harness_models
    • First observeddispatch_task
    • First observedget_integration_status
    • First observedget_model_market
    • First observedget_project_context
    • First observedget_quota_status
    • First observedget_task_status
    • First observedinstall_integration
    • First observedlist_harnesses
    • First observedlist_skills_and_plugins
    • First observedparallel_dispatch
    • First observedplan_integration
    • First observedpreview_routing
    • First observedread_task_resource
    • First observedreport_quota_status
    • First observedupdate_project_context

TDQS

B3.2/5.0

Scored across 18 tools

Disambiguation4/5

Most tools map to a distinct resource+action, and the three-phase integration flow (status → plan → install) is explicitly separated by read/write semantics. Minor ambiguity remains between get_quota_status and report_quota_status, since 'report' sounds like a read but actually mutates the circuit, and the model-information trio (discover_harness_models, list_harnesses, get_model_market) requires reading descriptions to separate cache reads from live discovery.

Naming Consistency4/5

The surface is overwhelmingly verb_noun snake_case (get_task_status, cancel_task, update_project_context) with clear read/write prefixes. Deviations are cosmetic: parallel_dispatch inverts the verb order, preview_routing lacks an explicit object, and discover_harness_models/get_model_market stretch the pattern without breaking it.

Tool Count4/5

18 tools sit at the high end of comfortable but each corresponds to a real operation across dispatch, quota, integration, model discovery and project context. Nothing looks like filler, though the set is broad enough that a controller may need a session to build a mental map.

Completeness4/5

Core lifecycle is well covered: routing preview, dispatch (single and parallel), status, cancel, patch application, quota read/write and integration detect/plan/install. Gaps are real but workaroundable: there is no list_tasks to enumerate tickets before calling get_task_status, no uninstall/ignore integration despite the 'ignored' state, and no tool to edit tier bindings that list_harnesses reports.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables repository-aware lifecycle management and controlled delegation of coding tasks to trusted worker harnesses via MCP, with execution isolation, recovery, and verified handoff.
    13 npm
    8
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables coordinating Claude Code and Codex on one machine by fanning out tasks to multiple agents in isolated Git worktrees, comparing results, picking a winning candidate, and handing off work between harnesses. It provides MCP stdio tools, a CLI, and a local loopback web cockpit.
    Apache 2.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI coding providers to run structured multi-agent workflows with shared documents, tracked tasks, handoffs, and health-gated completion evidence. It integrates with multiple coding tools while keeping task state, actions, and health results in the harness.
    29 npm
    MIT